From e24f19ecba58d92872370c80ca2fae4369afd6f6 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 18 Jun 2019 20:10:52 +0200 Subject: [PATCH] ui/key,ui/app: introduce ModShift modifier And add desktop implementations. Signed-off-by: Elias Naur --- ui/app/os_js.go | 3 +++ ui/app/os_macos.go | 3 +++ ui/app/os_wayland.go | 18 +++++++++--------- ui/app/os_windows.go | 4 ++++ ui/key/key.go | 1 + 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/ui/app/os_js.go b/ui/app/os_js.go index af87db1d..a016bfa4 100644 --- a/ui/app/os_js.go +++ b/ui/app/os_js.go @@ -198,6 +198,9 @@ func (w *window) keyEvent(e js.Value) { if e.Call("getModifierState", "Control").Bool() { cmd.Modifiers |= key.ModCommand } + if e.Call("getModifierState", "Shift").Bool() { + cmd.Modifiers |= key.ModShift + } w.w.event(cmd) } } diff --git a/ui/app/os_macos.go b/ui/app/os_macos.go index 61034a8e..9233a22b 100644 --- a/ui/app/os_macos.go +++ b/ui/app/os_macos.go @@ -82,6 +82,9 @@ func gio_onKeys(view C.CFTypeRef, cstr *C.char, ti C.double, mods C.NSUInteger) if mods&C.NSEventModifierFlagCommand != 0 { kmods |= key.ModCommand } + if mods&C.NSEventModifierFlagShift != 0 { + kmods |= key.ModShift + } w := views[view] for _, k := range str { if n, ok := convertKey(k); ok { diff --git a/ui/app/os_wayland.go b/ui/app/os_wayland.go index 4e1a0c5a..21f68edd 100644 --- a/ui/app/os_wayland.go +++ b/ui/app/os_wayland.go @@ -80,9 +80,6 @@ type wlConn struct { repeatRate int repeatDelay time.Duration repeatStop chan struct{} - - // Cached strings - _XKB_MOD_NAME_CTRL *C.char } type window struct { @@ -137,6 +134,11 @@ var ( outputConfig = make(map[*C.struct_wl_output]*wlOutput) ) +var ( + _XKB_MOD_NAME_CTRL = []byte("Control\x00") + _XKB_MOD_NAME_SHIFT = []byte("Shift\x00") +) + func Main() { <-mainDone } @@ -779,9 +781,12 @@ func (w *window) dispatchKey(keyCode C.uint32_t) { sym := C.xkb_state_key_get_one_sym(conn.xkbState, C.xkb_keycode_t(keyCode)) if n, ok := convertKeysym(sym); ok { cmd := key.Chord{Name: n} - if C.xkb_state_mod_name_is_active(conn.xkbState, conn._XKB_MOD_NAME_CTRL, C.XKB_STATE_MODS_EFFECTIVE) == 1 { + if C.xkb_state_mod_name_is_active(conn.xkbState, (*C.char)(unsafe.Pointer(&_XKB_MOD_NAME_CTRL[0])), C.XKB_STATE_MODS_EFFECTIVE) == 1 { cmd.Modifiers |= key.ModCommand } + if C.xkb_state_mod_name_is_active(conn.xkbState, (*C.char)(unsafe.Pointer(&_XKB_MOD_NAME_SHIFT[0])), C.XKB_STATE_MODS_EFFECTIVE) == 1 { + cmd.Modifiers |= key.ModShift + } w.w.event(cmd) } C.xkb_compose_state_feed(conn.xkbCompState, sym) @@ -1072,7 +1077,6 @@ func waylandConnect() error { c.destroy() return errors.New("wayland: wl_compositor_create_surface failed") } - c._XKB_MOD_NAME_CTRL = C.CString(C.XKB_MOD_NAME_CTRL) return nil } @@ -1087,10 +1091,6 @@ func (c *wlConn) stopRepeat() { func (c *wlConn) destroy() { c.stopRepeat() - if c._XKB_MOD_NAME_CTRL != nil { - C.free(unsafe.Pointer(c._XKB_MOD_NAME_CTRL)) - c._XKB_MOD_NAME_CTRL = nil - } if c.xkbCompState != nil { C.xkb_compose_state_unref(c.xkbCompState) c.xkbCompState = nil diff --git a/ui/app/os_windows.go b/ui/app/os_windows.go index 75e85dfa..9be95ab3 100644 --- a/ui/app/os_windows.go +++ b/ui/app/os_windows.go @@ -88,6 +88,7 @@ const ( _USER_TIMER_MINIMUM = 0x0000000A _VK_CONTROL = 0x11 + _VK_SHIFT = 0x10 _VK_BACK = 0x08 _VK_DELETE = 0x2e @@ -271,6 +272,9 @@ func windowProc(hwnd syscall.Handle, msg uint32, wParam, lParam uintptr) uintptr if getKeyState(_VK_CONTROL)&0x1000 != 0 { cmd.Modifiers |= key.ModCommand } + if getKeyState(_VK_SHIFT)&0x1000 != 0 { + cmd.Modifiers |= key.ModShift + } w.w.event(cmd) } case _WM_LBUTTONDOWN: diff --git a/ui/key/key.go b/ui/key/key.go index 3464c3ff..937f03c0 100644 --- a/ui/key/key.go +++ b/ui/key/key.go @@ -35,6 +35,7 @@ type TextInputState uint8 const ( ModCommand Modifiers = 1 << iota + ModShift ) const (