- /* startup the parsing so everything can register sections of the rc */
- parse_startup();
-
- /* anything that is going to read data from the rc file needs to be
- in this group */
- timer_startup();
- event_startup();
- grab_startup();
- /* focus_backup is used for stacking, so this needs to come before
- anything that calls stacking_add */
- focus_startup();
- window_startup();
- plugin_startup();
- /* load the plugins specified in the pluginrc */
- plugin_loadall();
-
- /* set up the kernel config shit */
- config_startup();
- menu_startup();
- /* parse/load user options */
- if (parse_load_rc(&doc, &node))
- parse_tree(doc, node->xmlChildrenNode, NULL);
- /* we're done with parsing now, kill it */
- parse_shutdown();
-
- /* load the theme specified in the rc file */
- ob_rr_theme = RrThemeNew(ob_rr_inst, config_theme);
- if (ob_rr_theme == NULL)
- exit_with_error("Unable to load a theme.");
-
- frame_startup();
- moveresize_startup();
- screen_startup();
- group_startup();
- client_startup();
- dock_startup();
-
- /* call startup for all the plugins */
- plugin_startall();
-
- /* get all the existing windows */
- client_manage_all();
-
- ob_state = State_Running;
- while (!ob_shutdown)
- event_loop();
- ob_state = State_Exiting;
-
- dock_remove_all();
- client_unmanage_all();
-
- plugin_shutdown(); /* calls all the plugins' shutdown functions */
- dock_shutdown();
- client_shutdown();
- group_shutdown();
- screen_shutdown();
- focus_shutdown();
- moveresize_shutdown();
- frame_shutdown();
- menu_shutdown();
- window_shutdown();
- grab_shutdown();
- event_shutdown();
- timer_shutdown();
- config_shutdown();
+ do {
+ modkeys_startup(reconfigure);
+
+ /* get the keycodes for keys we use */
+ keys[OB_KEY_RETURN] = modkeys_sym_to_code(XK_Return);
+ keys[OB_KEY_ESCAPE] = modkeys_sym_to_code(XK_Escape);
+ keys[OB_KEY_LEFT] = modkeys_sym_to_code(XK_Left);
+ keys[OB_KEY_RIGHT] = modkeys_sym_to_code(XK_Right);
+ keys[OB_KEY_UP] = modkeys_sym_to_code(XK_Up);
+ keys[OB_KEY_DOWN] = modkeys_sym_to_code(XK_Down);
+
+ {
+ ObParseInst *i;
+ xmlDocPtr doc;
+ xmlNodePtr node;
+
+ /* startup the parsing so everything can register sections
+ of the rc */
+ i = parse_startup();
+
+ /* start up config which sets up with the parser */
+ config_startup(i);
+
+ /* parse/load user options */
+ if (parse_load_rc(NULL, &doc, &node)) {
+ parse_tree(i, doc, node->xmlChildrenNode);
+ parse_close(doc);
+ } else
+ g_message(_("Unable to find a valid config file, using some simple defaults"));
+
+/*
+ if (config_type != NULL)
+ PROP_SETS(RootWindow(ob_display, ob_screen),
+ ob_config, config_type);
+*/
+
+ /* we're done with parsing now, kill it */
+ parse_shutdown(i);
+ }
+
+ /* load the theme specified in the rc file */
+ {
+ RrTheme *theme;
+ if ((theme = RrThemeNew(ob_rr_inst, config_theme,
+ config_font_activewindow,
+ config_font_inactivewindow,
+ config_font_menutitle,
+ config_font_menuitem,
+ config_font_osd)))
+ {
+ RrThemeFree(ob_rr_theme);
+ ob_rr_theme = theme;
+ }
+ if (ob_rr_theme == NULL)
+ ob_exit_with_error(_("Unable to load a theme."));
+ }
+
+ if (reconfigure) {
+ GList *it;
+
+ /* update all existing windows for the new theme */
+ for (it = client_list; it; it = g_list_next(it)) {
+ ObClient *c = it->data;
+ frame_adjust_theme(c->frame);
+ }
+ }
+ event_startup(reconfigure);
+ /* focus_backup is used for stacking, so this needs to come before
+ anything that calls stacking_add */
+ focus_startup(reconfigure);
+ window_startup(reconfigure);
+ sn_startup(reconfigure);
+ screen_startup(reconfigure);
+ grab_startup(reconfigure);
+ propwin_startup(reconfigure);
+ group_startup(reconfigure);
+ client_startup(reconfigure);
+ dock_startup(reconfigure);
+ moveresize_startup(reconfigure);
+ keyboard_startup(reconfigure);
+ mouse_startup(reconfigure);
+ menu_startup(reconfigure);
+ menu_frame_startup(reconfigure);
+
+ if (!reconfigure) {
+ guint32 xid;
+ ObWindow *w;
+
+ /* get all the existing windows */
+ client_manage_all();
+ focus_nothing();
+
+ /* focus what was focused if a wm was already running */
+ if (PROP_GET32(RootWindow(ob_display, ob_screen),
+ net_active_window, window, &xid) &&
+ (w = g_hash_table_lookup(window_map, &xid)) &&
+ WINDOW_IS_CLIENT(w))
+ {
+ client_focus(WINDOW_AS_CLIENT(w));
+ }
+ } else {
+ GList *it;
+
+ /* redecorate all existing windows */
+ for (it = client_list; it; it = g_list_next(it)) {
+ ObClient *c = it->data;
+ /* the new config can change the window's decorations */
+ client_setup_decor_and_functions(c);
+ /* redraw the frames */
+ frame_adjust_area(c->frame, TRUE, TRUE, FALSE);
+ }
+ }
+
+ reconfigure = FALSE;
+
+ state = OB_STATE_RUNNING;
+ ob_main_loop_run(ob_main_loop);
+ state = OB_STATE_EXITING;
+
+ if (!reconfigure) {
+ dock_remove_all();
+ client_unmanage_all();
+ }
+
+ menu_frame_shutdown(reconfigure);
+ menu_shutdown(reconfigure);
+ mouse_shutdown(reconfigure);
+ keyboard_shutdown(reconfigure);
+ moveresize_shutdown(reconfigure);
+ dock_shutdown(reconfigure);
+ client_shutdown(reconfigure);
+ group_shutdown(reconfigure);
+ propwin_shutdown(reconfigure);
+ grab_shutdown(reconfigure);
+ screen_shutdown(reconfigure);
+ focus_shutdown(reconfigure);
+ sn_shutdown(reconfigure);
+ window_shutdown(reconfigure);
+ event_shutdown(reconfigure);
+ config_shutdown();
+ modkeys_shutdown(reconfigure);
+ } while (reconfigure);