changeset 20703:0cc7d9dfe800 draft

-Codechange: Notify the video driver when an edit box lost (global) focus so it can abort any current input composition.
author Michael Lutz <michi@icosahedron.de>
date Sat, 09 Mar 2013 16:35:17 +0100
parents b098d8af7ec8
children 7d274a089d08
files src/console_gui.cpp src/osk_gui.cpp src/video/video_driver.hpp src/window.cpp src/window_gui.h
diffstat 5 files changed, 30 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 	{
 		this->Scroll(-wheel);
 	}
+
+	virtual void OnFocusLost()
+	{
+		_video_driver->EditBoxLostFocus();
+	}
 };
 
 int IConsoleWindow::scroll = 0;
--- 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 @@
 
 	virtual void OnFocusLost()
 	{
+		_video_driver->EditBoxLostFocus();
 		delete this;
 	}
 };
--- a/src/video/video_driver.hpp
+++ b/src/video/video_driver.hpp
@@ -73,6 +73,11 @@
 	{
 		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. */
--- 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 @@
 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,12 +391,21 @@
 
 		/* 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<NWidgetCore>(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.
  * On certain conditions, they have to be disabled.
@@ -953,7 +965,10 @@
 	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();
 
--- a/src/window_gui.h
+++ b/src/window_gui.h
@@ -582,10 +582,7 @@
 	 */
 	virtual void OnFocus() {}
 
-	/**
-	 * Called when window looses focus
-	 */
-	virtual void OnFocusLost() {}
+	virtual void OnFocusLost();
 
 	/**
 	 * A key has been pressed.