From 07cd393f7ec4f8edb0ad064bfc18ace84204e17e Mon Sep 17 00:00:00 2001 From: michi_cc Date: Mon, 5 Aug 2013 20:37:02 +0000 Subject: [PATCH] (svn r25678) -Codechange: Notify the video driver when an edit box lost (global) focus so it can abort any current input composition. --- src/console_gui.cpp | 6 ++++++ src/osk_gui.cpp | 2 ++ src/video/video_driver.hpp | 5 +++++ src/window.cpp | 17 ++++++++++++++++- src/window_gui.h | 5 +---- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/console_gui.cpp b/src/console_gui.cpp index dc9a0cb795..ce23952d24 100644 --- a/src/console_gui.cpp +++ b/src/console_gui.cpp @@ -21,6 +21,7 @@ #include "settings_type.h" #include "console_func.h" #include "rev.h" +#include "video/video_driver.hpp" #include "widgets/console_widget.h" @@ -311,6 +312,11 @@ struct IConsoleWindow : Window { this->Scroll(-wheel); } + + virtual void OnFocusLost() + { + _video_driver->EditBoxLostFocus(); + } }; int IConsoleWindow::scroll = 0; diff --git a/src/osk_gui.cpp b/src/osk_gui.cpp index 5dafdef118..2516c4dbf6 100644 --- a/src/osk_gui.cpp +++ b/src/osk_gui.cpp @@ -16,6 +16,7 @@ #include "window_func.h" #include "gfx_func.h" #include "querystring_gui.h" +#include "video/video_driver.hpp" #include "widgets/osk_widget.h" @@ -205,6 +206,7 @@ struct OskWindow : public Window { virtual void OnFocusLost() { + _video_driver->EditBoxLostFocus(); delete this; } }; diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp index 306fe28039..d8249b1f77 100644 --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -73,6 +73,11 @@ public: { return true; } + + /** + * An edit box lost the input focus. Abort character compositing if necessary. + */ + virtual void EditBoxLostFocus() {} }; /** Base of the factory for the video drivers. */ diff --git a/src/window.cpp b/src/window.cpp index 93a84812cb..1ef8afa441 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -35,6 +35,7 @@ #include "statusbar_gui.h" #include "error.h" #include "game/game.hpp" +#include "video/video_driver.hpp" /** Values for _settings_client.gui.auto_scrolling */ enum ViewportAutoscrolling { @@ -366,6 +367,8 @@ bool EditBoxInGlobalFocus() void Window::UnfocusFocusedWidget() { if (this->nested_focus != NULL) { + if (this->nested_focus->type == WWT_EDITBOX) _video_driver->EditBoxLostFocus(); + /* Repaint the widget that lost focus. A focused edit box may else leave the caret on the screen. */ this->nested_focus->SetDirty(this); this->nested_focus = NULL; @@ -388,11 +391,20 @@ bool Window::SetFocusedWidget(int widget_index) /* Repaint the widget that lost focus. A focused edit box may else leave the caret on the screen. */ this->nested_focus->SetDirty(this); + if (this->nested_focus->type == WWT_EDITBOX) _video_driver->EditBoxLostFocus(); } this->nested_focus = this->GetWidget(widget_index); return true; } +/** + * Called when window looses focus + */ +void Window::OnFocusLost() +{ + if (this->nested_focus != NULL && this->nested_focus->type == WWT_EDITBOX) _video_driver->EditBoxLostFocus(); +} + /** * Sets the enabled/disabled status of a list of widgets. * By default, widgets are enabled. @@ -953,7 +965,10 @@ Window::~Window() if (_last_scroll_window == this) _last_scroll_window = NULL; /* Make sure we don't try to access this window as the focused window when it doesn't exist anymore. */ - if (_focused_window == this) _focused_window = NULL; + if (_focused_window == this) { + this->OnFocusLost(); + _focused_window = NULL; + } this->DeleteChildWindows(); diff --git a/src/window_gui.h b/src/window_gui.h index ce9c062c69..ade8a3f1d3 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -582,10 +582,7 @@ public: */ virtual void OnFocus() {} - /** - * Called when window looses focus - */ - virtual void OnFocusLost() {} + virtual void OnFocusLost(); /** * A key has been pressed.