]> Dogcows Code - chaz/openbox/blobdiff - plugins/keyboard/keyboard.c
ECKS EM ELL
[chaz/openbox] / plugins / keyboard / keyboard.c
index 5991606adc52e8514179589653214f896b87cb0a..d1d93241a77e5422ace3440325179aa475f3b341 100644 (file)
@@ -4,17 +4,74 @@
 #include "kernel/event.h"
 #include "kernel/grab.h"
 #include "kernel/action.h"
+#include "kernel/prop.h"
 #include "kernel/parse.h"
 #include "kernel/timer.h"
 #include "tree.h"
 #include "keyboard.h"
-#include "keyparse.h"
 #include "translate.h"
 #include <glib.h>
 
+/*
+
+<keybind key="C-x">
+  <action name="ChangeDesktop">
+    <desktop>3</desktop>
+  </action>
+</keybind>
+
+*/
+
+static void parse_key(xmlDocPtr doc, xmlNodePtr node, GList *keylist)
+{
+    char *key;
+    Action *action;
+    xmlNodePtr n, nact;
+    GList *it;
+
+    n = parse_find_node("keybind", node);
+    while (n) {
+        if (parse_attr_string("key", n, &key)) {
+            keylist = g_list_append(keylist, key);
+
+            parse_key(doc, n->xmlChildrenNode, keylist);
+
+            it = g_list_last(keylist);
+            g_free(it->data);
+            keylist = g_list_delete_link(keylist, it);
+        }
+        n = parse_find_node("keybind", n->next);
+    }
+    if (keylist) {
+        nact = parse_find_node("action", node);
+        while (nact) {
+            if ((action = parse_action(doc, nact))) {
+                /* validate that its okay for a key binding */
+                if (action->func == action_moveresize &&
+                    action->data.moveresize.corner !=
+                    prop_atoms.net_wm_moveresize_move_keyboard &&
+                    action->data.moveresize.corner !=
+                    prop_atoms.net_wm_moveresize_size_keyboard) {
+                    action_free(action);
+                    action = NULL;
+                }
+
+                if (action)
+                    kbind(keylist, action);
+            }
+            nact = parse_find_node("action", nact->next);
+        }
+    }
+}
+
+static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d)
+{
+    parse_key(doc, node, NULL);
+}
+
 void plugin_setup_config()
 {
-    parse_reg_section("keyboard", keyparse, NULL);
+    parse_register("keyboard", parse_xml, NULL);
 }
 
 KeyBindingTree *firstnode = NULL;
@@ -160,6 +217,7 @@ static void event(ObEvent *e, void *foo)
                                 act->data.cycle.cancel = FALSE;
                             }
 
+                            act->data.any.c = focus_client;
                             act->func(&act->data);
 
                             if (act->func == action_cycle_windows &&
This page took 0.024135 seconds and 4 git commands to generate.