Skip to content

Commit

Permalink
Merge pull request #113 from IsaacMarovitz/3.0.0
Browse files Browse the repository at this point in the history
Merging up 3.0.0 features to master
  • Loading branch information
JoseMoreville committed May 8, 2023
2 parents 1e87c22 + ac33fe5 commit 7aff631
Show file tree
Hide file tree
Showing 26 changed files with 1,750 additions and 513 deletions.
104 changes: 92 additions & 12 deletions AKPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ class AKPlugin: NSObject, Plugin {
}

var mousePoint: CGPoint {
NSApplication.shared.windows.first!.mouseLocationOutsideOfEventStream as CGPoint
NSApplication.shared.windows.first?.mouseLocationOutsideOfEventStream ?? CGPoint()
}

var windowFrame: CGRect {
NSApplication.shared.windows.first!.frame as CGRect
NSApplication.shared.windows.first?.frame ?? CGRect()
}

var isMainScreenEqualToFirst: Bool {
Expand All @@ -37,9 +37,19 @@ class AKPlugin: NSObject, Plugin {
NSApplication.shared.windows.first!.styleMask.contains(.fullScreen)
}

var cmdPressed: Bool = false

func hideCursor() {
NSCursor.hide()
CGAssociateMouseAndMouseCursorPosition(0)
warpCursor()
}

func warpCursor() {
guard let firstScreen = NSScreen.screens.first else {return}
let frame = windowFrame
// Convert from NS coordinates to CG coordinates
CGWarpMouseCursorPosition(CGPoint(x: frame.midX, y: firstScreen.frame.height - frame.midY))
}

func unhideCursor() {
Expand All @@ -51,25 +61,90 @@ class AKPlugin: NSObject, Plugin {
NSApplication.shared.terminate(self)
}

func eliminateRedundantKeyPressEvents(_ dontIgnore: @escaping() -> Bool) {
private var modifierFlag: UInt = 0
func setupKeyboard(keyboard: @escaping(UInt16, Bool, Bool) -> Bool,
swapMode: @escaping() -> Bool) {
func checkCmd(modifier: NSEvent.ModifierFlags) -> Bool {
if modifier.contains(.command) {
self.cmdPressed = true
return true
} else if self.cmdPressed {
self.cmdPressed = false
}
return false
}
NSEvent.addLocalMonitorForEvents(matching: .keyDown, handler: { event in
if dontIgnore() {
if checkCmd(modifier: event.modifierFlags) {
return event
}
return nil
let consumed = keyboard(event.keyCode, true, event.isARepeat)
if consumed {
return nil
}
return event
})
NSEvent.addLocalMonitorForEvents(matching: .keyUp, handler: { event in
if checkCmd(modifier: event.modifierFlags) {
return event
}
let consumed = keyboard(event.keyCode, false, false)
if consumed {
return nil
}
return event
})
NSEvent.addLocalMonitorForEvents(matching: .flagsChanged, handler: { event in
if checkCmd(modifier: event.modifierFlags) {
return event
}
let pressed = self.modifierFlag < event.modifierFlags.rawValue
let changed = self.modifierFlag ^ event.modifierFlags.rawValue
self.modifierFlag = event.modifierFlags.rawValue
if pressed && NSEvent.ModifierFlags(rawValue: changed).contains(.option) {
if swapMode() {
return nil
}
return event
}
let consumed = keyboard(event.keyCode, pressed, false)
if consumed {
return nil
}
return event
})
}

func setupMouseMoved(mouseMoved: @escaping(CGFloat, CGFloat) -> Bool) {
let mask: NSEvent.EventTypeMask = [.leftMouseDragged, .otherMouseDragged, .rightMouseDragged]
NSEvent.addLocalMonitorForEvents(matching: mask, handler: { event in
let consumed = mouseMoved(event.deltaX, event.deltaY)
if consumed {
return nil
}
return event
})
// transpass mouse moved event when no button pressed, for traffic light button to light up
NSEvent.addLocalMonitorForEvents(matching: .mouseMoved, handler: { event in
_ = mouseMoved(event.deltaX, event.deltaY)
return event
})
}

func setupMouseButton(_ _up: Int, _ _down: Int, _ dontIgnore: @escaping(Int, Bool, Bool) -> Bool) {
NSEvent.addLocalMonitorForEvents(matching: NSEvent.EventTypeMask(rawValue: UInt64(_up)), handler: { event in
let isEventWindow = event.window == NSApplication.shared.windows.first!
if dontIgnore(_up, true, isEventWindow) {
func setupMouseButton(left: Bool, right: Bool, _ dontIgnore: @escaping(Bool) -> Bool) {
let downType: NSEvent.EventTypeMask = left ? .leftMouseDown : right ? .rightMouseDown : .otherMouseDown
let upType: NSEvent.EventTypeMask = left ? .leftMouseUp : right ? .rightMouseUp : .otherMouseUp
NSEvent.addLocalMonitorForEvents(matching: downType, handler: { event in
// For traffic light buttons when fullscreen
if event.window != NSApplication.shared.windows.first! {
return event
}
if dontIgnore(true) {
return event
}
return nil
})
NSEvent.addLocalMonitorForEvents(matching: NSEvent.EventTypeMask(rawValue: UInt64(_down)), handler: { event in
if dontIgnore(_up, false, true) {
NSEvent.addLocalMonitorForEvents(matching: upType, handler: { event in
if dontIgnore(false) {
return event
}
return nil
Expand All @@ -78,7 +153,12 @@ class AKPlugin: NSObject, Plugin {

func setupScrollWheel(_ onMoved: @escaping(CGFloat, CGFloat) -> Bool) {
NSEvent.addLocalMonitorForEvents(matching: NSEvent.EventTypeMask.scrollWheel, handler: { event in
let consumed = onMoved(event.scrollingDeltaX, event.scrollingDeltaY)
var deltaX = event.scrollingDeltaX, deltaY = event.scrollingDeltaY
if !event.hasPreciseScrollingDeltas {
deltaX *= 16
deltaY *= 16
}
let consumed = onMoved(deltaX, deltaY)
if consumed {
return nil
}
Expand Down
43 changes: 43 additions & 0 deletions PlayTools.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
6E7663A528D0FEBE00DE4AF9 /* AKPluginLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E7663A428D0FEBE00DE4AF9 /* AKPluginLoader.swift */; };
6E84A14528D0F94E00BF7495 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA818CBA287ABFD5000BEE9D /* UIKit.framework */; };
6E84A15028D0F97500BF7495 /* AKInterface.bundle in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6E84A14C28D0F96D00BF7495 /* AKInterface.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
951D8275299D097C00D35B20 /* Playtools.strings in Resources */ = {isa = PBXBuildFile; fileRef = 951D8277299D097C00D35B20 /* Playtools.strings */; };
95A553E729F2BBB200E34C26 /* PlayController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A553E629F2BBB200E34C26 /* PlayController.swift */; };
AA71970B287A44D200623C15 /* PlayLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = AA719702287A44D200623C15 /* PlayLoader.m */; };
AA71970D287A44D200623C15 /* PlaySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA719704287A44D200623C15 /* PlaySettings.swift */; };
AA71970E287A44D200623C15 /* PlayLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = AA719705287A44D200623C15 /* PlayLoader.h */; };
Expand Down Expand Up @@ -45,6 +47,9 @@
AA719870287A81A000623C15 /* UIEvent+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = AA719842287A81A000623C15 /* UIEvent+Private.h */; };
AA719872287A81A000623C15 /* UITouch+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = AA719844287A81A000623C15 /* UITouch+Private.h */; };
AA818CB9287ABFB1000BEE9D /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA818CB8287ABFB1000BEE9D /* IOKit.framework */; };
AB7DA47529B85BFB0034ACB2 /* PlayShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = AB7DA47429B85BFB0034ACB2 /* PlayShadow.m */; };
AB7DA47729B8A78B0034ACB2 /* PlayShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = AB7DA47629B8A78B0034ACB2 /* PlayShadow.h */; };
ABCECEE629750BA600746595 /* PlayedApple.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABCECEE529750BA600746595 /* PlayedApple.swift */; };
B127172228817AB90025112B /* SwordRPC in Frameworks */ = {isa = PBXBuildFile; productRef = B127172128817AB90025112B /* SwordRPC */; };
B127172528817C040025112B /* DiscordIPC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B127172428817C040025112B /* DiscordIPC.swift */; };
B1271729288284BE0025112B /* DiscordActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1271728288284BE0025112B /* DiscordActivity.swift */; };
Expand Down Expand Up @@ -72,6 +77,9 @@
6E7663A028D0FB5300DE4AF9 /* AKPlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AKPlugin.swift; sourceTree = "<group>"; };
6E7663A428D0FEBE00DE4AF9 /* AKPluginLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AKPluginLoader.swift; sourceTree = "<group>"; };
6E84A14C28D0F96D00BF7495 /* AKInterface.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AKInterface.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
951D8276299D097C00D35B20 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Playtools.strings; sourceTree = "<group>"; };
951D8278299D098000D35B20 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Playtools.strings"; sourceTree = "<group>"; };
95A553E629F2BBB200E34C26 /* PlayController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayController.swift; sourceTree = "<group>"; };
AA7196D8287A447700623C15 /* PlayTools.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PlayTools.framework; sourceTree = BUILT_PRODUCTS_DIR; };
AA719702287A44D200623C15 /* PlayLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PlayLoader.m; sourceTree = "<group>"; };
AA719704287A44D200623C15 /* PlaySettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaySettings.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -107,6 +115,9 @@
AA719844287A81A000623C15 /* UITouch+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITouch+Private.h"; sourceTree = "<group>"; };
AA818CB8287ABFB1000BEE9D /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/System/Library/Frameworks/IOKit.framework; sourceTree = DEVELOPER_DIR; };
AA818CBA287ABFD5000BEE9D /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/System/iOSSupport/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
AB7DA47429B85BFB0034ACB2 /* PlayShadow.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlayShadow.m; sourceTree = "<group>"; };
AB7DA47629B8A78B0034ACB2 /* PlayShadow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlayShadow.h; sourceTree = "<group>"; };
ABCECEE529750BA600746595 /* PlayedApple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayedApple.swift; sourceTree = "<group>"; };
B127172428817C040025112B /* DiscordIPC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscordIPC.swift; sourceTree = "<group>"; };
B1271728288284BE0025112B /* DiscordActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscordActivity.swift; sourceTree = "<group>"; };
B1E8CF8928BBE2AB004340D3 /* Keymapping.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keymapping.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -146,6 +157,7 @@
AA7196CE287A447700623C15 = {
isa = PBXGroup;
children = (
951D8277299D097C00D35B20 /* Playtools.strings */,
AA7196DA287A447700623C15 /* PlayTools */,
6E76639928D0FA6F00DE4AF9 /* AKInterface */,
AA7196D9287A447700623C15 /* Products */,
Expand All @@ -165,6 +177,7 @@
AA7196DA287A447700623C15 /* PlayTools */ = {
isa = PBXGroup;
children = (
ABCECEE729750BB100746595 /* MysticRunes */,
B127172328817AC70025112B /* DiscordActivity */,
AA719721287A480C00623C15 /* Controls */,
AA719799287A481500623C15 /* Keymap */,
Expand All @@ -191,6 +204,7 @@
AA719755287A480C00623C15 /* PlayInput.swift */,
AA719756287A480C00623C15 /* ControlMode.swift */,
AA719757287A480C00623C15 /* MenuController.swift */,
95A553E629F2BBB200E34C26 /* PlayController.swift */,
);
path = Controls;
sourceTree = "<group>";
Expand Down Expand Up @@ -262,6 +276,16 @@
name = Frameworks;
sourceTree = "<group>";
};
ABCECEE729750BB100746595 /* MysticRunes */ = {
isa = PBXGroup;
children = (
ABCECEE529750BA600746595 /* PlayedApple.swift */,
AB7DA47429B85BFB0034ACB2 /* PlayShadow.m */,
AB7DA47629B8A78B0034ACB2 /* PlayShadow.h */,
);
path = MysticRunes;
sourceTree = "<group>";
};
B127172328817AC70025112B /* DiscordActivity */ = {
isa = PBXGroup;
children = (
Expand All @@ -279,6 +303,7 @@
buildActionMask = 2147483647;
files = (
AA71986E287A81A000623C15 /* NSObject+Swizzle.h in Headers */,
AB7DA47729B8A78B0034ACB2 /* PlayShadow.h in Headers */,
AA719846287A81A000623C15 /* IOHIDEvent+KIF.h in Headers */,
AA719862287A81A000623C15 /* UITouch-KIFAdditions.h in Headers */,
AA71986B287A81A000623C15 /* UIApplication+Private.h in Headers */,
Expand Down Expand Up @@ -358,6 +383,7 @@
knownRegions = (
en,
Base,
"zh-Hans",
);
mainGroup = AA7196CE287A447700623C15;
packageReferences = (
Expand Down Expand Up @@ -385,6 +411,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
951D8275299D097C00D35B20 /* Playtools.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -425,6 +452,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
95A553E729F2BBB200E34C26 /* PlayController.swift in Sources */,
AA71975A287A480D00623C15 /* Toucher.swift in Sources */,
AA7197A1287A481500623C15 /* CircleMenuLoader.swift in Sources */,
6E76639B28D0FAE700DE4AF9 /* Plugin.swift in Sources */,
Expand All @@ -447,17 +475,32 @@
AA7197A3287A481500623C15 /* CircleMenuButton.swift in Sources */,
AA7197A9287A481500623C15 /* PlayInfo.swift in Sources */,
AA71986A287A81A000623C15 /* PTFakeMetaTouch.m in Sources */,
ABCECEE629750BA600746595 /* PlayedApple.swift in Sources */,
AA71986C287A81A000623C15 /* NSObject+Swizzle.m in Sources */,
AA71970F287A44D200623C15 /* PlayCover.swift in Sources */,
B127172528817C040025112B /* DiscordIPC.swift in Sources */,
AA719850287A81A000623C15 /* UITouch-KIFAdditions.m in Sources */,
AA71985F287A81A000623C15 /* IOHIDEvent+KIF.m in Sources */,
B1E8CF8A28BBE2AB004340D3 /* Keymapping.swift in Sources */,
AB7DA47529B85BFB0034ACB2 /* PlayShadow.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */

/* Begin PBXVariantGroup section */
951D8277299D097C00D35B20 /* Playtools.strings */ = {
isa = PBXVariantGroup;
children = (
951D8276299D097C00D35B20 /* en */,
951D8278299D098000D35B20 /* zh-Hans */,
);
name = Playtools.strings;
path = PlayTools;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
6E84A14E28D0F96D00BF7495 /* Debug */ = {
isa = XCBuildConfiguration;
Expand Down
48 changes: 37 additions & 11 deletions PlayTools/Controls/ControlMode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,59 @@ let mode = ControlMode.mode
public class ControlMode {

static public let mode = ControlMode()
public var visible: Bool = PlaySettings.shared.mouseMapping
public var visible: Bool = true
public var keyboardMapped = true

public static func trySwap() -> Bool {
if PlayInput.shouldLockCursor {
mode.show(!mode.visible)
return true
}
mode.show(true)
return false
}

func setMapping(_ mapped: Bool) {
if mapped {
PlayInput.shared.parseKeymap()
} else {
show(true)
PlayInput.shared.invalidate()
}
keyboardMapped = mapped
}

func show(_ show: Bool) {
if !editor.editorMode {
if keyboardMapped {
if show {
if !visible {
NotificationCenter.default.post(name: NSNotification.Name.playtoolsCursorWillShow,
object: nil, userInfo: [:])
if screen.fullscreen {
screen.switchDock(true)
}
if PlaySettings.shared.mouseMapping {
AKInterface.shared!.unhideCursor()
}
PlayInput.shared.invalidate()
AKInterface.shared!.unhideCursor()
}
} else {
if visible {
if PlaySettings.shared.mouseMapping {
AKInterface.shared!.hideCursor()
}
NotificationCenter.default.post(name: NSNotification.Name.playtoolsCursorWillHide,
object: nil, userInfo: [:])
AKInterface.shared!.hideCursor()
if screen.fullscreen {
screen.switchDock(false)
}

PlayInput.shared.setup()
}
}
Toucher.writeLog(logMessage: "cursor show switched to \(show)")
visible = show
}
}
}

extension NSNotification.Name {
public static let playtoolsCursorWillHide: NSNotification.Name
= NSNotification.Name("playtools.cursorWillHide")

public static let playtoolsCursorWillShow: NSNotification.Name
= NSNotification.Name("playtools.cursorWillShow")
}
Loading

0 comments on commit 7aff631

Please sign in to comment.