+
+static void print_version(void)
+{
+ g_print("Openbox %s\n", PACKAGE_VERSION);
+ g_print(_("Copyright (c)"));
+ g_print(" 2008 Mikael Magnusson\n");
+ g_print(_("Copyright (c)"));
+ g_print(" 2003-2006 Dana Jansens\n\n");
+ g_print("This program comes with ABSOLUTELY NO WARRANTY.\n");
+ g_print("This is free software, and you are welcome to redistribute it\n");
+ g_print("under certain conditions. See the file COPYING for details.\n\n");
+}
+
+static void print_help(void)
+{
+ g_print(_("Syntax: openbox [options]\n"));
+ g_print(_("\nOptions:\n"));
+ 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"));
+ g_print(_(" --reconfigure Reload Openbox's configuration\n"));
+ g_print(_(" --restart Restart Openbox\n"));
+ g_print(_(" --exit Exit Openbox\n"));
+ g_print(_("\nDebugging options:\n"));
+ g_print(_(" --sync Run in synchronous mode\n"));
+ g_print(_(" --startup CMD Run CMD after starting\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 management\n"));
+ g_print(_(" --debug-xinerama Split the display into fake xinerama screens\n"));
+ g_print(_("\nPlease report bugs at %s\n"), PACKAGE_BUGREPORT);
+}
+
+static void remove_args(gint *argc, gchar **argv, gint index, gint num)
+{
+ gint i;
+
+ for (i = index; i < *argc - num; ++i)
+ argv[i] = argv[i+num];
+ for (; i < *argc; ++i)
+ argv[i] = NULL;
+ *argc -= num;
+}
+
+static void run_startup_cmd(void)
+{
+ gchar **argv = NULL;
+ GError *e = NULL;
+ gboolean ok;
+
+ if (!g_shell_parse_argv(startup_cmd, NULL, &argv, &e)) {
+ g_message("Error parsing startup command: %s",
+ e->message);
+ g_error_free(e);
+ e = NULL;
+ }
+ ok = g_spawn_async(NULL, argv, NULL,
+ G_SPAWN_SEARCH_PATH |
+ G_SPAWN_DO_NOT_REAP_CHILD,
+ NULL, NULL, NULL, &e);
+ if (!g_shell_parse_argv(startup_cmd, NULL, &argv, &e)) {
+ g_message("Error launching startup command: %s",
+ e->message);
+ g_error_free(e);
+ e = NULL;
+ }
+}
+
+static void parse_env(void)
+{
+ const gchar *id;
+
+ /* unset this so we don't pass it on unknowingly */
+ unsetenv("DESKTOP_STARTUP_ID");
+
+ /* this is how gnome-session passes in a session client id */
+ id = g_getenv("DESKTOP_AUTOSTART_ID");
+ if (id) {
+ unsetenv("DESKTOP_AUTOSTART_ID");
+ if (ob_sm_id) g_free(ob_sm_id);
+ ob_sm_id = g_strdup(id);
+ ob_debug_type(OB_DEBUG_SM,
+ "DESKTOP_AUTOSTART_ID %s supercedes --sm-client-id\n",
+ ob_sm_id);
+ }
+}
+
+static void parse_args(gint *argc, gchar **argv)
+{
+ gint i;
+
+ for (i = 1; i < *argc; ++i) {
+ if (!strcmp(argv[i], "--version")) {
+ print_version();
+ exit(0);
+ }
+ else if (!strcmp(argv[i], "--help")) {
+ print_help();
+ exit(0);
+ }
+ else if (!strcmp(argv[i], "--g-fatal-warnings")) {
+ g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL);
+ }
+ else if (!strcmp(argv[i], "--replace")) {
+ ob_replace_wm = TRUE;
+ remove_args(argc, argv, i, 1);
+ --i; /* this arg was removed so go back */
+ }
+ else if (!strcmp(argv[i], "--sync")) {
+ xsync = TRUE;
+ }
+ else if (!strcmp(argv[i], "--startup")) {
+ if (i == *argc - 1) /* no args left */
+ g_printerr(_("--startup requires an argument\n"));
+ else {
+ /* this will be in the current locale encoding, which is
+ what we want */
+ startup_cmd = argv[i+1];
+ remove_args(argc, argv, i, 2);
+ --i; /* this arg was removed so go back */
+ ob_debug("--startup %s", startup_cmd);
+ }
+ }
+ else if (!strcmp(argv[i], "--debug")) {
+ ob_debug_enable(OB_DEBUG_NORMAL, TRUE);
+ ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE);
+ }
+ else if (!strcmp(argv[i], "--debug-focus")) {
+ ob_debug_enable(OB_DEBUG_FOCUS, TRUE);
+ }
+ else if (!strcmp(argv[i], "--debug-session")) {
+ ob_debug_enable(OB_DEBUG_SM, TRUE);
+ }
+ else if (!strcmp(argv[i], "--debug-xinerama")) {
+ ob_debug_xinerama = TRUE;
+ }
+ else if (!strcmp(argv[i], "--reconfigure")) {
+ remote_control = 1;
+ }
+ else if (!strcmp(argv[i], "--restart")) {
+ remote_control = 2;
+ }
+ else if (!strcmp(argv[i], "--exit")) {
+ remote_control = 3;
+ }
+ else if (!strcmp(argv[i], "--config-file")) {
+ if (i == *argc - 1) /* no args left */
+ g_printerr(_("--config-file requires an argument\n"));
+ else {
+ /* this will be in the current locale encoding, which is
+ what we want */
+ config_file = argv[i+1];
+ ++i; /* skip the argument */
+ ob_debug("--config-file %s", config_file);
+ }
+ }
+ else if (!strcmp(argv[i], "--sm-save-file")) {
+ if (i == *argc - 1) /* no args left */
+ /* not translated cuz it's sekret */
+ g_printerr("--sm-save-file requires an argument\n");
+ else {
+ ob_sm_save_file = g_strdup(argv[i+1]);
+ remove_args(argc, argv, i, 2);
+ --i; /* this arg was removed so go back */
+ ob_debug_type(OB_DEBUG_SM, "--sm-save-file %s",
+ ob_sm_save_file);
+ }
+ }
+ else if (!strcmp(argv[i], "--sm-client-id")) {
+ if (i == *argc - 1) /* no args left */
+ /* not translated cuz it's sekret */
+ g_printerr("--sm-client-id requires an argument\n");
+ else {
+ ob_sm_id = g_strdup(argv[i+1]);
+ remove_args(argc, argv, i, 2);
+ --i; /* this arg was removed so go back */
+ ob_debug_type(OB_DEBUG_SM, "--sm-client-id %s", ob_sm_id);
+ }
+ }
+ else if (!strcmp(argv[i], "--sm-disable")) {
+ ob_sm_use = FALSE;
+ }
+ else if (!strcmp(argv[i], "--sm-no-load")) {
+ ob_sm_restore = FALSE;
+ remove_args(argc, argv, i, 1);
+ --i; /* this arg was removed so go back */
+ }
+ else {
+ /* this is a memleak.. oh well.. heh */
+ gchar *err = g_strdup_printf
+ (_("Invalid command line argument \"%s\"\n"), argv[i]);
+ ob_exit_with_error(err);
+ }
+ }
+}
+
+static Cursor load_cursor(const gchar *name, guint fontval)
+{
+ Cursor c = None;
+
+#if USE_XCURSOR
+ c = XcursorLibraryLoadCursor(obt_display, name);
+#endif
+ if (c == None)
+ c = XCreateFontCursor(obt_display, fontval);
+ return c;
+}
+
+void ob_exit_with_error(const gchar *msg)
+{
+ g_message("%s", msg);
+ session_shutdown(TRUE);
+ exit(EXIT_FAILURE);
+}
+
+void ob_restart_other(const gchar *path)
+{
+ restart_path = g_strdup(path);
+ ob_restart();
+}
+
+void ob_restart(void)
+{
+ restart = TRUE;
+ ob_exit(0);
+}
+
+void ob_reconfigure(void)
+{
+ reconfigure = TRUE;
+ ob_exit(0);
+}
+
+void ob_exit(gint code)
+{
+ exitcode = code;
+ obt_main_loop_exit(ob_main_loop);
+}
+
+void ob_exit_replace(void)
+{
+ exitcode = 0;
+ being_replaced = TRUE;
+ obt_main_loop_exit(ob_main_loop);
+}
+
+Cursor ob_cursor(ObCursor cursor)
+{
+ g_assert(cursor < OB_NUM_CURSORS);
+ return cursors[cursor];
+}
+
+ObState ob_state(void)
+{
+ return state;
+}
+
+void ob_set_state(ObState s)
+{
+ state = s;
+}