[gnome-settings-daemon] media-keys: Pass appropriate GrabModes to grab_accelerator()



commit 1c9ded7b9dad1e5b5b6f62b2e78c221e99dc5eb1
Author: Florian Müllner <fmuellner gnome org>
Date:   Mon Dec 3 00:04:46 2012 +0100

    media-keys: Pass appropriate GrabModes to grab_accelerator()
    
    Not every keybinding is useful at any moment, for instance it does
    not make sense to launch the calculator from the lock screen. The
    shell API allows to enable keybindings selectively, make use of that
    by passing appropriate mode flags for each keybinding.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=693016

 plugins/media-keys/Makefile.am              |    1 +
 plugins/media-keys/gsd-media-keys-manager.c |    7 +-
 plugins/media-keys/shell-keybinding-modes.h |   35 ++++++++
 plugins/media-keys/shortcuts-list.h         |  124 ++++++++++++++-------------
 4 files changed, 107 insertions(+), 60 deletions(-)
---
diff --git a/plugins/media-keys/Makefile.am b/plugins/media-keys/Makefile.am
index 62a5a55..a8d70ad 100644
--- a/plugins/media-keys/Makefile.am
+++ b/plugins/media-keys/Makefile.am
@@ -38,6 +38,7 @@ libmedia_keys_la_SOURCES =            \
        gsd-screenshot-utils.h          \
        gsd-screenshot-utils.c          \
        shortcuts-list.h                \
+       shell-keybinding-modes.h        \
        $(BUILT_SOURCES)                \
        $(NULL)
 
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
index 28a9f6d..22147db 100644
--- a/plugins/media-keys/gsd-media-keys-manager.c
+++ b/plugins/media-keys/gsd-media-keys-manager.c
@@ -124,6 +124,7 @@ typedef struct {
 
 typedef struct {
         MediaKeyType key_type;
+        ShellKeyBindingMode modes;
         const char *settings_key;
         const char *hard_coded;
         char *custom_path;
@@ -443,7 +444,7 @@ grab_media_keys (GsdMediaKeysManager *manager)
 
                 key = g_ptr_array_index (manager->priv->keys, i);
                 tmp = get_key_string (manager, key);
-                g_variant_builder_add (&builder, "(su)", tmp, ~0);
+                g_variant_builder_add (&builder, "(su)", tmp, key->modes);
                 g_free (tmp);
         }
 
@@ -487,7 +488,7 @@ grab_media_key (MediaKey            *key,
 
        ensure_grab_cancellable (manager);
        shell_key_grabber_call_grab_accelerator (manager->priv->key_grabber,
-                                                tmp, ~0,
+                                                tmp, key->modes,
                                                 manager->priv->grab_cancellable,
                                                 grab_accelerator_complete,
                                                 data);
@@ -582,6 +583,7 @@ media_key_new_for_path (GsdMediaKeysManager *manager,
 
         key = g_new0 (MediaKey, 1);
         key->key_type = CUSTOM_KEY;
+        key->modes = GSD_KEYBINDING_MODE_LAUNCHER;
         key->custom_path = g_strdup (path);
         key->custom_command = command;
 
@@ -684,6 +686,7 @@ add_key (GsdMediaKeysManager *manager, guint i)
        key->key_type = media_keys[i].key_type;
        key->settings_key = media_keys[i].settings_key;
        key->hard_coded = media_keys[i].hard_coded;
+       key->modes = media_keys[i].modes;
 
        g_ptr_array_add (manager->priv->keys, key);
 }
diff --git a/plugins/media-keys/shell-keybinding-modes.h b/plugins/media-keys/shell-keybinding-modes.h
new file mode 100644
index 0000000..e02429a
--- /dev/null
+++ b/plugins/media-keys/shell-keybinding-modes.h
@@ -0,0 +1,35 @@
+/**
+ * ShellKeyBindingMode:
+ * @SHELL_KEYBINDING_MODE_NONE: block keybinding
+ * @SHELL_KEYBINDING_MODE_NORMAL: allow keybinding when in window mode,
+ *     e.g. when the focus is in an application window
+ * @SHELL_KEYBINDING_MODE_OVERVIEW: allow keybinding while the overview
+ *     is active
+ * @SHELL_KEYBINDING_MODE_LOCK_SCREEN: allow keybinding when the screen
+ *     is locked, e.g. when the screen shield is shown
+ * @SHELL_KEYBINDING_MODE_UNLOCK_SCREEN: allow keybinding in the unlock
+ *     dialog
+ * @SHELL_KEYBINDING_MODE_LOGIN_SCREEN: allow keybinding in the login screen
+ * @SHELL_KEYBINDING_MODE_MESSAGE_TRAY: allow keybinding while the message
+ *     tray is popped up
+ * @SHELL_KEYBINDING_MODE_SYSTEM_MODAL: allow keybinding when a system modal
+ *     dialog (e.g. authentification or session dialogs) is open
+ * @SHELL_KEYBINDING_MODE_LOOKING_GLASS: allow keybinding in looking glass
+ * @SHELL_KEYBINDING_MODE_ALL: always allow keybinding
+ *
+ * Controls in which GNOME Shell states a keybinding should be handled.
+*/
+typedef enum {
+  SHELL_KEYBINDING_MODE_NONE          = 0,
+  SHELL_KEYBINDING_MODE_NORMAL        = 1 << 0,
+  SHELL_KEYBINDING_MODE_OVERVIEW      = 1 << 1,
+  SHELL_KEYBINDING_MODE_LOCK_SCREEN   = 1 << 2,
+  SHELL_KEYBINDING_MODE_UNLOCK_SCREEN = 1 << 3,
+  SHELL_KEYBINDING_MODE_LOGIN_SCREEN  = 1 << 4,
+  SHELL_KEYBINDING_MODE_MESSAGE_TRAY  = 1 << 5,
+  SHELL_KEYBINDING_MODE_SYSTEM_MODAL  = 1 << 6,
+  SHELL_KEYBINDING_MODE_LOOKING_GLASS = 1 << 7,
+
+  SHELL_KEYBINDING_MODE_ALL = ~SHELL_KEYBINDING_MODE_NONE
+} ShellKeyBindingMode;
+
diff --git a/plugins/media-keys/shortcuts-list.h b/plugins/media-keys/shortcuts-list.h
index cfced5b..22cf75c 100644
--- a/plugins/media-keys/shortcuts-list.h
+++ b/plugins/media-keys/shortcuts-list.h
@@ -21,7 +21,7 @@
 #ifndef __ACME_H__
 #define __ACME_H__
 
-#include "gsd-keygrab.h"
+#include "shell-keybinding-modes.h"
 
 #define SETTINGS_BINDING_DIR "org.gnome.settings-daemon.plugins.media-keys"
 
@@ -84,72 +84,80 @@ typedef enum {
         CUSTOM_KEY
 } MediaKeyType;
 
+
+#define GSD_KEYBINDING_MODE_LAUNCHER (SHELL_KEYBINDING_MODE_NORMAL | \
+                                      SHELL_KEYBINDING_MODE_OVERVIEW)
+#define SCREENSAVER_MODE SHELL_KEYBINDING_MODE_ALL & ~SHELL_KEYBINDING_MODE_UNLOCK_SCREEN
+
 static struct {
         MediaKeyType key_type;
         const char *settings_key;
         const char *key_name;
         const char *hard_coded;
+        ShellKeyBindingMode modes;
 } media_keys[] = {
-        { TOUCHPAD_KEY, NULL, N_("Touchpad toggle"), "XF86TouchpadToggle" },
-        { TOUCHPAD_ON_KEY, NULL, N_("Touchpad On"), "XF86TouchpadOn" },
-        { TOUCHPAD_OFF_KEY, NULL, N_("Touchpad Off"), "XF86TouchpadOff" },
-        { MUTE_KEY, "volume-mute", NULL, NULL },
-        { VOLUME_DOWN_KEY, "volume-down", NULL, NULL },
-        { VOLUME_UP_KEY, "volume-up", NULL, NULL },
-        { MIC_MUTE_KEY, NULL, N_("Microphone Mute"), "F20" },
-        { MUTE_QUIET_KEY, NULL, N_("Quiet Volume Mute"), "<Alt>XF86AudioMute" },
-        { VOLUME_DOWN_QUIET_KEY, NULL, N_("Quiet Volume Down"), "<Alt>XF86AudioLowerVolume" },
-        { VOLUME_UP_QUIET_KEY, NULL, N_("Quiet Volume Up"), "<Alt>XF86AudioRaiseVolume" },
-        { LOGOUT_KEY, "logout", NULL },
-        { EJECT_KEY, "eject", NULL },
-        { HOME_KEY, "home", NULL },
-        { MEDIA_KEY, "media", NULL },
-        { CALCULATOR_KEY, "calculator", NULL },
-        { SEARCH_KEY, "search", NULL },
-        { EMAIL_KEY, "email", NULL },
-        { SCREENSAVER_KEY, "screensaver", NULL },
-        { SCREENSAVER_KEY, NULL, N_("Lock Screen"), "XF86ScreenSaver" },
-        { HELP_KEY, "help", NULL },
-        { SCREENSHOT_KEY, "screenshot", NULL },
-        { WINDOW_SCREENSHOT_KEY, "window-screenshot", NULL },
-        { AREA_SCREENSHOT_KEY, "area-screenshot", NULL },
-        { SCREENSHOT_CLIP_KEY, "screenshot-clip", NULL },
-        { WINDOW_SCREENSHOT_CLIP_KEY, "window-screenshot-clip", NULL },
-        { AREA_SCREENSHOT_CLIP_KEY, "area-screenshot-clip", NULL },
-        { WWW_KEY, "www", NULL },
-        { PLAY_KEY, "play", NULL },
-        { PAUSE_KEY, "pause", NULL },
-        { STOP_KEY, "stop", NULL },
-        { PREVIOUS_KEY, "previous", NULL },
-        { NEXT_KEY, "next", NULL },
-        { REWIND_KEY, NULL, N_("Rewind"), "XF86AudioRewind" },
-        { FORWARD_KEY, NULL, N_("Forward"), "XF86AudioForward" },
-        { REPEAT_KEY, NULL, N_("Repeat"), "XF86AudioRepeat" },
-        { RANDOM_KEY, NULL, N_("Random Play"), "XF86AudioRandomPlay"},
-        { VIDEO_OUT_KEY, NULL, N_("Video Out"), "<Super>p" },
+        { TOUCHPAD_KEY, NULL, N_("Touchpad toggle") ,"XF86TouchpadToggle", SHELL_KEYBINDING_MODE_ALL },
+        { TOUCHPAD_ON_KEY, NULL, N_("Touchpad On"), "XF86TouchpadOn", SHELL_KEYBINDING_MODE_ALL },
+        { TOUCHPAD_OFF_KEY, NULL, N_("Touchpad Off"), "XF86TouchpadOff", SHELL_KEYBINDING_MODE_ALL },
+        { MUTE_KEY, "volume-mute", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { VOLUME_DOWN_KEY, "volume-down", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { VOLUME_UP_KEY, "volume-up", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { MIC_MUTE_KEY, NULL, N_("Microphone Mute"), "F20", SHELL_KEYBINDING_MODE_ALL },
+        { MUTE_QUIET_KEY, NULL, N_("Quiet Volume Mute"), "<Alt>XF86AudioMute", SHELL_KEYBINDING_MODE_ALL },
+        { VOLUME_DOWN_QUIET_KEY, NULL, N_("Quiet Volume Down"), "<Alt>XF86AudioLowerVolume", 
SHELL_KEYBINDING_MODE_ALL },
+        { VOLUME_UP_QUIET_KEY, NULL, N_("Quiet Volume Up"), "<Alt>XF86AudioRaiseVolume", 
SHELL_KEYBINDING_MODE_ALL },
+        { LOGOUT_KEY, "logout", NULL, NULL, GSD_KEYBINDING_MODE_LAUNCHER },
+        { EJECT_KEY, "eject", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { HOME_KEY, "home", NULL, NULL, GSD_KEYBINDING_MODE_LAUNCHER },
+        { MEDIA_KEY, "media", NULL, NULL, GSD_KEYBINDING_MODE_LAUNCHER },
+        { CALCULATOR_KEY, "calculator", NULL, NULL, GSD_KEYBINDING_MODE_LAUNCHER },
+        { SEARCH_KEY, "search", NULL, NULL, GSD_KEYBINDING_MODE_LAUNCHER },
+        { EMAIL_KEY, "email", NULL, NULL, GSD_KEYBINDING_MODE_LAUNCHER },
+        { SCREENSAVER_KEY, "screensaver", NULL, NULL, SCREENSAVER_MODE },
+        { SCREENSAVER_KEY, NULL, N_("Lock Screen"), "XF86ScreenSaver", SCREENSAVER_MODE },
+        { HELP_KEY, "help", NULL, NULL, GSD_KEYBINDING_MODE_LAUNCHER },
+        { SCREENSHOT_KEY, "screenshot", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { WINDOW_SCREENSHOT_KEY, "window-screenshot", NULL, NULL, SHELL_KEYBINDING_MODE_NORMAL },
+        { AREA_SCREENSHOT_KEY, "area-screenshot", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { SCREENSHOT_CLIP_KEY, "screenshot-clip", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { WINDOW_SCREENSHOT_CLIP_KEY, "window-screenshot-clip", NULL, NULL, SHELL_KEYBINDING_MODE_NORMAL },
+        { AREA_SCREENSHOT_CLIP_KEY, "area-screenshot-clip", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { WWW_KEY, "www", NULL, NULL, GSD_KEYBINDING_MODE_LAUNCHER },
+        { PLAY_KEY, "play", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { PAUSE_KEY, "pause", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { STOP_KEY, "stop", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { PREVIOUS_KEY, "previous", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { NEXT_KEY, "next", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { REWIND_KEY, NULL, N_("Rewind"), "XF86AudioRewind", SHELL_KEYBINDING_MODE_ALL },
+        { FORWARD_KEY, NULL, N_("Forward"), "XF86AudioForward", SHELL_KEYBINDING_MODE_ALL },
+        { REPEAT_KEY, NULL, N_("Repeat"), "XF86AudioRepeat", SHELL_KEYBINDING_MODE_ALL },
+        { RANDOM_KEY, NULL, N_("Random Play"), "XF86AudioRandomPlay", SHELL_KEYBINDING_MODE_ALL },
+        { VIDEO_OUT_KEY, NULL, N_("Video Out"), "<Super>p", SHELL_KEYBINDING_MODE_ALL },
         /* Key code of the XF86Display key (Fn-F7 on Thinkpads, Fn-F4 on HP machines, etc.) */
-        { VIDEO_OUT_KEY, NULL, N_("Video Out"), "XF86Display" },
+        { VIDEO_OUT_KEY, NULL, N_("Video Out"), "XF86Display", SHELL_KEYBINDING_MODE_ALL },
         /* Key code of the XF86RotateWindows key (present on some tablets) */
-        { ROTATE_VIDEO_KEY, NULL, N_("Rotate Screen"), "XF86RotateWindows" },
-        { MAGNIFIER_KEY, "magnifier", NULL },
-        { SCREENREADER_KEY, "screenreader", NULL },
-        { ON_SCREEN_KEYBOARD_KEY, "on-screen-keyboard", NULL },
-        { INCREASE_TEXT_KEY, "increase-text-size", NULL },
-        { DECREASE_TEXT_KEY, "decrease-text-size", NULL },
-        { TOGGLE_CONTRAST_KEY, "toggle-contrast", NULL },
-        { MAGNIFIER_ZOOM_IN_KEY, "magnifier-zoom-in", NULL },
-        { MAGNIFIER_ZOOM_OUT_KEY, "magnifier-zoom-out", NULL },
-        { POWER_KEY, NULL, N_("Power Off"), "XF86PowerOff" },
+        { ROTATE_VIDEO_KEY, NULL, N_("Rotate Screen"), "XF86RotateWindows", SHELL_KEYBINDING_MODE_NORMAL },
+        { MAGNIFIER_KEY, "magnifier", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { SCREENREADER_KEY, "screenreader", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { ON_SCREEN_KEYBOARD_KEY, "on-screen-keyboard", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { INCREASE_TEXT_KEY, "increase-text-size", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { DECREASE_TEXT_KEY, "decrease-text-size", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { TOGGLE_CONTRAST_KEY, "toggle-contrast", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { MAGNIFIER_ZOOM_IN_KEY, "magnifier-zoom-in", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { MAGNIFIER_ZOOM_OUT_KEY, "magnifier-zoom-out", NULL, NULL, SHELL_KEYBINDING_MODE_ALL },
+        { POWER_KEY, NULL, N_("Power Off"), "XF86PowerOff", GSD_KEYBINDING_MODE_LAUNCHER },
         /* the kernel / Xorg names really are like this... */
-        { SLEEP_KEY, NULL, N_("Sleep"), "XF86Suspend" },
-        { SUSPEND_KEY, NULL, N_("Suspend"), "XF86Sleep" },
-        { HIBERNATE_KEY, NULL, N_("Hibernate"), "XF86Hibernate" },
-        { SCREEN_BRIGHTNESS_UP_KEY, NULL, N_("Brightness Up"), "XF86MonBrightnessUp" },
-        { SCREEN_BRIGHTNESS_DOWN_KEY, NULL, N_("Brightness Down"), "XF86MonBrightnessDown" },
-        { KEYBOARD_BRIGHTNESS_UP_KEY, NULL, N_("Keyboard Brightness Up"), "XF86KbdBrightnessUp" },
-        { KEYBOARD_BRIGHTNESS_DOWN_KEY, NULL, N_("Keyboard Brightness Down"), "XF86KbdBrightnessDown" },
-        { KEYBOARD_BRIGHTNESS_TOGGLE_KEY, NULL, N_("Keyboard Brightness Toggle"), "XF86KbdLightOnOff" },
-        { BATTERY_KEY, NULL, N_("Battery Status"), "XF86Battery" },
+        { SLEEP_KEY, NULL, N_("Sleep"), "XF86Suspend", SHELL_KEYBINDING_MODE_ALL },
+        { SUSPEND_KEY, NULL, N_("Suspend"), "XF86Sleep", SHELL_KEYBINDING_MODE_ALL },
+        { HIBERNATE_KEY, NULL, N_("Hibernate"), "XF86Hibernate", SHELL_KEYBINDING_MODE_ALL },
+        { SCREEN_BRIGHTNESS_UP_KEY, NULL, N_("Brightness Up"), "XF86MonBrightnessUp", 
SHELL_KEYBINDING_MODE_ALL },
+        { SCREEN_BRIGHTNESS_DOWN_KEY, NULL, N_("Brightness Down"), "XF86MonBrightnessDown", 
SHELL_KEYBINDING_MODE_ALL },
+        { KEYBOARD_BRIGHTNESS_UP_KEY, NULL, N_("Keyboard Brightness Up"), "XF86KbdBrightnessUp", 
SHELL_KEYBINDING_MODE_ALL },
+        { KEYBOARD_BRIGHTNESS_DOWN_KEY, NULL, N_("Keyboard Brightness Down"), "XF86KbdBrightnessDown", 
SHELL_KEYBINDING_MODE_ALL },
+        { KEYBOARD_BRIGHTNESS_TOGGLE_KEY, NULL, N_("Keyboard Brightness Toggle"), "XF86KbdLightOnOff", 
SHELL_KEYBINDING_MODE_ALL },
+        { BATTERY_KEY, NULL, N_("Battery Status"), "XF86Battery", GSD_KEYBINDING_MODE_LAUNCHER },
 };
 
+#undef SCREENSAVER_MODE
+
 #endif /* __ACME_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]