mirror of
https://github.com/brl/mutter.git
synced 2024-11-30 12:00:44 -05:00
keybindings: Use input event helper functions
This commit is contained in:
parent
3b0aa9f881
commit
36e237cf1e
@ -34,6 +34,7 @@
|
|||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include "place.h"
|
#include "place.h"
|
||||||
|
#include "input-events.h"
|
||||||
#include <meta/prefs.h>
|
#include <meta/prefs.h>
|
||||||
#include <meta/util.h>
|
#include <meta/util.h>
|
||||||
|
|
||||||
@ -1256,17 +1257,23 @@ process_overlay_key (MetaDisplay *display,
|
|||||||
XEvent *event,
|
XEvent *event,
|
||||||
KeySym keysym)
|
KeySym keysym)
|
||||||
{
|
{
|
||||||
if (event->xkey.keycode != display->overlay_key_combo.keycode)
|
guint evtype, keycode;
|
||||||
|
|
||||||
|
if (!meta_input_event_get_type (display, event, &evtype) ||
|
||||||
|
!meta_input_event_get_keycode (display, event, &keycode))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (keycode != display->overlay_key_combo.keycode)
|
||||||
{
|
{
|
||||||
display->overlay_key_only_pressed = FALSE;
|
display->overlay_key_only_pressed = FALSE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event->xkey.type == KeyPress)
|
if (evtype == KeyPress)
|
||||||
{
|
{
|
||||||
display->overlay_key_only_pressed = TRUE;
|
display->overlay_key_only_pressed = TRUE;
|
||||||
}
|
}
|
||||||
else if (event->xkey.type == KeyRelease && display->overlay_key_only_pressed)
|
else if (evtype == KeyRelease && display->overlay_key_only_pressed)
|
||||||
{
|
{
|
||||||
display->overlay_key_only_pressed = FALSE;
|
display->overlay_key_only_pressed = FALSE;
|
||||||
meta_display_overlay_key_activate (display);
|
meta_display_overlay_key_activate (display);
|
||||||
@ -1325,10 +1332,16 @@ process_event (MetaKeyBinding *bindings,
|
|||||||
KeySym keysym,
|
KeySym keysym,
|
||||||
gboolean on_window)
|
gboolean on_window)
|
||||||
{
|
{
|
||||||
|
guint evtype, keycode, state;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* we used to have release-based bindings but no longer. */
|
/* we used to have release-based bindings but no longer. */
|
||||||
if (event->type == KeyRelease)
|
if (!meta_input_event_get_type (display, event, &evtype) ||
|
||||||
|
!meta_input_event_get_keycode (display, event, &keycode) ||
|
||||||
|
!meta_input_event_get_state (display, event, &state))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (evtype == KeyRelease)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1340,12 +1353,12 @@ process_event (MetaKeyBinding *bindings,
|
|||||||
MetaKeyHandler *handler = bindings[i].handler;
|
MetaKeyHandler *handler = bindings[i].handler;
|
||||||
|
|
||||||
if ((!on_window && handler->flags & BINDING_PER_WINDOW) ||
|
if ((!on_window && handler->flags & BINDING_PER_WINDOW) ||
|
||||||
event->type != KeyPress ||
|
evtype != KeyPress ||
|
||||||
bindings[i].keycode != event->xkey.keycode ||
|
bindings[i].keycode != keycode ||
|
||||||
((event->xkey.state & 0xff & ~(display->ignored_modifier_mask)) !=
|
((state & 0xff & ~(display->ignored_modifier_mask)) !=
|
||||||
bindings[i].mask))
|
bindings[i].mask))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* window must be non-NULL for on_window to be true,
|
* window must be non-NULL for on_window to be true,
|
||||||
* and so also window must be non-NULL if we get here and
|
* and so also window must be non-NULL if we get here and
|
||||||
@ -1355,7 +1368,7 @@ process_event (MetaKeyBinding *bindings,
|
|||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Binding keycode 0x%x mask 0x%x matches event 0x%x state 0x%x\n",
|
"Binding keycode 0x%x mask 0x%x matches event 0x%x state 0x%x\n",
|
||||||
bindings[i].keycode, bindings[i].mask,
|
bindings[i].keycode, bindings[i].mask,
|
||||||
event->xkey.keycode, event->xkey.state);
|
keycode, state);
|
||||||
|
|
||||||
if (handler == NULL)
|
if (handler == NULL)
|
||||||
meta_bug ("Binding %s has no handler\n", bindings[i].name);
|
meta_bug ("Binding %s has no handler\n", bindings[i].name);
|
||||||
@ -1363,7 +1376,7 @@ process_event (MetaKeyBinding *bindings,
|
|||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Running handler for %s\n",
|
"Running handler for %s\n",
|
||||||
bindings[i].name);
|
bindings[i].name);
|
||||||
|
|
||||||
/* Global keybindings count as a let-the-terminal-lose-focus
|
/* Global keybindings count as a let-the-terminal-lose-focus
|
||||||
* due to new window mapping until the user starts
|
* due to new window mapping until the user starts
|
||||||
* interacting with the terminal again.
|
* interacting with the terminal again.
|
||||||
@ -1405,39 +1418,49 @@ meta_display_process_key_event (MetaDisplay *display,
|
|||||||
gboolean handled;
|
gboolean handled;
|
||||||
const char *str;
|
const char *str;
|
||||||
MetaScreen *screen;
|
MetaScreen *screen;
|
||||||
|
guint evtype, keycode, state;
|
||||||
|
Window xwindow;
|
||||||
|
Time evtime;
|
||||||
|
|
||||||
|
if (!meta_input_event_get_type (display, event, &evtype) ||
|
||||||
|
!meta_input_event_get_keycode (display, event, &keycode) ||
|
||||||
|
!meta_input_event_get_state (display, event, &state))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
XAllowEvents (display->xdisplay,
|
XAllowEvents (display->xdisplay,
|
||||||
all_bindings_disabled ? ReplayKeyboard : AsyncKeyboard,
|
all_bindings_disabled ? ReplayKeyboard : AsyncKeyboard,
|
||||||
event->xkey.time);
|
evtime);
|
||||||
if (all_bindings_disabled)
|
if (all_bindings_disabled)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
xwindow = meta_input_event_get_window (display, event);
|
||||||
|
|
||||||
/* if key event was on root window, we have a shortcut */
|
/* 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, xwindow);
|
||||||
|
|
||||||
/* else round-trip to server */
|
/* else round-trip to server */
|
||||||
if (screen == NULL)
|
if (screen == NULL)
|
||||||
screen = meta_display_screen_for_xwindow (display,
|
screen = meta_display_screen_for_xwindow (display, xwindow);
|
||||||
event->xany.window);
|
|
||||||
|
|
||||||
if (screen == NULL)
|
if (screen == NULL)
|
||||||
return FALSE; /* event window is destroyed */
|
return FALSE; /* event window is destroyed */
|
||||||
|
|
||||||
/* ignore key events on popup menus and such. */
|
/* ignore key events on popup menus and such. */
|
||||||
if (meta_ui_window_is_widget (screen->ui, event->xany.window))
|
if (meta_ui_window_is_widget (screen->ui, xwindow))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* window may be NULL */
|
/* window may be NULL */
|
||||||
|
|
||||||
keysym = XKeycodeToKeysym (display->xdisplay, event->xkey.keycode, 0);
|
keysym = XKeycodeToKeysym (display->xdisplay, keycode, 0);
|
||||||
|
|
||||||
str = XKeysymToString (keysym);
|
str = XKeysymToString (keysym);
|
||||||
|
|
||||||
/* was topic */
|
/* was topic */
|
||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Processing key %s event, keysym: %s state: 0x%x window: %s\n",
|
"Processing key %s event, keysym: %s state: 0x%x window: %s\n",
|
||||||
event->type == KeyPress ? "press" : "release",
|
evtype == KeyPress ? "press" : "release",
|
||||||
str ? str : "none", event->xkey.state,
|
str ? str : "none", state,
|
||||||
window ? window->desc : "(no window)");
|
window ? window->desc : "(no window)");
|
||||||
|
|
||||||
keep_grab = TRUE;
|
keep_grab = TRUE;
|
||||||
@ -1521,7 +1544,8 @@ meta_display_process_key_event (MetaDisplay *display,
|
|||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Ending grab op %u on key event sym %s\n",
|
"Ending grab op %u on key event sym %s\n",
|
||||||
display->grab_op, XKeysymToString (keysym));
|
display->grab_op, XKeysymToString (keysym));
|
||||||
meta_display_end_grab_op (display, event->xkey.time);
|
meta_display_end_grab_op (display,
|
||||||
|
meta_input_event_get_time (display, event));
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -1546,7 +1570,7 @@ process_mouse_move_resize_grab (MetaDisplay *display,
|
|||||||
KeySym keysym)
|
KeySym keysym)
|
||||||
{
|
{
|
||||||
/* don't care about releases, but eat them, don't end grab */
|
/* don't care about releases, but eat them, don't end grab */
|
||||||
if (event->type == KeyRelease)
|
if (meta_input_event_is_type (display, event, KeyRelease))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (keysym == XK_Escape)
|
if (keysym == XK_Escape)
|
||||||
@ -1595,27 +1619,31 @@ process_keyboard_move_grab (MetaDisplay *display,
|
|||||||
int x, y;
|
int x, y;
|
||||||
int incr;
|
int incr;
|
||||||
gboolean smart_snap;
|
gboolean smart_snap;
|
||||||
|
guint keycode, state;
|
||||||
|
|
||||||
handled = FALSE;
|
handled = FALSE;
|
||||||
|
|
||||||
/* don't care about releases, but eat them, don't end grab */
|
/* don't care about releases, but eat them, don't end grab */
|
||||||
if (event->type == KeyRelease)
|
if (meta_input_event_is_type (display, event, KeyRelease))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
meta_input_event_get_keycode (display, event, &keycode);
|
||||||
|
meta_input_event_get_state (display, event, &state);
|
||||||
|
|
||||||
/* don't end grab on modifier key presses */
|
/* don't end grab on modifier key presses */
|
||||||
if (is_modifier (display, event->xkey.keycode))
|
if (is_modifier (display, keycode))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
meta_window_get_position (window, &x, &y);
|
meta_window_get_position (window, &x, &y);
|
||||||
|
|
||||||
smart_snap = (event->xkey.state & ShiftMask) != 0;
|
smart_snap = (state & ShiftMask) != 0;
|
||||||
|
|
||||||
#define SMALL_INCREMENT 1
|
#define SMALL_INCREMENT 1
|
||||||
#define NORMAL_INCREMENT 10
|
#define NORMAL_INCREMENT 10
|
||||||
|
|
||||||
if (smart_snap)
|
if (smart_snap)
|
||||||
incr = 1;
|
incr = 1;
|
||||||
else if (event->xkey.state & ControlMask)
|
else if (state & ControlMask)
|
||||||
incr = SMALL_INCREMENT;
|
incr = SMALL_INCREMENT;
|
||||||
else
|
else
|
||||||
incr = NORMAL_INCREMENT;
|
incr = NORMAL_INCREMENT;
|
||||||
@ -1841,15 +1869,19 @@ process_keyboard_resize_grab (MetaDisplay *display,
|
|||||||
int width, height;
|
int width, height;
|
||||||
gboolean smart_snap;
|
gboolean smart_snap;
|
||||||
int gravity;
|
int gravity;
|
||||||
|
guint keycode, state;
|
||||||
|
|
||||||
handled = FALSE;
|
handled = FALSE;
|
||||||
|
|
||||||
/* don't care about releases, but eat them, don't end grab */
|
/* don't care about releases, but eat them, don't end grab */
|
||||||
if (event->type == KeyRelease)
|
if (meta_input_event_is_type (display, event, KeyRelease))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
meta_input_event_get_keycode (display, event, &keycode);
|
||||||
|
meta_input_event_get_state (display, event, &state);
|
||||||
|
|
||||||
/* don't end grab on modifier key presses */
|
/* don't end grab on modifier key presses */
|
||||||
if (is_modifier (display, event->xkey.keycode))
|
if (is_modifier (display, keycode))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (keysym == XK_Escape)
|
if (keysym == XK_Escape)
|
||||||
@ -1874,7 +1906,7 @@ process_keyboard_resize_grab (MetaDisplay *display,
|
|||||||
|
|
||||||
gravity = meta_resize_gravity_from_grab_op (display->grab_op);
|
gravity = meta_resize_gravity_from_grab_op (display->grab_op);
|
||||||
|
|
||||||
smart_snap = (event->xkey.state & ShiftMask) != 0;
|
smart_snap = (state & ShiftMask) != 0;
|
||||||
|
|
||||||
#define SMALL_INCREMENT 1
|
#define SMALL_INCREMENT 1
|
||||||
#define NORMAL_INCREMENT 10
|
#define NORMAL_INCREMENT 10
|
||||||
@ -1884,7 +1916,7 @@ process_keyboard_resize_grab (MetaDisplay *display,
|
|||||||
height_inc = 1;
|
height_inc = 1;
|
||||||
width_inc = 1;
|
width_inc = 1;
|
||||||
}
|
}
|
||||||
else if (event->xkey.state & ControlMask)
|
else if (state & ControlMask)
|
||||||
{
|
{
|
||||||
width_inc = SMALL_INCREMENT;
|
width_inc = SMALL_INCREMENT;
|
||||||
height_inc = SMALL_INCREMENT;
|
height_inc = SMALL_INCREMENT;
|
||||||
@ -2103,13 +2135,18 @@ process_tab_grab (MetaDisplay *display,
|
|||||||
gboolean backward;
|
gboolean backward;
|
||||||
gboolean key_used;
|
gboolean key_used;
|
||||||
MetaWindow *prev_window;
|
MetaWindow *prev_window;
|
||||||
|
guint evtype, keycode;
|
||||||
|
|
||||||
if (screen != display->grab_screen)
|
if (screen != display->grab_screen)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
if (!meta_input_event_get_type (display, event, &evtype) ||
|
||||||
|
!meta_input_event_get_keycode (display, event, &keycode))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
binding = display_get_keybinding (display,
|
binding = display_get_keybinding (display,
|
||||||
keysym,
|
keysym,
|
||||||
event->xkey.keycode,
|
keycode,
|
||||||
display->grab_mask);
|
display->grab_mask);
|
||||||
if (binding)
|
if (binding)
|
||||||
action = meta_prefs_get_keybinding_action (binding->name);
|
action = meta_prefs_get_keybinding_action (binding->name);
|
||||||
@ -2123,9 +2160,9 @@ process_tab_grab (MetaDisplay *display,
|
|||||||
*/
|
*/
|
||||||
if (!screen->tab_popup)
|
if (!screen->tab_popup)
|
||||||
{
|
{
|
||||||
if (event->type == KeyRelease)
|
if (evtype == KeyRelease)
|
||||||
{
|
{
|
||||||
if (end_keyboard_grab (display, event->xkey.keycode))
|
if (end_keyboard_grab (display, keycode))
|
||||||
{
|
{
|
||||||
invoke_handler_by_name (display, screen, "tab_popup_select", NULL, event);
|
invoke_handler_by_name (display, screen, "tab_popup_select", NULL, event);
|
||||||
|
|
||||||
@ -2174,7 +2211,7 @@ process_tab_grab (MetaDisplay *display,
|
|||||||
* If this is simply user pressing the Shift key, we do not want
|
* If this is simply user pressing the Shift key, we do not want
|
||||||
* to cancel the grab.
|
* to cancel the grab.
|
||||||
*/
|
*/
|
||||||
if (is_modifier (display, event->xkey.keycode))
|
if (is_modifier (display, keycode))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2187,8 +2224,8 @@ process_tab_grab (MetaDisplay *display,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event->type == KeyRelease &&
|
if (evtype == KeyRelease &&
|
||||||
end_keyboard_grab (display, event->xkey.keycode))
|
end_keyboard_grab (display, keycode))
|
||||||
{
|
{
|
||||||
/* We're done, move to the new window. */
|
/* We're done, move to the new window. */
|
||||||
MetaWindow *target_window;
|
MetaWindow *target_window;
|
||||||
@ -2200,6 +2237,9 @@ process_tab_grab (MetaDisplay *display,
|
|||||||
|
|
||||||
if (target_window)
|
if (target_window)
|
||||||
{
|
{
|
||||||
|
Time evtime;
|
||||||
|
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
target_window->tab_unminimized = FALSE;
|
target_window->tab_unminimized = FALSE;
|
||||||
|
|
||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
@ -2209,11 +2249,11 @@ process_tab_grab (MetaDisplay *display,
|
|||||||
"selection and turning mouse_mode off\n",
|
"selection and turning mouse_mode off\n",
|
||||||
target_window->desc);
|
target_window->desc);
|
||||||
display->mouse_mode = FALSE;
|
display->mouse_mode = FALSE;
|
||||||
meta_window_activate (target_window, event->xkey.time);
|
meta_window_activate (target_window, evtime);
|
||||||
|
|
||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Ending grab early so we can focus the target window\n");
|
"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, evtime);
|
||||||
|
|
||||||
return TRUE; /* we already ended the grab */
|
return TRUE; /* we already ended the grab */
|
||||||
}
|
}
|
||||||
@ -2222,11 +2262,11 @@ process_tab_grab (MetaDisplay *display,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* don't care about other releases, but eat them, don't end grab */
|
/* don't care about other releases, but eat them, don't end grab */
|
||||||
if (event->type == KeyRelease)
|
if (evtype == KeyRelease)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* don't end grab on modifier key presses */
|
/* don't end grab on modifier key presses */
|
||||||
if (is_modifier (display, event->xkey.keycode))
|
if (is_modifier (display, keycode))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
prev_window = meta_screen_tab_popup_get_selected (screen);
|
prev_window = meta_screen_tab_popup_get_selected (screen);
|
||||||
@ -2342,10 +2382,14 @@ process_tab_grab (MetaDisplay *display,
|
|||||||
|
|
||||||
if (key_used)
|
if (key_used)
|
||||||
{
|
{
|
||||||
|
guint state;
|
||||||
|
|
||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Key pressed, moving tab focus in popup\n");
|
"Key pressed, moving tab focus in popup\n");
|
||||||
|
|
||||||
if (event->xkey.state & ShiftMask)
|
meta_input_event_get_state (display, event, &state);
|
||||||
|
|
||||||
|
if (state & ShiftMask)
|
||||||
backward = !backward;
|
backward = !backward;
|
||||||
|
|
||||||
if (backward)
|
if (backward)
|
||||||
@ -2432,7 +2476,8 @@ handle_switch_to_workspace (MetaDisplay *display,
|
|||||||
|
|
||||||
if (workspace)
|
if (workspace)
|
||||||
{
|
{
|
||||||
meta_workspace_activate (workspace, event->xkey.time);
|
meta_workspace_activate (workspace,
|
||||||
|
meta_input_event_get_time (display, event));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2544,8 +2589,10 @@ handle_run_command (MetaDisplay *display,
|
|||||||
gint which = binding->handler->data;
|
gint which = binding->handler->data;
|
||||||
const char *command;
|
const char *command;
|
||||||
GError *err;
|
GError *err;
|
||||||
|
Time evtime;
|
||||||
|
|
||||||
command = meta_prefs_get_command (which);
|
command = meta_prefs_get_command (which);
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
|
|
||||||
if (command == NULL)
|
if (command == NULL)
|
||||||
{
|
{
|
||||||
@ -2557,7 +2604,7 @@ handle_run_command (MetaDisplay *display,
|
|||||||
|
|
||||||
s = g_strdup_printf (_("No command %d has been defined.\n"),
|
s = g_strdup_printf (_("No command %d has been defined.\n"),
|
||||||
which + 1);
|
which + 1);
|
||||||
error_on_command (which, NULL, s, screen, event->xkey.time);
|
error_on_command (which, NULL, s, screen, evtime);
|
||||||
g_free (s);
|
g_free (s);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -2566,8 +2613,8 @@ handle_run_command (MetaDisplay *display,
|
|||||||
err = NULL;
|
err = NULL;
|
||||||
if (!meta_spawn_command_line_async_on_screen (command, screen, &err))
|
if (!meta_spawn_command_line_async_on_screen (command, screen, &err))
|
||||||
{
|
{
|
||||||
error_on_command (which, command, err->message, screen, event->xkey.time);
|
error_on_command (which, command, err->message, screen, evtime);
|
||||||
|
|
||||||
g_error_free (err);
|
g_error_free (err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2783,12 +2830,20 @@ process_workspace_switch_grab (MetaDisplay *display,
|
|||||||
KeySym keysym)
|
KeySym keysym)
|
||||||
{
|
{
|
||||||
MetaWorkspace *workspace;
|
MetaWorkspace *workspace;
|
||||||
|
guint evtype, keycode;
|
||||||
|
Time evtime;
|
||||||
|
|
||||||
if (screen != display->grab_screen || !screen->ws_popup)
|
if (screen != display->grab_screen || !screen->ws_popup)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (event->type == KeyRelease &&
|
if (!meta_input_event_get_type (display, event, &evtype) ||
|
||||||
end_keyboard_grab (display, event->xkey.keycode))
|
!meta_input_event_get_keycode (display, event, &keycode))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
|
|
||||||
|
if (evtype == KeyRelease &&
|
||||||
|
end_keyboard_grab (display, keycode))
|
||||||
{
|
{
|
||||||
/* We're done, move to the new workspace. */
|
/* We're done, move to the new workspace. */
|
||||||
MetaWorkspace *target_workspace;
|
MetaWorkspace *target_workspace;
|
||||||
@ -2802,14 +2857,14 @@ process_workspace_switch_grab (MetaDisplay *display,
|
|||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Ending grab so we can focus on the target workspace\n");
|
"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, evtime);
|
||||||
|
|
||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Focusing default window on target workspace\n");
|
"Focusing default window on target workspace\n");
|
||||||
|
|
||||||
meta_workspace_focus_default_window (target_workspace,
|
meta_workspace_focus_default_window (target_workspace,
|
||||||
NULL,
|
NULL,
|
||||||
event->xkey.time);
|
evtime);
|
||||||
|
|
||||||
return TRUE; /* we already ended the grab */
|
return TRUE; /* we already ended the grab */
|
||||||
}
|
}
|
||||||
@ -2821,11 +2876,11 @@ process_workspace_switch_grab (MetaDisplay *display,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* don't care about other releases, but eat them, don't end grab */
|
/* don't care about other releases, but eat them, don't end grab */
|
||||||
if (event->type == KeyRelease)
|
if (evtype == KeyRelease)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* don't end grab on modifier key presses */
|
/* don't end grab on modifier key presses */
|
||||||
if (is_modifier (display, event->xkey.keycode))
|
if (is_modifier (display, keycode))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* select the next workspace in the popup */
|
/* select the next workspace in the popup */
|
||||||
@ -2837,7 +2892,7 @@ process_workspace_switch_grab (MetaDisplay *display,
|
|||||||
MetaKeyBindingAction action;
|
MetaKeyBindingAction action;
|
||||||
|
|
||||||
action = meta_display_get_keybinding_action (display,
|
action = meta_display_get_keybinding_action (display,
|
||||||
event->xkey.keycode,
|
keycode,
|
||||||
display->grab_mask);
|
display->grab_mask);
|
||||||
|
|
||||||
switch (action)
|
switch (action)
|
||||||
@ -2876,7 +2931,7 @@ process_workspace_switch_grab (MetaDisplay *display,
|
|||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Activating target workspace\n");
|
"Activating target workspace\n");
|
||||||
|
|
||||||
meta_workspace_activate (target_workspace, event->xkey.time);
|
meta_workspace_activate (target_workspace, evtime);
|
||||||
|
|
||||||
return TRUE; /* we already ended the grab */
|
return TRUE; /* we already ended the grab */
|
||||||
}
|
}
|
||||||
@ -2886,7 +2941,7 @@ process_workspace_switch_grab (MetaDisplay *display,
|
|||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Ending workspace tabbing & focusing default window; uninteresting key pressed\n");
|
"Ending workspace tabbing & focusing default window; uninteresting key pressed\n");
|
||||||
workspace = meta_screen_workspace_popup_get_selected (screen);
|
workspace = meta_screen_workspace_popup_get_selected (screen);
|
||||||
meta_workspace_focus_default_window (workspace, NULL, event->xkey.time);
|
meta_workspace_focus_default_window (workspace, NULL, evtime);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2898,15 +2953,18 @@ handle_show_desktop (MetaDisplay *display,
|
|||||||
MetaKeyBinding *binding,
|
MetaKeyBinding *binding,
|
||||||
gpointer dummy)
|
gpointer dummy)
|
||||||
{
|
{
|
||||||
|
Time evtime;
|
||||||
|
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
|
|
||||||
if (screen->active_workspace->showing_desktop)
|
if (screen->active_workspace->showing_desktop)
|
||||||
{
|
{
|
||||||
meta_screen_unshow_desktop (screen);
|
meta_screen_unshow_desktop (screen);
|
||||||
meta_workspace_focus_default_window (screen->active_workspace,
|
meta_workspace_focus_default_window (screen->active_workspace,
|
||||||
NULL,
|
NULL, evtime);
|
||||||
event->xkey.time);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
meta_screen_show_desktop (screen, event->xkey.time);
|
meta_screen_show_desktop (screen, evtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -2920,6 +2978,7 @@ handle_panel (MetaDisplay *display,
|
|||||||
MetaKeyBindingAction action = binding->handler->data;
|
MetaKeyBindingAction action = binding->handler->data;
|
||||||
Atom action_atom;
|
Atom action_atom;
|
||||||
XClientMessageEvent ev;
|
XClientMessageEvent ev;
|
||||||
|
Time evtime;
|
||||||
|
|
||||||
action_atom = None;
|
action_atom = None;
|
||||||
switch (action)
|
switch (action)
|
||||||
@ -2934,23 +2993,25 @@ handle_panel (MetaDisplay *display,
|
|||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
|
|
||||||
ev.type = ClientMessage;
|
ev.type = ClientMessage;
|
||||||
ev.window = screen->xroot;
|
ev.window = screen->xroot;
|
||||||
ev.message_type = display->atom__GNOME_PANEL_ACTION;
|
ev.message_type = display->atom__GNOME_PANEL_ACTION;
|
||||||
ev.format = 32;
|
ev.format = 32;
|
||||||
ev.data.l[0] = action_atom;
|
ev.data.l[0] = action_atom;
|
||||||
ev.data.l[1] = event->xkey.time;
|
ev.data.l[1] = evtime;
|
||||||
|
|
||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Sending panel message with timestamp %lu, and turning mouse_mode "
|
"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", evtime);
|
||||||
display->mouse_mode = FALSE;
|
display->mouse_mode = FALSE;
|
||||||
|
|
||||||
meta_error_trap_push (display);
|
meta_error_trap_push (display);
|
||||||
|
|
||||||
/* Release the grab for the panel before sending the event */
|
/* Release the grab for the panel before sending the event */
|
||||||
XUngrabKeyboard (display->xdisplay, event->xkey.time);
|
XUngrabKeyboard (display->xdisplay, evtime);
|
||||||
|
|
||||||
XSendEvent (display->xdisplay,
|
XSendEvent (display->xdisplay,
|
||||||
screen->xroot,
|
screen->xroot,
|
||||||
@ -2982,6 +3043,7 @@ handle_activate_window_menu (MetaDisplay *display,
|
|||||||
{
|
{
|
||||||
if (display->focus_window)
|
if (display->focus_window)
|
||||||
{
|
{
|
||||||
|
Time evtime;
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
||||||
meta_window_get_position (display->focus_window,
|
meta_window_get_position (display->focus_window,
|
||||||
@ -2990,10 +3052,12 @@ handle_activate_window_menu (MetaDisplay *display,
|
|||||||
if (meta_ui_get_direction() == META_UI_DIRECTION_RTL)
|
if (meta_ui_get_direction() == META_UI_DIRECTION_RTL)
|
||||||
x += display->focus_window->rect.width;
|
x += display->focus_window->rect.width;
|
||||||
|
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
|
|
||||||
meta_window_show_menu (display->focus_window,
|
meta_window_show_menu (display->focus_window,
|
||||||
x, y,
|
x, y,
|
||||||
0,
|
0,
|
||||||
event->xkey.time);
|
evtime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3044,14 +3108,21 @@ do_choose_window (MetaDisplay *display,
|
|||||||
{
|
{
|
||||||
MetaTabList type = binding->handler->data;
|
MetaTabList type = binding->handler->data;
|
||||||
MetaWindow *initial_selection;
|
MetaWindow *initial_selection;
|
||||||
|
guint state;
|
||||||
|
Time evtime;
|
||||||
|
|
||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Tab list = %u show_popup = %d\n", type, show_popup);
|
"Tab list = %u show_popup = %d\n", type, show_popup);
|
||||||
|
|
||||||
|
if (!meta_input_event_get_state (display, event, &state))
|
||||||
|
return;
|
||||||
|
|
||||||
/* reverse direction if shift is down */
|
/* reverse direction if shift is down */
|
||||||
if (event->xkey.state & ShiftMask)
|
if (state & ShiftMask)
|
||||||
backward = !backward;
|
backward = !backward;
|
||||||
|
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
|
|
||||||
initial_selection = meta_display_get_tab_next (display,
|
initial_selection = meta_display_get_tab_next (display,
|
||||||
type,
|
type,
|
||||||
screen,
|
screen,
|
||||||
@ -3082,7 +3153,7 @@ do_choose_window (MetaDisplay *display,
|
|||||||
"switch/cycle windows with no modifiers\n",
|
"switch/cycle windows with no modifiers\n",
|
||||||
initial_selection->desc);
|
initial_selection->desc);
|
||||||
display->mouse_mode = FALSE;
|
display->mouse_mode = FALSE;
|
||||||
meta_window_activate (initial_selection, event->xkey.time);
|
meta_window_activate (initial_selection, evtime);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3102,7 +3173,7 @@ do_choose_window (MetaDisplay *display,
|
|||||||
FALSE,
|
FALSE,
|
||||||
0,
|
0,
|
||||||
binding->mask,
|
binding->mask,
|
||||||
event->xkey.time,
|
evtime,
|
||||||
0, 0))
|
0, 0))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -3117,9 +3188,10 @@ do_choose_window (MetaDisplay *display,
|
|||||||
"mouse_mode due to switch/cycle windows where "
|
"mouse_mode due to switch/cycle windows where "
|
||||||
"modifier was released prior to grab\n",
|
"modifier was released prior to grab\n",
|
||||||
initial_selection->desc);
|
initial_selection->desc);
|
||||||
meta_display_end_grab_op (display, event->xkey.time);
|
|
||||||
|
meta_display_end_grab_op (display, evtime);
|
||||||
display->mouse_mode = FALSE;
|
display->mouse_mode = FALSE;
|
||||||
meta_window_activate (initial_selection, event->xkey.time);
|
meta_window_activate (initial_selection, evtime);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3269,10 +3341,14 @@ handle_toggle_shaded (MetaDisplay *display,
|
|||||||
MetaKeyBinding *binding,
|
MetaKeyBinding *binding,
|
||||||
gpointer dummy)
|
gpointer dummy)
|
||||||
{
|
{
|
||||||
|
Time evtime;
|
||||||
|
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
|
|
||||||
if (window->shaded)
|
if (window->shaded)
|
||||||
meta_window_unshade (window, event->xkey.time);
|
meta_window_unshade (window, evtime);
|
||||||
else if (window->has_shade_func)
|
else if (window->has_shade_func)
|
||||||
meta_window_shade (window, event->xkey.time);
|
meta_window_shade (window, evtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -3284,7 +3360,9 @@ handle_close (MetaDisplay *display,
|
|||||||
gpointer dummy)
|
gpointer dummy)
|
||||||
{
|
{
|
||||||
if (window->has_close_func)
|
if (window->has_close_func)
|
||||||
meta_window_delete (window, event->xkey.time);
|
meta_window_delete (window,
|
||||||
|
meta_input_event_get_time (display,
|
||||||
|
event));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -3312,7 +3390,7 @@ handle_begin_move (MetaDisplay *display,
|
|||||||
meta_window_begin_grab_op (window,
|
meta_window_begin_grab_op (window,
|
||||||
META_GRAB_OP_KEYBOARD_MOVING,
|
META_GRAB_OP_KEYBOARD_MOVING,
|
||||||
FALSE,
|
FALSE,
|
||||||
event->xkey.time);
|
meta_input_event_get_time (display, event));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3329,7 +3407,7 @@ handle_begin_resize (MetaDisplay *display,
|
|||||||
meta_window_begin_grab_op (window,
|
meta_window_begin_grab_op (window,
|
||||||
META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN,
|
META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN,
|
||||||
FALSE,
|
FALSE,
|
||||||
event->xkey.time);
|
meta_input_event_get_time (display, event));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3387,13 +3465,13 @@ handle_move_to_workspace (MetaDisplay *display,
|
|||||||
meta_window_change_workspace (window, workspace);
|
meta_window_change_workspace (window, workspace);
|
||||||
if (flip)
|
if (flip)
|
||||||
{
|
{
|
||||||
|
Time evtime = meta_input_event_get_time (display, event);
|
||||||
|
|
||||||
meta_topic (META_DEBUG_FOCUS,
|
meta_topic (META_DEBUG_FOCUS,
|
||||||
"Resetting mouse_mode to FALSE due to "
|
"Resetting mouse_mode to FALSE due to "
|
||||||
"handle_move_to_workspace() call with flip set.\n");
|
"handle_move_to_workspace() call with flip set.\n");
|
||||||
workspace->screen->display->mouse_mode = FALSE;
|
workspace->screen->display->mouse_mode = FALSE;
|
||||||
meta_workspace_activate_with_focus (workspace,
|
meta_workspace_activate_with_focus (workspace, window, evtime);
|
||||||
window,
|
|
||||||
event->xkey.time);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -3483,15 +3561,21 @@ handle_workspace_switch (MetaDisplay *display,
|
|||||||
unsigned int grab_mask;
|
unsigned int grab_mask;
|
||||||
MetaWorkspace *next;
|
MetaWorkspace *next;
|
||||||
gboolean grabbed_before_release;
|
gboolean grabbed_before_release;
|
||||||
|
guint state;
|
||||||
|
Time evtime;
|
||||||
|
|
||||||
g_assert (motion < 0);
|
g_assert (motion < 0);
|
||||||
|
|
||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"Starting tab between workspaces, showing popup\n");
|
"Starting tab between workspaces, showing popup\n");
|
||||||
|
|
||||||
|
if (!meta_input_event_get_state (display, event, &state))
|
||||||
|
return;
|
||||||
|
|
||||||
/* FIXME should we use binding->mask ? */
|
/* FIXME should we use binding->mask ? */
|
||||||
grab_mask = event->xkey.state & ~(display->ignored_modifier_mask);
|
grab_mask = state & ~(display->ignored_modifier_mask);
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
|
|
||||||
if (!meta_display_begin_grab_op (display,
|
if (!meta_display_begin_grab_op (display,
|
||||||
screen,
|
screen,
|
||||||
NULL,
|
NULL,
|
||||||
@ -3500,7 +3584,7 @@ handle_workspace_switch (MetaDisplay *display,
|
|||||||
FALSE,
|
FALSE,
|
||||||
0,
|
0,
|
||||||
grab_mask,
|
grab_mask,
|
||||||
event->xkey.time,
|
evtime,
|
||||||
0, 0))
|
0, 0))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -3518,10 +3602,10 @@ handle_workspace_switch (MetaDisplay *display,
|
|||||||
* release event. Must end grab before we can switch
|
* release event. Must end grab before we can switch
|
||||||
* spaces.
|
* spaces.
|
||||||
*/
|
*/
|
||||||
meta_display_end_grab_op (display, event->xkey.time);
|
meta_display_end_grab_op (display, evtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_workspace_activate (next, event->xkey.time);
|
meta_workspace_activate (next, evtime);
|
||||||
|
|
||||||
if (grabbed_before_release && !meta_prefs_get_no_tab_popup ())
|
if (grabbed_before_release && !meta_prefs_get_no_tab_popup ())
|
||||||
meta_screen_workspace_popup_create (screen, next);
|
meta_screen_workspace_popup_create (screen, next);
|
||||||
@ -3555,8 +3639,10 @@ handle_run_terminal (MetaDisplay *display,
|
|||||||
gpointer dummy)
|
gpointer dummy)
|
||||||
{
|
{
|
||||||
const char *command;
|
const char *command;
|
||||||
|
Time evtime;
|
||||||
GError *err;
|
GError *err;
|
||||||
|
|
||||||
|
evtime = meta_input_event_get_time (display, event);
|
||||||
command = meta_prefs_get_terminal_command ();
|
command = meta_prefs_get_terminal_command ();
|
||||||
|
|
||||||
if (command == NULL)
|
if (command == NULL)
|
||||||
@ -3566,11 +3652,11 @@ handle_run_terminal (MetaDisplay *display,
|
|||||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||||
"No terminal command to run in response to "
|
"No terminal command to run in response to "
|
||||||
"keybinding press\n");
|
"keybinding press\n");
|
||||||
|
|
||||||
s = g_strdup_printf (_("No terminal command has been defined.\n"));
|
s = g_strdup_printf (_("No terminal command has been defined.\n"));
|
||||||
error_on_command (-1, NULL, s, screen, event->xkey.time);
|
error_on_command (-1, NULL, s, screen, evtime);
|
||||||
g_free (s);
|
g_free (s);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3578,8 +3664,8 @@ handle_run_terminal (MetaDisplay *display,
|
|||||||
if (!meta_spawn_command_line_async_on_screen (command, screen, &err))
|
if (!meta_spawn_command_line_async_on_screen (command, screen, &err))
|
||||||
{
|
{
|
||||||
error_on_command (-1, command, err->message, screen,
|
error_on_command (-1, command, err->message, screen,
|
||||||
event->xkey.time);
|
evtime);
|
||||||
|
|
||||||
g_error_free (err);
|
g_error_free (err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user