~eliasnaur/gio-patches

This thread contains a patchset. You're looking at the original emails, but you may wish to use the patch review UI. Review patch
1

[PATCH] gio: app: send keypress events for modifier keys in macos

Details
Message ID
<20241001020027.4089200-1-kanobe@gmail.com>
DKIM signature
pass
Download raw message
Patch: +52 -0
This change generates keypress and release events for modifier keys in
MacOS. Specifically the Control, Alt, Shift and Command keys.
---
 app/os_macos.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 app/os_macos.m  |  4 ++++
 2 files changed, 52 insertions(+)

diff --git a/app/os_macos.go b/app/os_macos.go
index d62bb645..877b6a7c 100644
--- a/app/os_macos.go
+++ b/app/os_macos.go
@@ -561,6 +561,54 @@ func gio_onKeys(h C.uintptr_t, cstr C.CFTypeRef, ti C.double, mods C.NSUInteger,
	}
}

var lastModsOnFlagsChanged C.NSUInteger

type onFlagsChangedLogicTableEntry struct {
	modKeyMask C.NSUInteger
	modKeyName key.Name
}

var onFlagsChangedLogicTable = []onFlagsChangedLogicTableEntry{
	onFlagsChangedLogicTableEntry{
		C.NSControlKeyMask,
		key.NameCtrl,
	},
	onFlagsChangedLogicTableEntry{
		C.NSAlternateKeyMask,
		key.NameAlt,
	},
	onFlagsChangedLogicTableEntry{
		C.NSShiftKeyMask,
		key.NameShift,
	},
	onFlagsChangedLogicTableEntry{
		C.NSCommandKeyMask,
		key.NameCommand,
	},
}

//export gio_onFlagsChanged
func gio_onFlagsChanged(h C.uintptr_t, mods C.NSUInteger) {
	w := windowFor(h)
	for _, e := range onFlagsChangedLogicTable {
		if mods&e.modKeyMask != 0 {
			w.ProcessEvent(key.Event{Name: e.modKeyName,
				State: key.Press,
			})

			continue
		}

		if lastModsOnFlagsChanged&e.modKeyMask != 0 {
			w.ProcessEvent(key.Event{Name: e.modKeyName,
				State: key.Release,
			})
		}
	}

	lastModsOnFlagsChanged = mods
}

//export gio_onText
func gio_onText(h C.uintptr_t, cstr C.CFTypeRef) {
	str := nsstringToString(cstr)
diff --git a/app/os_macos.m b/app/os_macos.m
index 9c895148..6e3438e3 100644
--- a/app/os_macos.m
+++ b/app/os_macos.m
@@ -136,6 +136,10 @@ static void handleMouse(GioView *view, NSEvent *event, int typ, CGFloat dx, CGFl
	NSString *keys = [event charactersIgnoringModifiers];
	gio_onKeys(self.handle, (__bridge CFTypeRef)keys, [event timestamp], [event modifierFlags], true);
}
- (void)flagsChanged:(NSEvent *)event {
	[self interpretKeyEvents:[NSArray arrayWithObject:event]];
	gio_onFlagsChanged(self.handle, [event modifierFlags]);
}
- (void)keyUp:(NSEvent *)event {
	NSString *keys = [event charactersIgnoringModifiers];
	gio_onKeys(self.handle, (__bridge CFTypeRef)keys, [event timestamp], [event modifierFlags], false);
-- 
2.30.2
Details
Message ID
<CAHe4cPnBc_6iNqWEp0-B7hUeRep8Hpv0PU=m2cVpnriNDm6c8Q@mail.gmail.com>
In-Reply-To
<20241001020027.4089200-1-kanobe@gmail.com> (view parent)
DKIM signature
pass
Download raw message
Please hold off on reviewing and merging this. I realized after
sending it there may be a defect in it. I'll review and send a new
patch.

On Mon, Sep 30, 2024 at 10:00 PM Jeff Williams <kanobe@gmail.com> wrote:
>
> This change generates keypress and release events for modifier keys in
> MacOS. Specifically the Control, Alt, Shift and Command keys.
> ---
>  app/os_macos.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
>  app/os_macos.m  |  4 ++++
>  2 files changed, 52 insertions(+)
>
> diff --git a/app/os_macos.go b/app/os_macos.go
> index d62bb645..877b6a7c 100644
> --- a/app/os_macos.go
> +++ b/app/os_macos.go
> @@ -561,6 +561,54 @@ func gio_onKeys(h C.uintptr_t, cstr C.CFTypeRef, ti C.double, mods C.NSUInteger,
>         }
>  }
>
> +var lastModsOnFlagsChanged C.NSUInteger
> +
> +type onFlagsChangedLogicTableEntry struct {
> +       modKeyMask C.NSUInteger
> +       modKeyName key.Name
> +}
> +
> +var onFlagsChangedLogicTable = []onFlagsChangedLogicTableEntry{
> +       onFlagsChangedLogicTableEntry{
> +               C.NSControlKeyMask,
> +               key.NameCtrl,
> +       },
> +       onFlagsChangedLogicTableEntry{
> +               C.NSAlternateKeyMask,
> +               key.NameAlt,
> +       },
> +       onFlagsChangedLogicTableEntry{
> +               C.NSShiftKeyMask,
> +               key.NameShift,
> +       },
> +       onFlagsChangedLogicTableEntry{
> +               C.NSCommandKeyMask,
> +               key.NameCommand,
> +       },
> +}
> +
> +//export gio_onFlagsChanged
> +func gio_onFlagsChanged(h C.uintptr_t, mods C.NSUInteger) {
> +       w := windowFor(h)
> +       for _, e := range onFlagsChangedLogicTable {
> +               if mods&e.modKeyMask != 0 {
> +                       w.ProcessEvent(key.Event{Name: e.modKeyName,
> +                               State: key.Press,
> +                       })
> +
> +                       continue
> +               }
> +
> +               if lastModsOnFlagsChanged&e.modKeyMask != 0 {
> +                       w.ProcessEvent(key.Event{Name: e.modKeyName,
> +                               State: key.Release,
> +                       })
> +               }
> +       }
> +
> +       lastModsOnFlagsChanged = mods
> +}
> +
>  //export gio_onText
>  func gio_onText(h C.uintptr_t, cstr C.CFTypeRef) {
>         str := nsstringToString(cstr)
> diff --git a/app/os_macos.m b/app/os_macos.m
> index 9c895148..6e3438e3 100644
> --- a/app/os_macos.m
> +++ b/app/os_macos.m
> @@ -136,6 +136,10 @@ static void handleMouse(GioView *view, NSEvent *event, int typ, CGFloat dx, CGFl
>         NSString *keys = [event charactersIgnoringModifiers];
>         gio_onKeys(self.handle, (__bridge CFTypeRef)keys, [event timestamp], [event modifierFlags], true);
>  }
> +- (void)flagsChanged:(NSEvent *)event {
> +       [self interpretKeyEvents:[NSArray arrayWithObject:event]];
> +       gio_onFlagsChanged(self.handle, [event modifierFlags]);
> +}
>  - (void)keyUp:(NSEvent *)event {
>         NSString *keys = [event charactersIgnoringModifiers];
>         gio_onKeys(self.handle, (__bridge CFTypeRef)keys, [event timestamp], [event modifierFlags], false);
> --
> 2.30.2
>
Reply to thread Export thread (mbox)