summaryrefslogtreecommitdiff
path: root/src/keybindings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/keybindings.c')
-rw-r--r--src/keybindings.c1163
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);
}