From 5c34f8c12e2fbafb387d9af27c5e5a59a963bdd8 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Wed, 23 Mar 2016 10:56:35 +0000 Subject: Keep the keyboard as compatible If user try to change keyboard make sure is still compatible with our requirements --- src/spice-widget.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) 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) -- cgit v1.2.3