+
+static void print_version()
+{
+ g_print("Openbox %s\n", PACKAGE_VERSION);
+ g_print(_("Copyright (c)"));
+ g_print(" 2007 Mikael Magnusson\n");
+ g_print(_("Copyright (c)"));
+ g_print(" 2003-2007 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()
+{
+ 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"));
+ 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(_("\nDebugging options:\n"));
+ 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-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 parse_env()
+{
+ /* unset this so we don't pass it on unknowingly */
+ unsetenv("DESKTOP_STARTUP_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], "--debug")) {
+ ob_debug_show_output(TRUE);
+ ob_debug_enable(OB_DEBUG_SM, TRUE);
+ ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE);
+ }
+ else if (!strcmp(argv[i], "--debug-focus")) {
+ ob_debug_show_output(TRUE);
+ ob_debug_enable(OB_DEBUG_SM, TRUE);
+ ob_debug_enable(OB_DEBUG_APP_BUGS, TRUE);
+ ob_debug_enable(OB_DEBUG_FOCUS, TRUE);
+ }
+ else if (!strcmp(argv[i], "--debug-xinerama")) {
+ ob_debug_xinerama = TRUE;
+ }
+ else if (!strcmp(argv[i], "--reconfigure")) {
+ remote_control = 1;
+/* don't make this do anything if it's not in --help ..
+ } else if (!strcmp(argv[i], "--restart")) {
+ remote_control = 2;
+*/
+ }
+ 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\n",
+ 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\n", ob_sm_id);
+ }
+ }
+ else if (!strcmp(argv[i], "--sm-disable")) {
+ ob_sm_use = FALSE;
+ }
+ 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(ob_display, name);
+#endif
+ if (c == None)
+ c = XCreateFontCursor(ob_display, fontval);
+ return c;
+}
+
+void ob_exit_with_error(const gchar *msg)
+{
+ g_message(msg);
+ session_shutdown(TRUE);
+ exit(EXIT_FAILURE);
+}
+
+void ob_restart_other(const gchar *path)
+{
+ restart_path = g_strdup(path);
+ ob_restart();
+}
+
+void ob_restart()
+{
+ restart = TRUE;
+ ob_exit(0);
+}
+
+void ob_reconfigure()
+{
+ reconfigure = TRUE;
+ ob_exit(0);
+}
+
+void ob_exit(gint code)
+{
+ exitcode = code;
+ ob_main_loop_exit(ob_main_loop);
+}
+
+void ob_exit_replace()
+{
+ exitcode = 0;
+ being_replaced = TRUE;
+ ob_main_loop_exit(ob_main_loop);
+}
+
+Cursor ob_cursor(ObCursor cursor)
+{
+ g_assert(cursor < OB_NUM_CURSORS);
+ return cursors[cursor];
+}
+
+KeyCode ob_keycode(ObKey key)
+{
+ g_assert(key < OB_NUM_KEYS);
+ return keys[key];
+}
+
+ObState ob_state()
+{
+ return state;
+}