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
|
cursor pointer.Cursor
|
||||||
pointerBtns pointer.Buttons
|
pointerBtns pointer.Buttons
|
||||||
loop *eventLoop
|
loop *eventLoop
|
||||||
|
lastMods C.NSUInteger
|
||||||
|
|
||||||
scale float32
|
scale float32
|
||||||
config Config
|
config Config
|
||||||
@@ -601,6 +602,32 @@ func (w *window) commandKey(k rune, ti C.double, mods C.NSUInteger) bool {
|
|||||||
return true
|
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
|
//export gio_onText
|
||||||
func gio_onText(h C.uintptr_t, cstr C.CFTypeRef) {
|
func gio_onText(h C.uintptr_t, cstr C.CFTypeRef) {
|
||||||
str := nsstringToString(cstr)
|
str := nsstringToString(cstr)
|
||||||
|
|||||||
@@ -140,6 +140,10 @@ static void handleMouse(GioView *view, NSEvent *event, int typ, CGFloat dx, CGFl
|
|||||||
NSString *keys = [event charactersIgnoringModifiers];
|
NSString *keys = [event charactersIgnoringModifiers];
|
||||||
gio_onKeys(self.handle, (__bridge CFTypeRef)keys, [event timestamp], [event modifierFlags], true);
|
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 {
|
- (void)keyUp:(NSEvent *)event {
|
||||||
NSString *keys = [event charactersIgnoringModifiers];
|
NSString *keys = [event charactersIgnoringModifiers];
|
||||||
gio_onKeys(self.handle, (__bridge CFTypeRef)keys, [event timestamp], [event modifierFlags], false);
|
gio_onKeys(self.handle, (__bridge CFTypeRef)keys, [event timestamp], [event modifierFlags], false);
|
||||||
|
|||||||
Reference in New Issue
Block a user