From 266b01bb5d54ef1d6d5e4cb30920d7ad5e7b9b3e Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 27 May 2020 17:12:11 +0200 Subject: [PATCH] app/internal/window: [wasm] report key modifiers for pointer events Signed-off-by: Elias Naur --- app/internal/window/os_js.go | 52 +++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/app/internal/window/os_js.go b/app/internal/window/os_js.go index 8221acd8..5e42caf6 100644 --- a/app/internal/window/os_js.go +++ b/app/internal/window/os_js.go @@ -220,20 +220,30 @@ func (w *window) focus() { func (w *window) keyEvent(e js.Value) { k := e.Get("key").String() if n, ok := translateKey(k); ok { - cmd := key.Event{Name: n} - if e.Call("getModifierState", "Alt").Bool() { - cmd.Modifiers |= key.ModAlt - } - if e.Call("getModifierState", "Control").Bool() { - cmd.Modifiers |= key.ModCtrl - } - if e.Call("getModifierState", "Shift").Bool() { - cmd.Modifiers |= key.ModShift + cmd := key.Event{ + Name: n, + Modifiers: modifiersFor(e), } w.w.Event(cmd) } } +// modifiersFor returns the modifier set for a DOM MouseEvent or +// KeyEvent. +func modifiersFor(e js.Value) key.Modifiers { + var mods key.Modifiers + if e.Call("getModifierState", "Alt").Bool() { + mods |= key.ModAlt + } + if e.Call("getModifierState", "Control").Bool() { + mods |= key.ModCtrl + } + if e.Call("getModifierState", "Shift").Bool() { + mods |= key.ModShift + } + return mods +} + func (w *window) touchEvent(typ pointer.Type, e js.Value) { e.Call("preventDefault") t := time.Duration(e.Get("timeStamp").Int()) * time.Millisecond @@ -243,6 +253,16 @@ func (w *window) touchEvent(typ pointer.Type, e js.Value) { w.mu.Lock() scale := w.scale w.mu.Unlock() + var mods key.Modifiers + if e.Get("shiftKey").Bool() { + mods |= key.ModShift + } + if e.Get("altKey").Bool() { + mods |= key.ModAlt + } + if e.Get("ctrlKey").Bool() { + mods |= key.ModCtrl + } for i := 0; i < n; i++ { touch := changedTouches.Index(i) pid := w.touchIDFor(touch) @@ -259,6 +279,7 @@ func (w *window) touchEvent(typ pointer.Type, e js.Value) { Position: pos, PointerID: pid, Time: t, + Modifiers: modifiersFor(e), }) } } @@ -305,12 +326,13 @@ func (w *window) pointerEvent(typ pointer.Type, dx, dy float32, e js.Value) { btns |= pointer.ButtonMiddle } w.w.Event(pointer.Event{ - Type: typ, - Source: pointer.Mouse, - Buttons: btns, - Position: pos, - Scroll: scroll, - Time: t, + Type: typ, + Source: pointer.Mouse, + Buttons: btns, + Position: pos, + Scroll: scroll, + Time: t, + Modifiers: modifiersFor(e), }) }