From 6c371b844ff119f385ff1153294f4ea16186b9c6 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 14 Oct 2023 19:09:54 +0800 Subject: [PATCH] Repo // Add HangarRash_SwiftyCapsLockToggler. --- .../Framework/include/CapsLockToggler.c | 1 + .../Framework/include/CapsLockToggler.h | 4 ++ .../Package.swift | 33 ++++++++++++++++ .../SwiftyCapsLockToggler.swift | 39 +++++++++++++++++++ Packages/vChewing_MainAssembly/Package.swift | 2 + vChewing.xcodeproj/project.pbxproj | 2 + 6 files changed, 81 insertions(+) create mode 100644 Packages/HangarRash_SwiftyCapsLockToggler/Framework/include/CapsLockToggler.c create mode 100644 Packages/HangarRash_SwiftyCapsLockToggler/Framework/include/CapsLockToggler.h create mode 100644 Packages/HangarRash_SwiftyCapsLockToggler/Package.swift create mode 100644 Packages/HangarRash_SwiftyCapsLockToggler/Sources/SwiftyCapsLockToggler/SwiftyCapsLockToggler.swift diff --git a/Packages/HangarRash_SwiftyCapsLockToggler/Framework/include/CapsLockToggler.c b/Packages/HangarRash_SwiftyCapsLockToggler/Framework/include/CapsLockToggler.c new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Packages/HangarRash_SwiftyCapsLockToggler/Framework/include/CapsLockToggler.c @@ -0,0 +1 @@ + diff --git a/Packages/HangarRash_SwiftyCapsLockToggler/Framework/include/CapsLockToggler.h b/Packages/HangarRash_SwiftyCapsLockToggler/Framework/include/CapsLockToggler.h new file mode 100644 index 00000000..47828a0e --- /dev/null +++ b/Packages/HangarRash_SwiftyCapsLockToggler/Framework/include/CapsLockToggler.h @@ -0,0 +1,4 @@ +// Ref: https://stackoverflow.com/a/75870807/4162914 + +#import +#import diff --git a/Packages/HangarRash_SwiftyCapsLockToggler/Package.swift b/Packages/HangarRash_SwiftyCapsLockToggler/Package.swift new file mode 100644 index 00000000..0be587b7 --- /dev/null +++ b/Packages/HangarRash_SwiftyCapsLockToggler/Package.swift @@ -0,0 +1,33 @@ +// swift-tools-version:5.3 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "SwiftyCapsLockToggler", + platforms: [ + .macOS(.v11), + ], + products: [ + // Products define the executables and libraries a package produces, making them visible to other packages. + .library( + name: "SwiftyCapsLockToggler", + targets: ["SwiftyCapsLockToggler"] + ), + ], + targets: [ + // Targets are the basic building blocks of a package, defining a module or a test suite. + // Targets can depend on other targets in this package and products from dependencies. + .target( + name: "CapsLockToggler", + path: "Framework", + cSettings: [ + .headerSearchPath("include"), + ] + ), + .target( + name: "SwiftyCapsLockToggler", + dependencies: ["CapsLockToggler"] + ), + ] +) diff --git a/Packages/HangarRash_SwiftyCapsLockToggler/Sources/SwiftyCapsLockToggler/SwiftyCapsLockToggler.swift b/Packages/HangarRash_SwiftyCapsLockToggler/Sources/SwiftyCapsLockToggler/SwiftyCapsLockToggler.swift new file mode 100644 index 00000000..bb0c657d --- /dev/null +++ b/Packages/HangarRash_SwiftyCapsLockToggler/Sources/SwiftyCapsLockToggler/SwiftyCapsLockToggler.swift @@ -0,0 +1,39 @@ +// Ref: https://stackoverflow.com/a/75870807/4162914 + +// #import +// #import + +import CapsLockToggler + +public enum CapsLockToggler { + public static func toggle() { + let thePort: mach_port_t = { + if #available(macOS 12.0, *) { + return kIOMainPortDefault + } + return kIOMasterPortDefault + }() + let ioService: io_service_t = IOServiceGetMatchingService(thePort, IOServiceMatching(kIOHIDSystemClass)) + var ioConnect: io_connect_t = 0 + IOServiceOpen(ioService, mach_task_self_, UInt32(kIOHIDParamConnectType), &ioConnect) + var state = false + IOHIDGetModifierLockState(ioConnect, Int32(kIOHIDCapsLockState), &state) + state.toggle() + IOHIDSetModifierLockState(ioConnect, Int32(kIOHIDCapsLockState), state) + IOServiceClose(ioConnect) + } + + public static func turnOff() { + let thePort: mach_port_t = { + if #available(macOS 12.0, *) { + return kIOMainPortDefault + } + return kIOMasterPortDefault + }() + let ioService: io_service_t = IOServiceGetMatchingService(thePort, IOServiceMatching(kIOHIDSystemClass)) + var ioConnect: io_connect_t = 0 + IOServiceOpen(ioService, mach_task_self_, UInt32(kIOHIDParamConnectType), &ioConnect) + IOHIDSetModifierLockState(ioConnect, Int32(kIOHIDCapsLockState), false) + IOServiceClose(ioConnect) + } +} diff --git a/Packages/vChewing_MainAssembly/Package.swift b/Packages/vChewing_MainAssembly/Package.swift index f1f8b0d9..75f08392 100644 --- a/Packages/vChewing_MainAssembly/Package.swift +++ b/Packages/vChewing_MainAssembly/Package.swift @@ -14,6 +14,7 @@ let package = Package( ], dependencies: [ .package(path: "../DanielGalasko_FolderMonitor"), + .package(path: "../HangarRash_SwiftyCapsLockToggler"), .package(path: "../Jad_BookmarkManager"), .package(path: "../Qwertyyb_ShiftKeyUpChecker"), .package(path: "../vChewing_CandidateWindow"), @@ -50,6 +51,7 @@ let package = Package( .product(name: "Shared", package: "vChewing_Shared"), .product(name: "ShiftKeyUpChecker", package: "Qwertyyb_ShiftKeyUpChecker"), .product(name: "SwiftExtension", package: "vChewing_SwiftExtension"), + .product(name: "SwiftyCapsLockToggler", package: "HangarRash_SwiftyCapsLockToggler"), .product(name: "Tekkon", package: "vChewing_Tekkon"), .product(name: "TooltipUI", package: "vChewing_TooltipUI"), .product(name: "Uninstaller", package: "vChewing_Uninstaller"), diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index 79efa04c..aa092374 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -185,6 +185,7 @@ 5B963CA128D5C22D00DCEE88 /* vChewing_SwiftExtension */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = vChewing_SwiftExtension; path = Packages/vChewing_SwiftExtension; sourceTree = ""; }; 5B98114628D6198000CBC605 /* vChewing_PinyinPhonaConverter */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = vChewing_PinyinPhonaConverter; path = Packages/vChewing_PinyinPhonaConverter; sourceTree = ""; }; 5BA8C30128DEFE4F004C5CC4 /* vChewing_CandidateWindow */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = vChewing_CandidateWindow; path = Packages/vChewing_CandidateWindow; sourceTree = ""; }; + 5BAD67E12ADAB62D005A4842 /* HangarRash_SwiftyCapsLockToggler */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = HangarRash_SwiftyCapsLockToggler; path = Packages/HangarRash_SwiftyCapsLockToggler; sourceTree = ""; }; 5BB802D927FABA8300CF1C19 /* SessionCtl_Menu.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = SessionCtl_Menu.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; 5BBBB75D27AED54C0023B93A /* Beep.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = Beep.m4a; sourceTree = ""; }; 5BBBB75E27AED54C0023B93A /* Fart.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = Fart.m4a; sourceTree = ""; }; @@ -443,6 +444,7 @@ children = ( 5BDB7A3128D47587001AC277 /* DanielGalasko_FolderMonitor */, 5BFC63C428D487AE004A77B7 /* Fuziki_NSAttributedTextView */, + 5BAD67E12ADAB62D005A4842 /* HangarRash_SwiftyCapsLockToggler */, 5BDB7A3028D47587001AC277 /* Jad_BookmarkManager */, 5BDB7A3428D47587001AC277 /* Qwertyyb_ShiftKeyUpChecker */, 5BDB7A3528D47587001AC277 /* RMJay_LineReader */,