diff --git a/src/input/x11.c b/src/input/x11.c index 5f76c53..09d8d95 100644 --- a/src/input/x11.c +++ b/src/input/x11.c @@ -46,86 +46,85 @@ static Cursor cursor; static bool grabbed = True; static int x11_handler(int fd) { - if (!XPending(display)) - return LOOP_OK; - XEvent event; int button = 0; int motion_x, motion_y; - XNextEvent(display, &event); - switch (event.type) { - case KeyPress: - case KeyRelease: - if (event.xkey.keycode >= 8 && event.xkey.keycode < (sizeof(keyCodes)/sizeof(keyCodes[0]) + 8)) { - if ((keyboard_modifiers & MODIFIERS) == MODIFIERS && event.type == KeyRelease) { - grabbed = !grabbed; - XDefineCursor(display, window, grabbed ? cursor : 0); - } + while (XPending(display)) { + XNextEvent(display, &event); + switch (event.type) { + case KeyPress: + case KeyRelease: + if (event.xkey.keycode >= 8 && event.xkey.keycode < (sizeof(keyCodes)/sizeof(keyCodes[0]) + 8)) { + if ((keyboard_modifiers & MODIFIERS) == MODIFIERS && event.type == KeyRelease) { + grabbed = !grabbed; + XDefineCursor(display, window, grabbed ? cursor : 0); + } - int modifier = 0; - switch (event.xkey.keycode) { - case 0x32: - case 0x3e: - modifier = MODIFIER_SHIFT; + int modifier = 0; + switch (event.xkey.keycode) { + case 0x32: + case 0x3e: + modifier = MODIFIER_SHIFT; + break; + case 0x40: + case 0x6c: + modifier = MODIFIER_ALT; + break; + case 0x25: + case 0x69: + modifier = MODIFIER_CTRL; + break; + } + + if (modifier != 0) { + if (event.type == KeyPress) + keyboard_modifiers |= modifier; + else + keyboard_modifiers &= ~modifier; + } + + short code = 0x80 << 8 | keyCodes[event.xkey.keycode - 8]; + LiSendKeyboardEvent(code, event.type == KeyPress ? KEY_ACTION_DOWN : KEY_ACTION_UP, keyboard_modifiers); + } + break; + case ButtonPress: + case ButtonRelease: + switch (event.xbutton.button) { + case Button1: + button = BUTTON_LEFT; break; - case 0x40: - case 0x6c: - modifier = MODIFIER_ALT; + case Button2: + button = BUTTON_MIDDLE; break; - case 0x25: - case 0x69: - modifier = MODIFIER_CTRL; + case Button3: + button = BUTTON_RIGHT; break; } - if (modifier != 0) { - if (event.type == KeyPress) - keyboard_modifiers |= modifier; - else - keyboard_modifiers &= ~modifier; + if (button != 0) + LiSendMouseButtonEvent(event.type==ButtonPress ? BUTTON_ACTION_PRESS : BUTTON_ACTION_RELEASE, button); + break; + case MotionNotify: + motion_x = event.xmotion.x - last_x; + motion_y = event.xmotion.y - last_y; + if (abs(motion_x) > 0 || abs(motion_y) > 0) { + if (last_x >= 0 && last_y >= 0) + LiSendMouseMoveEvent(motion_x, motion_y); + + if (grabbed) + XWarpPointer(display, None, window, 0, 0, 0, 0, 640, 360); } - short code = 0x80 << 8 | keyCodes[event.xkey.keycode - 8]; - LiSendKeyboardEvent(code, event.type == KeyPress ? KEY_ACTION_DOWN : KEY_ACTION_UP, keyboard_modifiers); - } - break; - case ButtonPress: - case ButtonRelease: - switch (event.xbutton.button) { - case Button1: - button = BUTTON_LEFT; + last_x = grabbed ? 640 : event.xmotion.x; + last_y = grabbed ? 360 : event.xmotion.y; break; - case Button2: - button = BUTTON_MIDDLE; - break; - case Button3: - button = BUTTON_RIGHT; + case ClientMessage: + if (event.xclient.data.l[0] == wm_deletemessage) + return LOOP_RETURN; + break; } - - if (button != 0) - LiSendMouseButtonEvent(event.type==ButtonPress ? BUTTON_ACTION_PRESS : BUTTON_ACTION_RELEASE, button); - break; - case MotionNotify: - motion_x = event.xmotion.x - last_x; - motion_y = event.xmotion.y - last_y; - if (abs(motion_x) > 0 || abs(motion_y) > 0) { - if (last_x >= 0 && last_y >= 0) - LiSendMouseMoveEvent(motion_x, motion_y); - - if (grabbed) - XWarpPointer(display, None, window, 0, 0, 0, 0, 640, 360); - } - - last_x = grabbed ? 640 : event.xmotion.x; - last_y = grabbed ? 360 : event.xmotion.y; - break; - case ClientMessage: - if (event.xclient.data.l[0] == wm_deletemessage) - return LOOP_RETURN; - - break; } return LOOP_OK;