From 6cca277eebdafe651ef7a55c7e1de0df92bb14a4 Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Fri, 22 Sep 2023 04:01:31 -0700 Subject: [PATCH 1/3] re-add changes for events --- src/windy/platforms/macos/macdefs.nim | 40 +++++++++++++ src/windy/platforms/macos/platform.nim | 77 ++++++++++++++++---------- 2 files changed, 88 insertions(+), 29 deletions(-) diff --git a/src/windy/platforms/macos/macdefs.nim b/src/windy/platforms/macos/macdefs.nim index cb4ba3a..0beb9cb 100644 --- a/src/windy/platforms/macos/macdefs.nim +++ b/src/windy/platforms/macos/macdefs.nim @@ -109,6 +109,44 @@ const NSNormalWindowLevel* = 0.NSWindowLevel NSFloatingWindowLevel* = 3.NSWindowLevel +type + + NSEventType* = enum + NSEventTypeLeftMouseDown = 1, + NSEventTypeLeftMouseUp = 2, + NSEventTypeRightMouseDown = 3, + NSEventTypeRightMouseUp = 4, + NSEventTypeMouseMoved = 5, + NSEventTypeLeftMouseDragged = 6, + NSEventTypeRightMouseDragged = 7, + NSEventTypeMouseEntered = 8, + NSEventTypeMouseExited = 9, + NSEventTypeKeyDown = 10, + NSEventTypeKeyUp = 11, + NSEventTypeFlagsChanged = 12, + NSEventTypeAppKitDefined = 13, + NSEventTypeSystemDefined = 14, + NSEventTypeApplicationDefined = 15, + NSEventTypePeriodic = 16, + NSEventTypeCursorUpdate = 17, + NSEventTypeRotate = 18, + NSEventTypeBeginGesture = 19, + NSEventTypeEndGesture = 20, + NSEventTypeScrollWheel = 22, + NSEventTypeTabletPoint = 23, + NSEventTypeTabletProximity = 24, + NSEventTypeOtherMouseDown = 25, + NSEventTypeOtherMouseUp = 26, + NSEventTypeOtherMouseDragged = 27, + NSEventTypeGesture = 29, + NSEventTypeMagnify = 30, + NSEventTypeSwipe = 31, + NSEventTypeSmartMagnify = 32, + NSEventTypeQuickLook = 33, + NSEventTypePressure = 34, + NSEventTypeDirectTouch = 37 + + var NSApp* {.importc.}: NSApplication NSPasteboardTypeString* {.importc.}: NSPasteboardType @@ -139,6 +177,8 @@ objc: proc locationInWindow*(self: NSEvent): NSPoint proc buttonNumber*(self: NSEvent): int proc keyCode*(self: NSEvent): uint16 + proc type*(self: NSEvent): NSEventType + proc window*(self: NSEvent): NSWindow proc dataWithBytes*(class: typedesc[NSData], x: pointer, length: int): NSData proc length*(self: NSData): uint proc bytes*(self: NSData): pointer diff --git a/src/windy/platforms/macos/platform.nim b/src/windy/platforms/macos/platform.nim index 93c40ed..0054c20 100644 --- a/src/windy/platforms/macos/platform.nim +++ b/src/windy/platforms/macos/platform.nim @@ -496,32 +496,6 @@ proc otherMouseUp(self: ID, cmd: SEL, event: NSEvent): ID {.cdecl.} = else: discard -proc keyDown(self: ID, cmd: SEL, event: NSEvent): ID {.cdecl.} = - let window = windows.forNSWindow(self.NSView.window) - if window == nil: - return - - window.handleButtonPress(keyCodeToButton[event.keyCode.int]) - if window.state.runeInputEnabled: - discard self.NSView.inputContext.handleEvent(event) - -proc keyUp(self: ID, cmd: SEL, event: NSEvent): ID {.cdecl.} = - let window = windows.forNSWindow(self.NSView.window) - if window == nil: - return - window.handleButtonRelease(keyCodeToButton[event.keyCode.int]) - -proc flagsChanged(self: ID, cmd: SEL, event: NSEvent): ID {.cdecl.} = - let window = windows.forNSWindow(self.NSView.window) - if window == nil: - return - - let button = keyCodeToButton[event.keyCode] - if button in window.state.buttonDown: - window.handleButtonRelease(button) - else: - window.handleButtonPress(button) - proc hasMarkedText(self: ID, cmd: SEL): bool {.cdecl.} = let window = windows.forNSWindow(self.NSView.window) if window != nil and window.markedText.int != 0: @@ -717,9 +691,9 @@ proc init() {.raises: [].} = addMethod "rightMouseUp:", rightMouseUp addMethod "otherMouseDown:", otherMouseDown addMethod "otherMouseUp:", otherMouseUp - addMethod "keyDown:", keyDown - addMethod "keyUp:", keyUp - addMethod "flagsChanged:", flagsChanged + # addMethod "keyDown:", keyDown + # addMethod "keyUp:", keyUp + # addMethod "flagsChanged:", flagsChanged addMethod "hasMarkedText", hasMarkedText addMethod "markedRange", markedRange addMethod "selectedRange", selectedRange @@ -742,6 +716,33 @@ proc init() {.raises: [].} = initialized = true +proc keyDown(event: NSEvent) = + let nsWindow = event.window() + let window = windows.forNSWindow(nsWindow) + if window == nil: + return + + window.handleButtonPress(keyCodeToButton[event.keyCode.int]) + if window.state.runeInputEnabled: + discard nsWindow.contentView().inputContext.handleEvent(event) + +proc keyUp(event: NSEvent) = + let window = windows.forNSWindow(event.window()) + if window == nil: + return + window.handleButtonRelease(keyCodeToButton[event.keyCode.int]) + +proc flagsChanged(event: NSEvent) = + let window = windows.forNSWindow(event.window()) + if window == nil: + return + + let button = keyCodeToButton[event.keyCode] + if button in window.state.buttonDown: + window.handleButtonRelease(button) + else: + window.handleButtonPress(button) + proc pollEvents*() = # Draw first (in case a message closes a window or similar) for window in windows: @@ -762,6 +763,24 @@ proc pollEvents*() = ) if event.int == 0: break + + # we skip NSApplication keys here as the normal + # NSApplication misses keyUp events when + # command et al are held down + # + # see: + # - https://stackoverflow.com/questions/24099063/how-do-i-detect-keyup-in-my-nsview-with-the-command-key-held + # - https://lists.apple.com/archives/cocoa-dev/2003/Oct/msg00442.html + # - https://github.com/andlabs/ui/blob/bc848f5c4078b999dbe6ef1cd90e16290a0d1c3a/delegateuitask_darwin.m#L46 + # + if event.`type`() == NSEventTypeKeyDown: + keyDown(event) + elif event.`type`() == NSEventTypeKeyUp: + keyUp(event) + elif event.`type`() == NSEventTypeFlagsChanged: + flagsChanged(event) + + # forward event for app to handle NSApp.sendEvent(event) when defined(windyUseStdHttp): From a5a8941a2018a2b795dfd512b258056770fac685 Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Fri, 22 Sep 2023 18:57:58 -0700 Subject: [PATCH 2/3] fix annoying beeping - need to ignore key events in nsview --- src/windy/platforms/macos/platform.nim | 28 +++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/windy/platforms/macos/platform.nim b/src/windy/platforms/macos/platform.nim index 0054c20..9ca155c 100644 --- a/src/windy/platforms/macos/platform.nim +++ b/src/windy/platforms/macos/platform.nim @@ -496,6 +496,16 @@ proc otherMouseUp(self: ID, cmd: SEL, event: NSEvent): ID {.cdecl.} = else: discard + +proc keyDown(self: ID, cmd: SEL, event: NSEvent): ID {.cdecl.} = + discard + +proc keyUp(self: ID, cmd: SEL, event: NSEvent): ID {.cdecl.} = + discard + +proc flagsChanged(self: ID, cmd: SEL, event: NSEvent): ID {.cdecl.} = + discard + proc hasMarkedText(self: ID, cmd: SEL): bool {.cdecl.} = let window = windows.forNSWindow(self.NSView.window) if window != nil and window.markedText.int != 0: @@ -691,9 +701,9 @@ proc init() {.raises: [].} = addMethod "rightMouseUp:", rightMouseUp addMethod "otherMouseDown:", otherMouseDown addMethod "otherMouseUp:", otherMouseUp - # addMethod "keyDown:", keyDown - # addMethod "keyUp:", keyUp - # addMethod "flagsChanged:", flagsChanged + addMethod "keyDown:", keyDown + addMethod "keyUp:", keyUp + addMethod "flagsChanged:", flagsChanged addMethod "hasMarkedText", hasMarkedText addMethod "markedRange", markedRange addMethod "selectedRange", selectedRange @@ -716,7 +726,7 @@ proc init() {.raises: [].} = initialized = true -proc keyDown(event: NSEvent) = +proc processKeyDown(event: NSEvent) = let nsWindow = event.window() let window = windows.forNSWindow(nsWindow) if window == nil: @@ -726,13 +736,13 @@ proc keyDown(event: NSEvent) = if window.state.runeInputEnabled: discard nsWindow.contentView().inputContext.handleEvent(event) -proc keyUp(event: NSEvent) = +proc processKeyUp(event: NSEvent) = let window = windows.forNSWindow(event.window()) if window == nil: return window.handleButtonRelease(keyCodeToButton[event.keyCode.int]) -proc flagsChanged(event: NSEvent) = +proc processFlagsChanged(event: NSEvent) = let window = windows.forNSWindow(event.window()) if window == nil: return @@ -774,11 +784,11 @@ proc pollEvents*() = # - https://github.com/andlabs/ui/blob/bc848f5c4078b999dbe6ef1cd90e16290a0d1c3a/delegateuitask_darwin.m#L46 # if event.`type`() == NSEventTypeKeyDown: - keyDown(event) + processKeyDown(event) elif event.`type`() == NSEventTypeKeyUp: - keyUp(event) + processKeyUp(event) elif event.`type`() == NSEventTypeFlagsChanged: - flagsChanged(event) + processFlagsChanged(event) # forward event for app to handle NSApp.sendEvent(event) From 9e3a30259f75c514d1b59963631825f8c74ae5fe Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Fri, 22 Sep 2023 21:10:09 -0700 Subject: [PATCH 3/3] cleanup --- src/windy/platforms/macos/platform.nim | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/windy/platforms/macos/platform.nim b/src/windy/platforms/macos/platform.nim index 9ca155c..7c47371 100644 --- a/src/windy/platforms/macos/platform.nim +++ b/src/windy/platforms/macos/platform.nim @@ -331,6 +331,7 @@ proc windowDidBecomeKey( if window.onFocusChange != nil: window.onFocusChange() handleMouseMove(window, window.inner.mouseLocationOutsideOfEventStream) + window.state.buttonDown = {} proc windowDidResignKey( self: ID, @@ -340,6 +341,7 @@ proc windowDidResignKey( let window = windows.forNSWindow(self.NSWindow) if window != nil and window.onFocusChange != nil: window.onFocusChange() + window.state.buttonDown = {} proc windowShouldClose( self: ID,