summaryrefslogtreecommitdiff
diff options
-rw-r--r--services/panel-main.c22
-rw-r--r--services/panel-service.c84
-rw-r--r--unity-shared/GnomeKeyGrabber.cpp10
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))
{