Commit 179549b7 authored by Alberts Muktupāvels's avatar Alberts Muktupāvels
Browse files

keybindings: store keybindings dynamically

Rather than defining keybindings in static arrays generated at compile
time, store them in a hash table initialized in meta_display_init_keys()
and filled in init_builtin_keybindings().

This is a prerequisite for allowing to add/remove keybindings at runtime.

https://bugzilla.gnome.org/show_bug.cgi?id=663428

Based on mutter, mostly on this commit by Florian:
https://git.gnome.org/browse/mutter/commit/?id=d42a2a3c2741b8b44b48f83eb79a82fb4fcd5bbd
parent 4864daab
...@@ -109,8 +109,7 @@ libmetacity_private_la_SOURCES= \ ...@@ -109,8 +109,7 @@ libmetacity_private_la_SOURCES= \
ui/theme-parser.h \ ui/theme-parser.h \
ui/theme.c \ ui/theme.c \
ui/theme.h \ ui/theme.h \
ui/ui.c \ ui/ui.c
include/all-keybindings.h
libmetacity_private_la_LDFLAGS = -no-undefined -version-info 3:0:0 libmetacity_private_la_LDFLAGS = -no-undefined -version-info 3:0:0
libmetacity_private_la_LIBADD = @METACITY_LIBS@ libmetacity_private_la_LIBADD = @METACITY_LIBS@
......
This diff is collapsed.
...@@ -29,6 +29,28 @@ ...@@ -29,6 +29,28 @@
#include "display-private.h" #include "display-private.h"
#include "window.h" #include "window.h"
#include "prefs.h"
struct _MetaKeyHandler
{
char *name;
MetaKeyHandlerFunc func;
MetaKeyHandlerFunc default_func;
gint data;
gint flags;
gpointer user_data;
GDestroyNotify user_data_free_func;
};
struct _MetaKeyBinding
{
const char *name;
KeySym keysym;
KeyCode keycode;
unsigned int mask;
MetaVirtualModifier modifiers;
MetaKeyHandler *handler;
};
void meta_display_init_keys (MetaDisplay *display); void meta_display_init_keys (MetaDisplay *display);
void meta_display_shutdown_keys (MetaDisplay *display); void meta_display_shutdown_keys (MetaDisplay *display);
...@@ -52,8 +74,9 @@ void meta_set_keybindings_disabled (MetaDisplay *display, ...@@ -52,8 +74,9 @@ void meta_set_keybindings_disabled (MetaDisplay *display,
void meta_display_process_mapping_event (MetaDisplay *display, void meta_display_process_mapping_event (MetaDisplay *display,
XEvent *event); XEvent *event);
#endif gboolean meta_prefs_add_keybinding (const char *name,
const char *schema,
MetaKeyBindingAction action,
MetaKeyBindingFlags flags);
#endif
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <gio/gio.h> #include <gio/gio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "keybindings.h"
/* If you add a key, it needs updating in init() and in the gsettings /* If you add a key, it needs updating in init() and in the gsettings
* notify listener and of course in the .schemas file. * notify listener and of course in the .schemas file.
...@@ -55,7 +56,6 @@ ...@@ -55,7 +56,6 @@
#define SCHEMA_GENERAL "org.gnome.desktop.wm.preferences" #define SCHEMA_GENERAL "org.gnome.desktop.wm.preferences"
#define SCHEMA_METACITY "org.gnome.metacity" #define SCHEMA_METACITY "org.gnome.metacity"
#define SCHEMA_INTERFACE "org.gnome.desktop.interface" #define SCHEMA_INTERFACE "org.gnome.desktop.interface"
#define SCHEMA_BINDINGS "org.gnome.desktop.wm.keybindings"
#define SETTINGS(s) g_hash_table_lookup (settings_schemas, (s)) #define SETTINGS(s) g_hash_table_lookup (settings_schemas, (s))
...@@ -791,15 +791,7 @@ meta_prefs_init (void) ...@@ -791,15 +791,7 @@ meta_prefs_init (void)
G_CALLBACK (settings_changed), NULL); G_CALLBACK (settings_changed), NULL);
g_hash_table_insert (settings_schemas, SCHEMA_INTERFACE, settings); g_hash_table_insert (settings_schemas, SCHEMA_INTERFACE, settings);
/* Bindings have a separate handler, since they are in separate schemas
* and work differently */
settings = g_settings_new (SCHEMA_BINDINGS);
g_signal_connect (settings, "changed", G_CALLBACK (bindings_changed), NULL);
g_hash_table_insert (settings_schemas, SCHEMA_BINDINGS, settings);
/* Pick up initial values. */ /* Pick up initial values. */
handle_preference_init_enum (); handle_preference_init_enum ();
handle_preference_init_bool (); handle_preference_init_bool ();
handle_preference_init_string (); handle_preference_init_string ();
...@@ -1449,29 +1441,24 @@ meta_prefs_set_num_workspaces (int n_workspaces) ...@@ -1449,29 +1441,24 @@ meta_prefs_set_num_workspaces (int n_workspaces)
n_workspaces); n_workspaces);
} }
#define keybind(name, handler, param, flags) \ static GHashTable *key_bindings;
{ #name, NULL, !!(flags & BINDING_REVERSES), !!(flags & BINDING_PER_WINDOW) },
static MetaKeyPref key_bindings[] = {
#include "all-keybindings.h"
{ NULL, NULL, FALSE }
};
#undef keybind
static void static void
init_bindings (void) meta_key_pref_free (MetaKeyPref *pref)
{ {
int i; update_binding (pref, NULL);
gchar **strokes;
for (i = 0; key_bindings[i].name; i++) g_free (pref->name);
{ g_free (pref->schema);
strokes = g_settings_get_strv (SETTINGS (SCHEMA_BINDINGS),
key_bindings[i].name);
update_key_binding (key_bindings[i].name, strokes);
g_strfreev (strokes); g_free (pref);
} }
static void
init_bindings (void)
{
key_bindings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
(GDestroyNotify) meta_key_pref_free);
} }
static void static void
...@@ -1558,15 +1545,10 @@ static gboolean ...@@ -1558,15 +1545,10 @@ static gboolean
update_key_binding (const char *key, update_key_binding (const char *key,
gchar **strokes) gchar **strokes)
{ {
int i; MetaKeyPref *pref = g_hash_table_lookup (key_bindings, key);
i = 0;
while (key_bindings[i].name &&
strcmp (key, key_bindings[i].name) != 0)
i++;
if (key_bindings[i].name) if (pref)
return update_binding (&key_bindings[i], strokes); return update_binding (pref, strokes);
else else
return FALSE; return FALSE;
} }
...@@ -1703,13 +1685,56 @@ meta_prefs_get_visual_bell_type (void) ...@@ -1703,13 +1685,56 @@ meta_prefs_get_visual_bell_type (void)
return visual_bell_type; return visual_bell_type;
} }
void gboolean
meta_prefs_get_key_bindings (const MetaKeyPref **bindings, meta_prefs_add_keybinding (const char *name,
int *n_bindings) const char *schema,
MetaKeyBindingAction action,
MetaKeyBindingFlags flags)
{ {
MetaKeyPref *pref;
GSettings *settings;
char **strokes;
*bindings = key_bindings; if (g_hash_table_lookup (key_bindings, name))
*n_bindings = (int) G_N_ELEMENTS (key_bindings) - 1; {
meta_warning ("Trying to re-add keybinding \"%s\".\n", name);
return FALSE;
}
settings = SETTINGS (schema);
if (settings == NULL)
{
settings = g_settings_new (schema);
g_signal_connect (settings, "changed",
G_CALLBACK (bindings_changed), NULL);
g_hash_table_insert (settings_schemas, g_strdup (schema), settings);
}
pref = g_new0 (MetaKeyPref, 1);
pref->name = g_strdup (name);
pref->schema = g_strdup (schema);
pref->action = action;
pref->bindings = NULL;
pref->add_shift = (flags & META_KEY_BINDING_REVERSES) != 0;
pref->per_window = (flags & META_KEY_BINDING_PER_WINDOW) != 0;
strokes = g_settings_get_strv (settings, name);
update_binding (pref, strokes);
g_strfreev (strokes);
g_hash_table_insert (key_bindings, g_strdup (name), pref);
return TRUE;
}
/**
* meta_prefs_get_keybindings: (skip)
* Return: (element-type MetaKeyPref) (transfer container):
*/
GList *
meta_prefs_get_keybindings ()
{
return g_hash_table_get_values (key_bindings);
} }
GDesktopTitlebarAction GDesktopTitlebarAction
...@@ -1769,18 +1794,9 @@ meta_prefs_get_edge_tiling () ...@@ -1769,18 +1794,9 @@ meta_prefs_get_edge_tiling ()
MetaKeyBindingAction MetaKeyBindingAction
meta_prefs_get_keybinding_action (const char *name) meta_prefs_get_keybinding_action (const char *name)
{ {
int i; MetaKeyPref *pref = g_hash_table_lookup (key_bindings, name);
i = G_N_ELEMENTS (key_bindings) - 2; /* -2 for dummy entry at end */ return pref ? pref->action : META_KEYBINDING_ACTION_NONE;
while (i >= 0)
{
if (strcmp (key_bindings[i].name, name) == 0)
return (MetaKeyBindingAction) i;
--i;
}
return META_KEYBINDING_ACTION_NONE;
} }
/* This is used by the menu system to decide what key binding /* This is used by the menu system to decide what key binding
...@@ -1792,36 +1808,29 @@ meta_prefs_get_window_binding (const char *name, ...@@ -1792,36 +1808,29 @@ meta_prefs_get_window_binding (const char *name,
unsigned int *keysym, unsigned int *keysym,
MetaVirtualModifier *modifiers) MetaVirtualModifier *modifiers)
{ {
int i; MetaKeyPref *pref = g_hash_table_lookup (key_bindings, name);
i = G_N_ELEMENTS (key_bindings) - 2; /* -2 for dummy entry at end */ if (pref->per_window)
while (i >= 0)
{ {
if (key_bindings[i].per_window && GSList *s = pref->bindings;
strcmp (key_bindings[i].name, name) == 0)
while (s)
{ {
GSList *s = key_bindings[i].bindings; MetaKeyCombo *c = s->data;
while (s) if (c->keysym != 0 || c->modifiers != 0)
{ {
MetaKeyCombo *c = s->data; *keysym = c->keysym;
*modifiers = c->modifiers;
if (c->keysym!=0 || c->modifiers!=0) return;
{
*keysym = c->keysym;
*modifiers = c->modifiers;
return;
}
s = s->next;
} }
/* Not found; return the disabled value */ s = s->next;
*keysym = *modifiers = 0;
return;
} }
--i; /* Not found; return the disabled value */
*keysym = *modifiers = 0;
return;
} }
g_assert_not_reached (); g_assert_not_reached ();
......
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2008 Thomas Thurman
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
/**
* A list of screen keybinding information.
*
* Each action which can have a keystroke bound to it is listed below.
* To use this file, define keybind() to be a seven-argument macro (you can
* throw any of the arguments you please away), include this file,
* and then undefine the macro again.
*
* (If you aren't familiar with this technique, sometimes called "x-macros",
* see DDJ of May 2001: <http://www.ddj.com/cpp/184401387>.)
*
* This makes it possible to keep all information about all the keybindings
* in the same place. The only exception is the code to run when an action
* is actually invoked; while we *could* have put that in this file, it would
* have made debugging ridiculously difficult. Instead, each action should
* have a corresponding static function named handle_<name>() in
* keybindings.c.
*
* The arguments to keybind() are:
* 1) the name of the binding; a bareword identifier
* (it's fine if it happens to clash with a C reserved word)
* 2) the name of the function which implements it.
* Clearly we could have guessed this from the binding very often,
* but we choose to write it in full for the benefit of grep.
* 3) an integer parameter to pass to the handler
* 4) a set of boolean flags, ORed together:
* BINDING_PER_WINDOW - this is a window-based binding.
* It is only valid if there is a
* current window, and will operate in
* some way on that window.
* BINDING_REVERSES - the binding can reverse if you hold down Shift
* BINDING_IS_REVERSED - the same, but the senses are reversed from the
* handler's point of view (let me know if I should
* explain this better)
* or 0 if no flag applies.
*
* Don't try to do XML entity escaping anywhere in the strings.
*/
#ifndef keybind
#error "keybind () must be defined when you include screen-bindings.h"
#endif
/***********************************/
#ifndef _BINDINGS_DEFINED_CONSTANTS
#define _BINDINGS_DEFINED_CONSTANTS 1
#define BINDING_PER_WINDOW 0x01
#define BINDING_REVERSES 0x02
#define BINDING_IS_REVERSED 0x04
#endif /* _BINDINGS_DEFINED_CONSTANTS */
/***********************************/
/* convenience, since in this file they must always be set together */
#define REVERSES_AND_REVERSED (BINDING_REVERSES | BINDING_IS_REVERSED)
keybind (switch-to-workspace-1, handle_switch_to_workspace, 0, 0)
keybind (switch-to-workspace-2, handle_switch_to_workspace, 1, 0)
keybind (switch-to-workspace-3, handle_switch_to_workspace, 2, 0)
keybind (switch-to-workspace-4, handle_switch_to_workspace, 3, 0)
keybind (switch-to-workspace-5, handle_switch_to_workspace, 4, 0)
keybind (switch-to-workspace-6, handle_switch_to_workspace, 5, 0)
keybind (switch-to-workspace-7, handle_switch_to_workspace, 6, 0)
keybind (switch-to-workspace-8, handle_switch_to_workspace, 7, 0)
keybind (switch-to-workspace-9, handle_switch_to_workspace, 8, 0)
keybind (switch-to-workspace-10, handle_switch_to_workspace, 9, 0)
keybind (switch-to-workspace-11, handle_switch_to_workspace, 10, 0)
keybind (switch-to-workspace-12, handle_switch_to_workspace, 11, 0)
/* META_MOTION_* are negative, and so distinct from workspace numbers,
* which are always zero or positive.
* If you make use of these constants, you will need to include workspace.h
* (which you're probably using already for other reasons anyway).
* If your definition of keybind() throws them away, you don't need to include
* workspace.h, of course.
*/
keybind (switch-to-workspace-left, handle_switch_to_workspace,
META_MOTION_LEFT, 0)
keybind (switch-to-workspace-right, handle_switch_to_workspace,
META_MOTION_RIGHT, 0)
keybind (switch-to-workspace-up, handle_switch_to_workspace,
META_MOTION_UP, 0)
keybind (switch-to-workspace-down, handle_switch_to_workspace,
META_MOTION_DOWN, 0)
/***********************************/
/* 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.
*/
keybind (switch-applications, handle_switch, META_TAB_LIST_NORMAL,
BINDING_REVERSES)
keybind (switch-applications-backward, handle_switch, META_TAB_LIST_NORMAL,
REVERSES_AND_REVERSED)
keybind (switch-group, handle_switch, META_TAB_LIST_GROUP, BINDING_REVERSES)
keybind (switch-group-backward, handle_switch, META_TAB_LIST_GROUP,
REVERSES_AND_REVERSED)
keybind (switch-windows, handle_switch, META_TAB_LIST_NORMAL, BINDING_REVERSES)
keybind (switch-windows-backward, handle_switch, META_TAB_LIST_NORMAL,
REVERSES_AND_REVERSED)
keybind (switch-panels, handle_switch, META_TAB_LIST_DOCKS, BINDING_REVERSES)
keybind (switch-panels-backward, handle_switch, META_TAB_LIST_DOCKS,
REVERSES_AND_REVERSED)
keybind (cycle-group, handle_cycle, META_TAB_LIST_GROUP, BINDING_REVERSES)
keybind (cycle-group-backward, handle_cycle, META_TAB_LIST_GROUP,
REVERSES_AND_REVERSED)
keybind (cycle-windows, handle_cycle, META_TAB_LIST_NORMAL, BINDING_REVERSES)
keybind (cycle-windows-backward, handle_cycle, META_TAB_LIST_NORMAL,
REVERSES_AND_REVERSED)
keybind (cycle-panels, handle_cycle, META_TAB_LIST_DOCKS, BINDING_REVERSES)
keybind (cycle-panels-backward, handle_cycle, META_TAB_LIST_DOCKS,
REVERSES_AND_REVERSED)
/***********************************/
keybind (show-desktop, handle_show_desktop, 0, 0)
keybind (panel-main-menu, handle_panel,
META_KEYBINDING_ACTION_PANEL_MAIN_MENU, 0)
keybind (panel-run-dialog, handle_panel,
META_KEYBINDING_ACTION_PANEL_RUN_DIALOG, 0)
/* FIXME: No description because this is undocumented */
keybind (set-spew-mark, handle_set_spew_mark, 0, 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.
*/
keybind (activate-window-menu, handle_activate_window_menu, 0,
BINDING_PER_WINDOW)
keybind (toggle-fullscreen, handle_toggle_fullscreen, 0, BINDING_PER_WINDOW)
keybind (toggle-maximized, handle_toggle_maximized, 0, BINDING_PER_WINDOW)
keybind (toggle-above, handle_toggle_above, 0, BINDING_PER_WINDOW)
keybind (maximize, handle_maximize, 0, BINDING_PER_WINDOW)
keybind (unmaximize, handle_unmaximize, 0, BINDING_PER_WINDOW)
keybind (toggle-shaded, handle_toggle_shaded, 0, BINDING_PER_WINDOW)
keybind (minimize, handle_minimize, 0, BINDING_PER_WINDOW)
keybind (close, handle_close, 0, BINDING_PER_WINDOW)
keybind (begin-move, handle_begin_move, 0, BINDING_PER_WINDOW)
keybind (begin-resize, handle_begin_resize, 0, BINDING_PER_WINDOW)
keybind (toggle-on-all-workspaces, handle_toggle_on_all_workspaces, 0,
BINDING_PER_WINDOW)
keybind (move-to-workspace-1, handle_move_to_workspace, 0, BINDING_PER_WINDOW)
keybind (move-to-workspace-2, handle_move_to_workspace, 1, BINDING_PER_WINDOW)
keybind (move-to-workspace-3, handle_move_to_workspace, 2, BINDING_PER_WINDOW)
keybind (move-to-workspace-4, handle_move_to_workspace, 3, BINDING_PER_WINDOW)
keybind (move-to-workspace-5, handle_move_to_workspace, 4, BINDING_PER_WINDOW)
keybind (move-to-workspace-6, handle_move_to_workspace, 5, BINDING_PER_WINDOW)
keybind (move-to-workspace-7, handle_move_to_workspace, 6, BINDING_PER_WINDOW)
keybind (move-to-workspace-8, handle_move_to_workspace, 7, BINDING_PER_WINDOW)
keybind (move-to-workspace-9, handle_move_to_workspace, 8, BINDING_PER_WINDOW)
keybind (move-to-workspace-10, handle_move_to_workspace, 9, BINDING_PER_WINDOW)
keybind (move-to-workspace-11, handle_move_to_workspace, 10, BINDING_PER_WINDOW)
keybind (move-to-workspace-12, handle_move_to_workspace, 11, BINDING_PER_WINDOW)
/* META_MOTION_* are negative, and so distinct from workspace numbers,
* which are always zero or positive.
* If you make use of these constants, you will need to include workspace.h
* (which you're probably using already for other reasons anyway).
* If your definition of keybind() throws them away, you don't need to include
* workspace.h, of course.
*/
keybind (move-to-workspace-left, handle_move_to_workspace,
META_MOTION_LEFT, BINDING_PER_WINDOW)
keybind (move-to-workspace-right, handle_move_to_workspace,
META_MOTION_RIGHT, BINDING_PER_WINDOW)
keybind (move-to-workspace-up, handle_move_to_workspace,
META_MOTION_UP, BINDING_PER_WINDOW)
keybind (move-to-workspace-down, handle_move_to_workspace,
META_MOTION_DOWN, BINDING_PER_WINDOW)
keybind (raise-or-lower, handle_raise_or_lower, 0, BINDING_PER_WINDOW)
keybind (raise, handle_raise, 0, BINDING_PER_WINDOW)
keybind (lower, handle_lower, 0, BINDING_PER_WINDOW)
keybind (maximize-vertically, handle_maximize_vertically, 0, BINDING_PER_WINDOW)
keybind (maximize-horizontally, handle_maximize_horizontally, 0,
BINDING_PER_WINDOW)
keybind (move-to-corner-nw, handle_move_to_corner_nw, 0, BINDING_PER_WINDOW)
keybind (move-to-corner-ne, handle_move_to_corner_ne, 0, BINDING_PER_WINDOW)
keybind (move-to-corner-sw, handle_move_to_corner_sw, 0, BINDING_PER_WINDOW)
keybind (move-to-corner-se, handle_move_to_corner_se, 0, BINDING_PER_WINDOW)
keybind (move-to-side-n, handle_move_to_side_n, 0, BINDING_PER_WINDOW)
keybind (move-to-side-s, handle_move_to_side_s, 0, BINDING_PER_WINDOW)
keybind (move-to-side-e, handle_move_to_side_e, 0, BINDING_PER_WINDOW)
keybind (move-to-side-w, handle_move_to_side_w, 0, BINDING_PER_WINDOW)
keybind (move-to-center, handle_move_to_center, 0, BINDING_PER_WINDOW)
/* eof all-keybindings.h */
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
/* This header is a "common" one between the UI and core side */ /* This header is a "common" one between the UI and core side */
#include "common.h" #include "common.h"
#include "types.h"
#include <pango/pango-font.h> #include <pango/pango-font.h>
#include <gdesktop-enums.h> #include <gdesktop-enums.h>
...@@ -181,8 +182,59 @@ typedef enum _MetaKeyBindingAction ...@@ -181,8 +182,59 @@ typedef enum _MetaKeyBindingAction
META_KEYBINDING_ACTION_SHOW_DESKTOP, META_KEYBINDING_ACTION_SHOW_DESKTOP,
META_KEYBINDING_ACTION_PANEL_MAIN_MENU, META_KEYBINDING_ACTION_PANEL_MAIN_MENU,
META_KEYBINDING_ACTION_PANEL_RUN_DIALOG, META_KEYBINDING_ACTION_PANEL_RUN_DIALOG,
META_KEYBINDING_ACTION_SET_SPEW_MARK,
META_KEYBINDING_ACTION_ACTIVATE_WINDOW_MENU,
META_KEYBINDING_ACTION_TOGGLE_FULLSCREEN,
META_KEYBINDING_ACTION_TOGGLE_MAXIMIZED,
META_KEYBINDING_ACTION_TOGGLE_ABOVE,
META_KEYBINDING_ACTION_MAXIMIZE,
META_KEYBINDING_ACTION_UNMAXIMIZE,
META_KEYBINDING_ACTION_TOGGLE_SHADED,
META_KEYBINDING_ACTION_MINIMIZE,
META_KEYBINDING_ACTION_CLOSE,
META_KEYBINDING_ACTION_BEGIN_MOVE,
META_KEYBINDING_ACTION_BEGIN_RESIZE,
META_KEYBINDING_ACTION_TOGGLE_ON_ALL_WORKSPACES,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_1,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_2,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_3,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_4,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_5,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_6,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_7,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_8,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_9,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_10,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_11,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_12,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_LEFT,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_RIGHT,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_UP,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN,
META_KEYBINDING_ACTION_RAISE_OR_LOWER,
META_KEYBINDING_ACTION_RAISE,
META_KEYBINDING_ACTION_LOWER,