diff --git a/src/console_gui.cpp b/src/console_gui.cpp index 497c430489..143c333ac9 100644 --- a/src/console_gui.cpp +++ b/src/console_gui.cpp @@ -336,7 +336,7 @@ struct IConsoleWindow : Window VideoDriver::GetInstance()->EditBoxGainedFocus(); } - void OnFocusLost() override + void OnFocusLost(bool closing) override { VideoDriver::GetInstance()->EditBoxLostFocus(); } diff --git a/src/osk_gui.cpp b/src/osk_gui.cpp index 3b8e963bb5..750838acd6 100644 --- a/src/osk_gui.cpp +++ b/src/osk_gui.cpp @@ -197,10 +197,10 @@ struct OskWindow : public Window { this->parent->SetWidgetDirty(this->text_btn); } - void OnFocusLost() override + void OnFocusLost(bool closing) override { VideoDriver::GetInstance()->EditBoxLostFocus(); - this->Close(); + if (!closing) this->Close(); } }; diff --git a/src/widgets/dropdown.cpp b/src/widgets/dropdown.cpp index a0ff70e7b4..c2de0be6c4 100644 --- a/src/widgets/dropdown.cpp +++ b/src/widgets/dropdown.cpp @@ -197,9 +197,9 @@ struct DropdownWindow : Window { if (nwc != nullptr) SetBit(nwc->disp_flags, NDB_DROPDOWN_CLOSED); } - void OnFocusLost() override + void OnFocusLost(bool closing) override { - this->Close(); + if (!closing) this->Close(); } Point OnInitialPosition(int16 sm_width, int16 sm_height, int window_number) override diff --git a/src/window.cpp b/src/window.cpp index 314b6eb77e..5c31411468 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -469,7 +469,7 @@ void SetFocusedWindow(Window *w) _focused_window = w; /* So we can inform it that it lost focus */ - if (old_focused != nullptr) old_focused->OnFocusLost(); + if (old_focused != nullptr) old_focused->OnFocusLost(false); if (_focused_window != nullptr) _focused_window->OnFocus(); } @@ -545,7 +545,7 @@ void Window::OnFocus() /** * Called when window loses focus */ -void Window::OnFocusLost() +void Window::OnFocusLost(bool closing) { if (this->nested_focus != nullptr && this->nested_focus->type == WWT_EDITBOX) VideoDriver::GetInstance()->EditBoxLostFocus(); } @@ -1132,7 +1132,7 @@ void Window::Close() /* Make sure we don't try to access this window as the focused window when it doesn't exist anymore. */ if (_focused_window == this) { - this->OnFocusLost(); + this->OnFocusLost(true); _focused_window = nullptr; } diff --git a/src/window_gui.h b/src/window_gui.h index 3ef708ab4d..b29912dbd2 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -515,9 +515,16 @@ public: */ virtual void SetStringParameters(int widget) const {} + /** + * The window has gained focus. + */ virtual void OnFocus(); - virtual void OnFocusLost(); + /** + * The window has lost focus. + * @param closing True iff the window has lost focus in the process of closing. + */ + virtual void OnFocusLost(bool closing); /** * A key has been pressed.