]> Dogcows Code - chaz/openbox/blobdiff - openbox/actions/directionalwindows.c
don't strip the state for keyboard events
[chaz/openbox] / openbox / actions / directionalwindows.c
index 0d1476c7936b3c1aab7b037c89524a015f534edc..c5b908bbe04abec1fb39829dbd59af8d2b338b21 100644 (file)
@@ -6,6 +6,7 @@
 #include "openbox/openbox.h"
 #include "openbox/misc.h"
 #include "gettext.h"
+#include "obt/keyboard.h"
 
 typedef struct {
     gboolean interactive;
@@ -137,18 +138,18 @@ static gpointer setup_func(xmlNodePtr node)
     o->dialog = TRUE;
     o->bar = TRUE;
 
-    if ((n = obt_parse_find_node(node, "dialog")))
-        o->dialog = obt_parse_node_bool(n);
-    if ((n = obt_parse_find_node(node, "bar")))
-        o->bar = obt_parse_node_bool(n);
-    if ((n = obt_parse_find_node(node, "raise")))
-        o->raise = obt_parse_node_bool(n);
-    if ((n = obt_parse_find_node(node, "panels")))
-        o->dock_windows = obt_parse_node_bool(n);
-    if ((n = obt_parse_find_node(node, "desktop")))
-        o->desktop_windows = obt_parse_node_bool(n);
-    if ((n = obt_parse_find_node(node, "direction"))) {
-        gchar *s = obt_parse_node_string(n);
+    if ((n = obt_xml_find_node(node, "dialog")))
+        o->dialog = obt_xml_node_bool(n);
+    if ((n = obt_xml_find_node(node, "bar")))
+        o->bar = obt_xml_node_bool(n);
+    if ((n = obt_xml_find_node(node, "raise")))
+        o->raise = obt_xml_node_bool(n);
+    if ((n = obt_xml_find_node(node, "panels")))
+        o->dock_windows = obt_xml_node_bool(n);
+    if ((n = obt_xml_find_node(node, "desktop")))
+        o->desktop_windows = obt_xml_node_bool(n);
+    if ((n = obt_xml_find_node(node, "direction"))) {
+        gchar *s = obt_xml_node_string(n);
         if (!g_ascii_strcasecmp(s, "north") ||
             !g_ascii_strcasecmp(s, "up"))
             o->direction = OB_DIRECTION_NORTH;
@@ -172,14 +173,14 @@ static gpointer setup_func(xmlNodePtr node)
         g_free(s);
     }
 
-    if ((n = obt_parse_find_node(node, "finalactions"))) {
+    if ((n = obt_xml_find_node(node, "finalactions"))) {
         xmlNodePtr m;
 
-        m = obt_parse_find_node(n->children, "action");
+        m = obt_xml_find_node(n->children, "action");
         while (m) {
             ObActionsAct *action = actions_parse(m);
             if (action) o->actions = g_slist_append(o->actions, action);
-            m = obt_parse_find_node(m->next, "action");
+            m = obt_xml_find_node(m->next, "action");
         }
     }
     else {
@@ -256,6 +257,15 @@ static gboolean i_input_func(guint initial_state,
                              gpointer options,
                              gboolean *used)
 {
+    guint mods;
+
+    mods = obt_keyboard_only_modmasks(e->xkey.state);
+    if (e->type == KeyRelease) {
+        /* remove from the state the mask of the modifier key being
+           released, if it is a modifier key being released that is */
+        mods &= ~obt_keyboard_keycode_to_modmask(e->xkey.keycode);
+    }
+
     if (e->type == KeyPress) {
         /* Escape cancels no matter what */
         if (ob_keycode_match(e->xkey.keycode, OB_KEY_ESCAPE)) {
@@ -272,8 +282,7 @@ static gboolean i_input_func(guint initial_state,
         }
     }
     /* They released the modifiers */
-    else if (e->type == KeyRelease && initial_state &&
-             (e->xkey.state & initial_state) == 0)
+    else if (e->type == KeyRelease && initial_state && !(mods & initial_state))
     {
         end_cycle(FALSE, e->xkey.state, options);
         return FALSE;
This page took 0.024826 seconds and 4 git commands to generate.