mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-05 01:15:35 +00:00
widget: click button only if key pressed and released
This commit fixes the non-intuitive behaviour, where hitting return or space with a button focused, then tabbing to another button and releasing the key causes the second button to trigger. It feels wrong, as the "gesture" was never initiated on the second button. The fix makes widget.Clickable track which key was pressed, in a variable called pressedKey, and only considers a key release if the released key matches the pressed key. Finally, if the widget loses focus, pressedKey is cleared. Fixes: https://todo.sr.ht/~eliasnaur/gio/525 Signed-off-by: Veikko Sariola <5684185+vsariola@users.noreply.github.com>
This commit is contained in:
committed by
Elias Naur
parent
e9cb0b326d
commit
290b5fe821
+19
-5
@@ -28,6 +28,7 @@ type Clickable struct {
|
||||
keyTag struct{}
|
||||
requestFocus bool
|
||||
focused bool
|
||||
pressedKey string
|
||||
}
|
||||
|
||||
// Click represents a click.
|
||||
@@ -178,17 +179,30 @@ func (b *Clickable) update(gtx layout.Context) {
|
||||
switch e := e.(type) {
|
||||
case key.FocusEvent:
|
||||
b.focused = e.Focus
|
||||
if !b.focused {
|
||||
b.pressedKey = ""
|
||||
}
|
||||
case key.Event:
|
||||
if !b.focused || e.State != key.Release {
|
||||
if !b.focused {
|
||||
break
|
||||
}
|
||||
if e.Name != key.NameReturn && e.Name != key.NameSpace {
|
||||
break
|
||||
}
|
||||
b.clicks = append(b.clicks, Click{
|
||||
Modifiers: e.Modifiers,
|
||||
NumClicks: 1,
|
||||
})
|
||||
switch e.State {
|
||||
case key.Press:
|
||||
b.pressedKey = e.Name
|
||||
case key.Release:
|
||||
if b.pressedKey != e.Name {
|
||||
break
|
||||
}
|
||||
// only register a key as a click if the key was pressed and released while this button was focused
|
||||
b.pressedKey = ""
|
||||
b.clicks = append(b.clicks, Click{
|
||||
Modifiers: e.Modifiers,
|
||||
NumClicks: 1,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user