X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fconfig.c;h=656ad3c9d8da82536fbee5f6f1d5fafca301a453;hb=a4a5fc866db0ad56fb678740314573a06349ed7e;hp=92445517b77b708d0b434ca10d468142c7152961;hpb=b06b684589a618a2481ccc2745d5e03abb6bd5e0;p=chaz%2Fopenbox diff --git a/openbox/config.c b/openbox/config.c index 92445517..656ad3c9 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -86,15 +86,17 @@ 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; guint config_submenu_show_delay; -gboolean config_menu_client_list_icons; +guint config_submenu_hide_delay; gboolean config_menu_manage_desktops; +gboolean config_menu_show_icons; GSList *config_menu_files; @@ -105,7 +107,7 @@ GSList *config_per_app_settings; ObAppSettings* config_create_app_settings(void) { - ObAppSettings *settings = g_new0(ObAppSettings, 1); + ObAppSettings *settings = g_slice_new0(ObAppSettings); settings->type = -1; settings->decor = -1; settings->shade = -1; @@ -148,22 +150,33 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src, dst->pos_given = TRUE; dst->pos_force = src->pos_force; dst->position = src->position; - dst->monitor = src->monitor; + /* monitor is copied above */ } } -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); } @@ -199,8 +212,10 @@ static void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c) static void parse_per_app_settings(xmlNodePtr node, gpointer d) { xmlNodePtr app = obt_xml_find_node(node->children, "application"); - gchar *name = NULL, *class = NULL, *role = NULL, *type = NULL; - gboolean name_set, class_set, type_set; + gchar *name = NULL, *class = NULL, *role = NULL, *title = NULL, + *type_str = NULL; + gboolean name_set, class_set, type_set, role_set, title_set; + ObClientType type; gboolean x_pos_given; while (app) { @@ -208,10 +223,35 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d) class_set = obt_xml_attr_string(app, "class", &class); name_set = obt_xml_attr_string(app, "name", &name); - type_set = obt_xml_attr_string(app, "type", &type); - if (class_set || name_set) { + type_set = obt_xml_attr_string(app, "type", &type_str); + role_set = obt_xml_attr_string(app, "role", &role); + title_set = obt_xml_attr_string(app, "title", &title); + + /* validate the type tho */ + if (type_set) { + if (!g_ascii_strcasecmp(type_str, "normal")) + type = OB_CLIENT_TYPE_NORMAL; + else if (!g_ascii_strcasecmp(type_str, "dialog")) + type = OB_CLIENT_TYPE_DIALOG; + else if (!g_ascii_strcasecmp(type_str, "splash")) + type = OB_CLIENT_TYPE_SPLASH; + else if (!g_ascii_strcasecmp(type_str, "utility")) + type = OB_CLIENT_TYPE_UTILITY; + else if (!g_ascii_strcasecmp(type_str, "menu")) + type = OB_CLIENT_TYPE_MENU; + else if (!g_ascii_strcasecmp(type_str, "toolbar")) + type = OB_CLIENT_TYPE_TOOLBAR; + else if (!g_ascii_strcasecmp(type_str, "dock")) + type = OB_CLIENT_TYPE_DOCK; + else if (!g_ascii_strcasecmp(type_str, "desktop")) + type = OB_CLIENT_TYPE_DESKTOP; + else + type_set = FALSE; /* not valid! */ + } + + if (class_set || name_set || role_set || title_set || type_set) { xmlNodePtr n, c; - ObAppSettings *settings = config_create_app_settings();; + ObAppSettings *settings = config_create_app_settings(); if (name_set) settings->name = g_pattern_spec_new(name); @@ -219,28 +259,15 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d) if (class_set) settings->class = g_pattern_spec_new(class); - if (type_set) { - if (!g_ascii_strcasecmp(type, "normal")) - settings->type = OB_CLIENT_TYPE_NORMAL; - else if (!g_ascii_strcasecmp(type, "dialog")) - settings->type = OB_CLIENT_TYPE_DIALOG; - else if (!g_ascii_strcasecmp(type, "splash")) - settings->type = OB_CLIENT_TYPE_SPLASH; - else if (!g_ascii_strcasecmp(type, "utility")) - settings->type = OB_CLIENT_TYPE_UTILITY; - else if (!g_ascii_strcasecmp(type, "menu")) - settings->type = OB_CLIENT_TYPE_MENU; - else if (!g_ascii_strcasecmp(type, "toolbar")) - settings->type = OB_CLIENT_TYPE_TOOLBAR; - else if (!g_ascii_strcasecmp(type, "dock")) - settings->type = OB_CLIENT_TYPE_DOCK; - else if (!g_ascii_strcasecmp(type, "desktop")) - settings->type = OB_CLIENT_TYPE_DESKTOP; - } - - if (obt_xml_attr_string(app, "role", &role)) + if (role_set) settings->role = g_pattern_spec_new(role); + if (title_set) + settings->title = g_pattern_spec_new(title); + + if (type_set) + settings->type = type; + if ((n = obt_xml_find_node(app->children, "decor"))) if (!obt_xml_node_contains(n, "default")) settings->decor = obt_xml_node_bool(n); @@ -338,11 +365,12 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d) } config_per_app_settings = g_slist_append(config_per_app_settings, - (gpointer) settings); + (gpointer) settings); g_free(name); g_free(class); g_free(role); - name = class = role = NULL; + g_free(title); + name = class = role = title = NULL; } app = obt_xml_find_node(app->next, "application"); @@ -431,7 +459,7 @@ static void parse_mouse(xmlNodePtr node, gpointer d) { xmlNodePtr n, nbut, nact; gchar *buttonstr; - gchar *contextstr; + gchar *cxstr; ObMouseAction mact; mouse_unbind_all(); @@ -449,40 +477,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"); + } + next_nbut: g_free(buttonstr); - 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"); } @@ -813,10 +863,17 @@ static void parse_menu(xmlNodePtr node, gpointer d) config_menu_middle = obt_xml_node_bool(n); if ((n = obt_xml_find_node(node, "submenuShowDelay"))) config_submenu_show_delay = obt_xml_node_int(n); - if ((n = obt_xml_find_node(node, "applicationIcons"))) - config_menu_client_list_icons = obt_xml_node_bool(n); + if ((n = obt_xml_find_node(node, "submenuHideDelay"))) + config_submenu_hide_delay = obt_xml_node_int(n); if ((n = obt_xml_find_node(node, "manageDesktops"))) config_menu_manage_desktops = obt_xml_node_bool(n); + if ((n = obt_xml_find_node(node, "showIcons"))) { + config_menu_show_icons = obt_xml_node_bool(n); +#ifndef USE_IMLIB2 + if (config_menu_show_icons) + g_message(_("Openbox was compiled without Imlib2 image loading support. Icons in menus will not be loaded.")); +#endif + } while ((node = obt_xml_find_node(node, "file"))) { gchar *c = obt_xml_node_string(node); @@ -922,8 +979,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) @@ -962,6 +1019,8 @@ void config_startup(ObtXmlInst *i) config_font_inactivewindow = NULL; config_font_menuitem = NULL; config_font_menutitle = NULL; + config_font_activeosd = NULL; + config_font_inactiveosd = NULL; obt_xml_register(i, "theme", parse_theme, NULL); @@ -1005,6 +1064,7 @@ void config_startup(ObtXmlInst *i) config_mouse_threshold = 8; config_mouse_dclicktime = 200; config_mouse_screenedgetime = 400; + config_mouse_screenedgewarp = FALSE; bind_default_mouse(); @@ -1017,10 +1077,11 @@ void config_startup(ObtXmlInst *i) config_menu_hide_delay = 250; config_menu_middle = FALSE; - config_submenu_show_delay = 0; - config_menu_client_list_icons = TRUE; + config_submenu_show_delay = 100; + config_submenu_hide_delay = 400; config_menu_manage_desktops = TRUE; config_menu_files = NULL; + config_menu_show_icons = TRUE; obt_xml_register(i, "menu", parse_menu, NULL); @@ -1056,8 +1117,9 @@ void config_shutdown(void) ObAppSettings *itd = (ObAppSettings *)it->data; if (itd->name) g_pattern_spec_free(itd->name); if (itd->role) g_pattern_spec_free(itd->role); + if (itd->title) g_pattern_spec_free(itd->title); if (itd->class) g_pattern_spec_free(itd->class); - g_free(it->data); + g_slice_free(ObAppSettings, it->data); } g_slist_free(config_per_app_settings); }