diff options
author | Frediano Ziglio <fziglio@redhat.com> | 2016-03-23 10:56:35 +0000 |
---|---|---|
committer | Frediano Ziglio <fziglio@redhat.com> | 2016-03-23 16:08:40 +0000 |
commit | 5c34f8c12e2fbafb387d9af27c5e5a59a963bdd8 (patch) | |
tree | d0849e0aa32195f77061a0553ae8121794046e9f | |
parent | bcf2751888444e8404e4f6fe31989fc83e59c2d4 (diff) |
Keep the keyboard as compatibleenglish_keyboard
If user try to change keyboard make sure is still compatible
with our requirements
-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) |