classicmacos #17

Merged
IoI_xD merged 4 commits from classicmacos into master 2026-04-16 13:42:32 +09:00
31 changed files with 220 additions and 180 deletions
Showing only changes of commit f8a94b7380 - Show all commits

cmake
Some checks failed
pyrite-dev/milsko/pipeline/head There was a failure building this commit

IoIxD 2026-04-15 21:41:16 -07:00

1
.gitignore vendored
View file

@ -25,3 +25,4 @@ compile_flags.txt
*.bin *.bin
*.rsrc *.rsrc
*.finf *.finf
*.gdb

View file

@ -9,24 +9,34 @@ include(GNUInstallDirs)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}") set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
option(MW_TRY_OPENGL "Try to compile OpenGL widget or not" ON)
option(MW_TRY_VULKAN "Try to compile Vulkan widget or not" ON)
option(MW_CLASSIC_THEME "Use classic theme" OFF) option(MW_CLASSIC_THEME "Use classic theme" OFF)
option(MW_BUILD_EXAMPLES "Build examples" OFF) option(MW_BUILD_EXAMPLES "Build examples" OFF)
option(MW_USE_STB_IMAGE "Use stb_image" ON) option(MW_USE_STB_IMAGE "Use stb_image" ON)
option(MW_USE_STB_TRUETYPE "Use stb_truetype" OFF) option(MW_USE_STB_TRUETYPE "Use stb_truetype" OFF)
option(MW_BUILD_SHARED "Build a shared library" ON)
option(MW_BUILD_STATIC "Build a static library" OFF) if(${CMAKE_SYSTEM_NAME} MATCHES Retro)
option(MW_BUILD_SHARED "Build a shared library" OFF)
option(MW_BUILD_STATIC "Build a static library" ON)
option(MW_TRY_OPENGL "Try to compile OpenGL widget or not" OFF)
option(MW_TRY_VULKAN "Try to compile Vulkan widget or not" OFF)
else()
option(MW_BUILD_SHARED "Build a shared library" ON)
option(MW_BUILD_STATIC "Build a static library" OFF)
option(MW_TRY_OPENGL "Try to compile OpenGL widget or not" ON)
option(MW_TRY_VULKAN "Try to compile Vulkan widget or not" ON)
endif()
option(MW_INSTALL_HEADERS "Install headers" ON) option(MW_INSTALL_HEADERS "Install headers" ON)
if(${CMAKE_SYSTEM_NAME} STREQUAL Darwin) if(${CMAKE_SYSTEM_NAME} STREQUAL Darwin OR ${CMAKE_SYSTEM_NAME} MATCHES Retro)
option(MW_USE_FREETYPE2 "Use FreeType 2" OFF) option(MW_USE_FREETYPE2 "Use FreeType 2" OFF)
else() else()
option(MW_USE_FREETYPE2 "Use FreeType 2" ON) option(MW_USE_FREETYPE2 "Use FreeType 2" ON)
endif() endif()
if(${CMAKE_SYSTEM_NAME} STREQUAL Linux) if(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
option(MW_USE_WAYLAND "Enable Wayland backend" ON) option(MW_USE_WAYLAND "Enable Wayland backend" ON)
endif() endif()
file( file(
@ -39,83 +49,83 @@ list(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/widget/opengl.c")
list(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/widget/vulkan.c") list(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/widget/vulkan.c")
if(NOT MW_USE_STB_IMAGE) if(NOT MW_USE_STB_IMAGE)
list(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/external/stb_image.c") list(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/external/stb_image.c")
endif() endif()
if(NOT MW_USE_STB_TRUETYPE) if(NOT MW_USE_STB_TRUETYPE)
list(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/external/stb_truetype.c") list(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/external/stb_truetype.c")
endif() endif()
if(CMAKE_SYSTEM_NAME STREQUAL "NetBSD") if(CMAKE_SYSTEM_NAME STREQUAL "NetBSD")
list(APPEND CMAKE_REQUIRED_INCLUDES "/usr/X11R7/include") list(APPEND CMAKE_REQUIRED_INCLUDES "/usr/X11R7/include")
list(APPEND CMAKE_REQUIRED_INCLUDES "/usr/pkg/include") list(APPEND CMAKE_REQUIRED_INCLUDES "/usr/pkg/include")
endif() endif()
if(MW_TRY_OPENGL) if(MW_TRY_OPENGL)
find_package(OpenGL) find_package(OpenGL)
if(OpenGL_FOUND) if(OpenGL_FOUND)
set(MW_BUILD_OPENGL ON) set(MW_BUILD_OPENGL ON)
list(APPEND SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/widget/opengl.c") list(APPEND SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/widget/opengl.c")
if(APPLE) if(APPLE)
list(APPEND SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/widget/opengl_cocoa.m") list(APPEND SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/widget/opengl_cocoa.m")
endif()
message(STATUS "OpenGL widget has been enabled")
else()
message(WARNING "OpenGL widget has been disabled")
endif() endif()
message(STATUS "OpenGL widget has been enabled")
else()
message(WARNING "OpenGL widget has been disabled")
endif()
endif() endif()
if(MW_TRY_VULKAN) if(MW_TRY_VULKAN)
check_include_files(vulkan/vulkan.h HAVE_VULKAN_VULKAN_H) check_include_files(vulkan/vulkan.h HAVE_VULKAN_VULKAN_H)
if(HAVE_VULKAN_VULKAN_H) if(HAVE_VULKAN_VULKAN_H)
set(MW_BUILD_VULKAN ON) set(MW_BUILD_VULKAN ON)
list(APPEND SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/widget/vulkan.c") list(APPEND SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/widget/vulkan.c")
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
MW_VULKAN MW_VULKAN
) )
message(STATUS "Vulkan widget has been enabled") message(STATUS "Vulkan widget has been enabled")
else() else()
message(WARNING "Vulkan widget has been disabled") message(WARNING "Vulkan widget has been disabled")
endif() endif()
endif() endif()
if(MW_BUILD_STATIC) if(MW_BUILD_STATIC)
message(STATUS "Building Milsko as a static library") message(STATUS "Building Milsko as a static library")
add_library( add_library(
Mw Mw
${SOURCES} ${SOURCES}
) )
elseif(MW_BUILD_SHARED) elseif(MW_BUILD_SHARED)
message(STATUS "Building Milsko as a shared library") message(STATUS "Building Milsko as a shared library")
add_library( add_library(
Mw Mw
SHARED SHARED
${SOURCES} ${SOURCES}
) )
else() else()
message(ERROR "Must either build a shared library or a static library") message(ERROR "Must either build a shared library or a static library")
endif() endif()
if(MW_USE_STB_IMAGE) if(MW_USE_STB_IMAGE)
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
USE_STB_IMAGE USE_STB_IMAGE
) )
else() else()
file( file(
GLOB GLOB
IMAGE_SOURCES IMAGE_SOURCES
external/libjpeg/src/*.c external/libpng/src/*.c external/libjpeg/src/*.c external/libpng/src/*.c
) )
target_sources( target_sources(
Mw Mw
PRIVATE PRIVATE
${MW_IMAGE_SOURCES} ${MW_IMAGE_SOURCES}
) )
target_include_directories( target_include_directories(
Mw Mw
PRIVATE PRIVATE
external/libjpeg/include external/libpng/include external/libjpeg/include external/libpng/include
@ -123,7 +133,7 @@ else()
endif() endif()
if(MW_USE_STB_TRUETYPE) if(MW_USE_STB_TRUETYPE)
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
USE_STB_TRUETYPE USE_STB_TRUETYPE
@ -131,22 +141,22 @@ if(MW_USE_STB_TRUETYPE)
endif() endif()
if(MW_USE_FREETYPE2) if(MW_USE_FREETYPE2)
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
USE_FREETYPE2 USE_FREETYPE2
) )
find_package(PkgConfig) find_package(PkgConfig)
pkg_check_modules(FT2 REQUIRED freetype2) pkg_check_modules(FT2 REQUIRED freetype2)
list(APPEND INCLUDE_DIRS ${FT2_INCLUDE_DIRS}) list(APPEND INCLUDE_DIRS ${FT2_INCLUDE_DIRS})
list(APPEND LIBRARY_DIRS ${FT2_LIBRARY_DIRS}) list(APPEND LIBRARY_DIRS ${FT2_LIBRARY_DIRS})
list(APPEND LIBRARIES ${FT2_LIBRARIES}) list(APPEND LIBRARIES ${FT2_LIBRARIES})
endif() endif()
if(MW_USE_WAYLAND) if(MW_USE_WAYLAND)
function(scan_wayland_protocol_core) function(scan_wayland_protocol_core)
execute_process( execute_process(
COMMAND wayland-scanner private-code /usr/share/wayland/wayland.xml ${CMAKE_CURRENT_SOURCE_DIR}/src/backend/wayland-core-protocol.c COMMAND wayland-scanner private-code /usr/share/wayland/wayland.xml ${CMAKE_CURRENT_SOURCE_DIR}/src/backend/wayland-core-protocol.c
OUTPUT_VARIABLE WAYLAND_SCANNER_OUTPUT OUTPUT_VARIABLE WAYLAND_SCANNER_OUTPUT
ERROR_VARIABLE WAYLAND_SCANNER_ERROR ERROR_VARIABLE WAYLAND_SCANNER_ERROR
@ -154,12 +164,12 @@ if(MW_USE_WAYLAND)
ECHO_ERROR_VARIABLE ECHO_ERROR_VARIABLE
COMMAND_ECHO STDOUT COMMAND_ECHO STDOUT
) )
target_sources( target_sources(
Mw Mw
PRIVATE PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src/backend/wayland-core-protocol.c ${CMAKE_CURRENT_SOURCE_DIR}/src/backend/wayland-core-protocol.c
) )
execute_process( execute_process(
COMMAND wayland-scanner client-header /usr/share/wayland/wayland.xml ${CMAKE_CURRENT_SOURCE_DIR}/include/Mw/LowLevel/Wayland/wayland-core-protocol.h COMMAND wayland-scanner client-header /usr/share/wayland/wayland.xml ${CMAKE_CURRENT_SOURCE_DIR}/include/Mw/LowLevel/Wayland/wayland-core-protocol.h
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE WAYLAND_SCANNER_OUTPUT OUTPUT_VARIABLE WAYLAND_SCANNER_OUTPUT
@ -168,11 +178,11 @@ if(MW_USE_WAYLAND)
ECHO_ERROR_VARIABLE ECHO_ERROR_VARIABLE
COMMAND_ECHO STDOUT COMMAND_ECHO STDOUT
) )
endfunction() endfunction()
function(scan_wayland_protocol tier proto ver) function(scan_wayland_protocol tier proto ver)
SET(proto_c ${CMAKE_CURRENT_SOURCE_DIR}/src/backend/wayland-${proto}-protocol.c) SET(proto_c ${CMAKE_CURRENT_SOURCE_DIR}/src/backend/wayland-${proto}-protocol.c)
execute_process( execute_process(
COMMAND wayland-scanner private-code /usr/share/wayland-protocols/${tier}/${proto}/${proto}${ver}.xml ${proto_c} COMMAND wayland-scanner private-code /usr/share/wayland-protocols/${tier}/${proto}/${proto}${ver}.xml ${proto_c}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE WAYLAND_SCANNER_OUTPUT OUTPUT_VARIABLE WAYLAND_SCANNER_OUTPUT
@ -181,12 +191,12 @@ if(MW_USE_WAYLAND)
ECHO_ERROR_VARIABLE ECHO_ERROR_VARIABLE
COMMAND_ECHO STDOUT COMMAND_ECHO STDOUT
) )
target_sources( target_sources(
Mw Mw
PRIVATE PRIVATE
${proto_c} ${proto_c}
) )
execute_process( execute_process(
COMMAND wayland-scanner client-header /usr/share/wayland-protocols/${tier}/${proto}/${proto}${ver}.xml ${CMAKE_CURRENT_SOURCE_DIR}/include/Mw/LowLevel/Wayland/${proto}-client-protocol.h COMMAND wayland-scanner client-header /usr/share/wayland-protocols/${tier}/${proto}/${proto}${ver}.xml ${CMAKE_CURRENT_SOURCE_DIR}/include/Mw/LowLevel/Wayland/${proto}-client-protocol.h
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE WAYLAND_SCANNER_OUTPUT OUTPUT_VARIABLE WAYLAND_SCANNER_OUTPUT
@ -195,49 +205,49 @@ if(MW_USE_WAYLAND)
ECHO_ERROR_VARIABLE ECHO_ERROR_VARIABLE
COMMAND_ECHO STDOUT COMMAND_ECHO STDOUT
) )
endfunction() endfunction()
check_include_files(wayland-client.h HAVE_WL_H) check_include_files(wayland-client.h HAVE_WL_H)
check_include_files(xkbcommon/xkbcommon.h HAVE_XKBCOMMON_H) check_include_files(xkbcommon/xkbcommon.h HAVE_XKBCOMMON_H)
check_include_files(cairo/cairo.h HAVE_CAIRO_H) check_include_files(cairo/cairo.h HAVE_CAIRO_H)
if(HAVE_WL_H) if(HAVE_WL_H)
if(HAVE_XKBCOMMON_H) if(HAVE_XKBCOMMON_H)
if(HAVE_CAIRO_H) if(HAVE_CAIRO_H)
scan_wayland_protocol_core() scan_wayland_protocol_core()
scan_wayland_protocol("stable" "xdg-shell" "") scan_wayland_protocol("stable" "xdg-shell" "")
scan_wayland_protocol("stable" "viewporter" "") scan_wayland_protocol("stable" "viewporter" "")
scan_wayland_protocol("stable" "tablet" "-v2") scan_wayland_protocol("stable" "tablet" "-v2")
scan_wayland_protocol("staging" "xdg-toplevel-icon" "-v1") scan_wayland_protocol("staging" "xdg-toplevel-icon" "-v1")
scan_wayland_protocol("staging" "cursor-shape" "-v1") scan_wayland_protocol("staging" "cursor-shape" "-v1")
scan_wayland_protocol("unstable" "xdg-decoration" "-unstable-v1") scan_wayland_protocol("unstable" "xdg-decoration" "-unstable-v1")
scan_wayland_protocol("unstable" "primary-selection" "-unstable-v1") scan_wayland_protocol("unstable" "primary-selection" "-unstable-v1")
scan_wayland_protocol("unstable" "pointer-constraints" "-unstable-v1") scan_wayland_protocol("unstable" "pointer-constraints" "-unstable-v1")
scan_wayland_protocol("unstable" "relative-pointer" "-unstable-v1") scan_wayland_protocol("unstable" "relative-pointer" "-unstable-v1")
target_sources( target_sources(
Mw Mw
PRIVATE PRIVATE
src/backend/wayland.c src/backend/wayland.c
) )
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
USE_WAYLAND USE_WAYLAND
) )
message(STATUS "Wayland backend has been enabled") message(STATUS "Wayland backend has been enabled")
else() else()
message(WARNING "Wayland backend has been disabled")
endif()
else()
message(WARNING "Wayland backend has been disabled")
endif()
else()
message(WARNING "Wayland backend has been disabled") message(WARNING "Wayland backend has been disabled")
endif()
else()
message(WARNING "Wayland backend has been disabled")
endif() endif()
else()
message(WARNING "Wayland backend has been disabled")
endif()
endif() endif()
if(APPLE AND MW_BUILD_OPENGL) if(APPLE AND MW_BUILD_OPENGL)
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
GL_SILENCE_DEPRECATION GL_SILENCE_DEPRECATION
@ -257,7 +267,7 @@ target_include_directories(
) )
if(MW_CLASSIC_THEME) if(MW_CLASSIC_THEME)
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
USE_CLASSIC_THEME USE_CLASSIC_THEME
@ -265,60 +275,78 @@ if(MW_CLASSIC_THEME)
endif() endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Windows") if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
target_sources( target_sources(
Mw Mw
PRIVATE PRIVATE
src/backend/gdi.c src/backend/gdi.c
) )
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
USE_GDI USE_GDI
) )
list(APPEND LIBRARIES gdi32) list(APPEND LIBRARIES gdi32)
target_link_options( target_link_options(
Mw Mw
PRIVATE PRIVATE
-static-libgcc -static-libgcc
) )
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
target_sources( target_sources(
Mw Mw
PRIVATE PRIVATE
src/backend/cocoa.m src/backend/cocoa.m
) )
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
USE_COCOA USE_COCOA
) )
list(APPEND LIBRARIES objc) list(APPEND LIBRARIES objc)
target_link_options( target_link_options(
Mw Mw
PRIVATE PRIVATE
-framework Cocoa -framework Cocoa
) )
else() elseif(CMAKE_SYSTEM_NAME MATCHES "Retro")
find_package(PkgConfig) target_sources(
pkg_check_modules(X11 REQUIRED x11) Mw
pkg_check_modules(XRENDER REQUIRED xrender) PRIVATE
src/backend/classicmacos.c
)
if(PLATFORM MATCHES retroppc)
endif()
if(PLATFORM MATCHES retroppc)
set_target_properties(Mw PROPERTIES COMPILE_FLAGS "-ffunction-sections -mcpu=601 -Os -Wall -Wextra -Wno-unused-parameter")
set_target_properties(Mw PROPERTIES LINK_FLAGS "-Wl,-gc-sections")
endif()
target_sources( target_compile_definitions(
Mw
PRIVATE
CLASSIC_MAC_OS
)
else()
find_package(PkgConfig)
pkg_check_modules(X11 REQUIRED x11)
pkg_check_modules(XRENDER REQUIRED xrender)
target_sources(
Mw Mw
PRIVATE PRIVATE
src/backend/x11.c src/backend/x11.c
) )
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
USE_X11 USE_X11
) )
list(APPEND INCLUDE_DIRS ${X11_INCLUDE_DIRS} ${XRENDER_INCLUDE_DIRS}) list(APPEND INCLUDE_DIRS ${X11_INCLUDE_DIRS} ${XRENDER_INCLUDE_DIRS})
list(APPEND LIBRARY_DIRS ${X11_LIBRARY_DIRS} ${XRENDER_LIBRARY_DIRS}) list(APPEND LIBRARY_DIRS ${X11_LIBRARY_DIRS} ${XRENDER_LIBRARY_DIRS})
list(APPEND LIBRARIES ${X11_LIBRARIES} ${XRENDER_LIBRARIES} m) list(APPEND LIBRARIES ${X11_LIBRARIES} ${XRENDER_LIBRARIES} m)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux") if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
list(APPEND LIBRARIES dl) list(APPEND LIBRARIES dl)
endif() endif()
endif() endif()
target_include_directories( target_include_directories(
@ -338,14 +366,14 @@ target_link_libraries(
) )
if(MW_BUILD_VULKAN) if(MW_BUILD_VULKAN)
check_include_files(vulkan/vk_enum_string_helper.h HAS_VK_ENUM_STRING_HELPER) check_include_files(vulkan/vk_enum_string_helper.h HAS_VK_ENUM_STRING_HELPER)
if(HAS_VK_ENUM_STRING_HELPER) if(HAS_VK_ENUM_STRING_HELPER)
target_compile_definitions( target_compile_definitions(
Mw Mw
PRIVATE PRIVATE
HAS_VK_ENUM_STRING_HELPER HAS_VK_ENUM_STRING_HELPER
) )
endif() endif()
endif() endif()
target_compile_definitions( target_compile_definitions(
@ -362,7 +390,7 @@ install(
) )
if(MW_INSTALL_HEADERS) if(MW_INSTALL_HEADERS)
install( install(
DIRECTORY include/ DIRECTORY include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h" FILES_MATCHING PATTERN "*.h"
@ -370,5 +398,5 @@ if(MW_INSTALL_HEADERS)
endif() endif()
if(MW_BUILD_EXAMPLES) if(MW_BUILD_EXAMPLES)
add_subdirectory(examples) add_subdirectory(examples)
endif() endif()

19
configure vendored
View file

@ -46,6 +46,7 @@ param_set("shared", 1);
param_set("static", 1); param_set("static", 1);
param_set("examples", 1); param_set("examples", 1);
my %features = ( my %features = (
"classic-theme" => "use classic theme", "classic-theme" => "use classic theme",
"stb-image" => "use stb_image, instead use libjpeg/libpng", "stb-image" => "use stb_image, instead use libjpeg/libpng",
@ -131,16 +132,12 @@ foreach my $l (@ARGV) {
} }
} }
if($target ne "Darwin" and $target ne "ClassicMacOS68k" and $target ne "ClassicMacOSPPC") { if($target ne "Darwin" and $target ne "ClassicMacOS") {
param_set("freetype2", 1); param_set("freetype2", 1);
param_set("stb-truetype", 0); param_set("stb-truetype", 0);
} else { } else {
if($target ne "ClassicMacOS68k" and $target ne "ClassicMacOSPPC"){ param_set("freetype2", 0);
param_set("freetype2", 0); param_set("stb-truetype", 0);
param_set("stb-truetype", 1);
} else {
param_set("stb-truetype", 0);
}
} }
if($target eq "Linux") { if($target eq "Linux") {
@ -289,7 +286,7 @@ if (param_get("examples")) {
} }
if (grep(/^cocoa$/, @backends)) { if (grep(/^cocoa$/, @backends)) {
print(OUT print(OUT
" \$(CC) -L./src -I\$\(INCDIR) \$\(LIBDIR) -o ${l} ${s}${object_suffix} -lMw ${math} ${libs}\n" " \$(CC) -L./src \$\(LIBDIR) -o ${l} ${s}${object_suffix} -lMw ${math} ${libs}\n"
); );
} }
else { else {
@ -304,16 +301,12 @@ if (param_get("examples")) {
print(OUT print(OUT
" Rez -I ".$ENV{RETRO68_TOOLCHAIN_PATH}."/RIncludes ".$ENV{RETRO68_TOOLCHAIN_PATH}."/RIncludes/Retro68APPL.r -DCFRAG_NAME=\"example\" --data ${l}.pef --cc ${l}.dsk -t APPL\n" " Rez -I ".$ENV{RETRO68_TOOLCHAIN_PATH}."/RIncludes ".$ENV{RETRO68_TOOLCHAIN_PATH}."/RIncludes/Retro68APPL.r -DCFRAG_NAME=\"example\" --data ${l}.pef --cc ${l}.dsk -t APPL\n"
); );
}
print(OUT "${s}${object_suffix}: ${s}.c\n"); print(OUT "${s}${object_suffix}: ${s}.c\n");
print(OUT print(OUT
" \$(CC) -c \$\(INCDIR) -o ${s}${object_suffix} ${s}.c -lMw ${math}\n" " \$(CC) -c \$\(INCDIR) -o ${s}${object_suffix} ${s}.c -lMw ${math}\n"
); );
#print(OUT "Rez -I /path/to/Universal/RIncludes /path/to/libretro/RIncludes/Retro68APPL.r -DCFRAG_NAME="\"MyProgram\"" --data program.pef -o program.bin -t APPL");
}
} }
} }
print(OUT "\n"); print(OUT "\n");

View file

@ -1,22 +1,26 @@
file( file(
GLOB GLOB
EXAMPLES_BASIC_SOURCES EXAMPLES_BASIC_SOURCES
*.c *.c
) )
foreach(PATH IN LISTS EXAMPLES_BASIC_SOURCES) foreach(PATH IN LISTS EXAMPLES_BASIC_SOURCES)
get_filename_component(TARGET ${PATH} NAME_WE) get_filename_component(TARGET ${PATH} NAME_WE)
add_executable(${TARGET} MACOSX_BUNDLE ${PATH}) if(CMAKE_SYSTEM_NAME MATCHES Retro)
target_link_libraries( add_application(${TARGET} ${PATH})
${TARGET} else()
PRIVATE add_executable(${TARGET} MACOSX_BUNDLE ${PATH})
Mw endif()
) target_link_libraries(
if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") ${TARGET}
target_link_libraries( PRIVATE
${TARGET} Mw
PRIVATE )
m if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
) target_link_libraries(
endif() ${TARGET}
PRIVATE
m
)
endif()
endforeach() endforeach()

View file

@ -106,6 +106,9 @@ MWDECL void MwLLDBusFreeContext(MwLLDBusFuncTable* tbl, MwLLDBusContext* ctx);
#ifdef USE_COCOA #ifdef USE_COCOA
#include <Mw/LowLevel/Cocoa.h> #include <Mw/LowLevel/Cocoa.h>
#endif #endif
#ifdef CLASSIC_MAC_OS
#include <Mw/LowLevel/ClassicMacOS.h>
#endif
union _MwLL { union _MwLL {
struct _MwLLCommon common; struct _MwLLCommon common;
@ -121,6 +124,9 @@ union _MwLL {
#ifdef USE_COCOA #ifdef USE_COCOA
struct _MwLLCocoa cocoa; struct _MwLLCocoa cocoa;
#endif #endif
#ifdef CLASSIC_MAC_OS
struct _MwLLClassicMacOS cmacos;
#endif
}; };
union _MwLLColor { union _MwLLColor {

View file

@ -12,6 +12,10 @@
struct _MwLLClassicMacOS { struct _MwLLClassicMacOS {
struct _MwLLCommon common; struct _MwLLCommon common;
WindowRef window;
EventRecord event;
Rect winRect;
}; };
struct _MwLLClassicMacOSColor { struct _MwLLClassicMacOSColor {

10
pl/ostype/ClassicMacOS.pl Normal file
View file

@ -0,0 +1,10 @@
use_backend("classicmacos");
print("Compiling for Classic Mac OS via ./configure currently outputs a broken executable and it only supports PowerPC. Help is wanted. In the mean time, use CMake.")
$cc = $ENV{RETRO68_TOOLCHAIN_PATH}."/bin/powerpc-apple-macos-gcc";
$ar = $ENV{RETRO68_TOOLCHAIN_PATH}."/bin/powerpc-apple-macos-ar";
add_cflags("-DCLASSIC_MAC_OS");
add_cflags("-DSTBI_NO_THREAD_LOCALS");
1;

View file

@ -1,7 +0,0 @@
use_backend("classicmacos");
$cc = $ENV{RETRO68_TOOLCHAIN_PATH}."/bin/m68k-apple-macos-gcc";
$ar = $ENV{RETRO68_TOOLCHAIN_PATH}."/bin/m68k-apple-macos-ar";
add_cflags("-DCLASSIC_MAC_OS");
1;

View file

@ -1,7 +0,0 @@
use_backend("classicmacos");
$cc = $ENV{RETRO68_TOOLCHAIN_PATH}."/bin/powerpc-apple-macos-gcc";
$ar = $ENV{RETRO68_TOOLCHAIN_PATH}."/bin/powerpc-apple-macos-ar";
add_cflags("-DCLASSIC_MAC_OS");
1;

View file

@ -5,6 +5,15 @@
static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) { static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
MwLL r; MwLL r;
MwLLCreateCommon(r);
SetRect(&r->cmacos.winRect, 100, 100, width, height);
r->cmacos.window = NewCWindow(nil, &r->cmacos.winRect, (ConstStr255Param) "\p", true,
documentProc, (WindowPtr)(-1), true, 0);
SetPort(r->cmacos.window);
return r; return r;
} }
@ -59,8 +68,7 @@ static void MwLLFreeColorImpl(MwLLColor color) {
} }
static int MwLLPendingImpl(MwLL handle) { static int MwLLPendingImpl(MwLL handle) {
return GetNextEvent(everyEvent, &handle->cmacos.event);
return 0;
} }
static void MwLLNextEventImpl(MwLL handle) { static void MwLLNextEventImpl(MwLL handle) {

View file

@ -383,7 +383,7 @@ static void layout(MwWidget handle) {
MwNtext, "Cancel", MwNtext, "Cancel",
NULL); NULL);
MwAddUserHandler(fc->cancel, MwNactivateHandler, cancel, NULL); MwAddUserHandler(fc->cancel, MwNactivateHandler, filecancel, NULL);
} else { } else {
MwVaApply(fc->cancel, MwVaApply(fc->cancel,
MwNx, wx, MwNx, wx,

View file

@ -135,7 +135,7 @@ static void children_update(MwWidget handle) {
} }
MwClassRec MwBoxClassRec = { MwClassRec MwBoxClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -93,7 +93,7 @@ static void prop_change(MwWidget handle, const char* key) {
} }
MwClassRec MwButtonClassRec = { MwClassRec MwButtonClassRec = {
create, /* create */ wcreate, /* create */
NULL, /* destroy */ NULL, /* destroy */
draw, /* draw */ draw, /* draw */
click, /* click */ click, /* click */

View file

@ -38,7 +38,7 @@ static void prop_change(MwWidget handle, const char* key) {
} }
MwClassRec MwCheckBoxClassRec = { MwClassRec MwCheckBoxClassRec = {
create, /* create */ wcreate, /* create */
NULL, /* destroy */ NULL, /* destroy */
draw, /* draw */ draw, /* draw */
click, /* click */ click, /* click */

View file

@ -189,7 +189,7 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v
} }
MwClassRec MwComboBoxClassRec = { MwClassRec MwComboBoxClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
click, /* click */ click, /* click */

View file

@ -172,7 +172,7 @@ static void clipboard(MwWidget handle, const char* data) {
} }
MwClassRec MwEntryClassRec = { MwClassRec MwEntryClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -46,7 +46,7 @@ static void prop_change(MwWidget handle, const char* key) {
} }
MwClassRec MwFrameClassRec = { MwClassRec MwFrameClassRec = {
create, /* create */ wcreate, /* create */
NULL, /* destroy */ NULL, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -42,7 +42,7 @@ static void prop_change(MwWidget handle, const char* key) {
} }
MwClassRec MwImageClassRec = { MwClassRec MwImageClassRec = {
create, /* create */ wcreate, /* create */
NULL, /* destroy */ NULL, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -360,7 +360,7 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v
} }
MwClassRec MwLabelClassRec = { MwClassRec MwLabelClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -595,7 +595,7 @@ static void tick(MwWidget handle) {
} }
MwClassRec MwListBoxClassRec = { MwClassRec MwListBoxClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -189,7 +189,7 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v
} }
MwClassRec MwMenuClassRec = { MwClassRec MwMenuClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -128,7 +128,7 @@ static void prop_change(MwWidget handle, const char* prop) {
} }
MwClassRec MwNumberEntryClassRec = { MwClassRec MwNumberEntryClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -46,7 +46,7 @@ static void prop_change(MwWidget handle, const char* key) {
} }
MwClassRec MwProgressBarClassRec = { MwClassRec MwProgressBarClassRec = {
create, /* create */ wcreate, /* create */
NULL, /* destroy */ NULL, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -47,7 +47,7 @@ static void prop_change(MwWidget handle, const char* key) {
} }
MwClassRec MwRadioBoxClassRec = { MwClassRec MwRadioBoxClassRec = {
create, /* create */ wcreate, /* create */
NULL, /* destroy */ NULL, /* destroy */
draw, /* draw */ draw, /* draw */
click, /* click */ click, /* click */

View file

@ -257,7 +257,7 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v
} }
MwClassRec MwScrollBarClassRec = { MwClassRec MwScrollBarClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -35,7 +35,7 @@ static void prop_change(MwWidget handle, const char* key) {
} }
MwClassRec MwSeparatorClassRec = { MwClassRec MwSeparatorClassRec = {
create, /* create */ wcreate, /* create */
NULL, /* destroy */ NULL, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -241,7 +241,7 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v
} }
MwClassRec MwSubMenuClassRec = { MwClassRec MwSubMenuClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
click, /* click */ click, /* click */

View file

@ -481,7 +481,7 @@ static void tick(MwWidget handle) {
} }
MwClassRec MwTreeViewClassRec = { MwClassRec MwTreeViewClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -176,7 +176,7 @@ static void tick(MwWidget handle) {
} }
MwClassRec MwViewportClassRec = { MwClassRec MwViewportClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -556,7 +556,7 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v
} }
MwClassRec MwVulkanClassRec = { MwClassRec MwVulkanClassRec = {
create, /* create */ wcreate, /* create */
destroy, /* destroy */ destroy, /* destroy */
NULL, /* draw */ NULL, /* draw */
NULL, /* click */ NULL, /* click */

View file

@ -44,7 +44,7 @@ static void func_handler(MwWidget handle, const char* name, void* out, va_list v
} }
} }
MwClassRec MwWindowClassRec = { MwClassRec MwWindowClassRec = {
create, /* create */ wcreate, /* create */
NULL, /* destroy */ NULL, /* destroy */
draw, /* draw */ draw, /* draw */
NULL, /* click */ NULL, /* click */