diff options
| author | Dana Jansens <danakj@orodu.net> | 2007-04-26 01:25:52 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2007-04-26 01:25:52 +0000 |
| commit | b6d2529acb6e31efbf8c7791e44905a1712da891 (patch) | |
| tree | 752bd615f53234488500bdc655d08ad26f4f2647 /openbox/config.c | |
| parent | 1ee98f4a47e67b653057a62171a0993b80f81f8e (diff) | |
add chrooting. use chroot="true" on the chroot location
Diffstat (limited to 'openbox/config.c')
| -rw-r--r-- | openbox/config.c | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/openbox/config.c b/openbox/config.c index fda9d9f0..aadc4389 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -273,47 +273,59 @@ static void parse_key(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, GList *keylist) { gchar *key; - ObAction *action; - xmlNodePtr n, nact; - GList *it; - - if ((n = parse_find_node("chainQuitKey", node))) { - key = parse_string(doc, n); - translate_key(key, &config_keyboard_reset_state, - &config_keyboard_reset_keycode); - g_free(key); - } + xmlNodePtr n; + gboolean is_chroot = FALSE; - n = parse_find_node("keybind", node); - while (n) { - if (parse_attr_string("key", n, &key)) { - keylist = g_list_append(keylist, key); + if (!parse_attr_string("key", node, &key)) + return; + parse_attr_bool("chroot", node, &is_chroot); - parse_key(i, doc, n->children, keylist); + keylist = g_list_append(keylist, key); - it = g_list_last(keylist); - g_free(it->data); - keylist = g_list_delete_link(keylist, it); + /* a node either contains actions or key bindings */ + if ((n = parse_find_node("keybind", node->children))) { + while (n) { + parse_key(i, doc, n, keylist); + n = parse_find_node("keybind", n->next); } - n = parse_find_node("keybind", n->next); - } - if (keylist) { - nact = parse_find_node("action", node); - while (nact) { - if ((action = action_parse(i, doc, nact, - OB_USER_ACTION_KEYBOARD_KEY))) + } else if ((n = parse_find_node("action", node->children))) { + while (n) { + ObAction *action; + + action = action_parse(i, doc, n, OB_USER_ACTION_KEYBOARD_KEY); + if (action) keyboard_bind(keylist, action); - nact = parse_find_node("action", nact->next); + n = parse_find_node("action", n->next); } } + + if (is_chroot) + keyboard_chroot(keylist); + + g_free(key); + keylist = g_list_delete_link(keylist, g_list_last(keylist)); + + /* go to next sibling */ + if (node->next) parse_key(i, doc, node->next, keylist); } static void parse_keyboard(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, gpointer d) { + xmlNodePtr n; + gchar *key; + keyboard_unbind_all(); - parse_key(i, doc, node->children, NULL); + if ((n = parse_find_node("chainQuitKey", node->children))) { + key = parse_string(doc, n); + translate_key(key, &config_keyboard_reset_state, + &config_keyboard_reset_keycode); + g_free(key); + } + + if ((n = parse_find_node("keybind", node->children))) + parse_key(i, doc, n, NULL); } /* |
