summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <fourdan@xfce.org>2016-04-30 19:13:07 +0200
committerOlivier Fourdan <fourdan@xfce.org>2016-04-30 19:16:59 +0200
commit867ab66ceae1b75f9ea1df4591a1b73588221d89 (patch)
tree7e152f88cd369558bdaae1ecc5646504d5dcf540
parent322f0bbb93d2d03df1e02b4e4acd69ab7f936c80 (diff)
downloadxfwm4-867ab66ceae1b75f9ea1df4591a1b73588221d89.tar.gz
keyboard: Ignore unsupported modifiers
Bug: 10760 If a given keyboard modifier is not supported, ignore the shortcut. Signed-off-by: Olivier Fourdan <fourdan@xfce.org>
-rw-r--r--src/keyboard.c44
-rw-r--r--src/keyboard.h3
-rw-r--r--src/settings.c6
3 files changed, 39 insertions, 14 deletions
diff --git a/src/keyboard.c b/src/keyboard.c
index fa3526518..c32ed1874 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -73,29 +73,44 @@ getKeycode (Display *dpy, const char *str)
return XKeysymToKeycode (dpy, keysym);
}
-guint
-getModifierMap (const char *str)
+static gboolean
+addModifierMap (guint *map, guint mask)
{
- guint map;
+ if (!mask)
+ {
+ return FALSE;
+ }
+
+ *map |= mask;
- gtk_accelerator_parse (str, NULL, &map);
+ return TRUE;
+}
- if ((map & GDK_SUPER_MASK) == GDK_SUPER_MASK)
+gboolean
+getModifierMap (const char *str, guint *map)
+{
+ gboolean ret;
+
+ ret = TRUE;
+ gtk_accelerator_parse (str, NULL, map);
+
+ ret = TRUE;
+ if ((*map & GDK_SUPER_MASK) == GDK_SUPER_MASK)
{
- map |= SuperMask;
+ ret &= addModifierMap (map, SuperMask);
}
- if ((map & GDK_HYPER_MASK) == GDK_HYPER_MASK)
+ if ((*map & GDK_HYPER_MASK) == GDK_HYPER_MASK)
{
- map |= HyperMask;
+ ret &= addModifierMap (map, HyperMask);
}
- if ((map & GDK_META_MASK) == GDK_META_MASK)
+ if ((*map & GDK_META_MASK) == GDK_META_MASK)
{
- map |= MetaMask;
+ ret &= addModifierMap (map, MetaMask);
}
- return map & MODIFIER_MASK & ~IGNORE_MASK;
+ return ret;
}
void
@@ -119,8 +134,13 @@ parseKeyString (Display * dpy, MyKey * key, const char *str)
return;
}
+ if (!getModifierMap (str, &key->modifier))
+ {
+ g_message (_("Unsupported keyboard modifier '%s'"), str);
+ key->modifier = 0;
+ return;
+ }
key->keycode = getKeycode (dpy, str);
- key->modifier = getModifierMap (str);
TRACE ("keycode = 0x%x, modifier = 0x%x", key->keycode, key->modifier);
}
diff --git a/src/keyboard.h b/src/keyboard.h
index f50583207..1e8210bd8 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -45,7 +45,8 @@ extern unsigned int ScrollLockMask;
extern unsigned int SuperMask;
extern unsigned int HyperMask;
-guint getModifierMap (const char *);
+gboolean getModifierMap (const char *,
+ guint *);
void parseKeyString (Display *,
MyKey *,
const char *);
diff --git a/src/settings.c b/src/settings.c
index 20348b085..ce2f8c04f 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -155,7 +155,11 @@ set_easy_click (ScreenInfo *screen_info, const char *modifier)
else
{
modstr = g_strdup_printf ("<%s>", modifier);
- screen_info->params->easy_click = getModifierMap (modstr);
+ if (!getModifierMap (modstr, &screen_info->params->easy_click))
+ {
+ g_message (_("Unsupported keyboard modifier '%s'"), modstr);
+ screen_info->params->easy_click = 0;
+ }
g_free (modstr);
}
}