add obt_parse_tree_from_root and use it, cuz it's nice
[dana/openbox.git] / openbox / openbox.c
index c768bdf..92d0bbf 100644 (file)
 #include "openbox.h"
 #include "session.h"
 #include "dock.h"
-#include "modkeys.h"
 #include "event.h"
 #include "menu.h"
 #include "client.h"
-#include "xerror.h"
-#include "prop.h"
 #include "screen.h"
 #include "actions.h"
 #include "startupnotify.h"
@@ -38,7 +35,6 @@
 #include "frame.h"
 #include "keyboard.h"
 #include "mouse.h"
-#include "extensions.h"
 #include "menuframe.h"
 #include "grab.h"
 #include "group.h"
 #include "ping.h"
 #include "mainloop.h"
 #include "gettext.h"
-#include "parser/parse.h"
 #include "render/render.h"
 #include "render/theme.h"
-#include "obt/obt.h"
+#include "obt/display.h"
+#include "obt/prop.h"
+#include "obt/keyboard.h"
+#include "obt/parse.h"
 
 #ifdef HAVE_FCNTL_H
 #  include <fcntl.h>
 #include <X11/Xlib.h>
 #include <X11/keysym.h>
 
-ObtInstance *obt_inst;
 RrInstance  *ob_rr_inst;
 RrTheme     *ob_rr_theme;
-ObMainLoop  *ob_main_loop;
-Display     *ob_display;
+ObtMainLoop *ob_main_loop;
 gint         ob_screen;
 gboolean     ob_replace_wm = FALSE;
 gboolean     ob_sm_use = TRUE;
@@ -145,41 +141,37 @@ gint main(gint argc, gchar **argv)
         session_startup(argc, argv);
     }
 
-    obt_inst = obt_instance_new(NULL);
-    if (obt_inst == NULL)
+    if (!obt_display_open(NULL))
         ob_exit_with_error(_("Failed to open the display from the DISPLAY environment variable."));
-    ob_display = obt_display(obt_inst);
 
     if (remote_control) {
-        prop_startup();
-
         /* Send client message telling the OB process to:
          * remote_control = 1 -> reconfigure
          * remote_control = 2 -> restart */
-        PROP_MSG(RootWindow(ob_display, ob_screen),
-                 ob_control, remote_control, 0, 0, 0);
-        obt_instance_unref(obt_inst);
+        OBT_PROP_MSG(ob_screen, RootWindow(obt_display, ob_screen),
+                     OB_CONTROL, remote_control, 0, 0, 0, 0);
+        obt_display_close(obt_display);
         exit(EXIT_SUCCESS);
     }
 
-    ob_main_loop = ob_main_loop_new(ob_display);
+    ob_main_loop = obt_main_loop_new(obt_display);
 
     /* set up signal handler */
-    ob_main_loop_signal_add(ob_main_loop, SIGUSR1, signal_handler, NULL, NULL);
-    ob_main_loop_signal_add(ob_main_loop, SIGUSR2, signal_handler, NULL, NULL);
-    ob_main_loop_signal_add(ob_main_loop, SIGTERM, signal_handler, NULL, NULL);
-    ob_main_loop_signal_add(ob_main_loop, SIGINT, signal_handler, NULL, NULL);
-    ob_main_loop_signal_add(ob_main_loop, SIGHUP, signal_handler, NULL, NULL);
-    ob_main_loop_signal_add(ob_main_loop, SIGPIPE, signal_handler, NULL, NULL);
-    ob_main_loop_signal_add(ob_main_loop, SIGCHLD, signal_handler, NULL, NULL);
+    obt_main_loop_signal_add(ob_main_loop, SIGUSR1, signal_handler, NULL,NULL);
+    obt_main_loop_signal_add(ob_main_loop, SIGUSR2, signal_handler, NULL,NULL);
+    obt_main_loop_signal_add(ob_main_loop, SIGTERM, signal_handler, NULL,NULL);
+    obt_main_loop_signal_add(ob_main_loop, SIGINT, signal_handler,  NULL,NULL);
+    obt_main_loop_signal_add(ob_main_loop, SIGHUP, signal_handler,  NULL,NULL);
+    obt_main_loop_signal_add(ob_main_loop, SIGPIPE, signal_handler, NULL,NULL);
+    obt_main_loop_signal_add(ob_main_loop, SIGCHLD, signal_handler, NULL,NULL);
 
-    ob_screen = DefaultScreen(ob_display);
+    ob_screen = DefaultScreen(obt_display);
 
-    ob_rr_inst = RrInstanceNew(ob_display, ob_screen);
+    ob_rr_inst = RrInstanceNew(obt_display, ob_screen);
     if (ob_rr_inst == NULL)
         ob_exit_with_error(_("Failed to initialize the obrender library."));
 
-    XSynchronize(ob_display, xsync);
+    XSynchronize(obt_display, xsync);
 
     /* check for locale support */
     if (!XSupportsLocale())
@@ -187,12 +179,9 @@ gint main(gint argc, gchar **argv)
     if (!XSetLocaleModifiers(""))
         g_message(_("Cannot set locale modifiers for the X server."));
 
-    /* set our error handler */
-    XSetErrorHandler(xerror_handler);
-
     /* set the DISPLAY environment variable for any lauched children, to the
        display we're using, so they open in the right place. */
-    putenv(g_strdup_printf("DISPLAY=%s", DisplayString(ob_display)));
+    putenv(g_strdup_printf("DISPLAY=%s", DisplayString(obt_display)));
 
     /* create available cursors */
     cursors[OB_CURSOR_NONE] = None;
@@ -213,30 +202,24 @@ gint main(gint argc, gchar **argv)
     cursors[OB_CURSOR_NORTHWEST] = load_cursor("top_left_corner",
                                                XC_top_left_corner);
 
-
-    prop_startup(); /* get atoms values for the display */
-    extensions_query_all(); /* find which extensions are present */
-
     if (screen_annex()) { /* it will be ours! */
         do {
-            modkeys_startup(reconfigure);
+            if (reconfigure) obt_keyboard_reload();
 
             /* 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);
+            keys[OB_KEY_RETURN] = obt_keyboard_keysym_to_keycode(XK_Return);
+            keys[OB_KEY_ESCAPE] = obt_keyboard_keysym_to_keycode(XK_Escape);
+            keys[OB_KEY_LEFT] = obt_keyboard_keysym_to_keycode(XK_Left);
+            keys[OB_KEY_RIGHT] = obt_keyboard_keysym_to_keycode(XK_Right);
+            keys[OB_KEY_UP] = obt_keyboard_keysym_to_keycode(XK_Up);
+            keys[OB_KEY_DOWN] = obt_keyboard_keysym_to_keycode(XK_Down);
 
             {
-                ObParseInst *i;
-                xmlDocPtr doc;
-                xmlNodePtr node;
+                ObtParseInst *i;
 
                 /* startup the parsing so everything can register sections
                    of the rc */
-                i = parse_startup();
+                i = obt_parse_instance_new();
 
                 /* register all the available actions */
                 actions_startup(reconfigure);
@@ -244,20 +227,22 @@ gint main(gint argc, gchar **argv)
                 config_startup(i);
 
                 /* parse/load user options */
-                if (parse_load_rc(NULL, &doc, &node)) {
-                    parse_tree(i, doc, node->xmlChildrenNode);
-                    parse_close(doc);
+                if (obt_parse_load_config_file(i, "openbox", "rc.xml",
+                                               "openbox_config"))
+                {
+                    obt_parse_tree_from_root(i);
+                    obt_parse_close(i);
                 } 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),
+                    PROP_SETS(RootWindow(obt_display, ob_screen),
                               ob_config, config_type);
 */
 
                 /* we're done with parsing now, kill it */
-                parse_shutdown(i);
+                obt_parse_instance_unref(i);
             }
 
             /* load the theme specified in the rc file */
@@ -276,8 +261,8 @@ gint main(gint argc, gchar **argv)
                 if (ob_rr_theme == NULL)
                     ob_exit_with_error(_("Unable to load a theme."));
 
-                PROP_SETS(RootWindow(ob_display, ob_screen),
-                          ob_theme, ob_rr_theme->name);
+                OBT_PROP_SETS(RootWindow(obt_display, ob_screen),
+                              OB_THEME, utf8, ob_rr_theme->name);
             }
 
             if (reconfigure) {
@@ -319,8 +304,8 @@ gint main(gint argc, gchar **argv)
                 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) &&
+                if (OBT_PROP_GET32(RootWindow(obt_display, ob_screen),
+                                   NET_ACTIVE_WINDOW, WINDOW, &xid) &&
                     (w = g_hash_table_lookup(window_map, &xid)) &&
                     WINDOW_IS_CLIENT(w))
                 {
@@ -346,7 +331,7 @@ gint main(gint argc, gchar **argv)
             reconfigure = FALSE;
 
             state = OB_STATE_RUNNING;
-            ob_main_loop_run(ob_main_loop);
+            obt_main_loop_run(ob_main_loop);
             state = OB_STATE_EXITING;
 
             if (!reconfigure) {
@@ -374,18 +359,17 @@ gint main(gint argc, gchar **argv)
             event_shutdown(reconfigure);
             config_shutdown();
             actions_shutdown(reconfigure);
-            modkeys_shutdown(reconfigure);
         } while (reconfigure);
     }
 
-    XSync(ob_display, FALSE);
+    XSync(obt_display, FALSE);
 
     RrThemeFree(ob_rr_theme);
     RrInstanceFree(ob_rr_inst);
 
     session_shutdown(being_replaced);
 
-    obt_instance_unref(obt_inst);
+    obt_display_close(obt_display);
 
     parse_paths_shutdown();
 
@@ -611,10 +595,10 @@ static Cursor load_cursor(const gchar *name, guint fontval)
     Cursor c = None;
 
 #if USE_XCURSOR
-    c = XcursorLibraryLoadCursor(ob_display, name);
+    c = XcursorLibraryLoadCursor(obt_display, name);
 #endif
     if (c == None)
-        c = XCreateFontCursor(ob_display, fontval);
+        c = XCreateFontCursor(obt_display, fontval);
     return c;
 }
 
@@ -646,14 +630,14 @@ void ob_reconfigure()
 void ob_exit(gint code)
 {
     exitcode = code;
-    ob_main_loop_exit(ob_main_loop);
+    obt_main_loop_exit(ob_main_loop);
 }
 
 void ob_exit_replace()
 {
     exitcode = 0;
     being_replaced = TRUE;
-    ob_main_loop_exit(ob_main_loop);
+    obt_main_loop_exit(ob_main_loop);
 }
 
 Cursor ob_cursor(ObCursor cursor)