summaryrefslogtreecommitdiff
path: root/area_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'area_unix.go')
-rw-r--r--area_unix.go38
1 files changed, 9 insertions, 29 deletions
diff --git a/area_unix.go b/area_unix.go
index f9e6506..f6ac090 100644
--- a/area_unix.go
+++ b/area_unix.go
@@ -107,7 +107,7 @@ func translateModifiers(state C.guint, window *C.GdkWindow) C.guint {
return state
}
-func makeModifiers(state C.guint, m Modifiers) Modifiers {
+func makeModifiers(state C.guint) (m Modifiers) {
if (state & C.GDK_CONTROL_MASK) != 0 {
m |= Ctrl
}
@@ -133,7 +133,7 @@ func finishMouseEvent(widget *C.GtkWidget, data C.gpointer, me MouseEvent, mb ui
}
s := (*sysData)(unsafe.Pointer(data))
state = translateModifiers(state, gdkwindow)
- me.Modifiers = makeModifiers(state, 0)
+ me.Modifiers = makeModifiers(state)
// 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)
@@ -221,7 +221,7 @@ var area_motion_notify_event_callback = C.GCallback(C.our_area_motion_notify_eve
// we want switching away from the control to reset the double-click counter, like with WM_ACTIVATE on Windows; from what I can gather about the Windows version of GDK this is correct
// differentiating between focus-in-event and focus-out-event is unimportant
-// TODO make sure this actually works
+// TODO check logs; there's a comment left by either tristan or Company suggesting I use a different event here
//export our_area_focus_event_callback
func our_area_focus_event_callback(widget *C.GtkWidget, event *C.GdkEvent, data C.gpointer) C.gboolean {
@@ -239,11 +239,15 @@ func doKeyEvent(widget *C.GtkWidget, event *C.GdkEvent, data C.gpointer, up bool
e := (*C.GdkEventKey)(unsafe.Pointer(event))
s := (*sysData)(unsafe.Pointer(data))
keyval := e.keyval
+ // get modifiers now in case a modifier was pressed
+ state := translateModifiers(e.state, e.window)
+ ke.Modifiers = makeModifiers(state)
if extkey, ok := extkeys[keyval]; ok {
ke.ExtKey = extkey
} 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
+ ke.Modifier = mod
+ // don't include the modifier in ke.Modifiers
+ ke.Modifiers &^= mod
} else if xke, ok := fromScancode(uintptr(e.hardware_keycode) - 8); ok {
// see events_notdarwin.go for details of the above map lookup
// one of these will be nonzero
@@ -253,8 +257,6 @@ func doKeyEvent(widget *C.GtkWidget, event *C.GdkEvent, data C.gpointer, up bool
// TODO really stop here? [or should we handle modifiers?]
return false // pretend unhandled
}
- state := translateModifiers(e.state, e.window)
- ke.Modifiers = makeModifiers(state, ke.Modifiers)
ke.Up = up
handled, repaint := s.handler.Key(ke)
if repaint {
@@ -292,28 +294,6 @@ func our_area_key_release_event_callback(widget *C.GtkWidget, event *C.GdkEvent,
var area_key_release_event_callback = C.GCallback(C.our_area_key_release_event_callback)
-/*
-func pk(keyval C.guint, window *C.GdkWindow) {
- var kk *C.GdkKeymapKey
- var nk C.gint
-
- km := C.gdk_keymap_get_for_display(C.gdk_window_get_display(window))
- b := C.gdk_keymap_get_entries_for_keyval(km, keyval, &kk, &nk)
- if b == C.FALSE {
- fmt.Println("(no key equivalent)")
- return
- }
- ok := kk
- for i := C.gint(0); i < nk; i++ {
- fmt.Printf("equiv %d/%d: %#v\n", i + 1, nk, kk)
- xkk := uintptr(unsafe.Pointer(kk))
- xkk += unsafe.Sizeof(kk)
- kk = (*C.GdkKeymapKey)(unsafe.Pointer(xkk))
- }
- C.g_free(C.gpointer(unsafe.Pointer(ok)))
-}
-*/
-
var extkeys = map[C.guint]ExtKey{
C.GDK_KEY_Escape: Escape,
C.GDK_KEY_Insert: Insert,