~eliasnaur/gio

f6dff2fd1c92ce78229a6262a1f221d7ec93fa7f — Elias Naur a month ago 7b6eafc
app/internal/window,app/internal/xkb: [Wayland] report modifiers for pointer events

Updates #120

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2 files changed, 43 insertions(+), 29 deletions(-)

M app/internal/window/os_wayland.go
M app/internal/xkb/xkb_unix.go
M app/internal/window/os_wayland.go => app/internal/window/os_wayland.go +22 -16
@@ 708,6 708,7 @@ func gio_onTouchDown(data unsafe.Pointer, touch *C.struct_wl_touch, serial, t C.
		Position:  w.lastTouch,
		PointerID: pointer.ID(id),
		Time:      time.Duration(t) * time.Millisecond,
		Modifiers: w.disp.xkb.Modifiers(),
	})
}



@@ 723,6 724,7 @@ func gio_onTouchUp(data unsafe.Pointer, touch *C.struct_wl_touch, serial, t C.ui
		Position:  w.lastTouch,
		PointerID: pointer.ID(id),
		Time:      time.Duration(t) * time.Millisecond,
		Modifiers: w.disp.xkb.Modifiers(),
	})
}



@@ 740,6 742,7 @@ func gio_onTouchMotion(data unsafe.Pointer, touch *C.struct_wl_touch, t C.uint32
		Source:    pointer.Touch,
		PointerID: pointer.ID(id),
		Time:      time.Duration(t) * time.Millisecond,
		Modifiers: w.disp.xkb.Modifiers(),
	})
}



@@ 826,11 829,12 @@ func gio_onPointerButton(data unsafe.Pointer, p *C.struct_wl_pointer, serial, t,
	w.flushScroll()
	w.resetFling()
	w.w.Event(pointer.Event{
		Type:     typ,
		Source:   pointer.Mouse,
		Buttons:  w.pointerBtns,
		Position: w.lastPos,
		Time:     time.Duration(t) * time.Millisecond,
		Type:      typ,
		Source:    pointer.Mouse,
		Buttons:   w.pointerBtns,
		Position:  w.lastPos,
		Time:      time.Duration(t) * time.Millisecond,
		Modifiers: w.disp.xkb.Modifiers(),
	})
}



@@ 1289,12 1293,13 @@ func (w *window) flushScroll() {
		return
	}
	w.w.Event(pointer.Event{
		Type:     pointer.Move,
		Source:   pointer.Mouse,
		Buttons:  w.pointerBtns,
		Position: w.lastPos,
		Scroll:   total,
		Time:     w.scroll.time,
		Type:      pointer.Move,
		Source:    pointer.Mouse,
		Buttons:   w.pointerBtns,
		Position:  w.lastPos,
		Scroll:    total,
		Time:      w.scroll.time,
		Modifiers: w.disp.xkb.Modifiers(),
	})
	if w.scroll.steps == (image.Point{}) {
		w.fling.xExtrapolation.SampleDelta(w.scroll.time, -w.scroll.dist.X)


@@ 1311,11 1316,12 @@ func (w *window) onPointerMotion(x, y C.wl_fixed_t, t C.uint32_t) {
		Y: fromFixed(y) * float32(w.scale),
	}
	w.w.Event(pointer.Event{
		Type:     pointer.Move,
		Position: w.lastPos,
		Buttons:  w.pointerBtns,
		Source:   pointer.Mouse,
		Time:     time.Duration(t) * time.Millisecond,
		Type:      pointer.Move,
		Position:  w.lastPos,
		Buttons:   w.pointerBtns,
		Source:    pointer.Mouse,
		Time:      time.Duration(t) * time.Millisecond,
		Modifiers: w.disp.xkb.Modifiers(),
	})
}


M app/internal/xkb/xkb_unix.go => app/internal/xkb/xkb_unix.go +21 -13
@@ 133,6 133,23 @@ func (x *Context) LoadKeymap(format int, fd int, size int) error {
	return nil
}

func (x *Context) Modifiers() key.Modifiers {
	var mods key.Modifiers
	if C.xkb_state_mod_name_is_active(x.state, (*C.char)(unsafe.Pointer(&_XKB_MOD_NAME_CTRL[0])), C.XKB_STATE_MODS_EFFECTIVE) == 1 {
		mods |= key.ModCtrl
	}
	if C.xkb_state_mod_name_is_active(x.state, (*C.char)(unsafe.Pointer(&_XKB_MOD_NAME_SHIFT[0])), C.XKB_STATE_MODS_EFFECTIVE) == 1 {
		mods |= key.ModShift
	}
	if C.xkb_state_mod_name_is_active(x.state, (*C.char)(unsafe.Pointer(&_XKB_MOD_NAME_ALT[0])), C.XKB_STATE_MODS_EFFECTIVE) == 1 {
		mods |= key.ModAlt
	}
	if C.xkb_state_mod_name_is_active(x.state, (*C.char)(unsafe.Pointer(&_XKB_MOD_NAME_LOGO[0])), C.XKB_STATE_MODS_EFFECTIVE) == 1 {
		mods |= key.ModSuper
	}
	return mods
}

func (x *Context) DispatchKey(keyCode uint32) (events []event.Event) {
	if x.state == nil {
		return


@@ 143,24 160,15 @@ func (x *Context) DispatchKey(keyCode uint32) (events []event.Event) {
	}
	sym := C.xkb_state_key_get_one_sym(x.state, kc)
	if name, ok := convertKeysym(sym); ok {
		cmd := key.Event{Name: name}
		cmd := key.Event{
			Name:      name,
			Modifiers: x.Modifiers(),
		}
		// Ensure that a physical backtab key is translated to
		// Shift-Tab.
		if sym == C.XKB_KEY_ISO_Left_Tab {
			cmd.Modifiers |= key.ModShift
		}
		if C.xkb_state_mod_name_is_active(x.state, (*C.char)(unsafe.Pointer(&_XKB_MOD_NAME_CTRL[0])), C.XKB_STATE_MODS_EFFECTIVE) == 1 {
			cmd.Modifiers |= key.ModCtrl
		}
		if C.xkb_state_mod_name_is_active(x.state, (*C.char)(unsafe.Pointer(&_XKB_MOD_NAME_SHIFT[0])), C.XKB_STATE_MODS_EFFECTIVE) == 1 {
			cmd.Modifiers |= key.ModShift
		}
		if C.xkb_state_mod_name_is_active(x.state, (*C.char)(unsafe.Pointer(&_XKB_MOD_NAME_ALT[0])), C.XKB_STATE_MODS_EFFECTIVE) == 1 {
			cmd.Modifiers |= key.ModAlt
		}
		if C.xkb_state_mod_name_is_active(x.state, (*C.char)(unsafe.Pointer(&_XKB_MOD_NAME_LOGO[0])), C.XKB_STATE_MODS_EFFECTIVE) == 1 {
			cmd.Modifiers |= key.ModSuper
		}
		events = append(events, cmd)
	}
	C.xkb_compose_state_feed(x.compState, sym)