Revert "x11: Avoid excess keymap reconstruction"
Switching between layouts with the same group number (e.g. US to Japanese) were incorrectly filtered out with this change, as it doesn't trigger a MappingNotify event.
This reverts commit 3d42412650.
This commit is contained in:
@@ -1131,20 +1131,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
|
|||||||
printf("window %p: KeymapNotify!\n", data);
|
printf("window %p: KeymapNotify!\n", data);
|
||||||
#endif
|
#endif
|
||||||
if (SDL_GetKeyboardFocus() != NULL) {
|
if (SDL_GetKeyboardFocus() != NULL) {
|
||||||
#ifdef SDL_VIDEO_DRIVER_X11_HAS_XKBLOOKUPKEYSYM
|
|
||||||
if (videodata->xkb) {
|
|
||||||
XkbStateRec state;
|
|
||||||
X11_XkbGetUpdatedMap(videodata->display, XkbAllClientInfoMask, videodata->xkb);
|
|
||||||
|
|
||||||
if (X11_XkbGetState(videodata->display, XkbUseCoreKbd, &state) == Success) {
|
|
||||||
unsigned int group = state.group;
|
|
||||||
if (group != videodata->xkb_group) {
|
|
||||||
/* Only rebuild the keymap if the layout has changed. */
|
|
||||||
X11_UpdateKeymap(_this, SDL_TRUE);
|
X11_UpdateKeymap(_this, SDL_TRUE);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
X11_ReconcileKeyboardState(_this);
|
X11_ReconcileKeyboardState(_this);
|
||||||
}
|
}
|
||||||
} else if (xevent->type == MappingNotify) {
|
} else if (xevent->type == MappingNotify) {
|
||||||
|
|||||||
@@ -347,6 +347,7 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, SDL_bool send_event)
|
|||||||
int i;
|
int i;
|
||||||
SDL_Scancode scancode;
|
SDL_Scancode scancode;
|
||||||
SDL_Keymap *keymap;
|
SDL_Keymap *keymap;
|
||||||
|
unsigned char group = 0;
|
||||||
|
|
||||||
keymap = SDL_CreateKeymap();
|
keymap = SDL_CreateKeymap();
|
||||||
|
|
||||||
@@ -356,7 +357,7 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, SDL_bool send_event)
|
|||||||
X11_XkbGetUpdatedMap(data->display, XkbAllClientInfoMask, data->xkb);
|
X11_XkbGetUpdatedMap(data->display, XkbAllClientInfoMask, data->xkb);
|
||||||
|
|
||||||
if (X11_XkbGetState(data->display, XkbUseCoreKbd, &state) == Success) {
|
if (X11_XkbGetState(data->display, XkbUseCoreKbd, &state) == Success) {
|
||||||
data->xkb_group = state.group;
|
group = state.group;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -371,7 +372,7 @@ void X11_UpdateKeymap(SDL_VideoDevice *_this, SDL_bool send_event)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeySym keysym = X11_KeyCodeToSym(_this, i, data->xkb_group, keymod_masks[m].xkb_mask);
|
KeySym keysym = X11_KeyCodeToSym(_this, i, group, keymod_masks[m].xkb_mask);
|
||||||
|
|
||||||
/* Note: The default SDL scancode table sets this to right alt instead of AltGr/Mode, so handle it separately. */
|
/* Note: The default SDL scancode table sets this to right alt instead of AltGr/Mode, so handle it separately. */
|
||||||
if (keysym != XK_ISO_Level3_Shift) {
|
if (keysym != XK_ISO_Level3_Shift) {
|
||||||
|
|||||||
@@ -125,7 +125,6 @@ struct SDL_VideoData
|
|||||||
XkbDescPtr xkb;
|
XkbDescPtr xkb;
|
||||||
#endif
|
#endif
|
||||||
int xkb_event;
|
int xkb_event;
|
||||||
unsigned int xkb_group;
|
|
||||||
|
|
||||||
KeyCode filter_code;
|
KeyCode filter_code;
|
||||||
Time filter_time;
|
Time filter_time;
|
||||||
|
|||||||
Reference in New Issue
Block a user