diff options
Diffstat (limited to 'src/core/keybindings.c')
-rw-r--r-- | src/core/keybindings.c | 867 |
1 files changed, 722 insertions, 145 deletions
diff --git a/src/core/keybindings.c b/src/core/keybindings.c index 886905380..8897eacff 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -46,19 +46,18 @@ #include <X11/XKBlib.h> #endif +#define SCHEMA_COMMON_KEYBINDINGS "org.gnome.desktop.wm.keybindings" +#define SCHEMA_MUTTER_KEYBINDINGS "org.gnome.mutter.keybindings" + static gboolean all_bindings_disabled = FALSE; -/* Prototypes for handlers */ -#define keybind(name, handler, param, flags) \ -static void \ -handler (MetaDisplay *display,\ - MetaScreen *screen,\ - MetaWindow *window,\ - XEvent *event,\ - MetaKeyBinding *binding, \ - gpointer user_data); -#include "all-keybindings.h" -#undef keybind +static gboolean add_builtin_keybinding (MetaDisplay *display, + const char *name, + const char *schema, + MetaKeyBindingFlags flags, + MetaKeyBindingAction action, + MetaKeyHandlerFunc handler, + int handler_arg); /* These can't be bound to anything, but they are used to handle * various other events. TODO: Possibly we should include them as event @@ -103,13 +102,18 @@ static gboolean process_workspace_switch_grab (MetaDisplay *display, static void regrab_key_bindings (MetaDisplay *display); -#define keybind(name, handler, param, flags) \ - { #name, handler, handler, param, flags, NULL, NULL }, -static MetaKeyHandler key_handlers[] = { -#include "all-keybindings.h" - { NULL, NULL, NULL, 0, 0, NULL, NULL } -}; -#undef keybind +static GHashTable *key_handlers; + +#define HANDLER(name) g_hash_table_lookup (key_handlers, (name)) + +static void +key_handler_free (MetaKeyHandler *handler) +{ + g_free (handler->name); + if (handler->user_data_free_func && handler->user_data) + handler->user_data_free_func (handler->user_data); + g_free (handler); +} static void reload_keymap (MetaDisplay *display) @@ -302,17 +306,17 @@ reload_modifiers (MetaDisplay *display) static int -count_bindings (const MetaKeyPref *prefs, - int n_prefs) +count_bindings (GList *prefs) { - int i; + GList *p; int count; count = 0; - i = 0; - while (i < n_prefs) + p = prefs; + while (p) { - GSList *tmp = prefs[i].bindings; + MetaKeyPref *pref = (MetaKeyPref*)p->data; + GSList *tmp = pref->bindings; while (tmp) { @@ -322,58 +326,40 @@ count_bindings (const MetaKeyPref *prefs, { count += 1; - if (prefs[i].add_shift && + if (pref->add_shift && (combo->modifiers & META_VIRTUAL_SHIFT_MASK) == 0) count += 1; } tmp = tmp->next; } - - ++i; - } - return count; -} - -/* FIXME: replace this with a temporary hash */ -static MetaKeyHandler* -find_handler (MetaKeyHandler *handlers, - const char *name) -{ - MetaKeyHandler *iter; - - iter = handlers; - while (iter->name) - { - if (strcmp (iter->name, name) == 0) - return iter; - - ++iter; + p = p->next; } - return NULL; + return count; } static void -rebuild_binding_table (MetaDisplay *display, - MetaKeyBinding **bindings_p, - int *n_bindings_p, - const MetaKeyPref *prefs, - int n_prefs) +rebuild_binding_table (MetaDisplay *display, + MetaKeyBinding **bindings_p, + int *n_bindings_p, + GList *prefs) { + GList *p; int n_bindings; - int src, dest; + int i; - n_bindings = count_bindings (prefs, n_prefs); + n_bindings = count_bindings (prefs); g_free (*bindings_p); *bindings_p = g_new0 (MetaKeyBinding, n_bindings); - src = 0; - dest = 0; - while (src < n_prefs) + i = 0; + p = prefs; + while (p) { - GSList *tmp = prefs[src].bindings; + MetaKeyPref *pref = (MetaKeyPref*)p->data; + GSList *tmp = pref->bindings; while (tmp) { @@ -381,45 +367,45 @@ rebuild_binding_table (MetaDisplay *display, if (combo && (combo->keysym != None || combo->keycode != 0)) { - MetaKeyHandler *handler = find_handler (key_handlers, prefs[src].name); - - (*bindings_p)[dest].name = prefs[src].name; - (*bindings_p)[dest].handler = handler; - (*bindings_p)[dest].keysym = combo->keysym; - (*bindings_p)[dest].keycode = combo->keycode; - (*bindings_p)[dest].modifiers = combo->modifiers; - (*bindings_p)[dest].mask = 0; + MetaKeyHandler *handler = HANDLER (pref->name); + + (*bindings_p)[i].name = pref->name; + (*bindings_p)[i].handler = handler; + (*bindings_p)[i].keysym = combo->keysym; + (*bindings_p)[i].keycode = combo->keycode; + (*bindings_p)[i].modifiers = combo->modifiers; + (*bindings_p)[i].mask = 0; - ++dest; + ++i; - if (prefs[src].add_shift && + if (pref->add_shift && (combo->modifiers & META_VIRTUAL_SHIFT_MASK) == 0) { meta_topic (META_DEBUG_KEYBINDINGS, "Binding %s also needs Shift grabbed\n", - prefs[src].name); + pref->name); - (*bindings_p)[dest].name = prefs[src].name; - (*bindings_p)[dest].handler = handler; - (*bindings_p)[dest].keysym = combo->keysym; - (*bindings_p)[dest].keycode = combo->keycode; - (*bindings_p)[dest].modifiers = combo->modifiers | + (*bindings_p)[i].name = pref->name; + (*bindings_p)[i].handler = handler; + (*bindings_p)[i].keysym = combo->keysym; + (*bindings_p)[i].keycode = combo->keycode; + (*bindings_p)[i].modifiers = combo->modifiers | META_VIRTUAL_SHIFT_MASK; - (*bindings_p)[dest].mask = 0; + (*bindings_p)[i].mask = 0; - ++dest; + ++i; } } tmp = tmp->next; } - ++src; + p = p->next; } - g_assert (dest == n_bindings); + g_assert (i == n_bindings); - *n_bindings_p = dest; + *n_bindings_p = i; meta_topic (META_DEBUG_KEYBINDINGS, " %d bindings in table\n", @@ -429,17 +415,17 @@ rebuild_binding_table (MetaDisplay *display, static void rebuild_key_binding_table (MetaDisplay *display) { - const MetaKeyPref *prefs; - int n_prefs; - + GList *prefs; + meta_topic (META_DEBUG_KEYBINDINGS, "Rebuilding key binding table from preferences\n"); - - meta_prefs_get_key_bindings (&prefs, &n_prefs); + + prefs = meta_prefs_get_keybindings (); rebuild_binding_table (display, &display->key_bindings, &display->n_key_bindings, - prefs, n_prefs); + prefs); + g_list_free (prefs); } static void @@ -514,6 +500,32 @@ display_get_keybinding (MetaDisplay *display, return NULL; } +static gboolean +add_builtin_keybinding (MetaDisplay *display, + const char *name, + const char *schema, + MetaKeyBindingFlags flags, + MetaKeyBindingAction action, + MetaKeyHandlerFunc func, + int data) +{ + MetaKeyHandler *handler; + + if (!meta_prefs_add_keybinding (name, schema, action, flags)) + return FALSE; + + handler = g_new0 (MetaKeyHandler, 1); + handler->name = g_strdup (name); + handler->func = func; + handler->default_func = func; + handler->data = data; + handler->flags = flags; + + g_hash_table_insert (key_handlers, g_strdup (name), handler); + + return TRUE; +} + /** * meta_display_get_keybinding_action: * @display: A #MetaDisplay @@ -622,55 +634,6 @@ bindings_changed_callback (MetaPreference pref, void -meta_display_init_keys (MetaDisplay *display) -{ - /* Keybindings */ - display->keymap = NULL; - display->keysyms_per_keycode = 0; - display->modmap = NULL; - display->min_keycode = 0; - display->max_keycode = 0; - display->ignored_modifier_mask = 0; - display->num_lock_mask = 0; - display->scroll_lock_mask = 0; - display->hyper_mask = 0; - display->super_mask = 0; - display->meta_mask = 0; - display->key_bindings = NULL; - display->n_key_bindings = 0; - - XDisplayKeycodes (display->xdisplay, - &display->min_keycode, - &display->max_keycode); - - meta_topic (META_DEBUG_KEYBINDINGS, - "Display has keycode range %d to %d\n", - display->min_keycode, - display->max_keycode); - - reload_keymap (display); - reload_modmap (display); - - rebuild_key_binding_table (display); - rebuild_special_bindings (display); - - reload_keycodes (display); - reload_modifiers (display); - - /* Keys are actually grabbed in meta_screen_grab_keys() */ - - meta_prefs_add_listener (bindings_changed_callback, display); - -#ifdef HAVE_XKB - /* meta_display_init_keys() should have already called XkbQueryExtension() */ - if (display->xkb_base_event_type != -1) - XkbSelectEvents (display->xdisplay, XkbUseCoreKbd, - XkbNewKeyboardNotifyMask | XkbMapNotifyMask, - XkbNewKeyboardNotifyMask | XkbMapNotifyMask); -#endif -} - -void meta_display_shutdown_keys (MetaDisplay *display) { /* Note that display->xdisplay is invalid in this function */ @@ -797,7 +760,7 @@ grab_keys (MetaKeyBinding *bindings, while (i < n_bindings) { if (!!binding_per_window == - !!(bindings[i].handler->flags & BINDING_PER_WINDOW) && + !!(bindings[i].handler->flags & META_KEY_BINDING_PER_WINDOW) && bindings[i].keycode != 0) { meta_grab_key (display, xwindow, @@ -1261,14 +1224,14 @@ invoke_handler (MetaDisplay *display, { if (handler->func) (* handler->func) (display, screen, - handler->flags & BINDING_PER_WINDOW ? + handler->flags & META_KEY_BINDING_PER_WINDOW ? window : NULL, event, binding, handler->user_data); else (* handler->default_func) (display, screen, - handler->flags & BINDING_PER_WINDOW ? + handler->flags & META_KEY_BINDING_PER_WINDOW ? window: NULL, event, binding, @@ -1284,7 +1247,7 @@ invoke_handler_by_name (MetaDisplay *display, { MetaKeyHandler *handler; - handler = find_handler (key_handlers, handler_name); + handler = HANDLER (handler_name); if (handler) invoke_handler (display, screen, handler, window, event, NULL); } @@ -1314,17 +1277,17 @@ process_event (MetaKeyBinding *bindings, { MetaKeyHandler *handler = bindings[i].handler; - if ((!on_window && handler->flags & BINDING_PER_WINDOW) || + if ((!on_window && handler->flags & META_KEY_BINDING_PER_WINDOW) || event->type != KeyPress || bindings[i].keycode != event->xkey.keycode || ((event->xkey.state & 0xff & ~(display->ignored_modifier_mask)) != bindings[i].mask)) continue; - + /* * window must be non-NULL for on_window to be true, * and so also window must be non-NULL if we get here and - * this is a BINDING_PER_WINDOW binding. + * this is a META_KEY_BINDING_PER_WINDOW binding. */ meta_topic (META_DEBUG_KEYBINDINGS, @@ -1338,7 +1301,7 @@ process_event (MetaKeyBinding *bindings, meta_topic (META_DEBUG_KEYBINDINGS, "Running handler for %s\n", bindings[i].name); - + /* Global keybindings count as a let-the-terminal-lose-focus * due to new window mapping until the user starts * interacting with the terminal again. @@ -3069,7 +3032,7 @@ handle_switch (MetaDisplay *display, MetaKeyBinding *binding, gpointer dummy) { - gint backwards = binding->handler->flags & BINDING_IS_REVERSED; + gint backwards = (binding->handler->flags & META_KEY_BINDING_IS_REVERSED) != 0; do_choose_window (display, screen, event_window, event, binding, backwards, TRUE); @@ -3083,7 +3046,7 @@ handle_cycle (MetaDisplay *display, MetaKeyBinding *binding, gpointer dummy) { - gint backwards = binding->handler->flags & BINDING_IS_REVERSED; + gint backwards = (binding->handler->flags & META_KEY_BINDING_IS_REVERSED) != 0; do_choose_window (display, screen, event_window, event, binding, backwards, FALSE); @@ -3476,7 +3439,7 @@ meta_keybindings_set_custom_handler (const gchar *name, gpointer user_data, GDestroyNotify free_data) { - MetaKeyHandler *key_handler = find_handler (key_handlers, name); + MetaKeyHandler *key_handler = HANDLER (name); if (!key_handler) return FALSE; @@ -3502,9 +3465,623 @@ meta_keybindings_switch_window (MetaDisplay *display, XEvent *event, MetaKeyBinding *binding) { - gint backwards = binding->handler->flags & BINDING_IS_REVERSED; + gint backwards = (binding->handler->flags & META_KEY_BINDING_IS_REVERSED) != 0; do_choose_window (display, screen, event_window, event, binding, backwards, FALSE); } +static void +init_builtin_key_bindings (MetaDisplay *display) +{ +#define REVERSES_AND_REVERSED (META_KEY_BINDING_REVERSES | \ + META_KEY_BINDING_IS_REVERSED) + + add_builtin_keybinding (display, + "switch-to-workspace-1", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_1, + handle_switch_to_workspace, 0); + add_builtin_keybinding (display, + "switch-to-workspace-2", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_2, + handle_switch_to_workspace, 1); + add_builtin_keybinding (display, + "switch-to-workspace-3", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_3, + handle_switch_to_workspace, 2); + add_builtin_keybinding (display, + "switch-to-workspace-4", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_4, + handle_switch_to_workspace, 3); + add_builtin_keybinding (display, + "switch-to-workspace-5", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_5, + handle_switch_to_workspace, 4); + add_builtin_keybinding (display, + "switch-to-workspace-6", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_6, + handle_switch_to_workspace, 5); + add_builtin_keybinding (display, + "switch-to-workspace-7", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_7, + handle_switch_to_workspace, 6); + add_builtin_keybinding (display, + "switch-to-workspace-8", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_8, + handle_switch_to_workspace, 7); + add_builtin_keybinding (display, + "switch-to-workspace-9", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_9, + handle_switch_to_workspace, 8); + add_builtin_keybinding (display, + "switch-to-workspace-10", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_10, + handle_switch_to_workspace, 9); + add_builtin_keybinding (display, + "switch-to-workspace-11", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_11, + handle_switch_to_workspace, 10); + add_builtin_keybinding (display, + "switch-to-workspace-12", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_12, + handle_switch_to_workspace, 11); + + add_builtin_keybinding (display, + "switch-to-workspace-left", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_LEFT, + handle_switch_to_workspace, META_MOTION_LEFT); + + add_builtin_keybinding (display, + "switch-to-workspace-right", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_RIGHT, + handle_switch_to_workspace, META_MOTION_RIGHT); + + add_builtin_keybinding (display, + "switch-to-workspace-up", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_UP, + handle_switch_to_workspace, META_MOTION_UP); + + add_builtin_keybinding (display, + "switch-to-workspace-down", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_WORKSPACE_DOWN, + handle_switch_to_workspace, META_MOTION_DOWN); + + + /* The ones which have inverses. These can't be bound to any keystroke + * containing Shift because Shift will invert their "backward" state. + * + * TODO: "NORMAL" and "DOCKS" should be renamed to the same name as their + * action, for obviousness. + * + * TODO: handle_switch and handle_cycle should probably really be the + * same function checking a bit in the parameter for difference. + */ + + add_builtin_keybinding (display, + "switch-group", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_REVERSES, + META_KEYBINDING_ACTION_SWITCH_GROUP, + handle_switch, META_TAB_LIST_GROUP); + + add_builtin_keybinding (display, + "switch-group-backward", + SCHEMA_COMMON_KEYBINDINGS, + REVERSES_AND_REVERSED, + META_KEYBINDING_ACTION_SWITCH_GROUP_BACKWARD, + handle_switch, META_TAB_LIST_GROUP); + + add_builtin_keybinding (display, + "switch-windows", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_REVERSES, + META_KEYBINDING_ACTION_SWITCH_WINDOWS, + handle_switch, META_TAB_LIST_NORMAL); + + add_builtin_keybinding (display, + "switch-windows-backward", + SCHEMA_COMMON_KEYBINDINGS, + REVERSES_AND_REVERSED, + META_KEYBINDING_ACTION_SWITCH_WINDOWS_BACKWARD, + handle_switch, META_TAB_LIST_NORMAL); + + add_builtin_keybinding (display, + "switch-panels", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_REVERSES, + META_KEYBINDING_ACTION_SWITCH_PANELS, + handle_switch, META_TAB_LIST_DOCKS); + + add_builtin_keybinding (display, + "switch-panels-backward", + SCHEMA_COMMON_KEYBINDINGS, + REVERSES_AND_REVERSED, + META_KEYBINDING_ACTION_SWITCH_PANELS_BACKWARD, + handle_switch, META_TAB_LIST_DOCKS); + + add_builtin_keybinding (display, + "cycle-group", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_REVERSES, + META_KEYBINDING_ACTION_CYCLE_GROUP, + handle_cycle, META_TAB_LIST_GROUP); + + add_builtin_keybinding (display, + "cycle-group-backward", + SCHEMA_COMMON_KEYBINDINGS, + REVERSES_AND_REVERSED, + META_KEYBINDING_ACTION_CYCLE_GROUP_BACKWARD, + handle_cycle, META_TAB_LIST_GROUP); + + add_builtin_keybinding (display, + "cycle-windows", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_REVERSES, + META_KEYBINDING_ACTION_CYCLE_WINDOWS, + handle_cycle, META_TAB_LIST_NORMAL); + + add_builtin_keybinding (display, + "cycle-windows-backward", + SCHEMA_COMMON_KEYBINDINGS, + REVERSES_AND_REVERSED, + META_KEYBINDING_ACTION_CYCLE_WINDOWS_BACKWARD, + handle_cycle, META_TAB_LIST_NORMAL); + + add_builtin_keybinding (display, + "cycle-panels", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_REVERSES, + META_KEYBINDING_ACTION_CYCLE_PANELS, + handle_cycle, META_TAB_LIST_DOCKS); + + add_builtin_keybinding (display, + "cycle-panels-backward", + SCHEMA_COMMON_KEYBINDINGS, + REVERSES_AND_REVERSED, + META_KEYBINDING_ACTION_CYCLE_PANELS_BACKWARD, + handle_cycle, META_TAB_LIST_DOCKS); + + +/* These two are special pseudo-bindings that are provided for allowing + * custom handlers, but will never be bound to a key. While a tab + * grab is in effect, they are invoked for releasing the primary modifier + * or pressing some unbound key, respectively. + */ + add_builtin_keybinding (display, + "tab-popup-select", + SCHEMA_MUTTER_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_TAB_POPUP_SELECT, + handle_tab_popup_select, 0); + + add_builtin_keybinding (display, + "tab-popup-cancel", + SCHEMA_MUTTER_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_TAB_POPUP_CANCEL, + handle_tab_popup_cancel, 0); + +/***********************************/ + + add_builtin_keybinding (display, + "show-desktop", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_SHOW_DESKTOP, + handle_show_desktop, 0); + + add_builtin_keybinding (display, + "panel-main-menu", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_PANEL_MAIN_MENU, + handle_panel, META_KEYBINDING_ACTION_PANEL_MAIN_MENU); + + add_builtin_keybinding (display, + "panel-run-dialog", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_PANEL_RUN_DIALOG, + handle_panel, META_KEYBINDING_ACTION_PANEL_RUN_DIALOG); + + add_builtin_keybinding (display, + "toggle-recording", + SCHEMA_MUTTER_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_TOGGLE_RECORDING, + handle_toggle_recording, 0); + + add_builtin_keybinding (display, + "set-spew-mark", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_NONE, + META_KEYBINDING_ACTION_SET_SPEW_MARK, + handle_set_spew_mark, 0); + +#undef REVERSES_AND_REVERSED + +/************************ PER WINDOW BINDINGS ************************/ + +/* These take a window as an extra parameter; they have no effect + * if no window is active. + */ + + add_builtin_keybinding (display, + "activate-window-menu", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_ACTIVATE_WINDOW_MENU, + handle_activate_window_menu, 0); + + add_builtin_keybinding (display, + "toggle-fullscreen", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_TOGGLE_FULLSCREEN, + handle_toggle_fullscreen, 0); + + add_builtin_keybinding (display, + "toggle-maximized", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_TOGGLE_MAXIMIZED, + handle_toggle_maximized, 0); + + add_builtin_keybinding (display, + "toggle-above", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_TOGGLE_ABOVE, + handle_toggle_above, 0); + + add_builtin_keybinding (display, + "maximize", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MAXIMIZE, + handle_maximize, 0); + + add_builtin_keybinding (display, + "unmaximize", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_UNMAXIMIZE, + handle_unmaximize, 0); + + add_builtin_keybinding (display, + "toggle-shaded", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_TOGGLE_SHADED, + handle_toggle_shaded, 0); + + add_builtin_keybinding (display, + "minimize", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MINIMIZE, + handle_minimize, 0); + + add_builtin_keybinding (display, + "close", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_CLOSE, + handle_close, 0); + + add_builtin_keybinding (display, + "begin-move", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_BEGIN_MOVE, + handle_begin_move, 0); + + add_builtin_keybinding (display, + "begin-resize", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_BEGIN_RESIZE, + handle_begin_resize, 0); + + add_builtin_keybinding (display, + "toggle-on-all-workspaces", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_TOGGLE_ON_ALL_WORKSPACES, + handle_toggle_on_all_workspaces, 0); + + add_builtin_keybinding (display, + "move-to-workspace-1", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_1, + handle_move_to_workspace, 0); + + add_builtin_keybinding (display, + "move-to-workspace-2", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_2, + handle_move_to_workspace, 1); + + add_builtin_keybinding (display, + "move-to-workspace-3", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_3, + handle_move_to_workspace, 2); + + add_builtin_keybinding (display, + "move-to-workspace-4", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_4, + handle_move_to_workspace, 3); + + add_builtin_keybinding (display, + "move-to-workspace-5", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_5, + handle_move_to_workspace, 4); + + add_builtin_keybinding (display, + "move-to-workspace-6", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_6, + handle_move_to_workspace, 5); + + add_builtin_keybinding (display, + "move-to-workspace-7", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_7, + handle_move_to_workspace, 6); + + add_builtin_keybinding (display, + "move-to-workspace-8", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_8, + handle_move_to_workspace, 7); + + add_builtin_keybinding (display, + "move-to-workspace-9", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_9, + handle_move_to_workspace, 8); + + add_builtin_keybinding (display, + "move-to-workspace-10", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_10, + handle_move_to_workspace, 9); + + add_builtin_keybinding (display, + "move-to-workspace-11", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_11, + handle_move_to_workspace, 10); + + add_builtin_keybinding (display, + "move-to-workspace-12", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_12, + handle_move_to_workspace, 11); + + add_builtin_keybinding (display, + "move-to-workspace-left", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_LEFT, + handle_move_to_workspace, META_MOTION_LEFT); + + add_builtin_keybinding (display, + "move-to-workspace-right", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_RIGHT, + handle_move_to_workspace, META_MOTION_RIGHT); + + add_builtin_keybinding (display, + "move-to-workspace-up", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_UP, + handle_move_to_workspace, META_MOTION_UP); + + add_builtin_keybinding (display, + "move-to-workspace-down", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN, + handle_move_to_workspace, META_MOTION_DOWN); + + add_builtin_keybinding (display, + "raise-or-lower", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_RAISE_OR_LOWER, + handle_raise_or_lower, 0); + + add_builtin_keybinding (display, + "raise", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_RAISE, + handle_raise, 0); + + add_builtin_keybinding (display, + "lower", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_LOWER, + handle_lower, 0); + + add_builtin_keybinding (display, + "maximize-vertically", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MAXIMIZE_VERTICALLY, + handle_maximize_vertically, 0); + + add_builtin_keybinding (display, + "maximize-horizontally", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MAXIMIZE_HORIZONTALLY, + handle_maximize_horizontally, 0); + + add_builtin_keybinding (display, + "move-to-corner-nw", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_CORNER_NW, + handle_move_to_corner_nw, 0); + + add_builtin_keybinding (display, + "move-to-corner-ne", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_CORNER_NE, + handle_move_to_corner_ne, 0); + + add_builtin_keybinding (display, + "move-to-corner-sw", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_CORNER_SW, + handle_move_to_corner_sw, 0); + + add_builtin_keybinding (display, + "move-to-corner-se", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_CORNER_SE, + handle_move_to_corner_se, 0); + + add_builtin_keybinding (display, + "move-to-side-n", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_SIDE_N, + handle_move_to_side_n, 0); + + add_builtin_keybinding (display, + "move-to-side-s", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_SIDE_S, + handle_move_to_side_s, 0); + + add_builtin_keybinding (display, + "move-to-side-e", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_SIDE_E, + handle_move_to_side_e, 0); + + add_builtin_keybinding (display, + "move-to-side-w", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_SIDE_W, + handle_move_to_side_w, 0); + + add_builtin_keybinding (display, + "move-to-center", + SCHEMA_COMMON_KEYBINDINGS, + META_KEY_BINDING_PER_WINDOW, + META_KEYBINDING_ACTION_MOVE_TO_CENTER, + handle_move_to_center, 0); +} + +void +meta_display_init_keys (MetaDisplay *display) +{ + /* Keybindings */ + display->keymap = NULL; + display->keysyms_per_keycode = 0; + display->modmap = NULL; + display->min_keycode = 0; + display->max_keycode = 0; + display->ignored_modifier_mask = 0; + display->num_lock_mask = 0; + display->scroll_lock_mask = 0; + display->hyper_mask = 0; + display->super_mask = 0; + display->meta_mask = 0; + display->key_bindings = NULL; + display->n_key_bindings = 0; + + XDisplayKeycodes (display->xdisplay, + &display->min_keycode, + &display->max_keycode); + + meta_topic (META_DEBUG_KEYBINDINGS, + "Display has keycode range %d to %d\n", + display->min_keycode, + display->max_keycode); + + reload_keymap (display); + reload_modmap (display); + + key_handlers = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, + (GDestroyNotify) key_handler_free); + init_builtin_key_bindings (display); + + rebuild_key_binding_table (display); + rebuild_special_bindings (display); + + reload_keycodes (display); + reload_modifiers (display); + + /* Keys are actually grabbed in meta_screen_grab_keys() */ + + meta_prefs_add_listener (bindings_changed_callback, display); + +#ifdef HAVE_XKB + /* meta_display_init_keys() should have already called XkbQueryExtension() */ + if (display->xkb_base_event_type != -1) + XkbSelectEvents (display->xdisplay, XkbUseCoreKbd, + XkbNewKeyboardNotifyMask | XkbMapNotifyMask, + XkbNewKeyboardNotifyMask | XkbMapNotifyMask); +#endif +} |