diff options
Diffstat (limited to 'src/keybindings.c')
-rw-r--r-- | src/keybindings.c | 1163 |
1 files changed, 714 insertions, 449 deletions
diff --git a/src/keybindings.c b/src/keybindings.c index cd04c4f1..ecc8b9b6 100644 --- a/src/keybindings.c +++ b/src/keybindings.c @@ -33,6 +33,7 @@ #include "place.h" #include "prefs.h" #include "effects.h" +#include "devices.h" #include <X11/keysym.h> #include <string.h> @@ -45,230 +46,273 @@ static gboolean all_bindings_disabled = FALSE; -typedef void (* MetaKeyHandlerFunc) (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding); +typedef void (* MetaKeyHandlerFunc) (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding); static void handle_activate_workspace (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_activate_menu (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_tab_forward (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_tab_backward (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_cycle_forward (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_cycle_backward (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_toggle_fullscreen (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_toggle_desktop (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_panel_keybinding (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_toggle_above (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_toggle_maximize (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_maximize (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_unmaximize (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_toggle_shade (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_close_window (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_minimize_window (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_begin_move (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_begin_resize (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_toggle_sticky (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_move_to_workspace (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_move_to_workspace_flip (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_workspace_switch (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_raise_or_lower (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_raise (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_lower (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_run_command (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_maximize_vert (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_maximize_horiz (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_move_to_side_n (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_move_to_side_w (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_move_to_side_s (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_move_to_side_e (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); -static void handle_move_to_corner_nw (MetaDisplay *display, +static void handle_move_to_corner_nw (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); -static void handle_move_to_corner_ne (MetaDisplay *display, +static void handle_move_to_corner_ne (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); -static void handle_move_to_corner_sw (MetaDisplay *display, +static void handle_move_to_corner_sw (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); -static void handle_move_to_corner_se (MetaDisplay *display, +static void handle_move_to_corner_se (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_spew_mark (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); static void handle_run_terminal (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, MetaKeyBinding *binding); /* debug */ static gboolean process_mouse_move_resize_grab (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, KeySym keysym); static gboolean process_keyboard_move_grab (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, KeySym keysym); static gboolean process_keyboard_resize_grab (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, KeySym keysym); static gboolean process_tab_grab (MetaDisplay *display, MetaScreen *screen, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, KeySym keysym); static gboolean process_workspace_switch_grab (MetaDisplay *display, MetaScreen *screen, - XEvent *event, + //XEvent *event, + XDeviceKeyEvent *xdke, KeySym keysym); static void regrab_screen_bindings (MetaDisplay *display); @@ -495,6 +539,7 @@ reload_keymap (MetaDisplay *display) if (display->keymap) meta_XFree (display->keymap); + /* XXX USE XI!!!!! (when it implements these functions...) */ display->keymap = XGetKeyboardMapping (display->xdisplay, display->min_keycode, display->max_keycode - @@ -509,6 +554,7 @@ reload_modmap (MetaDisplay *display) int map_size; int i; + /* XXX USE XI!!!!! (when it implements these functions...) */ if (display->modmap) XFreeModifiermap (display->modmap); @@ -830,6 +876,7 @@ static void regrab_screen_bindings (MetaDisplay *display) { GSList *tmp; + int idev; meta_error_trap_push (display); /* for efficiency push outer trap */ @@ -837,9 +884,11 @@ regrab_screen_bindings (MetaDisplay *display) while (tmp != NULL) { MetaScreen *screen = tmp->data; - - meta_screen_ungrab_keys (screen); - meta_screen_grab_keys (screen); + for (idev = 0; idev < display->devices->keybsUsed; idev++) + { + meta_screen_ungrab_keys (screen, &display->devices->keyboards[idev]); + meta_screen_grab_keys (screen, &display->devices->keyboards[idev]); + } tmp = tmp->next; } @@ -852,6 +901,7 @@ regrab_window_bindings (MetaDisplay *display) { GSList *windows; GSList *tmp; + int idev; windows = meta_display_list_windows (display); @@ -861,8 +911,11 @@ regrab_window_bindings (MetaDisplay *display) { MetaWindow *w = tmp->data; - meta_window_ungrab_keys (w); - meta_window_grab_keys (w); + for (idev = 0; idev < display->devices->keybsUsed; idev++) + { + meta_window_ungrab_keys (w, &display->devices->keyboards[idev]); + meta_window_grab_keys (w, &display->devices->keyboards[idev]); + } tmp = tmp->next; } @@ -899,6 +952,7 @@ void meta_display_process_mapping_event (MetaDisplay *display, XEvent *event) { + /* XXX Is this Xi'able? */ if (event->xmapping.request == MappingModifier) { meta_topic (META_DEBUG_KEYBINDINGS, @@ -1028,6 +1082,7 @@ keysym_name (int keysym) /* Grab/ungrab, ignoring all annoying modifiers like NumLock etc. */ static void meta_change_keygrab (MetaDisplay *display, + MetaDevInfo *dev, Window xwindow, gboolean grab, int keysym, @@ -1065,15 +1120,20 @@ meta_change_keygrab (MetaDisplay *display, if (meta_is_debugging ()) meta_error_trap_push_with_return (display); if (grab) - XGrabKey (display->xdisplay, keycode, - modmask | ignored_mask, - xwindow, - True, - GrabModeAsync, GrabModeSync); + XGrabDeviceKey (display->xdisplay, + dev->xdev, + keycode, + modmask | ignored_mask, + dev->xdev, + xwindow, + True, + 0, + NULL, + GrabModeAsync, GrabModeSync); else - XUngrabKey (display->xdisplay, keycode, - modmask | ignored_mask, - xwindow); + XUngrabDeviceKey (display->xdisplay, dev->xdev, keycode, + modmask | ignored_mask, + dev->xdev, xwindow); if (meta_is_debugging ()) { @@ -1100,16 +1160,18 @@ meta_change_keygrab (MetaDisplay *display, static void meta_grab_key (MetaDisplay *display, + MetaDevInfo *dev, Window xwindow, int keysym, unsigned int keycode, int modmask) { - meta_change_keygrab (display, xwindow, TRUE, keysym, keycode, modmask); + meta_change_keygrab (display, dev, xwindow, TRUE, keysym, keycode, modmask); } static void -grab_keys (MetaKeyBinding *bindings, +grab_keys (MetaDevInfo *dev, + MetaKeyBinding *bindings, int n_bindings, MetaDisplay *display, Window xwindow) @@ -1125,7 +1187,7 @@ grab_keys (MetaKeyBinding *bindings, { if (bindings[i].keycode != 0) { - meta_grab_key (display, xwindow, + meta_grab_key (display, dev, xwindow, bindings[i].keysym, bindings[i].keycode, bindings[i].mask); @@ -1139,6 +1201,7 @@ grab_keys (MetaKeyBinding *bindings, static void ungrab_all_keys (MetaDisplay *display, + MetaDevInfo *dev, Window xwindow) { if (meta_is_debugging ()) @@ -1146,8 +1209,8 @@ ungrab_all_keys (MetaDisplay *display, else meta_error_trap_push (display); - XUngrabKey (display->xdisplay, AnyKey, AnyModifier, - xwindow); + XUngrabDeviceKey (display->xdisplay, dev->xdev, AnyKey, AnyModifier, + dev->xdev, xwindow); if (meta_is_debugging ()) { @@ -1164,7 +1227,7 @@ ungrab_all_keys (MetaDisplay *display, } void -meta_screen_grab_keys (MetaScreen *screen) +meta_screen_grab_keys (MetaScreen *screen, MetaDevInfo *dev) { if (screen->all_keys_grabbed) return; @@ -1172,7 +1235,8 @@ meta_screen_grab_keys (MetaScreen *screen) if (screen->keys_grabbed) return; - grab_keys (screen->display->screen_bindings, + grab_keys (dev, + screen->display->screen_bindings, screen->display->n_screen_bindings, screen->display, screen->xroot); @@ -1180,17 +1244,17 @@ meta_screen_grab_keys (MetaScreen *screen) } void -meta_screen_ungrab_keys (MetaScreen *screen) +meta_screen_ungrab_keys (MetaScreen *screen, MetaDevInfo *dev) { if (screen->keys_grabbed) { - ungrab_all_keys (screen->display, screen->xroot); + ungrab_all_keys (screen->display, dev, screen->xroot); screen->keys_grabbed = FALSE; } } void -meta_window_grab_keys (MetaWindow *window) +meta_window_grab_keys (MetaWindow *window, MetaDevInfo *dev) { if (window->all_keys_grabbed) return; @@ -1198,7 +1262,7 @@ meta_window_grab_keys (MetaWindow *window) if (window->type == META_WINDOW_DOCK) { if (window->keys_grabbed) - ungrab_all_keys (window->display, window->xwindow); + ungrab_all_keys (window->display, dev, window->xwindow); window->keys_grabbed = FALSE; return; } @@ -1206,7 +1270,7 @@ meta_window_grab_keys (MetaWindow *window) if (window->keys_grabbed) { if (window->frame && !window->grab_on_frame) - ungrab_all_keys (window->display, window->xwindow); + ungrab_all_keys (window->display, dev, window->xwindow); else if (window->frame == NULL && window->grab_on_frame) ; /* continue to regrab on client window */ @@ -1214,7 +1278,8 @@ meta_window_grab_keys (MetaWindow *window) return; /* already all good */ } - grab_keys (window->display->window_bindings, + grab_keys (dev, + window->display->window_bindings, window->display->n_window_bindings, window->display, window->frame ? window->frame->xwindow : window->xwindow); @@ -1224,16 +1289,16 @@ meta_window_grab_keys (MetaWindow *window) } void -meta_window_ungrab_keys (MetaWindow *window) +meta_window_ungrab_keys (MetaWindow *window, MetaDevInfo *dev) { if (window->keys_grabbed) { if (window->grab_on_frame && window->frame != NULL) - ungrab_all_keys (window->display, + ungrab_all_keys (window->display, dev, window->frame->xwindow); else if (!window->grab_on_frame) - ungrab_all_keys (window->display, + ungrab_all_keys (window->display, dev, window->xwindow); window->keys_grabbed = FALSE; @@ -1263,9 +1328,16 @@ grab_status_to_string (int status) #endif /* WITH_VERBOSE_MODE */ static gboolean +#ifdef MPX +grab_keyboard (MetaDisplay *display, + MetaDevInfo *dev, + Window xwindow, + guint32 timestamp) +#else grab_keyboard (MetaDisplay *display, Window xwindow, guint32 timestamp) +#endif { int result; int grab_status; @@ -1275,16 +1347,27 @@ grab_keyboard (MetaDisplay *display, */ meta_error_trap_push_with_return (display); - grab_status = XGrabKeyboard (display->xdisplay, - xwindow, True, - GrabModeAsync, GrabModeAsync, - timestamp); +#ifdef MPX + /* XXX No event classes?? */ +#warning grabbing stuff with no evclasses + grab_status = XGrabDevice (display->xdisplay, + dev->xdev, + xwindow, + True, + 0, + NULL, + GrabModeAsync, + GrabModeAsync, + timestamp); +// meta_warning("grabbed device %s with no evclasses! keybindings.c:1362\n", +// dev->name); +#endif if (grab_status != GrabSuccess) { meta_error_trap_pop_with_return (display, TRUE); meta_topic (META_DEBUG_KEYBINDINGS, - "XGrabKeyboard() returned failure status %s time %u\n", + "XGrabDevice() returned failure status %s time %u\n", grab_status_to_string (grab_status), timestamp); return FALSE; @@ -1295,7 +1378,7 @@ grab_keyboard (MetaDisplay *display, if (result != Success) { meta_topic (META_DEBUG_KEYBINDINGS, - "XGrabKeyboard() resulted in an error\n"); + "XGrabDevice() resulted in an error\n"); return FALSE; } } @@ -1306,19 +1389,26 @@ grab_keyboard (MetaDisplay *display, } static void -ungrab_keyboard (MetaDisplay *display, guint32 timestamp) +ungrab_keyboard (MetaDisplay *display, + MetaDevInfo *dev, + guint32 timestamp) { meta_error_trap_push (display); meta_topic (META_DEBUG_KEYBINDINGS, "Ungrabbing keyboard with timestamp %u\n", timestamp); - XUngrabKeyboard (display->xdisplay, timestamp); + XUngrabDevice (display->xdisplay, dev->xdev, timestamp); meta_error_trap_pop (display, FALSE); } gboolean +#ifdef MPX +meta_screen_grab_all_keys (MetaScreen *screen, MetaDevInfo *dev, + guint32 timestamp) +#else meta_screen_grab_all_keys (MetaScreen *screen, guint32 timestamp) +#endif { gboolean retval; @@ -1326,37 +1416,45 @@ meta_screen_grab_all_keys (MetaScreen *screen, guint32 timestamp) return FALSE; if (screen->keys_grabbed) - meta_screen_ungrab_keys (screen); + meta_screen_ungrab_keys (screen, dev); meta_topic (META_DEBUG_KEYBINDINGS, "Grabbing all keys on RootWindow\n"); - retval = grab_keyboard (screen->display, screen->xroot, timestamp); + retval = grab_keyboard (screen->display, dev, screen->xroot, timestamp); if (retval) screen->all_keys_grabbed = TRUE; else - meta_screen_grab_keys (screen); + meta_screen_grab_keys (screen, dev); return retval; } void -meta_screen_ungrab_all_keys (MetaScreen *screen, guint32 timestamp) +meta_screen_ungrab_all_keys (MetaScreen *screen, + MetaDevInfo *dev, + guint32 timestamp) { if (screen->all_keys_grabbed) { - ungrab_keyboard (screen->display, timestamp); + ungrab_keyboard (screen->display, dev, timestamp); screen->all_keys_grabbed = FALSE; screen->keys_grabbed = FALSE; /* Re-establish our standard bindings */ - meta_screen_grab_keys (screen); + meta_screen_grab_keys (screen, dev); } } gboolean +#ifdef MPX +meta_window_grab_all_keys (MetaWindow *window, + MetaDevInfo *dev, + guint32 timestamp) +#else meta_window_grab_all_keys (MetaWindow *window, guint32 timestamp) +#endif { Window grabwindow; gboolean retval; @@ -1365,7 +1463,7 @@ meta_window_grab_all_keys (MetaWindow *window, return FALSE; if (window->keys_grabbed) - meta_window_ungrab_keys (window); + meta_window_ungrab_keys (window, dev); /* Make sure the window is focused, otherwise the grab * won't do a lot of good. @@ -1373,13 +1471,17 @@ meta_window_grab_all_keys (MetaWindow *window, meta_topic (META_DEBUG_FOCUS, "Focusing %s because we're grabbing all its keys\n", window->desc); - meta_window_focus (window, timestamp); + meta_window_focus (window, dev, timestamp); grabwindow = window->frame ? window->frame->xwindow : window->xwindow; meta_topic (META_DEBUG_KEYBINDINGS, "Grabbing all keys on window %s\n", window->desc); +#ifdef MPX + retval = grab_keyboard (window->display, dev, grabwindow, timestamp); +#else retval = grab_keyboard (window->display, grabwindow, timestamp); +#endif if (retval) { window->keys_grabbed = FALSE; @@ -1391,18 +1493,22 @@ meta_window_grab_all_keys (MetaWindow *window, } void -meta_window_ungrab_all_keys (MetaWindow *window, guint32 timestamp) +meta_window_ungrab_all_keys (MetaWindow *window, + MetaDevInfo *dev, + guint32 timestamp) { + + if (window->all_keys_grabbed) { - ungrab_keyboard (window->display, timestamp); + ungrab_keyboard (window->display, dev, timestamp); window->grab_on_frame = FALSE; window->all_keys_grabbed = FALSE; window->keys_grabbed = FALSE; /* Re-establish our standard bindings */ - meta_window_grab_keys (window); + meta_window_grab_keys (window, dev); } } @@ -1531,25 +1637,43 @@ keycode_is_primary_modifier (MetaDisplay *display, static gboolean primary_modifier_still_pressed (MetaDisplay *display, + MetaDevInfo *ptrDev, unsigned int entire_binding_mask) { unsigned int primary_modifier; int x, y, root_x, root_y; Window root, child; guint mask; - MetaScreen *random_screen; - Window random_xwindow; + MetaScreen *random_screen; + Window random_xwindow; + Bool shared; +// MetaDevInfo *pairedPointer; primary_modifier = get_primary_modifier (display, entire_binding_mask); random_screen = display->screens->data; random_xwindow = random_screen->no_focus_window; + +// pairedPointer = meta_devices_find_paired_mouse(display, dev->xdev->device_id); + + XQueryDevicePointer (display->xdisplay, + ptrDev->xdev, + random_xwindow, /* some random window */ + &root, &child, + &root_x, &root_y, + &x, &y, + &mask, &shared); + + +#if 0 +#warning XQueryPointer XQueryPointer (display->xdisplay, random_xwindow, /* some random window */ &root, &child, &root_x, &root_y, &x, &y, &mask); +#endif meta_topic (META_DEBUG_KEYBINDINGS, "Primary modifier 0x%x full grab mask 0x%x current state 0x%x\n", @@ -1587,29 +1711,28 @@ process_event (MetaKeyBinding *bindings, MetaDisplay *display, MetaScreen *screen, MetaWindow *window, - XEvent *event, + XDeviceKeyEvent *xdke, KeySym keysym) { int i; - /* we used to have release-based bindings but no longer. */ - if (event->type == KeyRelease) + if (xdke->type == display->dev_key_release_type) return; i = 0; while (i < n_bindings) { - if (bindings[i].keycode == event->xkey.keycode && - ((event->xkey.state & ~(display->ignored_modifier_mask)) == + if (bindings[i].keycode == xdke->keycode && + ((xdke->state & ~(display->ignored_modifier_mask)) == bindings[i].mask) && - event->type == KeyPress) + xdke->type == display->dev_key_press_type) { const MetaKeyHandler *handler; meta_topic (META_DEBUG_KEYBINDINGS, "Binding keycode 0x%x mask 0x%x matches event 0x%x state 0x%x\n", bindings[i].keycode, bindings[i].mask, - event->xkey.keycode, event->xkey.state); + xdke->keycode, xdke->state); if (bindings[i].handler) handler = bindings[i].handler; @@ -1632,7 +1755,7 @@ process_event (MetaKeyBinding *bindings, */ display->allow_terminal_deactivation = TRUE; - (* handler->func) (display, screen, window, event, + (* handler->func) (display, screen, window, xdke, &bindings[i]); return; } @@ -1645,48 +1768,53 @@ process_event (MetaKeyBinding *bindings, } void -meta_display_process_key_event (MetaDisplay *display, - MetaWindow *window, - XEvent *event) +meta_display_process_key_event (MetaDisplay *display, + MetaWindow *window, + XDeviceKeyEvent *xdke) { KeySym keysym; gboolean handled; gboolean all_keys_grabbed; const char *str; MetaScreen *screen; + MetaDevInfo *dev; + + meta_warning("meta_display_process_key_event\n"); - XAllowEvents (display->xdisplay, + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + + XAllowDeviceEvents (display->xdisplay, dev->xdev, all_bindings_disabled ? ReplayKeyboard : AsyncKeyboard, - event->xkey.time); + xdke->time); if (all_bindings_disabled) return; /* if key event was on root window, we have a shortcut */ - screen = meta_display_screen_for_root (display, event->xkey.window); + screen = meta_display_screen_for_root (display, xdke->window); /* else round-trip to server */ if (screen == NULL) screen = meta_display_screen_for_xwindow (display, - event->xany.window); + xdke->window); if (screen == NULL) return; /* event window is destroyed */ /* ignore key events on popup menus and such. */ if (window == NULL && - meta_ui_window_is_widget (screen->ui, event->xany.window)) + meta_ui_window_is_widget (screen->ui, xdke->window)) return; /* window may be NULL */ - keysym = XKeycodeToKeysym (display->xdisplay, event->xkey.keycode, 0); + keysym = XKeycodeToKeysym (display->xdisplay, xdke->keycode, 0); str = XKeysymToString (keysym); meta_topic (META_DEBUG_KEYBINDINGS, "Processing key %s event, keysym: %s state: 0x%x window: %s\n", - event->type == KeyPress ? "press" : "release", - str ? str : "none", event->xkey.state, + xdke->type == display->dev_key_press_type ? "press" : "release", + str ? str : "none", xdke->state, window ? window->desc : "(no window)"); all_keys_grabbed = window ? window->all_keys_grabbed : screen->all_keys_grabbed; @@ -1696,13 +1824,13 @@ meta_display_process_key_event (MetaDisplay *display, process_event (display->screen_bindings, display->n_screen_bindings, screen_handlers, - display, screen, NULL, event, keysym); + display, screen, NULL, xdke, keysym); if (window) process_event (display->window_bindings, display->n_window_bindings, window_handlers, - display, screen, window, event, keysym); + display, screen, window, xdke, keysym); return; } @@ -1735,7 +1863,7 @@ meta_display_process_key_event (MetaDisplay *display, "Processing event for mouse-only move/resize\n"); g_assert (window != NULL); handled = process_mouse_move_resize_grab (display, screen, - window, event, keysym); + window, xdke, keysym); break; case META_GRAB_OP_KEYBOARD_MOVING: @@ -1743,7 +1871,7 @@ meta_display_process_key_event (MetaDisplay *display, "Processing event for keyboard move\n"); g_assert (window != NULL); handled = process_keyboard_move_grab (display, screen, - window, event, keysym); + window, xdke, keysym); break; case META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN: @@ -1759,7 +1887,7 @@ meta_display_process_key_event (MetaDisplay *display, "Processing event for keyboard resize\n"); g_assert (window != NULL); handled = process_keyboard_resize_grab (display, screen, - window, event, keysym); + window, xdke, keysym); break; case META_GRAB_OP_KEYBOARD_TABBING_NORMAL: @@ -1770,13 +1898,13 @@ meta_display_process_key_event (MetaDisplay *display, case META_GRAB_OP_KEYBOARD_ESCAPING_GROUP: meta_topic (META_DEBUG_KEYBINDINGS, "Processing event for keyboard tabbing/cycling\n"); - handled = process_tab_grab (display, screen, event, keysym); + handled = process_tab_grab (display, screen, xdke, keysym); break; case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING: meta_topic (META_DEBUG_KEYBINDINGS, "Processing event for keyboard workspace switching\n"); - handled = process_workspace_switch_grab (display, screen, event, keysym); + handled = process_workspace_switch_grab (display, screen, xdke, keysym); break; default: @@ -1790,21 +1918,27 @@ meta_display_process_key_event (MetaDisplay *display, meta_topic (META_DEBUG_KEYBINDINGS, "Ending grab op %u on key event sym %s\n", display->grab_op, XKeysymToString (keysym)); - meta_display_end_grab_op (display, event->xkey.time); + meta_display_end_grab_op (display, + dev, + xdke->time); } } static gboolean -process_mouse_move_resize_grab (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - KeySym keysym) +process_mouse_move_resize_grab (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + KeySym keysym) { + MetaDevInfo *dev; + /* don't care about releases, but eat them, don't end grab */ - if (event->type == KeyRelease) + if (xdke->type == display->dev_key_release_type) return TRUE; + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + if (keysym == XK_Escape) { /* End move or resize and restore to original state. If the @@ -1816,10 +1950,12 @@ process_mouse_move_resize_grab (MetaDisplay *display, */ if (window->shaken_loose) meta_window_maximize (window, + dev, META_MAXIMIZE_HORIZONTAL | META_MAXIMIZE_VERTICAL); else if (!display->grab_wireframe_active) meta_window_move_resize (display->grab_window, + dev, TRUE, display->grab_initial_window_pos.x, display->grab_initial_window_pos.y, @@ -1839,25 +1975,29 @@ process_mouse_move_resize_grab (MetaDisplay *display, } static gboolean -process_keyboard_move_grab (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - KeySym keysym) +process_keyboard_move_grab (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + KeySym keysym) { gboolean handled; int x, y; int incr; gboolean smart_snap; + MetaDevInfo *dev; handled = FALSE; /* don't care about releases, but eat them, don't end grab */ - if (event->type == KeyRelease) + if (xdke->type == display->dev_key_release_type) return TRUE; + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + + /* don't end grab on modifier key presses */ - if (is_modifier (display, event->xkey.keycode)) + if (is_modifier (display, xdke->keycode)) return TRUE; if (display->grab_wireframe_active) @@ -1870,14 +2010,14 @@ process_keyboard_move_grab (MetaDisplay *display, meta_window_get_position (window, &x, &y); } - smart_snap = (event->xkey.state & ShiftMask) != 0; + smart_snap = (xdke->state & ShiftMask) != 0; #define SMALL_INCREMENT 1 #define NORMAL_INCREMENT 10 if (smart_snap) incr = 1; - else if (event->xkey.state & ControlMask) + else if (xdke->state & ControlMask) incr = SMALL_INCREMENT; else incr = NORMAL_INCREMENT; @@ -1893,10 +2033,12 @@ process_keyboard_move_grab (MetaDisplay *display, */ if (window->shaken_loose) meta_window_maximize (window, + dev, META_MAXIMIZE_HORIZONTAL | META_MAXIMIZE_VERTICAL); else if (!display->grab_wireframe_active) meta_window_move_resize (display->grab_window, + dev, TRUE, display->grab_initial_window_pos.x, display->grab_initial_window_pos.y, @@ -1976,7 +2118,7 @@ process_keyboard_move_grab (MetaDisplay *display, } else { - meta_window_move (window, TRUE, x, y); + meta_window_move (window, dev, TRUE, x, y); } meta_window_update_keyboard_move (window); @@ -1986,11 +2128,11 @@ process_keyboard_move_grab (MetaDisplay *display, } static gboolean -process_keyboard_resize_grab_op_change (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - KeySym keysym) +process_keyboard_resize_grab_op_change (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + KeySym keysym) { gboolean handled; @@ -2108,11 +2250,11 @@ process_keyboard_resize_grab_op_change (MetaDisplay *display, } static gboolean -process_keyboard_resize_grab (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - KeySym keysym) +process_keyboard_resize_grab (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + KeySym keysym) { gboolean handled; int height_inc; @@ -2120,15 +2262,17 @@ process_keyboard_resize_grab (MetaDisplay *display, int width, height; gboolean smart_snap; int gravity; + MetaDevInfo *dev; handled = FALSE; - /* don't care about releases, but eat them, don't end grab */ - if (event->type == KeyRelease) + if (xdke->type == display->dev_key_release_type) return TRUE; + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + /* don't end grab on modifier key presses */ - if (is_modifier (display, event->xkey.keycode)) + if (is_modifier (display, xdke->keycode)) return TRUE; if (keysym == XK_Escape) @@ -2141,6 +2285,7 @@ process_keyboard_resize_grab (MetaDisplay *display, */ if (!display->grab_wireframe_active) meta_window_move_resize (display->grab_window, + dev, TRUE, display->grab_initial_window_pos.x, display->grab_initial_window_pos.y, @@ -2153,7 +2298,7 @@ process_keyboard_resize_grab (MetaDisplay *display, } if (process_keyboard_resize_grab_op_change (display, screen, window, - event, keysym)) + xdke, keysym)) return TRUE; if (display->grab_wireframe_active) @@ -2169,7 +2314,7 @@ process_keyboard_resize_grab (MetaDisplay *display, gravity = meta_resize_gravity_from_grab_op (display->grab_op); - smart_snap = (event->xkey.state & ShiftMask) != 0; + smart_snap = (xdke->state & ShiftMask) != 0; #define SMALL_INCREMENT 1 #define NORMAL_INCREMENT 10 @@ -2179,7 +2324,7 @@ process_keyboard_resize_grab (MetaDisplay *display, height_inc = 1; width_inc = 1; } - else if (event->xkey.state & ControlMask) + else if (xdke->state & ControlMask) { width_inc = SMALL_INCREMENT; height_inc = SMALL_INCREMENT; @@ -2366,7 +2511,8 @@ process_keyboard_resize_grab (MetaDisplay *display, * are actually different from what we had before. */ if (window->rect.width != width || window->rect.height != height) - meta_window_resize_with_gravity (window, + meta_window_resize_with_gravity (window, + dev, TRUE, width, height, @@ -2382,6 +2528,7 @@ static gboolean end_keyboard_grab (MetaDisplay *display, unsigned int keycode) { +#warning change end_keyboard_grab prototype? I think no... #ifdef HAVE_XKB if (display->xkb_base_event_type > 0) { @@ -2406,10 +2553,10 @@ end_keyboard_grab (MetaDisplay *display, } static gboolean -process_tab_grab (MetaDisplay *display, - MetaScreen *screen, - XEvent *event, - KeySym keysym) +process_tab_grab (MetaDisplay *display, + MetaScreen *screen, + XDeviceKeyEvent *xdke, + KeySym keysym) { MetaKeyBindingAction action; gboolean popup_not_showing; @@ -2417,14 +2564,25 @@ process_tab_grab (MetaDisplay *display, gboolean key_used; Window prev_xwindow; MetaWindow *prev_window; + MetaDevInfo *dev; +#if 0 + int idev; + + xdke = (XDeviceKeyEvent *)event; + + for (idev = 0; idev < display->devices->keybsUsed; idev++) + if (display->devices->keyboards[idev].xdev->device_id == xdke->deviceid) + dev = &display->devices->keyboards[idev]; +#endif + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); if (screen != display->grab_screen) return FALSE; g_return_val_if_fail (screen->tab_popup != NULL, FALSE); - if (event->type == KeyRelease && - end_keyboard_grab (display, event->xkey.keycode)) + if (xdke->type == display->dev_key_release_type && + end_keyboard_grab (display, xdke->keycode)) { /* We're done, move to the new window. */ Window target_xwindow; @@ -2449,11 +2607,11 @@ process_tab_grab (MetaDisplay *display, "selection and turning mouse_mode off\n", target_window->desc); display->mouse_mode = FALSE; - meta_window_activate (target_window, event->xkey.time); + meta_window_activate (target_window, dev, xdke->time); meta_topic (META_DEBUG_KEYBINDINGS, "Ending grab early so we can focus the target window\n"); - meta_display_end_grab_op (display, event->xkey.time); + meta_display_end_grab_op (display, dev, xdke->time); return TRUE; /* we already ended the grab */ } @@ -2462,18 +2620,18 @@ process_tab_grab (MetaDisplay *display, } /* don't care about other releases, but eat them, don't end grab */ - if (event->type == KeyRelease) + if (xdke->type == display->dev_key_release_type) return TRUE; /* don't end grab on modifier key presses */ - if (is_modifier (display, event->xkey.keycode)) + if (is_modifier (display, xdke->keycode)) return TRUE; prev_xwindow = (Window) meta_ui_tab_popup_get_selected (screen->tab_popup); prev_window = meta_display_lookup_x_window (display, prev_xwindow); action = display_get_keybinding_action (display, keysym, - event->xkey.keycode, + xdke->keycode, display->grab_mask); /* Cancel when alt-Escape is pressed during using alt-Tab, and vice @@ -2583,7 +2741,7 @@ process_tab_grab (MetaDisplay *display, meta_topic (META_DEBUG_KEYBINDINGS, "Key pressed, moving tab focus in popup\n"); - if (event->xkey.state & ShiftMask) + if (xdke->state & ShiftMask) backward = !backward; if (backward) @@ -2643,11 +2801,11 @@ process_tab_grab (MetaDisplay *display, } static void -handle_activate_workspace (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *event_window, - XEvent *event, - MetaKeyBinding *binding) +handle_activate_workspace (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *event_window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { int which; MetaWorkspace *workspace; @@ -2667,7 +2825,7 @@ handle_activate_workspace (MetaDisplay *display, if (workspace) { - meta_workspace_activate (workspace, event->xkey.time); + meta_workspace_activate (workspace, xdke->time); } else { @@ -2796,11 +2954,11 @@ meta_spawn_command_line_async_on_screen (const gchar *command_line, static void -handle_run_command (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_run_command (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { int which; const char *command; @@ -2820,7 +2978,7 @@ handle_run_command (MetaDisplay *display, s = g_strdup_printf (_("No command %d has been defined.\n"), which + 1); - error_on_command (which, NULL, s, screen->number, event->xkey.time); + error_on_command (which, NULL, s, screen->number, xdke->time); g_free (s); return; @@ -2829,7 +2987,7 @@ handle_run_command (MetaDisplay *display, err = NULL; if (!meta_spawn_command_line_async_on_screen (command, screen, &err)) { - error_on_command (which, command, err->message, screen->number, event->xkey.time); + error_on_command (which, command, err->message, screen->number, xdke->time); g_error_free (err); } @@ -2837,34 +2995,40 @@ handle_run_command (MetaDisplay *display, static void -handle_maximize_vert (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_maximize_vert (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { + MetaDevInfo *dev; + + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); if (window && window->has_resize_func) { if (window->maximized_vertically) - meta_window_unmaximize (window, META_MAXIMIZE_VERTICAL); + meta_window_unmaximize (window, dev, META_MAXIMIZE_VERTICAL); else - meta_window_maximize (window, META_MAXIMIZE_VERTICAL); + meta_window_maximize (window, dev, META_MAXIMIZE_VERTICAL); } } static void -handle_maximize_horiz (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_maximize_horiz (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { + MetaDevInfo *dev; + + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); if (window && window->has_resize_func) { if (window->maximized_horizontally) - meta_window_unmaximize (window, META_MAXIMIZE_HORIZONTAL); + meta_window_unmaximize (window, dev, META_MAXIMIZE_HORIZONTAL); else - meta_window_maximize (window, META_MAXIMIZE_HORIZONTAL); + meta_window_maximize (window, dev, META_MAXIMIZE_HORIZONTAL); } } @@ -2878,6 +3042,7 @@ static void handle_move_to_corner_backend (MetaDisplay *display, MetaScreen *screen, MetaWindow *window, + MetaDevInfo *dev, gboolean xchange, gboolean ychange, gboolean to_right, @@ -2913,132 +3078,162 @@ handle_move_to_corner_backend (MetaDisplay *display, } meta_window_move_resize (window, - FALSE, - new_x, - new_y, - window->rect.width, - window->rect.height); + dev, + FALSE, + new_x, + new_y, + window->rect.width, + window->rect.height); } static void -handle_move_to_corner_nw (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_move_to_corner_nw (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { - handle_move_to_corner_backend (display, screen, window, TRUE, TRUE, FALSE, FALSE); + handle_move_to_corner_backend (display, screen, window, + meta_devices_find_keyboard_by_id(display, xdke->deviceid), + TRUE, TRUE, FALSE, FALSE); } } static void -handle_move_to_corner_ne (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_move_to_corner_ne (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { - handle_move_to_corner_backend (display, screen, window, TRUE, TRUE, TRUE, FALSE); + handle_move_to_corner_backend (display, screen, window, + meta_devices_find_keyboard_by_id(display, xdke->deviceid), + TRUE, TRUE, TRUE, FALSE); } } static void -handle_move_to_corner_sw (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_move_to_corner_sw (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { - handle_move_to_corner_backend (display, screen, window, TRUE, TRUE, FALSE, TRUE); + handle_move_to_corner_backend (display, screen, window, + meta_devices_find_keyboard_by_id(display, xdke->deviceid), + TRUE, TRUE, FALSE, TRUE); } } static void -handle_move_to_corner_se (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_move_to_corner_se (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { - handle_move_to_corner_backend (display, screen, window, TRUE, TRUE, TRUE, TRUE); + handle_move_to_corner_backend (display, screen, window, + meta_devices_find_keyboard_by_id(display, xdke->deviceid), + TRUE, TRUE, TRUE, TRUE); } } static void -handle_move_to_side_n (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_move_to_side_n (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { - handle_move_to_corner_backend (display, screen, window, FALSE, TRUE, FALSE, FALSE); + handle_move_to_corner_backend (display, screen, window, + meta_devices_find_keyboard_by_id(display, xdke->deviceid), + FALSE, TRUE, FALSE, FALSE); } } static void -handle_move_to_side_s (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_move_to_side_s (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { - handle_move_to_corner_backend (display, screen, window, FALSE, TRUE, FALSE, TRUE); + handle_move_to_corner_backend (display, screen, window, + meta_devices_find_keyboard_by_id(display, xdke->deviceid), + FALSE, TRUE, FALSE, TRUE); } } static void -handle_move_to_side_e (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_move_to_side_e (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { - handle_move_to_corner_backend (display, screen, window, TRUE, FALSE, TRUE, FALSE); + handle_move_to_corner_backend (display, screen, window, + meta_devices_find_keyboard_by_id(display, xdke->deviceid), + TRUE, FALSE, TRUE, FALSE); } } static void -handle_move_to_side_w (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_move_to_side_w (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { - handle_move_to_corner_backend (display, screen, window, TRUE, FALSE, FALSE, FALSE); + handle_move_to_corner_backend (display, screen, window, + meta_devices_find_keyboard_by_id(display, xdke->deviceid), + TRUE, FALSE, FALSE, FALSE); } } static gboolean -process_workspace_switch_grab (MetaDisplay *display, - MetaScreen *screen, - XEvent *event, - KeySym keysym) +process_workspace_switch_grab (MetaDisplay *display, + MetaScreen *screen, + XDeviceKeyEvent *xdke, + KeySym keysym) { MetaWorkspace *workspace; +#if 0 + XDeviceKeyEvent *xdke; + MetaDevInfo *dev; + int idev; if (screen != display->grab_screen) return FALSE; + xdke = (XDeviceKeyEvent *)event; + for (idev = 0; idev < display->devices->keybsUsed; idev++) + if (xdke->deviceid == display->devices->keyboards[idev].xdev->device_id) + dev = &display->devices->keyboards[idev]; +#endif + MetaDevInfo *dev; + + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + g_return_val_if_fail (screen->tab_popup != NULL, FALSE); - if (event->type == KeyRelease && - end_keyboard_grab (display, event->xkey.keycode)) + if (xdke->type == display->dev_key_release_type && + end_keyboard_grab (display, xdke->keycode)) { /* We're done, move to the new workspace. */ MetaWorkspace *target_workspace; @@ -3053,14 +3248,15 @@ process_workspace_switch_grab (MetaDisplay *display, { meta_topic (META_DEBUG_KEYBINDINGS, "Ending grab so we can focus on the target workspace\n"); - meta_display_end_grab_op (display, event->xkey.time); + meta_display_end_grab_op (display, dev, xdke->time); meta_topic (META_DEBUG_KEYBINDINGS, "Focusing default window on target workspace\n"); - meta_workspace_focus_default_window (target_workspace, + meta_workspace_focus_default_window (target_workspace, + dev, NULL, - event->xkey.time); + xdke->time); return TRUE; /* we already ended the grab */ } @@ -3072,11 +3268,11 @@ process_workspace_switch_grab (MetaDisplay *display, } /* don't care about other releases, but eat them, don't end grab */ - if (event->type == KeyRelease) + if (xdke->type == display->dev_key_release_type) return TRUE; /* don't end grab on modifier key presses */ - if (is_modifier (display, event->xkey.keycode)) + if (is_modifier (display, xdke->keycode)) return TRUE; /* select the next workspace in the tabpopup */ @@ -3090,7 +3286,7 @@ process_workspace_switch_grab (MetaDisplay *display, action = display_get_keybinding_action (display, keysym, - event->xkey.keycode, + xdke->keycode, display->grab_mask); switch (action) @@ -3130,7 +3326,7 @@ process_workspace_switch_grab (MetaDisplay *display, meta_topic (META_DEBUG_KEYBINDINGS, "Activating target workspace\n"); - meta_workspace_activate (target_workspace, event->xkey.time); + meta_workspace_activate (target_workspace, xdke->time); return TRUE; /* we already ended the grab */ } @@ -3141,34 +3337,38 @@ process_workspace_switch_grab (MetaDisplay *display, "Ending workspace tabbing & focusing default window; uninteresting key pressed\n"); workspace = (MetaWorkspace *) meta_ui_tab_popup_get_selected (screen->tab_popup); - meta_workspace_focus_default_window (workspace, NULL, event->xkey.time); + meta_workspace_focus_default_window (workspace, dev, NULL, xdke->time); return FALSE; } static void -handle_toggle_desktop (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_toggle_desktop (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { + MetaDevInfo *dev; + + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); if (screen->active_workspace->showing_desktop) { meta_screen_unshow_desktop (screen); - meta_workspace_focus_default_window (screen->active_workspace, + meta_workspace_focus_default_window (screen->active_workspace, + dev, NULL, - event->xkey.time); + xdke->time); } else - meta_screen_show_desktop (screen, event->xkey.time); + meta_screen_show_desktop (screen, xdke->time); } static void -handle_panel_keybinding (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_panel_keybinding (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { MetaKeyBindingAction action; Atom action_atom; @@ -3194,17 +3394,23 @@ handle_panel_keybinding (MetaDisplay *display, ev.message_type = display->atom_gnome_panel_action; ev.format = 32; ev.data.l[0] = action_atom; - ev.data.l[1] = event->xkey.time; + ev.data.l[1] = xdke->time; meta_topic (META_DEBUG_KEYBINDINGS, "Sending panel message with timestamp %lu, and turning mouse_mode " - "off due to keybinding press\n", event->xkey.time); + "off due to keybinding press\n", xdke->time); display->mouse_mode = FALSE; meta_error_trap_push (display); /* Release the grab for the panel before sending the event */ - XUngrabKeyboard (display->xdisplay, event->xkey.time); + XUngrabDevice (display->xdisplay, + (meta_devices_find_keyboard_by_id (display, xdke->deviceid))->xdev, /* XXX */ + xdke->time); +#if 0 +#warning XUngrabKeyboard + XUngrabKeyboard (display->xdisplay, xdke->time); +#endif XSendEvent (display->xdisplay, screen->xroot, @@ -3216,11 +3422,11 @@ handle_panel_keybinding (MetaDisplay *display, } static void -handle_activate_menu (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *event_window, - XEvent *event, - MetaKeyBinding *binding) +handle_activate_menu (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *event_window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (display->focus_window) { @@ -3235,7 +3441,7 @@ handle_activate_menu (MetaDisplay *display, meta_window_show_menu (display->focus_window, x, y, 0, - event->xkey.time); + xdke->time); } } @@ -3276,16 +3482,22 @@ cycle_op_from_tab_type (MetaTabList type) } static void -do_choose_window (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *event_window, - XEvent *event, - MetaKeyBinding *binding, - gboolean backward, - gboolean show_popup) +do_choose_window (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *event_window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding, + gboolean backward, + gboolean show_popup) { MetaTabList type; MetaWindow *initial_selection; + + MetaDevInfo *kbdDev; + MetaDevInfo *pairedPtr; + + kbdDev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + pairedPtr = meta_devices_find_paired_mouse (display, xdke->deviceid); type = GPOINTER_TO_INT (binding->handler->data); @@ -3293,7 +3505,7 @@ do_choose_window (MetaDisplay *display, "Tab list = %u show_popup = %d\n", type, show_popup); /* reverse direction if shift is down */ - if (event->xkey.state & ShiftMask) + if (xdke->state & ShiftMask) backward = !backward; initial_selection = meta_display_get_tab_next (display, @@ -3325,10 +3537,11 @@ do_choose_window (MetaDisplay *display, "switch/cycle windows with no modifiers\n", initial_selection->desc); display->mouse_mode = FALSE; - meta_window_activate (initial_selection, event->xkey.time); + meta_window_activate (initial_selection, kbdDev, xdke->time); } else if (meta_display_begin_grab_op (display, screen, + pairedPtr, NULL, show_popup ? tab_op_from_tab_type (type) : @@ -3337,10 +3550,10 @@ do_choose_window (MetaDisplay *display, FALSE, 0, binding->mask, - event->xkey.time, + xdke->time, 0, 0)) { - if (!primary_modifier_still_pressed (display, + if (!primary_modifier_still_pressed (display, pairedPtr, binding->mask)) { /* This handles a race where modifier might be released @@ -3352,9 +3565,9 @@ do_choose_window (MetaDisplay *display, "mouse_mode due to switch/cycle windows where " "modifier was released prior to grab\n", initial_selection->desc); - meta_display_end_grab_op (display, event->xkey.time); + meta_display_end_grab_op (display, pairedPtr, xdke->time); display->mouse_mode = FALSE; - meta_window_activate (initial_selection, event->xkey.time); + meta_window_activate (initial_selection, kbdDev, xdke->time); } else { @@ -3377,71 +3590,75 @@ do_choose_window (MetaDisplay *display, } static void -handle_tab_forward (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *event_window, - XEvent *event, - MetaKeyBinding *binding) +handle_tab_forward (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *event_window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { do_choose_window (display, screen, - event_window, event, binding, FALSE, TRUE); + event_window, xdke, binding, FALSE, TRUE); } static void -handle_tab_backward (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *event_window, - XEvent *event, - MetaKeyBinding *binding) +handle_tab_backward (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *event_window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { do_choose_window (display, screen, - event_window, event, binding, TRUE, TRUE); + event_window, xdke, binding, TRUE, TRUE); } static void -handle_cycle_forward (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *event_window, - XEvent *event, - MetaKeyBinding *binding) +handle_cycle_forward (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *event_window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { do_choose_window (display, screen, - event_window, event, binding, FALSE, FALSE); + event_window, xdke, binding, FALSE, FALSE); } static void -handle_cycle_backward (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *event_window, - XEvent *event, - MetaKeyBinding *binding) +handle_cycle_backward (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *event_window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { do_choose_window (display, screen, - event_window, event, binding, TRUE, FALSE); + event_window, xdke, binding, TRUE, FALSE); } static void -handle_toggle_fullscreen (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_toggle_fullscreen (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { + MetaDevInfo *dev; + + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + if (window) { if (window->fullscreen) - meta_window_unmake_fullscreen (window); + meta_window_unmake_fullscreen (window, dev); else if (window->has_fullscreen_func) - meta_window_make_fullscreen (window); + meta_window_make_fullscreen (window, dev); } } static void -handle_toggle_above (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_toggle_above (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { @@ -3453,91 +3670,105 @@ handle_toggle_above (MetaDisplay *display, } static void -handle_toggle_maximize (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_toggle_maximize (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { + MetaDevInfo *dev; + + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + if (window) { if (META_WINDOW_MAXIMIZED (window)) - meta_window_unmaximize (window, + meta_window_unmaximize (window, dev, META_MAXIMIZE_HORIZONTAL | META_MAXIMIZE_VERTICAL); else if (window->has_maximize_func) - meta_window_maximize (window, + meta_window_maximize (window, dev, META_MAXIMIZE_HORIZONTAL | META_MAXIMIZE_VERTICAL); } } static void -handle_maximize (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_maximize (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { if (window->has_maximize_func) meta_window_maximize (window, + meta_devices_find_keyboard_by_id (display, + xdke->deviceid), + META_MAXIMIZE_HORIZONTAL | META_MAXIMIZE_VERTICAL); } } static void -handle_unmaximize (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_unmaximize (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { + MetaDevInfo *dev; + + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + if (window) { if (window->maximized_vertically || window->maximized_horizontally) - meta_window_unmaximize (window, + meta_window_unmaximize (window, dev, META_MAXIMIZE_HORIZONTAL | META_MAXIMIZE_VERTICAL); } } static void -handle_toggle_shade (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_toggle_shade (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { + MetaDevInfo *dev; + + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); if (window) { if (window->shaded) - meta_window_unshade (window, event->xkey.time); + meta_window_unshade (window, dev, xdke->time); else if (window->has_shade_func) - meta_window_shade (window, event->xkey.time); + meta_window_shade (window, dev, xdke->time); } } static void -handle_close_window (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_close_window (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) if (window->has_close_func) - meta_window_delete (window, event->xkey.time); + meta_window_delete (window, xdke->time); } static void -handle_minimize_window (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_minimize_window (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) if (window->has_minimize_func) @@ -3545,43 +3776,69 @@ handle_minimize_window (MetaDisplay *display, } static void -handle_begin_move (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_begin_move (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { + /* XXX Shouldnt we grab the mouse? (not the keyboard) */ +#if 0 + int idev; + MetaDevInfo *dev; + for (idev = 0; idev < display->devices->keybsUsed; idev++) + if (((XDeviceKeyEvent*)event)->deviceid == + display->devices->keyboards[idev].xdev->device_id) + dev = &display->devices->keyboards[idev]; +#endif + MetaDevInfo *dev; + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + if (window && window->has_move_func) { meta_window_begin_grab_op (window, + dev, META_GRAB_OP_KEYBOARD_MOVING, FALSE, - event->xkey.time); + xdke->time); } } static void -handle_begin_resize (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_begin_resize (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { + /* XXX Shouldnt we grab the mouse? (not the keyboard) */ +#if 0 + int idev; + MetaDevInfo *dev; + for (idev = 0; idev < display->devices->keybsUsed; idev++) + if (((XDeviceKeyEvent*)event)->deviceid == + display->devices->keyboards[idev].xdev->device_id) + dev = &display->devices->keyboards[idev]; +#endif + MetaDevInfo *dev; + dev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + if (window && window->has_resize_func) { meta_window_begin_grab_op (window, + dev, META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN, FALSE, - event->xkey.time); + xdke->time); } } static void -handle_toggle_sticky (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_toggle_sticky (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { @@ -3593,12 +3850,12 @@ handle_toggle_sticky (MetaDisplay *display, } static void -do_handle_move_to_workspace (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding, - gboolean flip) +do_handle_move_to_workspace (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding, + gboolean flip) { int which; MetaWorkspace *workspace; @@ -3631,7 +3888,7 @@ do_handle_move_to_workspace (MetaDisplay *display, workspace->screen->display->mouse_mode = FALSE; meta_workspace_activate_with_focus (workspace, window, - event->xkey.time); + xdke->time); } } else @@ -3641,40 +3898,40 @@ do_handle_move_to_workspace (MetaDisplay *display, } static void -handle_move_to_workspace (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_move_to_workspace (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { do_handle_move_to_workspace (display, screen, window, - event, + xdke, binding, FALSE); } static void -handle_move_to_workspace_flip (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_move_to_workspace_flip (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { do_handle_move_to_workspace (display, screen, window, - event, + xdke, binding, TRUE); } static void -handle_raise_or_lower (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_raise_or_lower (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { /* Get window at pointer */ @@ -3719,11 +3976,11 @@ handle_raise_or_lower (MetaDisplay *display, } static void -handle_raise (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_raise (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { @@ -3732,11 +3989,11 @@ handle_raise (MetaDisplay *display, } static void -handle_lower (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_lower (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { if (window) { @@ -3745,14 +4002,21 @@ handle_lower (MetaDisplay *display, } static void -handle_workspace_switch (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_workspace_switch (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { int motion; unsigned int grab_mask; + + MetaDevInfo *kbdDev; + MetaDevInfo *pairedPtr; + + kbdDev = meta_devices_find_keyboard_by_id (display, xdke->deviceid); + pairedPtr = meta_devices_find_paired_mouse (display, xdke->deviceid); + motion = GPOINTER_TO_INT (binding->handler->data); @@ -3762,17 +4026,18 @@ handle_workspace_switch (MetaDisplay *display, "Starting tab between workspaces, showing popup\n"); /* FIXME should we use binding->mask ? */ - grab_mask = event->xkey.state & ~(display->ignored_modifier_mask); + grab_mask = xdke->state & ~(display->ignored_modifier_mask); if (meta_display_begin_grab_op (display, screen, + pairedPtr, NULL, META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING, FALSE, FALSE, 0, grab_mask, - event->xkey.time, + xdke->time, 0, 0)) { MetaWorkspace *next; @@ -3781,7 +4046,7 @@ handle_workspace_switch (MetaDisplay *display, next = meta_workspace_get_neighbor (screen->active_workspace, motion); g_assert (next); - grabbed_before_release = primary_modifier_still_pressed (display, grab_mask); + grabbed_before_release = primary_modifier_still_pressed (display, pairedPtr, grab_mask); meta_topic (META_DEBUG_KEYBINDINGS, "Activating target workspace\n"); @@ -3793,10 +4058,10 @@ handle_workspace_switch (MetaDisplay *display, * release event. Must end grab before we can switch * spaces. */ - meta_display_end_grab_op (display, event->xkey.time); + meta_display_end_grab_op (display, pairedPtr, xdke->time); } - meta_workspace_activate (next, event->xkey.time); + meta_workspace_activate (next, xdke->time); if (grabbed_before_release) { @@ -3809,11 +4074,11 @@ handle_workspace_switch (MetaDisplay *display, } static void -handle_spew_mark (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_spew_mark (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { meta_verbose ("-- MARK MARK MARK MARK --\n"); } @@ -3827,15 +4092,15 @@ meta_set_keybindings_disabled (gboolean setting) } static void -handle_run_terminal (MetaDisplay *display, - MetaScreen *screen, - MetaWindow *window, - XEvent *event, - MetaKeyBinding *binding) +handle_run_terminal (MetaDisplay *display, + MetaScreen *screen, + MetaWindow *window, + XDeviceKeyEvent *xdke, + MetaKeyBinding *binding) { const char *command; GError *err; - + command = meta_prefs_get_terminal_command (); if (command == NULL) @@ -3847,7 +4112,7 @@ handle_run_terminal (MetaDisplay *display, "keybinding press\n"); s = g_strdup_printf (_("No terminal command has been defined.\n")); - error_on_terminal_command (NULL, s, screen->number, event->xkey.time); + error_on_terminal_command (NULL, s, screen->number, xdke->time); g_free (s); return; @@ -3857,7 +4122,7 @@ handle_run_terminal (MetaDisplay *display, if (!meta_spawn_command_line_async_on_screen (command, screen, &err)) { error_on_terminal_command (command, err->message, screen->number, - event->xkey.time); + xdke->time); g_error_free (err); } |