Browse Source

X11: Handle keyboard layout changing during app's run on Ubuntu 12.04 (etc).

Fixes Bugzilla #3050 (in addition to Jason Wyatt's patch, prior to this).
Ryan C. Gordon 9 years ago
parent
commit
8145760314
3 changed files with 11 additions and 2 deletions
  1. 9 2
      src/video/x11/SDL_x11events.c
  2. 1 0
      src/video/x11/SDL_x11video.c
  3. 1 0
      src/video/x11/SDL_x11video.h

+ 9 - 2
src/video/x11/SDL_x11events.c

@@ -1134,8 +1134,15 @@ X11_DispatchEvent(_THIS)
                     } else {
                         SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_RESTORED, 0, 0);
                     }
-                 }
-
+                }
+            } else if (xevent.xproperty.atom == videodata->XKLAVIER_STATE) {
+                /* Hack for Ubuntu 12.04 (etc) that doesn't send MappingNotify
+                   events when the keyboard layout changes (for example,
+                   changing from English to French on the menubar's keyboard
+                   icon). Since it changes the XKLAVIER_STATE property, we
+                   notice and reinit our keymap here. This might not be the
+                   right approach, but it seems to work. */
+                X11_UpdateKeymap(_this);
             }
         }
         break;

+ 1 - 0
src/video/x11/SDL_x11video.c

@@ -408,6 +408,7 @@ X11_VideoInit(_THIS)
     GET_ATOM(XdndDrop);
     GET_ATOM(XdndFinished);
     GET_ATOM(XdndSelection);
+    GET_ATOM(XKLAVIER_STATE);
 
     /* Detect the window manager */
     X11_CheckWindowManager(_this);

+ 1 - 0
src/video/x11/SDL_x11video.h

@@ -111,6 +111,7 @@ typedef struct SDL_VideoData
     Atom XdndDrop;
     Atom XdndFinished;
     Atom XdndSelection;
+    Atom XKLAVIER_STATE;
 
     SDL_Scancode key_layout[256];
     SDL_bool selection_waiting;