diff options
| -rw-r--r-- | services/panel-main.c | 22 | ||||
| -rw-r--r-- | services/panel-service.c | 84 | ||||
| -rw-r--r-- | unity-shared/GnomeKeyGrabber.cpp | 10 |
3 files changed, 91 insertions, 25 deletions
diff --git a/services/panel-main.c b/services/panel-main.c index 106b974b2..7e5596eb3 100644 --- a/services/panel-main.c +++ b/services/panel-main.c @@ -19,6 +19,7 @@ */ #include <glib.h> +#include <glib-unix.h> #include <gio/gio.h> #include <gtk/gtk.h> #include <libido/libido.h> @@ -422,19 +423,14 @@ on_name_lost (GDBusConnection *connection, gtk_main_quit (); } -static void -on_indicators_cleared (PanelService *service) -{ - gtk_main_quit (); -} - -static void -on_signal (int sig) +static gboolean +on_unix_signal (gpointer data) { - PanelService *service = panel_service_get_default (); - panel_service_clear_indicators (service); + PanelService *service = PANEL_SERVICE (data); g_signal_connect (service, "indicators-cleared", - G_CALLBACK (on_indicators_cleared), NULL); + G_CALLBACK (gtk_main_quit), NULL); + panel_service_clear_indicators (service); + return FALSE; } static void @@ -497,8 +493,8 @@ main (gint argc, gchar **argv) service, NULL); - signal (SIGINT, on_signal); - signal (SIGTERM, on_signal); + g_unix_signal_add (SIGINT, on_unix_signal, service); + g_unix_signal_add (SIGTERM, on_unix_signal, service); gtk_main (); diff --git a/services/panel-service.c b/services/panel-service.c index 2f5703e9c..e8b2e14f3 100644 --- a/services/panel-service.c +++ b/services/panel-service.c @@ -31,6 +31,7 @@ #include <libindicator/indicator-ng.h> #include <X11/XKBlib.h> +#include <X11/XF86keysym.h> #include <X11/extensions/XInput2.h> #include <upstart.h> @@ -474,6 +475,64 @@ event_matches_keybinding (guint32 modifiers, KeySym key, KeyBinding *kb) return FALSE; } +static gboolean +is_special_keysym (KeySym keysym) +{ + /* Multimedia keys, see X11/XF86keysym.h */ + if (keysym >= 0x1008FF00 && keysym <= 0x1008FFFF) + return TRUE; + + return FALSE; +} + +static gboolean +is_control_keysym (KeySym keysym) +{ + if (!is_special_keysym (keysym)) + return FALSE; + + /* Display backlight controls */ + if (keysym >= 0x1008FF01 && keysym <= 0x1008FF0F) + return TRUE; + + switch (keysym) + { + case XF86XK_Battery: + case XF86XK_Bluetooth: + case XF86XK_WLAN: + case XF86XK_UWB: + return !lockscreen_mode; + case XF86XK_Suspend: + case XF86XK_Hibernate: + case XF86XK_Sleep: + case XF86XK_PowerOff: + case XF86XK_ScreenSaver: + return lockscreen_mode; + } + + const gchar *keystr = XKeysymToString (keysym); + + if (g_str_has_prefix (keystr, "XF86Audio") || + g_str_has_prefix (keystr, "XF86Touchpad")) + { + return TRUE; + } + + return FALSE; +} + +static gboolean +is_allowed_keysym (KeySym keysym) +{ + if (keysym == XK_Print) + return TRUE; + + if (is_special_keysym (keysym)) + return TRUE; + + return FALSE; +} + static GdkFilterReturn event_filter (GdkXEvent *ev, GdkEvent *gev, PanelService *self) { @@ -503,10 +562,18 @@ event_filter (GdkXEvent *ev, GdkEvent *gev, PanelService *self) { case XI_KeyPress: { + KeySym keysym = XkbKeycodeToKeysym (event->display, event->detail, 0, 0); + if (lockscreen_mode) - break; + { + if (is_control_keysym (keysym)) + { + reinject_key_event_to_root_window (event); + ret = GDK_FILTER_REMOVE; + } - KeySym keysym = XkbKeycodeToKeysym (event->display, event->detail, 0, 0); + break; + } if (event_matches_keybinding (event->mods.base, keysym, &priv->menu_toggle) || event_matches_keybinding (event->mods.base, keysym, &priv->show_dash) || @@ -519,9 +586,9 @@ event_filter (GdkXEvent *ev, GdkEvent *gev, PanelService *self) } else if (event->mods.base != GDK_CONTROL_MASK) { - if (!IsModifierKey (keysym) && (event->mods.base != 0 || keysym == XK_Print)) + if (!IsModifierKey (keysym) && (event->mods.base != 0 || is_allowed_keysym (keysym))) { - if (GTK_IS_MENU (priv->last_menu)) + if (GTK_IS_MENU (priv->last_menu) && !is_control_keysym (keysym)) gtk_menu_popdown (GTK_MENU (priv->last_menu)); reinject_key_event_to_root_window (event); @@ -593,19 +660,20 @@ event_filter (GdkXEvent *ev, GdkEvent *gev, PanelService *self) } } } - else if (entry && (event->detail == 2 || event->detail == 4 || event->detail == 5)) + else if (entry && (event->detail == 2 || event->detail >= 4 || event->detail <= 7)) { /* If we're scrolling or middle-clicking over an indicator * (which is not an appmenu entry) then we need to send the * event to the indicator itself, and avoid it to close */ gchar *entry_id = get_indicator_entry_id_by_entry (entry); - if (event->detail == 4 || event->detail == 5) + if (event->detail >= 4 || event->detail <= 7) { - gint32 delta = (event->detail == 4) ? 120 : -120; + gint32 delta = (event->detail >= 6) ? NUX_HORIZONTAL_SCROLL_DELTA : NUX_VERTICAL_SCROLL_DELTA; + delta = (event->detail % 2 == 0) ? delta : delta * -1; panel_service_scroll_entry (self, entry_id, delta); } - else if (entry == priv->pressed_entry) + else if (event->detail == 2 && entry == priv->pressed_entry) { panel_service_secondary_activate_entry (self, entry_id); } diff --git a/unity-shared/GnomeKeyGrabber.cpp b/unity-shared/GnomeKeyGrabber.cpp index 76c7161c0..563390b46 100644 --- a/unity-shared/GnomeKeyGrabber.cpp +++ b/unity-shared/GnomeKeyGrabber.cpp @@ -202,12 +202,14 @@ unsigned int GnomeGrabber::Impl::grabAccelerator(char const* accelerator, unsign if (action.key().toString().empty()) { - CompString prefixed = "XF86" + CompString(accelerator); - LOG_DEBUG(logger) << "Can't grab \"" << accelerator << "\", trying \"" << prefixed << "\""; - action.keyFromString(prefixed); + CompString prefixed = "XF86" + CompString(accelerator); + LOG_DEBUG(logger) << "Can't grab \"" << accelerator << "\", trying \"" << prefixed << "\""; + action.keyFromString(prefixed); } else - LOG_DEBUG(logger) << "grabAccelerator \"" << accelerator << "\""; + { + LOG_DEBUG(logger) << "grabAccelerator \"" << accelerator << "\""; + } if (!isActionPostponed(action)) { |
