From: Dana Jansens Date: Mon, 8 Aug 2011 22:01:13 +0000 (-0400) Subject: Load and save the focus and placement stuff from the cache config file X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=53c7a0fcee8b34aec94220841b983d8996b50eb5;p=dana%2Fopenbox.git Load and save the focus and placement stuff from the cache config file --- diff --git a/openbox/config.c b/openbox/config.c index 5f4d9c1e..c51d3e65 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -533,56 +533,6 @@ static void parse_context(xmlNodePtr n, gpointer d) g_free(cxstr); } -static void parse_focus(xmlNodePtr node, gpointer d) -{ - xmlNodePtr n; - - node = node->children; - - if ((n = obt_xml_find_sibling(node, "focusNew"))) - config_focus_new = obt_xml_node_bool(n); - if ((n = obt_xml_find_sibling(node, "followMouse"))) - config_focus_follow = obt_xml_node_bool(n); - if ((n = obt_xml_find_sibling(node, "focusDelay"))) - config_focus_delay = obt_xml_node_int(n); - if ((n = obt_xml_find_sibling(node, "raiseOnFocus"))) - config_focus_raise = obt_xml_node_bool(n); - if ((n = obt_xml_find_sibling(node, "focusLast"))) - config_focus_last = obt_xml_node_bool(n); - if ((n = obt_xml_find_sibling(node, "underMouse"))) - config_focus_under_mouse = obt_xml_node_bool(n); - if ((n = obt_xml_find_sibling(node, "unfocusOnLeave"))) - config_unfocus_leave = obt_xml_node_bool(n); -} - -static void parse_placement(xmlNodePtr node, gpointer d) -{ - xmlNodePtr n; - - node = node->children; - - if ((n = obt_xml_find_sibling(node, "policy"))) - if (obt_xml_node_contains(n, "UnderMouse")) - config_place_policy = OB_PLACE_POLICY_MOUSE; - if ((n = obt_xml_find_sibling(node, "center"))) - config_place_center = obt_xml_node_bool(n); - if ((n = obt_xml_find_sibling(node, "monitor"))) { - if (obt_xml_node_contains(n, "active")) - 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_sibling(node, "primaryMonitor"))) { - config_primary_monitor_index = obt_xml_node_int(n); - if (!config_primary_monitor_index) { - if (obt_xml_node_contains(n, "mouse")) - config_primary_monitor = OB_PLACE_MONITOR_MOUSE; - } - } -} - static void parse_margins(xmlNodePtr node, gpointer d) { xmlNodePtr n; @@ -1001,59 +951,101 @@ static void bind_default_mouse(void) action_parser_unref(p); } +static ObtXmlInst *config_inst = NULL; + void config_startup() { } -enum ObConfigType { - CONFIG_FILE, - CACHE_FILE -}; - -static gboolean load_file(ObtXmlInst *i, enum ObConfigType type, - const gchar *domain, const gchar *file) +void config_shutdown(void) { - gboolean load = FALSE; - - switch (type) { - case CONFIG_FILE: - load = obt_xml_load_config_file(i, domain, file, file); - break; - case CACHE_FILE: - load = obt_xml_load_cache_file(i, domain, file, file); - break; - } + GSList *it; - return load; -} + g_free(config_theme); -gboolean config_load_config(void) -{ - ObtXmlInst *i = obt_xml_instance_new(); - gboolean ok; + g_free(config_title_layout); - config_focus_new = TRUE; - config_focus_follow = FALSE; - config_focus_delay = 0; - config_focus_raise = FALSE; - config_focus_last = TRUE; - config_focus_under_mouse = FALSE; - config_unfocus_leave = FALSE; + RrFontClose(config_font_activewindow); + RrFontClose(config_font_inactivewindow); + RrFontClose(config_font_menuitem); + RrFontClose(config_font_menutitle); + RrFontClose(config_font_activeosd); + RrFontClose(config_font_inactiveosd); - obt_xml_register(i, "focus", parse_focus, NULL); + for (it = config_desktops_names; it; it = g_slist_next(it)) + g_free(it->data); + g_slist_free(config_desktops_names); + + for (it = config_menu_files; it; it = g_slist_next(it)) + g_free(it->data); + g_slist_free(config_menu_files); - config_place_policy = OB_PLACE_POLICY_SMART; - config_place_center = TRUE; - config_place_monitor = OB_PLACE_MONITOR_PRIMARY; + for (it = config_per_app_settings; it; it = g_slist_next(it)) { + 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_slice_free(ObAppSettings, it->data); + } + g_slist_free(config_per_app_settings); +} - config_primary_monitor_index = 1; - config_primary_monitor = OB_PLACE_MONITOR_ACTIVE; +void config_load_config(void) +{ + xmlNodePtr n, root, e; + gboolean ok; - obt_xml_register(i, "placement", parse_placement, NULL); + config_inst = obt_xml_instance_new(); + ok = obt_xml_load_cache_file(config_inst, "openbox", "config", "config"); + root = obt_xml_root(config_inst); + + n = obt_xml_path_get_node(root, "focus", ""); + config_focus_new = obt_xml_path_bool(n, "focusNew", "yes"); + config_focus_follow = obt_xml_path_bool(n, "followMouse", "no"); + config_focus_delay = obt_xml_path_int(n, "focusDelay", "0"); + config_focus_raise = obt_xml_path_bool(n, "raiseOnFocus", "no"); + config_focus_last = obt_xml_path_bool(n, "focusLast", "yes"); + config_focus_under_mouse = obt_xml_path_bool(n, "underMouse", "no"); + config_unfocus_leave = obt_xml_path_bool(n, "unfocusOnLeave", "no"); + + n = obt_xml_path_get_node(root, "placement", ""); + e = obt_xml_path_get_node(n, "policy", "smart"); + if (obt_xml_node_contains(e, "smart")) + config_place_policy = OB_PLACE_POLICY_SMART; + else if (obt_xml_node_contains(e, "undermouse")) + config_place_policy = OB_PLACE_POLICY_MOUSE; + else + config_place_policy = OB_PLACE_POLICY_SMART; + config_place_center = obt_xml_path_bool(n, "center", "true"); + e = obt_xml_path_get_node(n, "monitor", "primary"); + if (obt_xml_node_contains(e, "primary")) + config_place_monitor = OB_PLACE_MONITOR_PRIMARY; + else if (obt_xml_node_contains(e, "active")) + config_place_monitor = OB_PLACE_MONITOR_ACTIVE; + else if (obt_xml_node_contains(e, "mouse")) + config_place_monitor = OB_PLACE_MONITOR_MOUSE; + else if (obt_xml_node_contains(e, "any")) + config_place_monitor = OB_PLACE_MONITOR_ANY; + else + config_place_monitor = OB_PLACE_MONITOR_PRIMARY; + e = obt_xml_path_get_node(n, "primaryMonitor", "1"); + if (obt_xml_node_contains(e, "active")) { + config_primary_monitor = OB_PLACE_MONITOR_ACTIVE; + config_primary_monitor_index = 1; + } + else if (obt_xml_node_contains(e, "mouse")) { + config_primary_monitor = OB_PLACE_MONITOR_MOUSE; + config_primary_monitor_index = 1; + } + else { + config_primary_monitor = OB_PLACE_MONITOR_ACTIVE; + config_primary_monitor_index = obt_xml_node_int(e); + } STRUT_PARTIAL_SET(config_margins, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - obt_xml_register(i, "margins", parse_margins, NULL); + obt_xml_register(config_inst, "margins", parse_margins, NULL); config_theme = NULL; @@ -1069,14 +1061,14 @@ gboolean config_load_config(void) config_font_activeosd = NULL; config_font_inactiveosd = NULL; - obt_xml_register(i, "theme", parse_theme, NULL); + obt_xml_register(config_inst, "theme", parse_theme, NULL); config_desktops_num = 4; config_screen_firstdesk = 1; config_desktops_names = NULL; config_desktop_popup_time = 875; - obt_xml_register(i, "desktops", parse_desktops, NULL); + obt_xml_register(config_inst, "desktops", parse_desktops, NULL); config_resize_redraw = TRUE; config_resize_popup_show = 1; /* nonpixel increments */ @@ -1084,7 +1076,7 @@ gboolean config_load_config(void) GRAVITY_COORD_SET(config_resize_popup_fixed.x, 0, FALSE, FALSE); GRAVITY_COORD_SET(config_resize_popup_fixed.y, 0, FALSE, FALSE); - obt_xml_register(i, "resize", parse_resize, NULL); + obt_xml_register(config_inst, "resize", parse_resize, NULL); config_dock_layer = OB_STACKING_LAYER_ABOVE; config_dock_pos = OB_DIRECTION_NORTHEAST; @@ -1099,24 +1091,24 @@ gboolean config_load_config(void) config_dock_app_move_button = 2; /* middle */ config_dock_app_move_modifiers = 0; - obt_xml_register(i, "dock", parse_dock, NULL); + obt_xml_register(config_inst, "dock", parse_dock, NULL); translate_key("C-g", &config_keyboard_reset_state, &config_keyboard_reset_keycode); - obt_xml_register(i, "keyboard", parse_keyboard, NULL); + obt_xml_register(config_inst, "keyboard", parse_keyboard, NULL); config_mouse_threshold = 8; config_mouse_dclicktime = 200; config_mouse_screenedgetime = 400; config_mouse_screenedgewarp = FALSE; - obt_xml_register(i, "mouse", parse_mouse, NULL); + obt_xml_register(config_inst, "mouse", parse_mouse, NULL); config_resist_win = 10; config_resist_edge = 20; - obt_xml_register(i, "resistance", parse_resistance, NULL); + obt_xml_register(config_inst, "resistance", parse_resistance, NULL); config_menu_hide_delay = 250; config_menu_middle = FALSE; @@ -1126,15 +1118,63 @@ gboolean config_load_config(void) config_menu_files = NULL; config_menu_show_icons = TRUE; - obt_xml_register(i, "menu", parse_menu, NULL); + obt_xml_register(config_inst, "menu", parse_menu, NULL); + - ok = load_file(i, CACHE_FILE, "openbox", "config"); if (ok) { - obt_xml_tree_from_root(i); - obt_xml_close(i); + obt_xml_tree_from_root(config_inst); + obt_xml_close(config_inst); } - obt_xml_instance_unref(i); - return ok; +} + +void config_save_config(void) +{ + xmlNodePtr n, root; + const gchar *e; + + root = obt_xml_root(config_inst); + + n = obt_xml_path_get_node(root, "focus", ""); + obt_xml_path_set_bool(n, "focusNew", config_focus_new); + obt_xml_path_set_bool(n, "followMouse", config_focus_follow); + obt_xml_path_set_int(n, "focusDelay", config_focus_delay); + obt_xml_path_set_bool(n, "raiseOnFocus", config_focus_raise); + obt_xml_path_set_bool(n, "focusLast", config_focus_last); + obt_xml_path_set_bool(n, "underMouse", config_focus_under_mouse); + obt_xml_path_set_bool(n, "unfocusOnLeave", config_unfocus_leave); + + n = obt_xml_path_get_node(root, "placement", ""); + switch (config_place_policy) { + case OB_PLACE_POLICY_SMART: e = "smart"; break; + case OB_PLACE_POLICY_MOUSE: e = "mouse"; break; + } + obt_xml_path_set_string(n, "policy", e); + obt_xml_path_set_bool(n, "center", config_place_center); + switch (config_place_monitor) { + case OB_PLACE_MONITOR_PRIMARY: e = "primary"; break; + case OB_PLACE_MONITOR_ACTIVE: e = "active"; break; + case OB_PLACE_MONITOR_MOUSE: e = "mouse"; break; + case OB_PLACE_MONITOR_ANY: e = "any"; break; + } + obt_xml_path_set_string(n, "monitor", e); + if (config_primary_monitor_index) + obt_xml_path_set_int( + n, "primaryMonitor", config_primary_monitor_index); + else { + switch (config_primary_monitor) { + case OB_PLACE_MONITOR_ACTIVE: e = "active"; break; + case OB_PLACE_MONITOR_MOUSE: e = "mouse"; break; + case OB_PLACE_MONITOR_PRIMARY: + case OB_PLACE_MONITOR_ANY: g_assert_not_reached(); + } + obt_xml_path_set_string(n, "primaryMonitor", e); + } + + + if (!obt_xml_save_cache_file(config_inst, "openbox", "config", TRUE)) + g_warning("Unable to save configuration in XDG cache directory."); + obt_xml_instance_unref(config_inst); + config_inst = NULL; } gboolean config_load_keys(void) @@ -1142,7 +1182,7 @@ gboolean config_load_keys(void) ObtXmlInst *i = obt_xml_instance_new(); gboolean ok; - ok = load_file(i, CONFIG_FILE, "openbox", "keys"); + ok = obt_xml_load_config_file(i, "openbox", "keys", "keys"); if (!ok) bind_default_keyboard(); else { @@ -1166,7 +1206,7 @@ gboolean config_load_mouse(void) obt_xml_register(i, "context", parse_context, NULL); - ok = load_file(i, CONFIG_FILE, "openbox", "mouse"); + ok = obt_xml_load_config_file(i, "openbox", "mouse", "mouse"); if (!ok) bind_default_mouse(); else { @@ -1185,7 +1225,8 @@ gboolean config_load_windows(void) config_per_app_settings = NULL; obt_xml_register(i, "applications", parse_per_app_settings, NULL); - ok = load_file(i, CONFIG_FILE, "openbox", "applications"); + ok = obt_xml_load_config_file( + i, "openbox", "applications", "applications"); if (ok) { obt_xml_tree_from_root(i); obt_xml_close(i); @@ -1193,37 +1234,3 @@ gboolean config_load_windows(void) obt_xml_instance_unref(i); return ok; } - -void config_shutdown(void) -{ - GSList *it; - - g_free(config_theme); - - g_free(config_title_layout); - - RrFontClose(config_font_activewindow); - RrFontClose(config_font_inactivewindow); - RrFontClose(config_font_menuitem); - RrFontClose(config_font_menutitle); - RrFontClose(config_font_activeosd); - RrFontClose(config_font_inactiveosd); - - for (it = config_desktops_names; it; it = g_slist_next(it)) - g_free(it->data); - g_slist_free(config_desktops_names); - - for (it = config_menu_files; it; it = g_slist_next(it)) - g_free(it->data); - g_slist_free(config_menu_files); - - for (it = config_per_app_settings; it; it = g_slist_next(it)) { - 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_slice_free(ObAppSettings, it->data); - } - g_slist_free(config_per_app_settings); -} diff --git a/openbox/config.h b/openbox/config.h index aef0f06b..2ce646eb 100644 --- a/openbox/config.h +++ b/openbox/config.h @@ -209,7 +209,9 @@ extern GSList *config_per_app_settings; void config_startup(void); void config_shutdown(void); -gboolean config_load_config(void); +void config_load_config(void); +void config_save_config(void); + gboolean config_load_keys(void); gboolean config_load_mouse(void); gboolean config_load_windows(void); diff --git a/openbox/openbox.c b/openbox/openbox.c index 8cd9c878..d61a2179 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -362,6 +362,8 @@ gint main(gint argc, gchar **argv) xmlprompt = NULL; } + config_save_config(); + if (!reconfigure) window_unmanage_all();