Give the find bar's input focus and the keyboard when it opens
Tapping the search icon set FocusedElementID to find_bar (so the editor
stopped its IME sync), but the main-owned widget.Editor only grabs key
focus on its own click — the icon tap never touches it, so neither focus
nor the soft keyboard moved to the search input.
Main now watches the frame's FocusedElementID and, on the transition
into find_bar, issues key.FocusCmd{Tag: &findEditor} (once per open).
The widget's FocusEvent handler raises the soft keyboard on focus gain
(gioui.org/widget/editor.go), so the keyboard follows automatically;
w.Invalidate guarantees the frame in which the widget sees the FocusEvent.
Close needs no inverse action: the editor's TextField re-issues its own
FocusCmd because the renderer clears the focus dedup on frames where no
logic field is focused.
This commit is contained in:
parent
587c1c5aad
commit
cfaf4927ac
|
|
@ -128,6 +128,10 @@ func run(w *app.Window) error {
|
||||||
// the set changes — the rects move every frame while a selection is
|
// the set changes — the rects move every frame while a selection is
|
||||||
// visible/scrolling, but identical repeats are skipped.
|
// visible/scrolling, but identical repeats are skipped.
|
||||||
var lastExcl [][4]int
|
var lastExcl [][4]int
|
||||||
|
// findBarFocused tracks whether the previous frame focused the find bar's
|
||||||
|
// main-owned input, so main hands key focus to it exactly once per open
|
||||||
|
// (see the focus handoff below).
|
||||||
|
var findBarFocused bool
|
||||||
|
|
||||||
for {
|
for {
|
||||||
switch e := w.Event().(type) {
|
switch e := w.Event().(type) {
|
||||||
|
|
@ -233,6 +237,19 @@ func run(w *app.Window) error {
|
||||||
|
|
||||||
// Gather key events
|
// Gather key events
|
||||||
focusedID := frame.FocusedElementID
|
focusedID := frame.FocusedElementID
|
||||||
|
// Hand key focus to the find bar's main-owned input the moment the
|
||||||
|
// find bar opens: the search-icon tap never touches the widget, and
|
||||||
|
// widget.Editor only grabs key focus on its own click (gioui.org/
|
||||||
|
// widget/editor.go). The widget's FocusEvent handler raises the soft
|
||||||
|
// keyboard on focus gain, so the keyboard follows automatically. On
|
||||||
|
// the inverse transition the editor's TextField re-issues its own
|
||||||
|
// key.FocusCmd (the renderer clears the focus dedup on frames where
|
||||||
|
// no logic field is focused), so nothing is needed on close.
|
||||||
|
if focusedID == "find_bar" && !findBarFocused {
|
||||||
|
gtx.Execute(key.FocusCmd{Tag: &findEditor})
|
||||||
|
w.Invalidate() // next frame: the widget sees the FocusEvent
|
||||||
|
}
|
||||||
|
findBarFocused = focusedID == "find_bar"
|
||||||
if focusedID == "" {
|
if focusedID == "" {
|
||||||
// No focused input: drop any stale shift state (a release event
|
// No focused input: drop any stale shift state (a release event
|
||||||
// for a key held across focus loss may never arrive).
|
// for a key held across focus loss may never arrive).
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user