diff options
Diffstat (limited to 'src/spice-widget.c')
-rw-r--r-- | src/spice-widget.c | 33 |
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) |