diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 48f3dc1fae..ba627ddee3 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -811,6 +811,14 @@ void QueryString::DrawEditBox(const Window *w, int wid) const _cur_dpi = old_dpi; } +void QueryString::ClickEditBox(Window *w, Point pt, int wid, int click_count, bool focus_changed) +{ + if (!focus_changed && w->window_class != WC_OSK) { + /* Open the OSK window if clicked on an edit box, while not changing focus */ + ShowOnScreenKeyboard(w, wid); + } +} + /** Class for the string query window. */ struct QueryStringWindow : public Window { diff --git a/src/querystring_gui.h b/src/querystring_gui.h index a84e167461..8aea26d88d 100644 --- a/src/querystring_gui.h +++ b/src/querystring_gui.h @@ -65,6 +65,7 @@ private: bool HasEditBoxFocus(const Window *w, int wid) const; public: void DrawEditBox(const Window *w, int wid) const; + void ClickEditBox(Window *w, Point pt, int wid, int click_count, bool focus_changed); void HandleEditBox(Window *w, int wid); HandleEditBoxResult HandleEditBoxKey(Window *w, int wid, uint16 key, uint16 keycode, EventState &state); }; diff --git a/src/window.cpp b/src/window.cpp index 088233fc04..62109e82cc 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -463,20 +463,19 @@ static void DispatchLeftClickEvent(Window *w, int x, int y, int click_count) if ((widget_type & ~WWB_PUSHBUTTON) < WWT_LAST && (widget_type & WWB_PUSHBUTTON)) w->HandleButtonClick(widget_index); + Point pt = { x, y }; + switch (widget_type) { case NWID_VSCROLLBAR: case NWID_HSCROLLBAR: ScrollbarClickHandler(w, nw, x, y); break; - case WWT_EDITBOX: - if (!focused_widget_changed) { // Only open the OSK window if clicking on an already focused edit box - /* Open the OSK window if clicked on an edit box */ - if (w->querystrings.Contains(widget_index)) { - ShowOnScreenKeyboard(w, widget_index); - } - } + case WWT_EDITBOX: { + QueryString *query = w->GetQueryString(widget_index); + if (query != NULL) query->ClickEditBox(w, pt, widget_index, click_count, focused_widget_changed); break; + } case WWT_CLOSEBOX: // 'X' delete w; @@ -520,7 +519,6 @@ static void DispatchLeftClickEvent(Window *w, int x, int y, int click_count) Game::NewEvent(new ScriptEventWindowWidgetClick((ScriptWindow::WindowClass)w->window_class, w->window_number, widget_index)); } - Point pt = { x, y }; w->OnClick(pt, widget_index, click_count); }