mirror of https://github.com/encounter/SDL.git
Fixed X11 build, added code to print initial modifiers to checkkeys
This commit is contained in:
parent
0694baf260
commit
719bb6fcee
|
@ -334,6 +334,77 @@ static void X11_HandleGenericEvent(SDL_VideoData *videodata,XEvent event)
|
||||||
}
|
}
|
||||||
#endif /* SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS */
|
#endif /* SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS */
|
||||||
|
|
||||||
|
static unsigned
|
||||||
|
X11_GetNumLockModifierMask(_THIS)
|
||||||
|
{
|
||||||
|
SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata;
|
||||||
|
Display *display = viddata->display;
|
||||||
|
unsigned num_mask = 0;
|
||||||
|
int i, j;
|
||||||
|
XModifierKeymap *xmods;
|
||||||
|
unsigned n;
|
||||||
|
|
||||||
|
xmods = X11_XGetModifierMapping(display);
|
||||||
|
n = xmods->max_keypermod;
|
||||||
|
for(i = 3; i < 8; i++) {
|
||||||
|
for(j = 0; j < n; j++) {
|
||||||
|
KeyCode kc = xmods->modifiermap[i * n + j];
|
||||||
|
if (viddata->key_layout[kc] == SDL_SCANCODE_NUMLOCKCLEAR) {
|
||||||
|
num_mask = 1 << i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
X11_XFreeModifiermap(xmods);
|
||||||
|
|
||||||
|
return num_mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
X11_ReconcileKeyboardState(_THIS, const SDL_WindowData *data)
|
||||||
|
{
|
||||||
|
SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata;
|
||||||
|
Display *display = viddata->display;
|
||||||
|
char keys[32];
|
||||||
|
int keycode;
|
||||||
|
Window junk_window;
|
||||||
|
int x, y;
|
||||||
|
unsigned int mask;
|
||||||
|
|
||||||
|
X11_XQueryKeymap(display, keys);
|
||||||
|
|
||||||
|
/* Get the keyboard modifier state */
|
||||||
|
if (X11_XQueryPointer(display, DefaultRootWindow(display), &junk_window, &junk_window, &x, &y, &x, &y, &mask)) {
|
||||||
|
unsigned num_mask = X11_GetNumLockModifierMask(_this);
|
||||||
|
const Uint8 *keystate = SDL_GetKeyboardState(NULL);
|
||||||
|
Uint8 capslockState = keystate[SDL_SCANCODE_CAPSLOCK];
|
||||||
|
Uint8 numlockState = keystate[SDL_SCANCODE_NUMLOCKCLEAR];
|
||||||
|
|
||||||
|
/* Toggle key mod state if needed */
|
||||||
|
if (!!(mask & LockMask) != !!(SDL_GetModState() & KMOD_CAPS)) {
|
||||||
|
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_CAPSLOCK);
|
||||||
|
if (capslockState == SDL_RELEASED) {
|
||||||
|
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_CAPSLOCK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!!(mask & num_mask) != !!(SDL_GetModState() & KMOD_NUM)) {
|
||||||
|
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR);
|
||||||
|
if (numlockState == SDL_RELEASED) {
|
||||||
|
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (keycode = 0; keycode < 256; ++keycode) {
|
||||||
|
if (keys[keycode / 8] & (1 << (keycode % 8))) {
|
||||||
|
SDL_SendKeyboardKey(SDL_PRESSED, viddata->key_layout[keycode]);
|
||||||
|
} else {
|
||||||
|
SDL_SendKeyboardKey(SDL_RELEASED, viddata->key_layout[keycode]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
X11_DispatchFocusIn(_THIS, SDL_WindowData *data)
|
X11_DispatchFocusIn(_THIS, SDL_WindowData *data)
|
||||||
|
@ -342,7 +413,7 @@ X11_DispatchFocusIn(_THIS, SDL_WindowData *data)
|
||||||
printf("window %p: Dispatching FocusIn\n", data);
|
printf("window %p: Dispatching FocusIn\n", data);
|
||||||
#endif
|
#endif
|
||||||
SDL_SetKeyboardFocus(data->window);
|
SDL_SetKeyboardFocus(data->window);
|
||||||
ReconcileKeyboardState(_this, data);
|
X11_ReconcileKeyboardState(_this, data);
|
||||||
#ifdef X_HAVE_UTF8_STRING
|
#ifdef X_HAVE_UTF8_STRING
|
||||||
if (data->ic) {
|
if (data->ic) {
|
||||||
X11_XSetICFocus(data->ic);
|
X11_XSetICFocus(data->ic);
|
||||||
|
@ -483,77 +554,6 @@ ProcessHitTest(_THIS, const SDL_WindowData *data, const XEvent *xev)
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned
|
|
||||||
GetNumLockModifierMask(_THIS)
|
|
||||||
{
|
|
||||||
SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata;
|
|
||||||
Display *display = viddata->display;
|
|
||||||
unsigned num_mask = 0;
|
|
||||||
int i, j;
|
|
||||||
XModifierKeymap *xmods;
|
|
||||||
unsigned n;
|
|
||||||
|
|
||||||
xmods = X11_XGetModifierMapping(display);
|
|
||||||
n = xmods->max_keypermod;
|
|
||||||
for(i = 3; i < 8; i++) {
|
|
||||||
for(j = 0; j < n; j++) {
|
|
||||||
KeyCode kc = xmods->modifiermap[i * n + j];
|
|
||||||
if (viddata->key_layout[kc] == SDL_SCANCODE_NUMLOCKCLEAR) {
|
|
||||||
num_mask = 1 << i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
X11_XFreeModifiermap(xmods);
|
|
||||||
|
|
||||||
return num_mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ReconcileKeyboardState(_THIS, const SDL_WindowData *data)
|
|
||||||
{
|
|
||||||
SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata;
|
|
||||||
Display *display = viddata->display;
|
|
||||||
char keys[32];
|
|
||||||
int keycode;
|
|
||||||
Window junk_window;
|
|
||||||
int x, y;
|
|
||||||
unsigned int mask;
|
|
||||||
|
|
||||||
X11_XQueryKeymap(display, keys);
|
|
||||||
|
|
||||||
for (keycode = 0; keycode < 256; ++keycode) {
|
|
||||||
if (keys[keycode / 8] & (1 << (keycode % 8))) {
|
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, viddata->key_layout[keycode]);
|
|
||||||
} else {
|
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, viddata->key_layout[keycode]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the keyboard modifier state */
|
|
||||||
if (X11_XQueryPointer(display, DefaultRootWindow(display), &junk_window, &junk_window, &x, &y, &x, &y, &mask)) {
|
|
||||||
unsigned num_mask = GetNumLockModifierMask(_this);
|
|
||||||
const Uint8 *keystate = SDL_GetKeyboardState(NULL);
|
|
||||||
Uint8 capslockState = keystate[SDL_SCANCODE_CAPSLOCK];
|
|
||||||
Uint8 numlockState = keystate[SDL_SCANCODE_NUMLOCKCLEAR];
|
|
||||||
|
|
||||||
/* Toggle key mod state if needed */
|
|
||||||
if (!!(mask & LockMask) != !!(SDL_GetModState() & KMOD_CAPS)) {
|
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_CAPSLOCK);
|
|
||||||
if (capslockState == SDL_RELEASED) {
|
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_CAPSLOCK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!!(mask & num_mask) != !!(SDL_GetModState() & KMOD_NUM)) {
|
|
||||||
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR);
|
|
||||||
if (numlockState == SDL_RELEASED) {
|
|
||||||
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
X11_DispatchEvent(_THIS)
|
X11_DispatchEvent(_THIS)
|
||||||
{
|
{
|
||||||
|
@ -737,7 +737,7 @@ X11_DispatchEvent(_THIS)
|
||||||
{
|
{
|
||||||
data->pending_focus = PENDING_FOCUS_NONE;
|
data->pending_focus = PENDING_FOCUS_NONE;
|
||||||
data->pending_focus_time = 0;
|
data->pending_focus_time = 0;
|
||||||
X11_DispatchFocusOut(data);
|
X11_DispatchFocusOut(_this, data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -88,6 +88,20 @@ print_modifiers(char **text, size_t *maxlen)
|
||||||
print_string(text, maxlen, " MODE");
|
print_string(text, maxlen, " MODE");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
PrintModifierState()
|
||||||
|
{
|
||||||
|
char message[512];
|
||||||
|
char *spot;
|
||||||
|
size_t left;
|
||||||
|
|
||||||
|
spot = message;
|
||||||
|
left = sizeof(message);
|
||||||
|
|
||||||
|
print_modifiers(&spot, &left);
|
||||||
|
SDL_Log("Initial state:%s\n", message);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
PrintKey(SDL_Keysym * sym, SDL_bool pressed, SDL_bool repeat)
|
PrintKey(SDL_Keysym * sym, SDL_bool pressed, SDL_bool repeat)
|
||||||
{
|
{
|
||||||
|
@ -200,6 +214,10 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
SDL_StartTextInput();
|
SDL_StartTextInput();
|
||||||
|
|
||||||
|
/* Print initial modifier state */
|
||||||
|
SDL_PumpEvents();
|
||||||
|
PrintModifierState();
|
||||||
|
|
||||||
/* Watch keystrokes */
|
/* Watch keystrokes */
|
||||||
done = 0;
|
done = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue