Index: settings-dialogs/frap-shortcuts.c =================================================================== --- settings-dialogs/frap-shortcuts.c (revision 28516) +++ settings-dialogs/frap-shortcuts.c (working copy) @@ -93,6 +93,7 @@ return GTK_RESPONSE_ACCEPT; title = g_strdup_printf (_("Conflicting actions for %s"), shortcut); + primary_text = NULL; for (i = 0; conflict_messages[i].message != NULL; ++i) if (g_utf8_collate (conflict_messages[i].owner_name, owner) == 0 && Index: themes/Makefile.am =================================================================== --- themes/Makefile.am (revision 28516) +++ themes/Makefile.am (working copy) @@ -4,7 +4,6 @@ SUBDIRS = \ daloa \ default \ - default.keys \ default-4.0 \ default-4.2 \ default-4.4 \ Index: src/keyboard.c =================================================================== --- src/keyboard.c (revision 28516) +++ src/keyboard.c (working copy) @@ -27,12 +27,29 @@ #include #include +#include #include #include #include #include #include "keyboard.h" +#define MODIFIER_MASK (GDK_SHIFT_MASK | \ + GDK_CONTROL_MASK | \ + GDK_MOD1_MASK | \ + GDK_MOD2_MASK | \ + GDK_MOD3_MASK | \ + GDK_MOD4_MASK | \ + GDK_MOD5_MASK) + +#define IGNORE_MASK (0x2000 | \ + GDK_LOCK_MASK | \ + GDK_HYPER_MASK | \ + GDK_SUPER_MASK | \ + GDK_META_MASK | \ + NumLockMask | \ + ScrollLockMask) + unsigned int AltMask; unsigned int MetaMask; unsigned int NumLockMask; @@ -40,92 +57,43 @@ unsigned int SuperMask; unsigned int HyperMask; -static gboolean -getKeycode (Display *dpy, const char *str, KeyCode *keycode) +static KeyCode +getKeycode (Display *dpy, const char *str) { - unsigned int value; - KeySym keysym; + GdkModifierType keysym; - keysym = XStringToKeysym (str); - if (keysym == NoSymbol) - { - if (sscanf (str, "0x%X", (unsigned int *) &value) != 1) - { - *keycode = 0; - return FALSE; - } - *keycode = (KeyCode) value; - } - else - { - *keycode = XKeysymToKeycode (dpy, keysym); - } - return TRUE; + gtk_accelerator_parse (str, &keysym, NULL); + return XKeysymToKeycode (dpy, keysym); } -int +guint getModifierMap (const char *str) { - gchar *tmp; - int map; + guint map; - tmp = g_ascii_strdown ((gchar *) str, strlen (str)); - map = 0; + gtk_accelerator_parse (str, NULL, &map); - if (strstr (tmp, "shift")) + if ((map & GDK_SUPER_MASK) == GDK_SUPER_MASK) { - map |= ShiftMask; - } - if (strstr (tmp, "control")) - { - map |= ControlMask; - } - if (strstr (tmp, "alt")) - { - map |= AltMask; - } - if (strstr (tmp, "meta")) - { - map |= MetaMask; - } - if (strstr (tmp, "super")) - { map |= SuperMask; } - if (strstr (tmp, "hyper")) + + if ((map & GDK_HYPER_MASK) == GDK_HYPER_MASK) { map |= HyperMask; } - if (strstr (tmp, "mod1")) + + if ((map & GDK_META_MASK) == GDK_META_MASK) { - map |= Mod1Mask; + map |= MetaMask; } - if (strstr (tmp, "mod2")) - { - map |= Mod2Mask; - } - if (strstr (tmp, "mod3")) - { - map |= Mod3Mask; - } - if (strstr (tmp, "mod4")) - { - map |= Mod4Mask; - } - if (strstr (tmp, "mod5")) - { - map |= Mod5Mask; - } - g_free (tmp); - return map; + return map & MODIFIER_MASK & ~IGNORE_MASK; } void parseKeyString (Display * dpy, MyKey * key, const char *str) { - char *k; - g_return_if_fail (key != NULL); TRACE ("entering parseKeyString"); @@ -134,25 +102,20 @@ key->keycode = 0; key->modifier = 0; - g_return_if_fail (str != NULL); - - if (!g_ascii_strcasecmp (str, "none")) + if (str == NULL) { return; } - k = strrchr (str, '+'); - if (k) + if (!g_ascii_strcasecmp (str, "none")) { - /* There is a modifier */ - getKeycode (dpy, ++k, &key->keycode); - key->modifier = getModifierMap (str); + return; } - else - { - getKeycode (dpy, str, &key->keycode); - key->modifier = 0; - } + + key->keycode = getKeycode (dpy, str); + key->modifier = getModifierMap (str); + + TRACE ("keycode = 0x%x, modifier = 0x%x", key->keycode, key->modifier); } gboolean Index: src/keyboard.h =================================================================== --- src/keyboard.h (revision 28516) +++ src/keyboard.h (working copy) @@ -35,6 +35,7 @@ { KeyCode keycode; int modifier; + gchar *internal_name; }; extern unsigned int AltMask; @@ -44,7 +45,7 @@ extern unsigned int SuperMask; extern unsigned int HyperMask; -int getModifierMap (const char *); +guint getModifierMap (const char *); void parseKeyString (Display *, MyKey *, const char *); Index: src/settings.c =================================================================== --- src/settings.c (revision 28516) +++ src/settings.c (working copy) @@ -31,6 +31,7 @@ #include #include #include +#include #include "screen.h" #include "hints.h" @@ -41,13 +42,8 @@ #include "compositor.h" #include "ui_style.h" -#define CHANNEL1 "xfwm4" -#define CHANNEL2 "xfwm4_keys" - -#define DEFAULT_KEYTHEME "Default" -#define KEYTHEMERC "keythemerc" +#define CHANNEL_XFWM "xfwm4" #define THEMERC "themerc" - #define XPM_COLOR_SYMBOL_SIZE 22 #define XFWM4_SETTINGS_COUNT 66 @@ -61,16 +57,30 @@ Settings *); static void loadTheme (ScreenInfo *, Settings *); -static gboolean loadKeyBindings (ScreenInfo *, - Settings *); +static void loadKeyBindings (ScreenInfo *); static void unloadTheme (ScreenInfo *); +static void unloadKeyBindings (ScreenInfo *); static void unloadSettings (ScreenInfo *); static gboolean reloadScreenSettings (ScreenInfo *, int); +static void parseShortcut (ScreenInfo *, + int, + const gchar *, + GList *); +static const gchar *getShortcut (const gchar *, + GList *); static void cb_xfwm4_channel_property_changed (XfconfChannel *, const gchar *, const GValue *, ScreenInfo *); +static void cb_keys_changed (GdkKeymap *, + ScreenInfo *); +static void cb_shortcut_added (XfceShortcutsProvider *, + const gchar *, + ScreenInfo *); +static void cb_shortcut_removed (XfceShortcutsProvider *, + const gchar *, + ScreenInfo *); static void update_grabs (ScreenInfo *screen_info) @@ -129,6 +139,8 @@ static void set_easy_click (ScreenInfo *screen_info, const char *modifier) { + gchar *modstr; + g_return_if_fail (screen_info != NULL); g_return_if_fail (modifier != NULL); @@ -138,7 +150,9 @@ } else { - screen_info->params->easy_click = getModifierMap (modifier); + modstr = g_strdup_printf ("<%s>", modifier); + screen_info->params->easy_click = getModifierMap (modstr); + g_free (modstr); } } @@ -182,30 +196,12 @@ loadRcData (ScreenInfo *screen_info, Settings *rc) { gchar *homedir; - const gchar *keythemevalue; - gchar *keytheme; - gchar *system_keytheme; if (!parseRc ("defaults", PACKAGE_DATADIR, rc)) { g_warning ("Missing defaults file"); exit (1); } - keythemevalue = getStringValue ("keytheme", rc); - if (keythemevalue) - { - system_keytheme = getSystemThemeDir (); - parseRc (KEYTHEMERC, system_keytheme, rc); - - keytheme = getThemeDir (keythemevalue, KEYTHEMERC); - if (keytheme) - { - /* If there is a custom key theme, merge it with system defaults */ - parseRc (KEYTHEMERC, keytheme, rc); - g_free (keytheme); - } - g_free (system_keytheme); - } homedir = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, "xfce4" G_DIR_SEPARATOR_S "xfwm4", FALSE); @@ -535,96 +531,74 @@ g_free (theme); } -static gboolean -loadKeyBindings (ScreenInfo *screen_info, Settings *rc) +static void +loadKeyBindings (ScreenInfo *screen_info) { + GList *shortcuts; gchar keyname[30]; Display *dpy; - gchar *keytheme; - const gchar *keythemevalue; guint i; dpy = myScreenGetXDisplay (screen_info); - /* - Load defaults keytheme so that even if there are - missing shortcuts in an older user defined key theme - the missing keys will be taken from the default - */ - keytheme = getThemeDir (DEFAULT_KEYTHEME, KEYTHEMERC); - parseRc (KEYTHEMERC, keytheme, rc); - g_free (keytheme); - keythemevalue = getStringValue ("keytheme", rc); - if (keythemevalue) - { - keytheme = getThemeDir (keythemevalue, KEYTHEMERC); - if (!parseRc (KEYTHEMERC, keytheme, rc)) - { - g_warning ("Specified key theme \"%s\" missing, using default", keythemevalue); - } - g_free (keytheme); + shortcuts = xfce_shortcuts_provider_get_shortcuts (screen_info->shortcuts_provider); - if (!checkRc (rc)) - { - g_warning ("Missing values in defaults file"); - return FALSE; - } - } + parseShortcut (screen_info, KEY_CANCEL, "cancel_key", shortcuts); + parseShortcut (screen_info, KEY_DOWN, "down_key", shortcuts); + parseShortcut (screen_info, KEY_LEFT, "left_key", shortcuts); + parseShortcut (screen_info, KEY_RIGHT, "right_key", shortcuts); + parseShortcut (screen_info, KEY_UP, "up_key", shortcuts); + parseShortcut (screen_info, KEY_ADD_WORKSPACE, "add_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_ADD_ADJACENT_WORKSPACE, "add_adjacent_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_CLOSE_WINDOW, "close_window_key", shortcuts); + parseShortcut (screen_info, KEY_CYCLE_WINDOWS, "cycle_windows_key", shortcuts); + parseShortcut (screen_info, KEY_DEL_WORKSPACE, "del_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_DEL_ACTIVE_WORKSPACE, "del_active_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_DOWN_WORKSPACE, "down_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_FILL_HORIZ, "fill_horiz_key", shortcuts); + parseShortcut (screen_info, KEY_FILL_VERT, "fill_vert_key", shortcuts); + parseShortcut (screen_info, KEY_FILL_WINDOW, "fill_window_key", shortcuts); + parseShortcut (screen_info, KEY_HIDE_WINDOW, "hide_window_key", shortcuts); + parseShortcut (screen_info, KEY_LEFT_WORKSPACE, "left_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_LOWER_WINDOW, "lower_window_key", shortcuts); + parseShortcut (screen_info, KEY_MOVE, "move_window_key", shortcuts); + parseShortcut (screen_info, KEY_MAXIMIZE_HORIZ, "maximize_horiz_key", shortcuts); + parseShortcut (screen_info, KEY_MAXIMIZE_VERT, "maximize_vert_key", shortcuts); + parseShortcut (screen_info, KEY_MAXIMIZE_WINDOW, "maximize_window_key", shortcuts); + parseShortcut (screen_info, KEY_MOVE_DOWN_WORKSPACE, "move_window_down_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_MOVE_LEFT_WORKSPACE, "move_window_left_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_MOVE_NEXT_WORKSPACE, "move_window_next_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_MOVE_PREV_WORKSPACE, "move_window_prev_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_MOVE_RIGHT_WORKSPACE, "move_window_right_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_MOVE_UP_WORKSPACE, "move_window_up_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_NEXT_WORKSPACE, "next_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_POPUP_MENU, "popup_menu_key", shortcuts); + parseShortcut (screen_info, KEY_PREV_WORKSPACE, "prev_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_RAISE_WINDOW, "raise_window_key", shortcuts); + parseShortcut (screen_info, KEY_RESIZE, "resize_window_key", shortcuts); + parseShortcut (screen_info, KEY_RIGHT_WORKSPACE, "right_workspace_key", shortcuts); + parseShortcut (screen_info, KEY_SHADE_WINDOW, "shade_window_key", shortcuts); + parseShortcut (screen_info, KEY_SHOW_DESKTOP, "show_desktop_key", shortcuts); + parseShortcut (screen_info, KEY_STICK_WINDOW, "stick_window_key", shortcuts); + parseShortcut (screen_info, KEY_TOGGLE_ABOVE, "above_key", shortcuts); + parseShortcut (screen_info, KEY_TOGGLE_FULLSCREEN, "fullscreen_key", shortcuts); + parseShortcut (screen_info, KEY_UP_WORKSPACE, "up_workspace_key", shortcuts); - parseKeyString (dpy, &screen_info->params->keys[KEY_CANCEL], getStringValue ("cancel_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_DOWN], getStringValue ("down_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_LEFT], getStringValue ("left_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_RIGHT], getStringValue ("right_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_UP], getStringValue ("up_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_ADD_WORKSPACE], getStringValue ("add_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_ADD_ADJACENT_WORKSPACE], getStringValue ("add_adjacent_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_CLOSE_WINDOW], getStringValue ("close_window_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_CYCLE_WINDOWS], getStringValue ("cycle_windows_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_DEL_WORKSPACE], getStringValue ("del_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_DEL_ACTIVE_WORKSPACE], getStringValue ("del_active_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_DOWN_WORKSPACE], getStringValue ("down_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_FILL_HORIZ], getStringValue ("fill_horiz_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_FILL_VERT], getStringValue ("fill_vert_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_FILL_WINDOW], getStringValue ("fill_window_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_HIDE_WINDOW], getStringValue ("hide_window_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_LEFT_WORKSPACE], getStringValue ("left_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_LOWER_WINDOW], getStringValue ("lower_window_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE], getStringValue ("move_window_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_MAXIMIZE_HORIZ], getStringValue ("maximize_horiz_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_MAXIMIZE_VERT], getStringValue ("maximize_vert_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_MAXIMIZE_WINDOW], getStringValue ("maximize_window_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_DOWN_WORKSPACE], getStringValue ("move_window_down_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_LEFT_WORKSPACE], getStringValue ("move_window_left_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_NEXT_WORKSPACE], getStringValue ("move_window_next_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_PREV_WORKSPACE], getStringValue ("move_window_prev_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_RIGHT_WORKSPACE], getStringValue ("move_window_right_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_UP_WORKSPACE], getStringValue ("move_window_up_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_NEXT_WORKSPACE], getStringValue ("next_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_POPUP_MENU], getStringValue ("popup_menu_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_PREV_WORKSPACE], getStringValue ("prev_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_RAISE_WINDOW], getStringValue ("raise_window_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_RESIZE], getStringValue ("resize_window_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_RIGHT_WORKSPACE], getStringValue ("right_workspace_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_SHADE_WINDOW], getStringValue ("shade_window_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_SHOW_DESKTOP], getStringValue("show_desktop_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_STICK_WINDOW], getStringValue ("stick_window_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_TOGGLE_ABOVE], getStringValue ("above_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_TOGGLE_FULLSCREEN], getStringValue ("fullscreen_key", rc)); - parseKeyString (dpy, &screen_info->params->keys[KEY_UP_WORKSPACE], getStringValue ("up_workspace_key", rc)); - for (i = 0; i < 12; i++) { g_snprintf(keyname, sizeof (keyname), "move_window_workspace_%d_key", i + 1); - parseKeyString (dpy, &screen_info->params->keys[KEY_MOVE_WORKSPACE_1 + i], getStringValue (keyname, rc)); + parseShortcut (screen_info, KEY_MOVE_WORKSPACE_1 + i, keyname, shortcuts); g_snprintf(keyname, sizeof (keyname), "workspace_%d_key", i + 1); - parseKeyString (dpy, &screen_info->params->keys[KEY_WORKSPACE_1 + i], getStringValue (keyname, rc)); + parseShortcut (screen_info, KEY_WORKSPACE_1 + i, keyname, shortcuts); } + xfce_shortcuts_free (shortcuts); + myScreenUngrabKeys (screen_info); myScreenGrabKeys (screen_info); - return TRUE; + return; } gboolean @@ -677,7 +651,6 @@ {"frame_opacity", NULL, G_TYPE_INT, TRUE}, {"full_width_title", NULL, G_TYPE_BOOLEAN, TRUE}, {"inactive_opacity", NULL, G_TYPE_INT, TRUE}, - {"keytheme", NULL, G_TYPE_STRING, TRUE}, {"margin_bottom", NULL, G_TYPE_INT, FALSE}, {"margin_left", NULL, G_TYPE_INT, FALSE}, {"margin_right", NULL, G_TYPE_INT, FALSE}, @@ -802,11 +775,7 @@ loadTheme (screen_info, rc); update_grabs (screen_info); - if (!loadKeyBindings (screen_info, rc)) - { - freeRc (rc); - return FALSE; - } + loadKeyBindings (screen_info); screen_info->params->borderless_maximize = getBoolValue ("borderless_maximize", rc); @@ -978,7 +947,21 @@ } } + static void +unloadKeyBindings (ScreenInfo *screen_info) +{ + int i; + + g_return_if_fail (screen_info); + + for (i = 0; i < KEY_COUNT; ++i) + { + g_free (screen_info->params->keys[i].internal_name); + } +} + +static void unloadSettings (ScreenInfo *screen_info) { g_return_if_fail (screen_info); @@ -986,6 +969,7 @@ TRACE ("entering unloadSettings"); unloadTheme (screen_info); + unloadKeyBindings (screen_info); } static gboolean @@ -1035,6 +1019,7 @@ gboolean initSettings (ScreenInfo *screen_info) { + GdkKeymap *keymap; DisplayInfo *display_info; char **names; long val; @@ -1050,17 +1035,24 @@ return FALSE; } - display_info = screen_info->display_info; names = NULL; val = 0; i = 0; - screen_info->xfwm4_channel = xfconf_channel_new(CHANNEL1); - screen_info->keys_channel = xfconf_channel_new(CHANNEL2); + screen_info->xfwm4_channel = xfconf_channel_new(CHANNEL_XFWM); + g_signal_connect (screen_info->xfwm4_channel, "property-changed", + G_CALLBACK (cb_xfwm4_channel_property_changed), screen_info); - g_signal_connect (G_OBJECT(screen_info->xfwm4_channel), "property-changed", (GCallback)cb_xfwm4_channel_property_changed, screen_info); + keymap = gdk_keymap_get_default (); + g_signal_connect (keymap, "keys-changed", + G_CALLBACK (cb_keys_changed), screen_info); + screen_info->shortcuts_provider = xfce_shortcuts_provider_new ("xfwm4"); + g_signal_connect (screen_info->shortcuts_provider, "shortcut-added", + G_CALLBACK (cb_shortcut_added), screen_info); + g_signal_connect (screen_info->shortcuts_provider, "shortcut-removed", + G_CALLBACK (cb_shortcut_removed), screen_info); if (!loadSettings (screen_info)) { @@ -1128,12 +1120,8 @@ { reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE); } - else if (!strcmp (name, "keytheme")) + else if (!strcmp (name, "easy_click")) { - reloadScreenSettings (screen_info, NO_UPDATE_FLAG); - } - else if (!strcmp (name, "easy_click")) - { reloadScreenSettings (screen_info, UPDATE_BUTTON_GRABS); } else if (!strcmp (name, "activate_action")) @@ -1360,3 +1348,115 @@ } } } + +static void +cb_keys_changed (GdkKeymap *keymap, ScreenInfo *screen_info) +{ + initModifiers (myScreenGetXDisplay (screen_info)); + reloadSettings (screen_info->display_info, UPDATE_BUTTON_GRABS); +} + +static void +cb_shortcut_added (XfceShortcutsProvider *provider, const gchar *shortcut, + ScreenInfo *screen_info) +{ + XfceShortcut *sc; + Display *dpy; + int i; + + g_return_if_fail (XFCE_IS_SHORTCUTS_PROVIDER (provider)); + g_return_if_fail (shortcut); + g_return_if_fail (screen_info); + + sc = xfce_shortcuts_provider_get_shortcut (provider, shortcut); + + if (sc == NULL) + { + return; + } + + dpy = myScreenGetXDisplay (screen_info); + + for (i = 0; i < KEY_COUNT; ++i) + { + if (g_str_equal (screen_info->params->keys[i].internal_name, sc->command)) + { + parseKeyString (dpy, &screen_info->params->keys[i], shortcut); + + myScreenUngrabKeys (screen_info); + myScreenGrabKeys (screen_info); + break; + } + } + + xfce_shortcut_free (sc); +} + +static void +cb_shortcut_removed (XfceShortcutsProvider *provider, const gchar *shortcut, + ScreenInfo *screen_info) +{ + MyKey key; + Display *dpy; + int i; + + g_return_if_fail (XFCE_IS_SHORTCUTS_PROVIDER (provider)); + g_return_if_fail (screen_info); + g_return_if_fail (shortcut); + + dpy = myScreenGetXDisplay (screen_info); + + parseKeyString (dpy, &key, shortcut); + + for (i = 0; i < KEY_COUNT; ++i) + { + if (screen_info->params->keys[i].keycode == key.keycode && + screen_info->params->keys[i].modifier == key.modifier) + { + screen_info->params->keys[i].keycode = 0; + screen_info->params->keys[i].modifier = 0; + + myScreenUngrabKeys (screen_info); + myScreenGrabKeys (screen_info); + break; + } + } +} + +static void +parseShortcut (ScreenInfo *screen_info, int index, const gchar *name, + GList *shortcuts) +{ + Display *dpy; + const gchar *shortcut; + + g_return_if_fail (screen_info); + g_return_if_fail (index >= 0 && index < KEY_COUNT); + + dpy = myScreenGetXDisplay (screen_info); + shortcut = getShortcut (name, shortcuts); + parseKeyString (dpy, &screen_info->params->keys[index], shortcut); + + screen_info->params->keys[index].internal_name = g_strdup (name); +} + +static const gchar * +getShortcut (const gchar *name, GList *shortcuts) +{ + XfceShortcut *shortcut; + GList *iter; + const gchar *result = NULL; + + for (iter = shortcuts; iter != NULL; iter = g_list_next (iter)) + { + shortcut = iter->data; + + if (g_str_equal (shortcut->command, name)) + { + result = shortcut->shortcut; + break; + } + } + + return result; +} Index: src/events.c =================================================================== --- src/events.c (revision 28522) +++ src/events.c (working copy) @@ -2215,31 +2215,6 @@ } static eventFilterStatus -handleMappingNotify (DisplayInfo *display_info, XMappingEvent * ev) -{ - TRACE ("entering handleMappingNotify"); - - /* Refreshes the stored modifier and keymap information */ - XRefreshKeyboardMapping (ev); - - /* Update internal modifiers masks if necessary */ - if (ev->request == MappingModifier) - { - TRACE ("handleMappingNotify: modifiers mapping has changed"); - initModifiers (display_info->dpy); - } - - /* Regrab all keys if the notify is for keyboard (ie not pointer) */ - if (ev->request != MappingPointer) - { - TRACE ("handleMappingNotify: Reload settings"); - reloadSettings (display_info, UPDATE_BUTTON_GRABS); - } - - return EVENT_FILTER_PASS; -} - -static eventFilterStatus handleReparentNotify (DisplayInfo *display_info, XReparentEvent * ev) { TRACE ("entering handleReparentNotify, 0x%lx reparented in 0x%lx", ev->window, ev->parent); @@ -2341,9 +2316,6 @@ case ColormapNotify: handleColormapNotify (display_info, (XColormapEvent *) ev); break; - case MappingNotify: - status = handleMappingNotify (display_info, (XMappingEvent *) ev); - break; case ReparentNotify: status = handleReparentNotify (display_info, (XReparentEvent *) ev); break; Index: src/event_filter.c =================================================================== --- src/event_filter.c (revision 28516) +++ src/event_filter.c (working copy) @@ -127,9 +127,6 @@ case ColormapNotify: TRACE ("Unhandled ColormapNotify event"); break; - case MappingNotify: - TRACE ("Unhandled MappingNotify event"); - break; default: TRACE ("Unhandled Unknown event"); break; Index: src/screen.h =================================================================== --- src/screen.h (revision 28516) +++ src/screen.h (working copy) @@ -30,7 +30,9 @@ #include #include #include +#include + #ifdef HAVE_LIBSTARTUP_NOTIFICATION #define SN_API_NOT_YET_FROZEN #include @@ -117,8 +119,10 @@ /* xfconf */ XfconfChannel *xfwm4_channel; - XfconfChannel *keys_channel; + /* Shortcuts */ + XfceShortcutsProvider *shortcuts_provider; + /* Per screen parameters */ XfwmParams *params; Index: src/Makefile.am =================================================================== --- src/Makefile.am (revision 28516) +++ src/Makefile.am (working copy) @@ -81,6 +81,7 @@ $(LIBXFCONF_CFLAGS) \ $(LIBXFCE4UTIL_CFLAGS) \ $(LIBXFCEGUI4_CFLAGS) \ + $(LIBXFCE4KBD_PRIVATE_CFLAGS) \ $(RENDER_CFLAGS) \ $(LIBSTARTUP_NOTIFICATION_CFLAGS) \ $(COMPOSITOR_CFLAGS) \ @@ -98,6 +99,7 @@ $(LIBXFCONF_LIBS) \ $(LIBXFCE4UTIL_LIBS) \ $(LIBXFCEGUI4_LIBS) \ + $(LIBXFCE4KBD_PRIVATE_LIBS) \ $(LIBSTARTUP_NOTIFICATION_LIBS) \ $(RENDER_LIBS) \ $(COMPOSITOR_LIBS) \ Index: defaults/defaults =================================================================== --- defaults/defaults (revision 28516) +++ defaults/defaults (working copy) @@ -19,7 +19,6 @@ frame_opacity=100 full_width_title=true inactive_opacity=100 -keytheme=Default maximized_offset=0 move_opacity=100 placement_mode=center Index: configure.ac.in =================================================================== --- configure.ac.in (revision 28516) +++ configure.ac.in (working copy) @@ -12,7 +12,8 @@ m4_define([gtk_minimum_version], [2.10.0]) m4_define([xfce_minimum_version], [4.5.91]) -m4_define([libxfcegui4_minimum_version], [4.5.91svn-r28280]) +m4_define([libxfcegui4_minimum_version], [4.5.91svn-r28487]) +m4_define([libxfce4kbd_private_minimum_version], [4.5.91svn-r28487]) m4_define([xfconf_minimum_version], [4.5.91]) m4_define([xcomposite_minimum_version], [0.2]) m4_define([wnck_minimum_version], [2.12]) @@ -73,6 +74,7 @@ XDT_CHECK_PACKAGE([GLADE], [libglade-2.0], [2.0.0]) XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [xfce_minimum_version]) XDT_CHECK_PACKAGE([LIBXFCEGUI4], libxfcegui4-1.0, [libxfcegui4_minimum_version]) +XDT_CHECK_PACKAGE([LIBXFCE4KBD_PRIVATE], libxfce4kbd-private-1.0, [libxfce4kbd_private_minimum_version]) XDT_CHECK_PACKAGE([LIBXFCONF], libxfconf-0, [xfconf_minimum_version]) XDT_CHECK_PACKAGE([LIBWNCK], [libwnck-1.0], [wnck_minimum_version]) XDT_CHECK_PACKAGE([DBUS], [dbus-1], [1.0.0]) @@ -226,7 +228,6 @@ themes/Makefile themes/daloa/Makefile themes/default/Makefile -themes/default.keys/Makefile themes/default-4.0/Makefile themes/default-4.2/Makefile themes/default-4.4/Makefile