X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fconfig.c;h=50f6aef6d4fd8ec16ab45fffdb390561b31c3283;hb=a4d13100e67791955eef10876c6784748aff2fed;hp=51e169e8ba29275b61472a199484d3f64ed0269b;hpb=8228e90450c147c647465d281fa16caeca07fd10;p=chaz%2Fopenbox diff --git a/openbox/config.c b/openbox/config.c index 51e169e8..50f6aef6 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -38,6 +38,9 @@ gboolean config_focus_under_mouse; ObPlacePolicy config_place_policy; gboolean config_place_center; +gboolean config_place_active; + +StrutPartial config_margins; gchar *config_theme; gboolean config_theme_keepborder; @@ -52,14 +55,15 @@ RrFont *config_font_menuitem; RrFont *config_font_menutitle; RrFont *config_font_osd; -gint config_desktops_num; +guint config_desktops_num; GSList *config_desktops_names; guint config_screen_firstdesk; +guint config_desktop_popup_time; -gboolean config_resize_redraw; -gboolean config_resize_four_corners; -gint config_resize_popup_show; -gint config_resize_popup_pos; +gboolean config_resize_redraw; +gint config_resize_popup_show; +ObResizePopupPos config_resize_popup_pos; +GravityPoint config_resize_popup_fixed; ObStackingLayer config_dock_layer; gboolean config_dock_floating; @@ -79,6 +83,7 @@ guint config_keyboard_reset_state; gint config_mouse_threshold; gint config_mouse_dclicktime; +gint config_mouse_screenedgetime; guint config_menu_hide_delay; gboolean config_menu_middle; @@ -92,7 +97,7 @@ gint config_resist_edge; GSList *config_per_app_settings; -ObAppSettings* config_create_app_settings() +ObAppSettings* config_create_app_settings(void) { ObAppSettings *settings = g_new0(ObAppSettings, 1); settings->decor = -1; @@ -132,16 +137,28 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src, if (src->pos_given) { dst->pos_given = TRUE; - dst->center_x = src->center_x; - dst->center_y = src->center_y; - dst->opposite_x = src->opposite_x; - dst->opposite_y = src->opposite_y; - dst->position.x = src->position.x; - dst->position.y = src->position.y; + dst->position = src->position; dst->monitor = src->monitor; } } +static void config_parse_gravity_coord(xmlDocPtr doc, xmlNodePtr node, + GravityCoord *c) +{ + gchar *s = parse_string(doc, node); + if (!g_ascii_strcasecmp(s, "center")) + c->center = TRUE; + else { + if (s[0] == '-') + c->opposite = TRUE; + if (s[0] == '-' || s[0] == '+') + c->pos = atoi(s+1); + else + c->pos = atoi(s); + } + g_free(s); +} + /* @@ -170,8 +187,8 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src, the monitor, so center2 will center the window on the second monitor. */ -static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc, - xmlNodePtr node, gpointer d) +static void parse_per_app_settings(ObParseInst *inst, xmlDocPtr doc, + xmlNodePtr node, gpointer data) { xmlNodePtr app = parse_find_node("application", node->children); gchar *name = NULL, *class = NULL, *role = NULL; @@ -186,7 +203,7 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc, if (class_set || name_set) { xmlNodePtr n, c; ObAppSettings *settings = config_create_app_settings();; - + if (name_set) settings->name = g_pattern_spec_new(name); @@ -207,45 +224,23 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc, if ((n = parse_find_node("position", app->children))) { if ((c = parse_find_node("x", n->children))) if (!parse_contains("default", doc, c)) { - gchar *s = parse_string(doc, c); - if (!strcmp(s, "center")) { - settings->center_x = TRUE; - x_pos_given = TRUE; - } else { - if (s[0] == '-') - settings->opposite_x = TRUE; - if (s[0] == '-' || s[0] == '+') - settings->position.x = atoi(s+1); - else - settings->position.x = atoi(s); - x_pos_given = TRUE; - } - g_free(s); + config_parse_gravity_coord(doc, c, + &settings->position.x); + x_pos_given = TRUE; } if (x_pos_given && (c = parse_find_node("y", n->children))) if (!parse_contains("default", doc, c)) { - gchar *s = parse_string(doc, c); - if (!strcmp(s, "center")) { - settings->center_y = TRUE; - settings->pos_given = TRUE; - } else { - if (s[0] == '-') - settings->opposite_y = TRUE; - if (s[0] == '-' || s[0] == '+') - settings->position.y = atoi(s+1); - else - settings->position.y = atoi(s); - settings->pos_given = TRUE; - } - g_free(s); + config_parse_gravity_coord(doc, c, + &settings->position.y); + settings->pos_given = TRUE; } if (settings->pos_given && (c = parse_find_node("monitor", n->children))) if (!parse_contains("default", doc, c)) { gchar *s = parse_string(doc, c); - if (!strcmp(s, "mouse")) + if (!g_ascii_strcasecmp(s, "mouse")) settings->monitor = 0; else settings->monitor = parse_int(doc, c) + 1; @@ -260,7 +255,7 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc, if ((n = parse_find_node("desktop", app->children))) { if (!parse_contains("default", doc, n)) { gchar *s = parse_string(doc, n); - if (!strcmp(s, "all")) + if (!g_ascii_strcasecmp(s, "all")) settings->desktop = DESKTOP_ALL; else { gint i = parse_int(doc, n); @@ -274,9 +269,9 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc, if ((n = parse_find_node("layer", app->children))) if (!parse_contains("default", doc, n)) { gchar *s = parse_string(doc, n); - if (!strcmp(s, "above")) + if (!g_ascii_strcasecmp(s, "above")) settings->layer = 1; - else if (!strcmp(s, "below")) + else if (!g_ascii_strcasecmp(s, "below")) settings->layer = -1; else settings->layer = 0; @@ -302,10 +297,10 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc, if ((n = parse_find_node("maximized", app->children))) if (!parse_contains("default", doc, n)) { gchar *s = parse_string(doc, n); - if (!strcmp(s, "horizontal")) { + if (!g_ascii_strcasecmp(s, "horizontal")) { settings->max_horz = TRUE; settings->max_vert = FALSE; - } else if (!strcmp(s, "vertical")) { + } else if (!g_ascii_strcasecmp(s, "vertical")) { settings->max_horz = FALSE; settings->max_vert = TRUE; } else @@ -316,14 +311,14 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc, config_per_app_settings = g_slist_append(config_per_app_settings, (gpointer) settings); + g_free(name); + g_free(class); + g_free(role); + name = class = role = NULL; } - + app = parse_find_node("application", app->next); } - - g_free(name); - g_free(class); - g_free(role); } /* @@ -359,7 +354,7 @@ static void parse_key(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, else if ((n = parse_find_node("action", node->children))) { while (n) { ObActionsAct *action; - + action = actions_parse(i, doc, n); if (action) keyboard_bind(keylist, action); @@ -375,7 +370,7 @@ static void parse_key(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, } static void parse_keyboard(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, - gpointer d) + gpointer data) { xmlNodePtr n; gchar *key; @@ -398,7 +393,7 @@ static void parse_keyboard(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, /* - + @@ -407,7 +402,7 @@ static void parse_keyboard(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, */ static void parse_mouse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, - gpointer d) + gpointer data) { xmlNodePtr n, nbut, nact; gchar *buttonstr; @@ -417,11 +412,13 @@ static void parse_mouse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, mouse_unbind_all(); node = node->children; - + if ((n = parse_find_node("dragThreshold", node))) config_mouse_threshold = parse_int(doc, n); if ((n = parse_find_node("doubleClickTime", node))) config_mouse_dclicktime = parse_int(doc, n); + if ((n = parse_find_node("screenEdgeWarpTime", node))) + config_mouse_screenedgetime = parse_int(doc, n); n = parse_find_node("context", node); while (n) { @@ -462,18 +459,18 @@ static void parse_mouse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, } static void parse_focus(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, - gpointer d) + gpointer data) { xmlNodePtr n; node = node->children; - + if ((n = parse_find_node("focusNew", node))) config_focus_new = parse_bool(doc, n); if ((n = parse_find_node("followMouse", node))) config_focus_follow = parse_bool(doc, n); if ((n = parse_find_node("focusDelay", node))) - config_focus_delay = parse_int(doc, n) * 1000; + config_focus_delay = parse_int(doc, n); if ((n = parse_find_node("raiseOnFocus", node))) config_focus_raise = parse_bool(doc, n); if ((n = parse_find_node("focusLast", node))) @@ -483,21 +480,40 @@ static void parse_focus(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, } static void parse_placement(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, - gpointer d) + gpointer data) { xmlNodePtr n; node = node->children; - + if ((n = parse_find_node("policy", node))) if (parse_contains("UnderMouse", doc, n)) config_place_policy = OB_PLACE_POLICY_MOUSE; if ((n = parse_find_node("center", node))) config_place_center = parse_bool(doc, n); + if ((n = parse_find_node("active", node))) + config_place_active = parse_bool(doc, n); +} + +static void parse_margins(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, + gpointer data) +{ + xmlNodePtr n; + + node = node->children; + + if ((n = parse_find_node("top", node))) + config_margins.top = MAX(0, parse_int(doc, n)); + if ((n = parse_find_node("left", node))) + config_margins.left = MAX(0, parse_int(doc, n)); + if ((n = parse_find_node("right", node))) + config_margins.right = MAX(0, parse_int(doc, n)); + if ((n = parse_find_node("bottom", node))) + config_margins.bottom = MAX(0, parse_int(doc, n)); } static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, - gpointer d) + gpointer data) { xmlNodePtr n; @@ -580,16 +596,16 @@ static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, } static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, - gpointer d) + gpointer data) { xmlNodePtr n; node = node->children; - + if ((n = parse_find_node("number", node))) { gint d = parse_int(doc, n); if (d > 0) - config_desktops_num = d; + config_desktops_num = (unsigned) d; } if ((n = parse_find_node("firstdesk", node))) { gint d = parse_int(doc, n); @@ -612,15 +628,17 @@ static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, nname = parse_find_node("name", nname->next); } } + if ((n = parse_find_node("popupTime", node))) + config_desktop_popup_time = parse_int(doc, n); } static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, - gpointer d) + gpointer data) { xmlNodePtr n; node = node->children; - + if ((n = parse_find_node("drawContents", node))) config_resize_redraw = parse_bool(doc, n); if ((n = parse_find_node("popupShow", node))) { @@ -633,16 +651,29 @@ static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, config_resize_popup_show = 1; } if ((n = parse_find_node("popupPosition", node))) { - config_resize_popup_pos = parse_int(doc, n); if (parse_contains("Top", doc, n)) - config_resize_popup_pos = 1; + config_resize_popup_pos = OB_RESIZE_POS_TOP; else if (parse_contains("Center", doc, n)) - config_resize_popup_pos = 0; + config_resize_popup_pos = OB_RESIZE_POS_CENTER; + else if (parse_contains("Fixed", doc, n)) { + config_resize_popup_pos = OB_RESIZE_POS_FIXED; + + if ((n = parse_find_node("popupFixedPosition", node))) { + xmlNodePtr n2; + + if ((n2 = parse_find_node("x", n->children))) + config_parse_gravity_coord(doc, n2, + &config_resize_popup_fixed.x); + if ((n2 = parse_find_node("y", n->children))) + config_parse_gravity_coord(doc, n2, + &config_resize_popup_fixed.y); + } + } } } static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, - gpointer d) + gpointer data) { xmlNodePtr n; @@ -702,9 +733,9 @@ static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, if ((n = parse_find_node("autoHide", node))) config_dock_hide = parse_bool(doc, n); if ((n = parse_find_node("hideDelay", node))) - config_dock_hide_delay = parse_int(doc, n) * 1000; + config_dock_hide_delay = parse_int(doc, n); if ((n = parse_find_node("showDelay", node))) - config_dock_show_delay = parse_int(doc, n) * 1000; + config_dock_show_delay = parse_int(doc, n); if ((n = parse_find_node("moveButton", node))) { gchar *str = parse_string(doc, n); guint b, s; @@ -719,7 +750,7 @@ static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, } static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, - gpointer d) + gpointer data) { xmlNodePtr n; for (node = node->children; node; node = node->next) { @@ -741,9 +772,9 @@ static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, config_menu_client_list_icons = parse_bool(doc, n); } } - -static void parse_resistance(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, - gpointer d) + +static void parse_resistance(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, + gpointer data) { xmlNodePtr n; @@ -760,6 +791,21 @@ typedef struct const gchar *actname; } ObDefKeyBind; +static void bind_default_keyboard(void) +{ + ObDefKeyBind *it; + ObDefKeyBind binds[] = { + { "A-Tab", "NextWindow" }, + { "S-A-Tab", "PreviousWindow" }, + { "A-F4", "Close" }, + { NULL, NULL } + }; + for (it = binds; it->key; ++it) { + GList *l = g_list_append(NULL, g_strdup(it->key)); + keyboard_bind(l, actions_parse_string(it->actname)); + } +} + typedef struct { const gchar *button; @@ -768,7 +814,7 @@ typedef struct const gchar *actname; } ObDefMouseBind; -static void bind_default_mouse() +static void bind_default_mouse(void) { ObDefMouseBind *it; ObDefMouseBind binds[] = { @@ -804,14 +850,18 @@ static void bind_default_mouse() { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK, "Raise" }, { "Left", "Shade", OB_MOUSE_ACTION_CLICK, "Raise" }, { "Left", "Close", OB_MOUSE_ACTION_CLICK, "Close" }, - { "Left", "Maximize", OB_MOUSE_ACTION_CLICK, "Maximize" }, + { "Left", "Maximize", OB_MOUSE_ACTION_CLICK, "ToggleMaximize" }, { "Left", "Iconify", OB_MOUSE_ACTION_CLICK, "Iconify" }, - { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK, "Omnipresent" }, - { "Left", "Shade", OB_MOUSE_ACTION_CLICK, "Shade" }, + { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK, "ToggleOmnipresent" }, + { "Left", "Shade", OB_MOUSE_ACTION_CLICK, "ToggleShade" }, { "Left", "TLCorner", OB_MOUSE_ACTION_MOTION, "Resize" }, { "Left", "TRCorner", OB_MOUSE_ACTION_MOTION, "Resize" }, { "Left", "BLCorner", OB_MOUSE_ACTION_MOTION, "Resize" }, { "Left", "BRCorner", OB_MOUSE_ACTION_MOTION, "Resize" }, + { "Left", "Top", OB_MOUSE_ACTION_MOTION, "Resize" }, + { "Left", "Bottom", OB_MOUSE_ACTION_MOTION, "Resize" }, + { "Left", "Left", OB_MOUSE_ACTION_MOTION, "Resize" }, + { "Left", "Right", OB_MOUSE_ACTION_MOTION, "Resize" }, { "Left", "Titlebar", OB_MOUSE_ACTION_MOTION, "Move" }, { "A-Left", "Frame", OB_MOUSE_ACTION_MOTION, "Move" }, { "A-Middle", "Frame", OB_MOUSE_ACTION_MOTION, "Resize" }, @@ -836,9 +886,14 @@ void config_startup(ObParseInst *i) config_place_policy = OB_PLACE_POLICY_SMART; config_place_center = TRUE; + config_place_active = FALSE; parse_register(i, "placement", parse_placement, NULL); + STRUT_PARTIAL_SET(config_margins, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + + parse_register(i, "margins", parse_margins, NULL); + config_theme = NULL; config_animate_iconify = TRUE; @@ -855,13 +910,15 @@ void config_startup(ObParseInst *i) config_desktops_num = 4; config_screen_firstdesk = 1; config_desktops_names = NULL; + config_desktop_popup_time = 875; parse_register(i, "desktops", parse_desktops, NULL); config_resize_redraw = TRUE; - config_resize_four_corners = FALSE; config_resize_popup_show = 1; /* nonpixel increments */ - config_resize_popup_pos = 0; /* center of client */ + config_resize_popup_pos = OB_RESIZE_POS_CENTER; + GRAVITY_COORD_SET(config_resize_popup_fixed.x, 0, FALSE, FALSE); + GRAVITY_COORD_SET(config_resize_popup_fixed.y, 0, FALSE, FALSE); parse_register(i, "resize", parse_resize, NULL); @@ -883,10 +940,13 @@ void config_startup(ObParseInst *i) translate_key("C-g", &config_keyboard_reset_state, &config_keyboard_reset_keycode); + bind_default_keyboard(); + parse_register(i, "keyboard", parse_keyboard, NULL); config_mouse_threshold = 8; config_mouse_dclicktime = 200; + config_mouse_screenedgetime = 400; bind_default_mouse(); @@ -910,7 +970,7 @@ void config_startup(ObParseInst *i) parse_register(i, "applications", parse_per_app_settings, NULL); } -void config_shutdown() +void config_shutdown(void) { GSList *it; @@ -922,6 +982,7 @@ void config_shutdown() RrFontClose(config_font_inactivewindow); RrFontClose(config_font_menuitem); RrFontClose(config_font_menutitle); + RrFontClose(config_font_osd); for (it = config_desktops_names; it; it = g_slist_next(it)) g_free(it->data);