summaryrefslogtreecommitdiff
path: root/area_unix.go
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-03-23 17:24:13 -0400
committerPietro Gagliardi <[email protected]>2014-03-23 17:24:13 -0400
commitaee2b982707b1e3210b6335082d01d1f3e2fdc3b (patch)
tree6a73f6b0b8fda3fc185bfbb73e43dbb7bdfb47f5 /area_unix.go
parentd1376e035d8fccbd16d63d9109a1bab4eb093aba (diff)
Fixed modifier keys in GTK+ not being registered by KeyEvent on first press.
Diffstat (limited to 'area_unix.go')
-rw-r--r--area_unix.go29
1 files changed, 16 insertions, 13 deletions
diff --git a/area_unix.go b/area_unix.go
index 3362861..a990cc9 100644
--- a/area_unix.go
+++ b/area_unix.go
@@ -84,7 +84,7 @@ func translateModifiers(state C.guint, window *C.GdkWindow) C.guint {
return state
}
-func makeModifiers(state C.guint) (m Modifiers) {
+func makeModifiers(state C.guint, m Modifiers) Modifiers {
if (state & C.GDK_CONTROL_MASK) != 0 {
m |= Ctrl
}
@@ -101,7 +101,7 @@ func makeModifiers(state C.guint) (m Modifiers) {
func finishMouseEvent(data C.gpointer, me MouseEvent, mb uint, x C.gdouble, y C.gdouble, state C.guint, gdkwindow *C.GdkWindow) {
s := (*sysData)(unsafe.Pointer(data))
state = translateModifiers(state, gdkwindow)
- me.Modifiers = makeModifiers(state)
+ me.Modifiers = makeModifiers(state, 0)
// the mb != # checks exclude the Up/Down button from Held
if mb != 1 && (state & C.GDK_BUTTON1_MASK) != 0 {
me.Held = append(me.Held, 1)
@@ -178,7 +178,10 @@ func doKeyEvent(event *C.GdkEvent, data C.gpointer, up bool) bool {
ke.ExtKey = extkey
} else if predef, ok := predefkeys[keyval]; ok {
ke.ASCII = predef
- } else if _, ok := modonlykeys[keyval]; !ok { // use ok form here to save memory/avoid racy map write
+ } else if mod, ok := modonlykeys[keyval]; ok {
+ // modifier keys don't seem to be set on their initial keypress; set them here
+ ke.Modifiers |= mod
+ } else {
cp := C.gdk_keyval_to_unicode(keyval)
// GDK keycodes in GDK 3.4 the ASCII plane map to their ASCII values
// (proof: https://git.gnome.org/browse/gtk+/tree/gdk/gdkkeysyms.h?h=gtk-3-4)
@@ -191,7 +194,7 @@ func doKeyEvent(event *C.GdkEvent, data C.gpointer, up bool) bool {
ke.ASCII = byte(cp)
}
state := translateModifiers(e.state, e.window)
- ke.Modifiers = makeModifiers(state)
+ ke.Modifiers = makeModifiers(state, ke.Modifiers)
ke.Up = up
return s.handler.Key(ke)
}
@@ -310,14 +313,14 @@ var predefkeys = map[C.guint]byte{
// no space; handled by the code above
}
-var modonlykeys = map[C.guint]bool{
- C.GDK_KEY_Shift_L: true,
- C.GDK_KEY_Shift_R: true,
- C.GDK_KEY_Control_L: true,
- C.GDK_KEY_Control_R: true,
- C.GDK_KEY_Meta_L: true,
- C.GDK_KEY_Meta_R: true,
+var modonlykeys = map[C.guint]Modifiers{
+ C.GDK_KEY_Shift_L: Shift,
+ C.GDK_KEY_Shift_R: Shift,
+ C.GDK_KEY_Control_L: Ctrl,
+ C.GDK_KEY_Control_R: Ctrl,
+ C.GDK_KEY_Meta_L: Alt,
+ C.GDK_KEY_Meta_R: Alt,
// TODO GDK_KEY_Alt_L/R too?
- C.GDK_KEY_Super_L: true,
- C.GDK_KEY_Super_R: true,
+// C.GDK_KEY_Super_L: Super,
+// C.GDK_KEY_Super_R: Super,
}