diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 3e6fc50d..ed95a551 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -5,7 +5,7 @@ on: - '**' jobs: - apple-arm64: + catalyst-arm64: runs-on: macos-latest steps: @@ -17,13 +17,94 @@ jobs: - name: Compile env: CC: clang - CFLAGS: '-O2 -g -target arm64-apple-macos10.5 -flto -fomit-frame-pointer -fno-stack-protector -pipe' + CFLAGS: '-O2 -g -target arm64-apple-ios-macabi -miphoneos-version-min=13.1 -flto -fomit-frame-pointer -fno-stack-protector -pipe' LDFLAGS: '-Wl,-dead_strip_dylibs' shell: bash run: | cmake -B ${{github.workspace}}/build \ -G "Unix Makefiles" \ - -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/dist/darwin/arm64 \ + -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/dist/catalyst/arm64 \ + -D CMAKE_VERBOSE_MAKEFILE=true \ + -D BUILD_SHARED_LIBS=ON \ + -D USE_APPLICATION_SERVICES=OFF \ + -D USE_IOKIT=OFF \ + -D USE_APPKIT=OFF \ + -D BUILD_DEMO=OFF + + cmake --build ${{github.workspace}}/build \ + --parallel 2 \ + --config RelWithDebInfo \ + --clean-first + + cmake --install ${{github.workspace}}/build --config RelWithDebInfo + + - name: Upload + uses: actions/upload-artifact@v4 + with: + name: ${{github.job}} + path: ${{github.workspace}}/dist/**/* + overwrite: true + + catalyst-x86_64: + runs-on: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v1 + with: + submodules: true + + - name: Compile + env: + CC: clang + CFLAGS: '-O2 -g -target x86_64-apple-ios-macabi -miphoneos-version-min=13.1 -flto -fomit-frame-pointer -fno-stack-protector -pipe' + LDFLAGS: '-Wl,-dead_strip_dylibs' + shell: bash + run: | + cmake -B ${{github.workspace}}/build \ + -G "Unix Makefiles" \ + -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/dist/catalyst/x86_64 \ + -D CMAKE_VERBOSE_MAKEFILE=true \ + -D BUILD_SHARED_LIBS=ON \ + -D USE_APPLICATION_SERVICES=OFF \ + -D USE_IOKIT=OFF \ + -D USE_APPKIT=OFF \ + -D BUILD_DEMO=OFF + + cmake --build ${{github.workspace}}/build \ + --parallel 2 \ + --config RelWithDebInfo \ + --clean-first + + cmake --install ${{github.workspace}}/build --config RelWithDebInfo + + - name: Upload + uses: actions/upload-artifact@v4 + with: + name: ${{github.job}} + path: ${{github.workspace}}/dist/**/* + overwrite: true + + + macos-arm64: + runs-on: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v1 + with: + submodules: true + + - name: Compile + env: + CC: clang + CFLAGS: '-O2 -g -target arm64-apple-macos -mmacosx-version-min=10.5 -flto -fomit-frame-pointer -fno-stack-protector -pipe' + LDFLAGS: '-Wl,-dead_strip_dylibs' + shell: bash + run: | + cmake -B ${{github.workspace}}/build \ + -G "Unix Makefiles" \ + -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/dist/macos/arm64 \ -D CMAKE_VERBOSE_MAKEFILE=true \ -D BUILD_SHARED_LIBS=ON \ -D BUILD_DEMO=ON @@ -36,12 +117,13 @@ jobs: cmake --install ${{github.workspace}}/build --config RelWithDebInfo - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: nightly-build + name: ${{github.job}} path: ${{github.workspace}}/dist/**/* + overwrite: true - apple-x86_64: + macos-x86_64: runs-on: macos-latest steps: @@ -53,13 +135,13 @@ jobs: - name: Compile env: CC: clang - CFLAGS: '-O2 -g -target x86_64-apple-macos10.5 -flto -fomit-frame-pointer -fno-stack-protector -pipe' + CFLAGS: '-O2 -g -target x86_64-apple-macos -mmacosx-version-min=10.5 -flto -fomit-frame-pointer -fno-stack-protector -pipe' LDFLAGS: '-Wl,-dead_strip_dylibs' shell: bash run: | cmake -B ${{github.workspace}}/build \ -G "Unix Makefiles" \ - -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/dist/darwin/x86_64 \ + -D CMAKE_INSTALL_PREFIX=${{github.workspace}}/dist/macos/x86_64 \ -D CMAKE_VERBOSE_MAKEFILE=true \ -D BUILD_SHARED_LIBS=ON \ -D BUILD_DEMO=ON @@ -72,10 +154,11 @@ jobs: cmake --install ${{github.workspace}}/build --config RelWithDebInfo - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: nightly-build + name: ${{github.job}} path: ${{github.workspace}}/dist/**/* + overwrite: true linux-arm: @@ -97,7 +180,7 @@ jobs: deb [arch=amd64,i386] http://us.archive.ubuntu.com/ubuntu ${DISTRIB_CODENAME}-backports main universe # This only seems to be required on GitHub images deb [arch=amd64,i386] https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu ${DISTRIB_CODENAME} main - + deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports ${DISTRIB_CODENAME} main universe deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports ${DISTRIB_CODENAME}-updates main universe deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports ${DISTRIB_CODENAME}-backports main universe @@ -145,10 +228,11 @@ jobs: cmake --install ${{github.workspace}}/build --config RelWithDebInfo - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: nightly-build + name: ${{github.job}} path: ${{github.workspace}}/dist/**/* + overwrite: true linux-arm64: runs-on: ubuntu-latest @@ -217,10 +301,11 @@ jobs: cmake --install ${{github.workspace}}/build --config RelWithDebInfo - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: nightly-build + name: ${{github.job}} path: ${{github.workspace}}/dist/**/* + overwrite: true linux-x86: runs-on: ubuntu-latest @@ -283,10 +368,11 @@ jobs: cmake --install ${{github.workspace}}/build --config RelWithDebInfo - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: nightly-build + name: ${{github.job}} path: ${{github.workspace}}/dist/**/* + overwrite: true linux-x86_64: runs-on: ubuntu-latest @@ -333,10 +419,11 @@ jobs: cmake --install ${{github.workspace}}/build --config RelWithDebInfo - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: nightly-build + name: ${{github.job}} path: ${{github.workspace}}/dist/**/* + overwrite: true windows-arm: @@ -370,10 +457,11 @@ jobs: cmake --install ${{github.workspace}}\build --config RelWithDebInfo - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: nightly-build + name: ${{github.job}} path: ${{github.workspace}}/dist/**/* + overwrite: true windows-x86: runs-on: windows-latest @@ -406,10 +494,11 @@ jobs: cmake --install ${{github.workspace}}\build --config RelWithDebInfo - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: nightly-build + name: ${{github.job}} path: ${{github.workspace}}/dist/**/* + overwrite: true windows-x86_64: runs-on: windows-latest @@ -442,7 +531,8 @@ jobs: cmake --install ${{github.workspace}}\build --config RelWithDebInfo - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: nightly-build + name: ${{github.job}} path: ${{github.workspace}}/dist/**/* + overwrite: true diff --git a/CMakeLists.txt b/CMakeLists.txt index 8186905d..2d87d49f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -194,21 +194,29 @@ if(UNIX AND NOT APPLE) endif() elseif(APPLE) set(CMAKE_MACOSX_RPATH 1) - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.5") - - find_package(Threads REQUIRED) - target_link_libraries(uiohook "${CMAKE_THREAD_LIBS_INIT}") - - find_library(CARBON Carbon REQUIRED) - target_include_directories(uiohook PRIVATE "${CARBON}") - target_link_libraries(uiohook "${CARBON}") option(USE_APPLICATION_SERVICES "ApplicationServices framework (default: ON)" ON) if(USE_APPLICATION_SERVICES) + find_package(Threads REQUIRED) + target_link_libraries(uiohook "${CMAKE_THREAD_LIBS_INIT}") + + find_library(CARBON Carbon REQUIRED) + target_include_directories(uiohook PRIVATE "${CARBON}") + target_link_libraries(uiohook "${CARBON}") + find_library(APPLICATION_SERVICES ApplicationServices REQUIRED) add_compile_definitions(USE_APPLICATION_SERVICES) target_include_directories(uiohook PRIVATE "${APPLICATION_SERVICES}") target_link_libraries(uiohook "${APPLICATION_SERVICES}") + else() + # If we aren't using APPLICATION_SERVICES, we need to link against other required libraries. + find_library(CORE_FOUNDATION CoreFoundation REQUIRED) + target_include_directories(uiohook PRIVATE "${CORE_FOUNDATION}") + target_link_libraries(uiohook "${CORE_FOUNDATION}") + + find_library(CORE_GRAPHICS CoreGraphics REQUIRED) + target_include_directories(uiohook PRIVATE "${CORE_GRAPHICS}") + target_link_libraries(uiohook "${CORE_GRAPHICS}") endif() option(USE_IOKIT "IOKit framework (default: ON)" ON) diff --git a/src/darwin/dispatch_event.h b/src/darwin/dispatch_event.h index 20ef2bee..2915c816 100644 --- a/src/darwin/dispatch_event.h +++ b/src/darwin/dispatch_event.h @@ -19,7 +19,11 @@ #include #include +#ifdef USE_APPLICATION_SERVICES #include +#else +#include +#endif extern bool dispatch_hook_enabled(uint64_t timestamp); diff --git a/src/darwin/input_helper.c b/src/darwin/input_helper.c index 0c5c727f..d03c8ee4 100644 --- a/src/darwin/input_helper.c +++ b/src/darwin/input_helper.c @@ -33,8 +33,11 @@ #include #endif - // Dynamic library loading for dispatch_sync_f to offload tasks that must run on the main runloop. +#if (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_6) \ + || (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_4_0) +typedef struct dispatch_queue_s *dispatch_queue_t; +#endif static struct dispatch_queue_s *dispatch_main_queue_s; static void (*dispatch_sync_f_f)(dispatch_queue_t, void *, void (*function)(void *)); @@ -549,10 +552,10 @@ static void tis_message_to_nsevent(void *info) { if (data_ref != NULL) { if (CFDataGetLength(data_ref) >= 132) { UInt8 buffer[4]; - CFDataGetBytes(data_ref, CFRangeMake(120, 4), &buffer); + CFDataGetBytes(data_ref, CFRangeMake(120, 4), &buffer[0]); tis->subtype = CFSwapInt32BigToHost(*((UInt32 *) &buffer)); - CFDataGetBytes(data_ref, CFRangeMake(128, 4), &buffer); + CFDataGetBytes(data_ref, CFRangeMake(128, 4), &buffer[0]); tis->data1 = CFSwapInt32BigToHost(*((UInt32 *) &buffer)); CFRelease(data_ref); @@ -728,7 +731,6 @@ static void tis_message_to_unicode(void *info) { tis->length = 0; } } - } } diff --git a/src/darwin/input_helper.h b/src/darwin/input_helper.h index ec949cf9..46b60024 100644 --- a/src/darwin/input_helper.h +++ b/src/darwin/input_helper.h @@ -23,14 +23,173 @@ #ifndef _included_input_helper #define _included_input_helper +#ifdef USE_APPLICATION_SERVICES #include #include // For HIToolbox kVK_ key codes and TIS functions. +#else +#include +#include +#endif #ifdef USE_IOKIT #include #endif #include +#ifndef USE_APPLICATION_SERVICES +// If we are not using ApplicationServices, we don't need Carbon.HIToolbox but we still need some of the constants. + +/* + * Summary: + * Virtual keycodes + * + * Discussion: + * These constants are the virtual keycodes defined originally in + * Inside Mac Volume V, pg. V-191. They identify physical keys on a + * keyboard. Those constants with "ANSI" in the name are labeled + * according to the key position on an ANSI-standard US keyboard. + * For example, kVK_ANSI_A indicates the virtual keycode for the key + * with the letter 'A' in the US keyboard layout. Other keyboard + * layouts may have the 'A' key label on a different physical key; + * in this case, pressing 'A' will generate a different virtual + * keycode. + */ +enum { + kVK_ANSI_A = 0x00, + kVK_ANSI_S = 0x01, + kVK_ANSI_D = 0x02, + kVK_ANSI_F = 0x03, + kVK_ANSI_H = 0x04, + kVK_ANSI_G = 0x05, + kVK_ANSI_Z = 0x06, + kVK_ANSI_X = 0x07, + kVK_ANSI_C = 0x08, + kVK_ANSI_V = 0x09, + kVK_ANSI_B = 0x0B, + kVK_ANSI_Q = 0x0C, + kVK_ANSI_W = 0x0D, + kVK_ANSI_E = 0x0E, + kVK_ANSI_R = 0x0F, + kVK_ANSI_Y = 0x10, + kVK_ANSI_T = 0x11, + kVK_ANSI_1 = 0x12, + kVK_ANSI_2 = 0x13, + kVK_ANSI_3 = 0x14, + kVK_ANSI_4 = 0x15, + kVK_ANSI_6 = 0x16, + kVK_ANSI_5 = 0x17, + kVK_ANSI_Equal = 0x18, + kVK_ANSI_9 = 0x19, + kVK_ANSI_7 = 0x1A, + kVK_ANSI_Minus = 0x1B, + kVK_ANSI_8 = 0x1C, + kVK_ANSI_0 = 0x1D, + kVK_ANSI_RightBracket = 0x1E, + kVK_ANSI_O = 0x1F, + kVK_ANSI_U = 0x20, + kVK_ANSI_LeftBracket = 0x21, + kVK_ANSI_I = 0x22, + kVK_ANSI_P = 0x23, + kVK_ANSI_L = 0x25, + kVK_ANSI_J = 0x26, + kVK_ANSI_Quote = 0x27, + kVK_ANSI_K = 0x28, + kVK_ANSI_Semicolon = 0x29, + kVK_ANSI_Backslash = 0x2A, + kVK_ANSI_Comma = 0x2B, + kVK_ANSI_Slash = 0x2C, + kVK_ANSI_N = 0x2D, + kVK_ANSI_M = 0x2E, + kVK_ANSI_Period = 0x2F, + kVK_ANSI_Grave = 0x32, + kVK_ANSI_KeypadDecimal = 0x41, + kVK_ANSI_KeypadMultiply = 0x43, + kVK_ANSI_KeypadPlus = 0x45, + kVK_ANSI_KeypadClear = 0x47, + kVK_ANSI_KeypadDivide = 0x4B, + kVK_ANSI_KeypadEnter = 0x4C, + kVK_ANSI_KeypadMinus = 0x4E, + kVK_ANSI_KeypadEquals = 0x51, + kVK_ANSI_Keypad0 = 0x52, + kVK_ANSI_Keypad1 = 0x53, + kVK_ANSI_Keypad2 = 0x54, + kVK_ANSI_Keypad3 = 0x55, + kVK_ANSI_Keypad4 = 0x56, + kVK_ANSI_Keypad5 = 0x57, + kVK_ANSI_Keypad6 = 0x58, + kVK_ANSI_Keypad7 = 0x59, + kVK_ANSI_Keypad8 = 0x5B, + kVK_ANSI_Keypad9 = 0x5C +}; + +/* keycodes for keys that are independent of keyboard layout*/ +enum { + kVK_Return = 0x24, + kVK_Tab = 0x30, + kVK_Space = 0x31, + kVK_Delete = 0x33, + kVK_Escape = 0x35, + kVK_Command = 0x37, + kVK_Shift = 0x38, + kVK_CapsLock = 0x39, + kVK_Option = 0x3A, + kVK_Control = 0x3B, + kVK_RightShift = 0x3C, + kVK_RightOption = 0x3D, + kVK_RightControl = 0x3E, + kVK_Function = 0x3F, + kVK_F17 = 0x40, + kVK_VolumeUp = 0x48, + kVK_VolumeDown = 0x49, + kVK_Mute = 0x4A, + kVK_F18 = 0x4F, + kVK_F19 = 0x50, + kVK_F20 = 0x5A, + kVK_F5 = 0x60, + kVK_F6 = 0x61, + kVK_F7 = 0x62, + kVK_F3 = 0x63, + kVK_F8 = 0x64, + kVK_F9 = 0x65, + kVK_F11 = 0x67, + kVK_F13 = 0x69, + kVK_F16 = 0x6A, + kVK_F14 = 0x6B, + kVK_F10 = 0x6D, + kVK_F12 = 0x6F, + kVK_F15 = 0x71, + kVK_Help = 0x72, + kVK_Home = 0x73, + kVK_PageUp = 0x74, + kVK_ForwardDelete = 0x75, + kVK_F4 = 0x76, + kVK_End = 0x77, + kVK_F2 = 0x78, + kVK_PageDown = 0x79, + kVK_F1 = 0x7A, + kVK_LeftArrow = 0x7B, + kVK_RightArrow = 0x7C, + kVK_DownArrow = 0x7D, + kVK_UpArrow = 0x7E +}; + +/* ISO keyboards only*/ +enum { + kVK_ISO_Section = 0x0A +}; + +/* JIS keyboards only*/ +enum { + kVK_JIS_Yen = 0x5D, + kVK_JIS_Underscore = 0x5E, + kVK_JIS_KeypadComma = 0x5F, + kVK_JIS_Eisu = 0x66, + kVK_JIS_Kana = 0x68 +}; + +#endif + + #ifndef USE_IOKIT // Some of the system key codes that maybe missing from IOKit. They appear to have shown up over the years. diff --git a/src/darwin/input_hook.c b/src/darwin/input_hook.c index bdbc062d..bc64ec15 100644 --- a/src/darwin/input_hook.c +++ b/src/darwin/input_hook.c @@ -42,10 +42,6 @@ typedef struct _event_runloop_info { static id auto_release_pool; #endif -#if __MAC_OS_X_VERSION_MAX_ALLOWED <= 1050 -typedef void* dispatch_queue_t; -#endif - #ifdef USE_EPOCH_TIME #include