diff options
Diffstat (limited to 'openbox/config.c')
| -rw-r--r-- | openbox/config.c | 81 |
1 files changed, 51 insertions, 30 deletions
diff --git a/openbox/config.c b/openbox/config.c index 76f48569..dad5d1bf 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -83,8 +83,9 @@ guint config_dock_show_delay; guint config_dock_app_move_button; guint config_dock_app_move_modifiers; -guint config_keyboard_reset_keycode; -guint config_keyboard_reset_state; +guint config_keyboard_reset_keycode; +guint config_keyboard_reset_state; +gboolean config_keyboard_rebind_on_mapping_notify; gint config_mouse_threshold; gint config_mouse_dclicktime; @@ -503,6 +504,9 @@ static void parse_keyboard(xmlNodePtr node, gpointer d) parse_key(n, NULL); n = obt_xml_find_node(n->next, "keybind"); } + + if ((n = obt_xml_find_node(node->children, "rebindOnMappingNotify"))) + config_keyboard_rebind_on_mapping_notify = obt_xml_node_bool(n); } /* @@ -540,13 +544,15 @@ static void parse_mouse(xmlNodePtr node, gpointer d) if ((n = obt_xml_find_node(node, "screenEdgeWarpMouse"))) config_mouse_screenedgewarp = obt_xml_node_bool(n); - n = obt_xml_find_node(node, "context"); - while (n) { + for (n = obt_xml_find_node(node, "context"); + n; + n = obt_xml_find_node(n->next, "context")) + { gchar *modcxstr; ObFrameContext cx; if (!obt_xml_attr_string(n, "name", &cxstr)) - goto next_n; + continue; modcxstr = g_strdup(cxstr); /* make a copy to mutilate */ while (frame_next_context_from_string(modcxstr, &cx)) { @@ -561,10 +567,15 @@ static void parse_mouse(xmlNodePtr node, gpointer d) continue; } - nbut = obt_xml_find_node(n->children, "mousebind"); - while (nbut) { + for (nbut = obt_xml_find_node(n->children, "mousebind"); + nbut; + nbut = obt_xml_find_node(nbut->next, "mousebind")) + { + + gchar **button, **buttons; + if (!obt_xml_attr_string(nbut, "button", &buttonstr)) - goto next_nbut; + continue; if (obt_xml_attr_contains(nbut, "action", "press")) mact = OB_MOUSE_ACTION_PRESS; else if (obt_xml_attr_contains(nbut, "action", "release")) @@ -576,25 +587,31 @@ static void parse_mouse(xmlNodePtr node, gpointer d) else if (obt_xml_attr_contains(nbut, "action", "drag")) mact = OB_MOUSE_ACTION_MOTION; else - goto next_nbut; + continue; - nact = obt_xml_find_node(nbut->children, "action"); - while (nact) { + buttons = g_strsplit(buttonstr, " ", 0); + for (nact = obt_xml_find_node(nbut->children, "action"); + nact; + nact = obt_xml_find_node(nact->next, "action")) + { ObActionsAct *action; - if ((action = actions_parse(nact))) - mouse_bind(buttonstr, cx, mact, action); - nact = obt_xml_find_node(nact->next, "action"); + /* actions_parse() creates one ref to the action, but we need + * exactly one ref per binding we use it for. */ + if ((action = actions_parse(nact))) { + for (button = buttons; *button; ++button) { + actions_act_ref(action); + mouse_bind(*button, cx, mact, action); + } + actions_act_unref(action); + } } - g_free(buttonstr); - next_nbut: - nbut = obt_xml_find_node(nbut->next, "mousebind"); + g_strfreev(buttons); + g_free(buttonstr); } } g_free(modcxstr); g_free(cxstr); - next_n: - n = obt_xml_find_node(n->next, "context"); } } @@ -703,8 +720,10 @@ static void parse_theme(xmlNodePtr node, gpointer d) config_theme_window_list_icon_size = 96; } - n = obt_xml_find_node(node, "font"); - while (n) { + for (n = obt_xml_find_node(node, "font"); + n; + n = obt_xml_find_node(n->next, "font")) + { xmlNodePtr fnode; RrFont **font; gchar *name = g_strdup(RrDefaultFontFamily); @@ -727,7 +746,7 @@ static void parse_theme(xmlNodePtr node, gpointer d) else if (obt_xml_attr_contains(n, "place","InactiveOnScreenDisplay")) font = &config_font_inactiveosd; else - goto next_font; + continue; if ((fnode = obt_xml_find_node(n->children, "name"))) { g_free(name); @@ -754,8 +773,6 @@ static void parse_theme(xmlNodePtr node, gpointer d) *font = RrFontOpen(ob_rr_inst, name, size, weight, slant); g_free(name); - next_font: - n = obt_xml_find_node(n->next, "font"); } } @@ -784,12 +801,13 @@ static void parse_desktops(xmlNodePtr node, gpointer d) g_slist_free(config_desktops_names); config_desktops_names = NULL; - nname = obt_xml_find_node(n->children, "name"); - while (nname) { + for (nname = obt_xml_find_node(n->children, "name"); + nname; + nname = obt_xml_find_node(nname->next, "name")) + { config_desktops_names = g_slist_append(config_desktops_names, obt_xml_node_string(nname)); - nname = obt_xml_find_node(nname->next, "name"); } } if ((n = obt_xml_find_node(node, "popupTime"))) @@ -905,7 +923,7 @@ static void parse_dock(xmlNodePtr node, gpointer d) config_dock_show_delay = obt_xml_node_int(n); if ((n = obt_xml_find_node(node, "moveButton"))) { gchar *str = obt_xml_node_string(n); - guint b, s; + guint b = 0, s = 0; if (translate_button(str, &s, &b)) { config_dock_app_move_button = b; config_dock_app_move_modifiers = s; @@ -939,12 +957,14 @@ static void parse_menu(xmlNodePtr node, gpointer d) #endif } - while ((node = obt_xml_find_node(node, "file"))) { + for (node = obt_xml_find_node(node, "file"); + node; + node = obt_xml_find_node(node->next, "file")) + { gchar *c = obt_xml_node_string(node); config_menu_files = g_slist_append(config_menu_files, obt_paths_expand_tilde(c)); g_free(c); - node = node->next; } } @@ -1120,6 +1140,7 @@ void config_startup(ObtXmlInst *i) translate_key("C-g", &config_keyboard_reset_state, &config_keyboard_reset_keycode); + config_keyboard_rebind_on_mapping_notify = TRUE; bind_default_keyboard(); |
