forked from joejulian/gio
app: [macOS] send keypress events for modifier keys
This change generates keypress and release events for modifier keys in macOS. Specifically the Control, Alt, Shift and Command keys. Signed-off-by: Jeff Williams <kanobe@gmail.com>
This commit is contained in:
@@ -346,6 +346,7 @@ type window struct {
|
||||
cursor pointer.Cursor
|
||||
pointerBtns pointer.Buttons
|
||||
loop *eventLoop
|
||||
lastMods C.NSUInteger
|
||||
|
||||
scale float32
|
||||
config Config
|
||||
@@ -601,6 +602,32 @@ func (w *window) commandKey(k rune, ti C.double, mods C.NSUInteger) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
//export gio_onFlagsChanged
|
||||
func gio_onFlagsChanged(h C.uintptr_t, curMods C.NSUInteger) {
|
||||
w := windowFor(h)
|
||||
|
||||
mods := []C.NSUInteger{C.NSControlKeyMask, C.NSAlternateKeyMask, C.NSShiftKeyMask, C.NSCommandKeyMask}
|
||||
keys := []key.Name{key.NameCtrl, key.NameAlt, key.NameShift, key.NameCommand}
|
||||
|
||||
for i, mod := range mods {
|
||||
wasPressed := w.lastMods&mod != 0
|
||||
isPressed := curMods&mod != 0
|
||||
|
||||
if wasPressed != isPressed {
|
||||
st := key.Release
|
||||
if isPressed {
|
||||
st = key.Press
|
||||
}
|
||||
w.ProcessEvent(key.Event{
|
||||
Name: keys[i],
|
||||
State: st,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
w.lastMods = curMods
|
||||
}
|
||||
|
||||
//export gio_onText
|
||||
func gio_onText(h C.uintptr_t, cstr C.CFTypeRef) {
|
||||
str := nsstringToString(cstr)
|
||||
|
||||
@@ -140,6 +140,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);
|
||||
|
||||
Reference in New Issue
Block a user