No \n on ob_debug in this branch.
[dana/openbox.git] / openbox / openbox.c
index 012666d..5be4e78 100644 (file)
@@ -42,6 +42,7 @@
 #include "config.h"
 #include "ping.h"
 #include "prompt.h"
+#include "hooks.h"
 #include "gettext.h"
 #include "render/render.h"
 #include "render/theme.h"
@@ -117,7 +118,7 @@ gint main(gint argc, gchar **argv)
 {
     gchar *program_name;
 
-    state = OB_STATE_STARTING;
+    ob_set_state(OB_STATE_STARTING);
 
     ob_debug_startup();
 
@@ -128,6 +129,10 @@ gint main(gint argc, gchar **argv)
     bind_textdomain_codeset(PACKAGE_NAME, "UTF-8");
     textdomain(PACKAGE_NAME);
 
+    if (chdir(g_get_home_dir()) == -1)
+        g_message(_("Unable to change to home directory \"%s\": %s"),
+                  g_get_home_dir(), g_strerror(errno));
+
     /* parse the command line args, which can change the argv[0] */
     parse_args(&argc, argv);
     /* parse the environment variables */
@@ -207,6 +212,8 @@ gint main(gint argc, gchar **argv)
 
     if (screen_annex()) { /* it will be ours! */
         do {
+            ObPrompt *xmlprompt = NULL;
+
             if (reconfigure) obt_keyboard_reload();
 
             /* get the keycodes for keys we use */
@@ -228,6 +235,7 @@ gint main(gint argc, gchar **argv)
 
                 /* register all the available actions */
                 actions_startup(reconfigure);
+                hooks_startup(reconfigure);
                 /* start up config which sets up with the parser */
                 config_startup(i);
 
@@ -302,7 +310,6 @@ gint main(gint argc, gchar **argv)
             grab_startup(reconfigure);
             group_startup(reconfigure);
             ping_startup(reconfigure);
-            prompt_startup(reconfigure);
             client_startup(reconfigure);
             dock_startup(reconfigure);
             moveresize_startup(reconfigure);
@@ -310,6 +317,7 @@ gint main(gint argc, gchar **argv)
             mouse_startup(reconfigure);
             menu_frame_startup(reconfigure);
             menu_startup(reconfigure);
+            prompt_startup(reconfigure);
 
             if (!reconfigure) {
                 guint32 xid;
@@ -345,13 +353,35 @@ gint main(gint argc, gchar **argv)
 
             reconfigure = FALSE;
 
-            state = OB_STATE_RUNNING;
+            ob_set_state(OB_STATE_RUNNING);
+
+            /* look for parsing errors */
+            {
+                xmlErrorPtr e = xmlGetLastError();
+                if (e) {
+                    gchar *m;
+
+                    m = g_strdup_printf(_("One or more XML syntax errors were found while parsing the Openbox configuration files.  See stdout for more information.  The last error seen was in file \"%s\" line %d, with message: %s"), e->file, e->line, e->message);
+                    xmlprompt =
+                        prompt_show_message(m, _("Openbox Syntax Error"), _("Close"));
+                    g_free(m);
+                    xmlResetError(e);
+                }
+            }
+
             obt_main_loop_run(ob_main_loop);
-            state = OB_STATE_EXITING;
+            ob_set_state(reconfigure ?
+                         OB_STATE_RECONFIGURING : OB_STATE_EXITING);
+
+            if (xmlprompt) {
+                prompt_unref(xmlprompt);
+                xmlprompt = NULL;
+            }
 
             if (!reconfigure)
                 window_unmanage_all();
 
+            prompt_shutdown(reconfigure);
             menu_shutdown(reconfigure);
             menu_frame_shutdown(reconfigure);
             mouse_shutdown(reconfigure);
@@ -359,7 +389,6 @@ gint main(gint argc, gchar **argv)
             moveresize_shutdown(reconfigure);
             dock_shutdown(reconfigure);
             client_shutdown(reconfigure);
-            prompt_shutdown(reconfigure);
             ping_shutdown(reconfigure);
             group_shutdown(reconfigure);
             grab_shutdown(reconfigure);
@@ -372,6 +401,7 @@ gint main(gint argc, gchar **argv)
             sn_shutdown(reconfigure);
             event_shutdown(reconfigure);
             config_shutdown();
+            hooks_shutdown(reconfigure);
             actions_shutdown(reconfigure);
         } while (reconfigure);
     }
@@ -398,7 +428,7 @@ gint main(gint argc, gchar **argv)
                 g_strfreev(argvp);
             } else {
                 g_message(
-                    _("Restart failed to execute new executable '%s': %s"),
+                    _("Restart failed to execute new executable \"%s\": %s"),
                     restart_path, err->message);
                 g_error_free(err);
             }
@@ -486,6 +516,9 @@ static void print_help(void)
     g_print(_("  --help              Display this help and exit\n"));
     g_print(_("  --version           Display the version and exit\n"));
     g_print(_("  --replace           Replace the currently running window manager\n"));
+    /* TRANSLATORS: if you translate "FILE" here, make sure to keep the "Specify..."
+       aligned still, if you have to, make a new line with \n and 22 spaces. It's
+       fine to leave it as FILE though. */
     g_print(_("  --config-file FILE  Specify the path to the config file to use\n"));
     g_print(_("  --sm-disable        Disable connection to the session manager\n"));
     g_print(_("\nPassing messages to a running Openbox instance:\n"));
@@ -496,7 +529,7 @@ static void print_help(void)
     g_print(_("  --sync              Run in synchronous mode\n"));
     g_print(_("  --debug             Display debugging output\n"));
     g_print(_("  --debug-focus       Display debugging output for focus handling\n"));
-    g_print(_("  --debug-session     Display debugging output for session managment\n"));
+    g_print(_("  --debug-session     Display debugging output for session management\n"));
     g_print(_("  --debug-xinerama    Split the display into fake xinerama screens\n"));
     g_print(_("\nPlease report bugs at %s\n"), PACKAGE_BUGREPORT);
 }
@@ -547,13 +580,9 @@ static void parse_args(gint *argc, gchar **argv)
             ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE);
         }
         else if (!strcmp(argv[i], "--debug-focus")) {
-            ob_debug_enable(OB_DEBUG_NORMAL, TRUE);
-            ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE);
             ob_debug_enable(OB_DEBUG_FOCUS, TRUE);
         }
         else if (!strcmp(argv[i], "--debug-session")) {
-            ob_debug_enable(OB_DEBUG_NORMAL, TRUE);
-            ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE);
             ob_debug_enable(OB_DEBUG_SM, TRUE);
         }
         else if (!strcmp(argv[i], "--debug-xinerama")) {
@@ -576,7 +605,7 @@ static void parse_args(gint *argc, gchar **argv)
                    what we want */
                 config_file = argv[i+1];
                 ++i; /* skip the argument */
-                ob_debug("--config-file %s\n", config_file);
+                ob_debug("--config-file %s", config_file);
             }
         }
         else if (!strcmp(argv[i], "--sm-save-file")) {
@@ -613,7 +642,7 @@ static void parse_args(gint *argc, gchar **argv)
         else {
             /* this is a memleak.. oh well.. heh */
             gchar *err = g_strdup_printf
-                (_("Invalid command line argument '%s'\n"), argv[i]);
+                (_("Invalid command line argument \"%s\"\n"), argv[i]);
             ob_exit_with_error(err);
         }
     }
@@ -685,3 +714,8 @@ ObState ob_state(void)
 {
     return state;
 }
+
+void ob_set_state(ObState s)
+{
+    state = s;
+}