summaryrefslogtreecommitdiff
path: root/src/spice-widget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/spice-widget.c')
-rw-r--r--src/spice-widget.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/spice-widget.c b/src/spice-widget.c
index 426aea9..ae50816 100644
--- a/src/spice-widget.c
+++ b/src/spice-widget.c
@@ -1889,6 +1889,34 @@ static void update_image(SpiceDisplay *display)
do_color_convert(display, &d->area);
}
+#ifdef G_OS_WIN32
+GdkFilterReturn message_filter(GdkXEvent *xevent, GdkEvent *event, gpointer data)
+{
+ enum { WM_RESET_KEYBOARD = WM_USER + 123 };
+
+ MSG *msg = (MSG *) xevent;
+ SpiceDisplay *display;
+
+ // save new input locale
+ switch (msg->message) {
+ case WM_INPUTLANGCHANGE:
+ if (PRIMARYLANGID(LOWORD(msg->lParam)) != LANG_ENGLISH)
+ PostMessage(msg->hwnd, WM_RESET_KEYBOARD, 0, 0);
+ break;
+ case WM_RESET_KEYBOARD:
+ display = SPICE_DISPLAY((GtkWidget *) data);
+ if (msg->wParam == 0 && msg->lParam == 0
+ && PRIMARYLANGID(LOWORD(GetKeyboardLayout(0))) != LANG_ENGLISH
+ && display->priv->keyboard_have_focus) {
+ set_normal_keyboard(display);
+ set_raw_keyboard(display);
+ }
+ break;
+ }
+ return GDK_FILTER_CONTINUE;
+}
+#endif
+
static void realize(GtkWidget *widget)
{
SpiceDisplay *display = SPICE_DISPLAY(widget);
@@ -1900,6 +1928,11 @@ static void realize(GtkWidget *widget)
vnc_display_keymap_gdk2xtkbd_table(gtk_widget_get_window(widget),
&d->keycode_maplen);
update_image(display);
+
+#ifdef G_OS_WIN32
+ // add a filter to capture Windows messages
+ gdk_window_add_filter(GDK_WINDOW(gtk_widget_get_window(widget)), message_filter, widget);
+#endif
}
static void unrealize(GtkWidget *widget)