X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fconfig.c;h=8e0e5ac3877bf4e5e21337164531df229e0fa59a;hb=332280daf9a4bc410544ae7d267092a11ab8c945;hp=bf0facda55f3197a6865cc4cc3c6add39e814028;hpb=a8554def0e1d0dc4b481b7b3c88af9fe3b09660d;p=chaz%2Fopenbox diff --git a/openbox/config.c b/openbox/config.c index bf0facda..8e0e5ac3 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -86,9 +86,10 @@ guint config_dock_app_move_modifiers; guint config_keyboard_reset_keycode; guint config_keyboard_reset_state; -gint config_mouse_threshold; -gint config_mouse_dclicktime; -gint config_mouse_screenedgetime; +gint config_mouse_threshold; +gint config_mouse_dclicktime; +gint config_mouse_screenedgetime; +gboolean config_mouse_screenedgewarp; guint config_menu_hide_delay; gboolean config_menu_middle; @@ -153,18 +154,29 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src, } } -static void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c) +void config_parse_relative_number(gchar *s, gint *num, gint *denom) +{ + *num = strtol(s, &s, 10); + + if (*s == '%') { + *denom = 100; + } else if (*s == '/') { + *denom = atoi(s+1); + } +} + +void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c) { gchar *s = obt_xml_node_string(node); if (!g_ascii_strcasecmp(s, "center")) c->center = TRUE; else { + gchar *ps = s; if (s[0] == '-') c->opposite = TRUE; if (s[0] == '-' || s[0] == '+') - c->pos = atoi(s+1); - else - c->pos = atoi(s); + ps++; + config_parse_relative_number(ps, &c->pos, &c->denom); } g_free(s); } @@ -358,7 +370,8 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d) g_free(class); g_free(role); g_free(title); - name = class = role = title = NULL; + g_free(type_str); + name = class = role = title = type_str = NULL; } app = obt_xml_find_node(app->next, "application"); @@ -377,39 +390,44 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d) static void parse_key(xmlNodePtr node, GList *keylist) { - gchar *key; + gchar *keystring, **keys, **key; xmlNodePtr n; gboolean is_chroot = FALSE; - if (!obt_xml_attr_string(node, "key", &key)) + if (!obt_xml_attr_string(node, "key", &keystring)) return; obt_xml_attr_bool(node, "chroot", &is_chroot); - keylist = g_list_append(keylist, key); + keys = g_strsplit(keystring, " ", 0); + for (key = keys; *key; ++key) { + keylist = g_list_append(keylist, *key); - if ((n = obt_xml_find_node(node->children, "keybind"))) { - while (n) { - parse_key(n, keylist); - n = obt_xml_find_node(n->next, "keybind"); + if ((n = obt_xml_find_node(node->children, "keybind"))) { + while (n) { + parse_key(n, keylist); + n = obt_xml_find_node(n->next, "keybind"); + } } - } - else if ((n = obt_xml_find_node(node->children, "action"))) { - while (n) { - ObActionsAct *action; + else if ((n = obt_xml_find_node(node->children, "action"))) { + while (n) { + ObActionsAct *action; - action = actions_parse(n); - if (action) - keyboard_bind(keylist, action); - n = obt_xml_find_node(n->next, "action"); + action = actions_parse(n); + if (action) + keyboard_bind(keylist, action); + n = obt_xml_find_node(n->next, "action"); + } } - } - if (is_chroot) - keyboard_chroot(keylist); - g_free(key); - keylist = g_list_delete_link(keylist, g_list_last(keylist)); + if (is_chroot) + keyboard_chroot(keylist); + keylist = g_list_delete_link(keylist, g_list_last(keylist)); + } + + g_strfreev(keys); + g_free(keystring); } static void parse_keyboard(xmlNodePtr node, gpointer d) @@ -447,7 +465,7 @@ static void parse_mouse(xmlNodePtr node, gpointer d) { xmlNodePtr n, nbut, nact; gchar *buttonstr; - gchar *contextstr; + gchar *cxstr; ObMouseAction mact; mouse_unbind_all(); @@ -465,40 +483,62 @@ static void parse_mouse(xmlNodePtr node, gpointer d) if (config_mouse_screenedgetime && config_mouse_screenedgetime < 25) config_mouse_screenedgetime = 25; } + 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) { - if (!obt_xml_attr_string(n, "name", &contextstr)) + gchar *modcxstr; + ObFrameContext cx; + + if (!obt_xml_attr_string(n, "name", &cxstr)) goto next_n; - nbut = obt_xml_find_node(n->children, "mousebind"); - while (nbut) { - if (!obt_xml_attr_string(nbut, "button", &buttonstr)) - goto next_nbut; - if (obt_xml_attr_contains(nbut, "action", "press")) { - mact = OB_MOUSE_ACTION_PRESS; - } else if (obt_xml_attr_contains(nbut, "action", "release")) { - mact = OB_MOUSE_ACTION_RELEASE; - } else if (obt_xml_attr_contains(nbut, "action", "click")) { - mact = OB_MOUSE_ACTION_CLICK; - } else if (obt_xml_attr_contains(nbut, "action","doubleclick")) { - mact = OB_MOUSE_ACTION_DOUBLE_CLICK; - } else if (obt_xml_attr_contains(nbut, "action", "drag")) { - mact = OB_MOUSE_ACTION_MOTION; - } else - goto next_nbut; - nact = obt_xml_find_node(nbut->children, "action"); - while (nact) { - ObActionsAct *action; - if ((action = actions_parse(nact))) - mouse_bind(buttonstr, contextstr, mact, action); - nact = obt_xml_find_node(nact->next, "action"); + modcxstr = g_strdup(cxstr); /* make a copy to mutilate */ + while (frame_next_context_from_string(modcxstr, &cx)) { + if (!cx) { + gchar *s = strchr(modcxstr, ' '); + if (s) { + *s = '\0'; + g_message(_("Invalid context \"%s\" in mouse binding"), + modcxstr); + *s = ' '; + } + continue; } + + nbut = obt_xml_find_node(n->children, "mousebind"); + while (nbut) { + if (!obt_xml_attr_string(nbut, "button", &buttonstr)) + goto next_nbut; + if (obt_xml_attr_contains(nbut, "action", "press")) + mact = OB_MOUSE_ACTION_PRESS; + else if (obt_xml_attr_contains(nbut, "action", "release")) + mact = OB_MOUSE_ACTION_RELEASE; + else if (obt_xml_attr_contains(nbut, "action", "click")) + mact = OB_MOUSE_ACTION_CLICK; + else if (obt_xml_attr_contains(nbut, "action","doubleclick")) + mact = OB_MOUSE_ACTION_DOUBLE_CLICK; + else if (obt_xml_attr_contains(nbut, "action", "drag")) + mact = OB_MOUSE_ACTION_MOTION; + else + goto next_nbut; + + nact = obt_xml_find_node(nbut->children, "action"); + while (nact) { + ObActionsAct *action; + + if ((action = actions_parse(nact))) + mouse_bind(buttonstr, cx, mact, action); + nact = obt_xml_find_node(nact->next, "action"); + } g_free(buttonstr); - next_nbut: + next_nbut: nbut = obt_xml_find_node(nbut->next, "mousebind"); + } } - g_free(contextstr); + g_free(modcxstr); + g_free(cxstr); next_n: n = obt_xml_find_node(n->next, "context"); } @@ -542,6 +582,8 @@ static void parse_placement(xmlNodePtr node, gpointer d) config_place_monitor = OB_PLACE_MONITOR_ACTIVE; else if (obt_xml_node_contains(n, "mouse")) config_place_monitor = OB_PLACE_MONITOR_MOUSE; + else if (obt_xml_node_contains(n, "any")) + config_place_monitor = OB_PLACE_MONITOR_ANY; } if ((n = obt_xml_find_node(node, "primaryMonitor"))) { config_primary_monitor_index = obt_xml_node_int(n); @@ -945,8 +987,8 @@ static void bind_default_mouse(void) }; for (it = binds; it->button; ++it) - mouse_bind(it->button, it->context, it->mact, - actions_parse_string(it->actname)); + mouse_bind(it->button, frame_context_from_string(it->context), + it->mact, actions_parse_string(it->actname)); } void config_startup(ObtXmlInst *i) @@ -963,7 +1005,7 @@ void config_startup(ObtXmlInst *i) config_place_policy = OB_PLACE_POLICY_SMART; config_place_center = TRUE; - config_place_monitor = OB_PLACE_MONITOR_ANY; + config_place_monitor = OB_PLACE_MONITOR_PRIMARY; config_primary_monitor_index = 1; config_primary_monitor = OB_PLACE_MONITOR_ACTIVE; @@ -1028,8 +1070,9 @@ void config_startup(ObtXmlInst *i) obt_xml_register(i, "keyboard", parse_keyboard, NULL); config_mouse_threshold = 8; - config_mouse_dclicktime = 200; + config_mouse_dclicktime = 500; config_mouse_screenedgetime = 400; + config_mouse_screenedgewarp = FALSE; bind_default_mouse();