X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fopenbox.c;h=4703d7d6eb921632f203416eda9ead477f689a17;hb=d35605823736410c4910ec1affe9563e4e8a8769;hp=800e6a210d3141a2fffd4eba1dc7b9816a167a0f;hpb=50d662681160c309ea86268c0d05794b87b75593;p=chaz%2Fopenbox diff --git a/openbox/openbox.c b/openbox/openbox.c index 800e6a21..4703d7d6 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -43,12 +43,12 @@ #include "ping.h" #include "prompt.h" #include "gettext.h" -#include "render/render.h" -#include "render/theme.h" +#include "obrender/render.h" +#include "obrender/theme.h" #include "obt/display.h" #include "obt/prop.h" #include "obt/keyboard.h" -#include "obt/parse.h" +#include "obt/xml.h" #ifdef HAVE_FCNTL_H # include @@ -80,9 +80,6 @@ #include #endif -#include -#include - RrInstance *ob_rr_inst; RrImageCache *ob_rr_icons; RrTheme *ob_rr_theme; @@ -94,6 +91,7 @@ gchar *ob_sm_id = NULL; gchar *ob_sm_save_file = NULL; gboolean ob_sm_restore = TRUE; gboolean ob_debug_xinerama = FALSE; +const gchar *ob_locale_msg = NULL; static ObState state; static gboolean xsync = FALSE; @@ -101,17 +99,18 @@ static gboolean reconfigure = FALSE; static gboolean restart = FALSE; static gchar *restart_path = NULL; static Cursor cursors[OB_NUM_CURSORS]; -static KeyCode *keys[OB_NUM_KEYS]; static gint exitcode = 0; static guint remote_control = 0; static gboolean being_replaced = FALSE; static gchar *config_file = NULL; +static gchar *startup_cmd = NULL; static void signal_handler(gint signal, gpointer data); static void remove_args(gint *argc, gchar **argv, gint index, gint num); static void parse_env(); static void parse_args(gint *argc, gchar **argv); static Cursor load_cursor(const gchar *name, guint fontval); +static void run_startup_cmd(void); gint main(gint argc, gchar **argv) { @@ -122,6 +121,8 @@ gint main(gint argc, gchar **argv) ob_debug_startup(); /* initialize the locale */ + if (!(ob_locale_msg = setlocale(LC_MESSAGES, ""))) + g_message("Couldn't set messages locale category from environment."); if (!setlocale(LC_ALL, "")) g_message("Couldn't set locale from environment."); bindtextdomain(PACKAGE_NAME, LOCALEDIR); @@ -166,6 +167,8 @@ gint main(gint argc, gchar **argv) 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); + obt_main_loop_signal_add(ob_main_loop, SIGTTIN, signal_handler, NULL,NULL); + obt_main_loop_signal_add(ob_main_loop, SIGTTOU, signal_handler, NULL,NULL); ob_screen = DefaultScreen(obt_display); @@ -215,22 +218,12 @@ gint main(gint argc, gchar **argv) if (reconfigure) obt_keyboard_reload(); - /* get the keycodes for keys we use */ - 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); - keys[OB_KEY_TAB] = obt_keyboard_keysym_to_keycode(XK_Tab); - keys[OB_KEY_SPACE] = obt_keyboard_keysym_to_keycode(XK_space); - { - ObtParseInst *i; + ObtXmlInst *i; /* startup the parsing so everything can register sections of the rc */ - i = obt_parse_instance_new(); + i = obt_xml_instance_new(); /* register all the available actions */ actions_startup(reconfigure); @@ -239,12 +232,12 @@ gint main(gint argc, gchar **argv) /* parse/load user options */ if ((config_file && - obt_parse_load_file(i, config_file, "openbox_config")) || - obt_parse_load_config_file(i, "openbox", "rc.xml", - "openbox_config")) + obt_xml_load_file(i, config_file, "openbox_config")) || + obt_xml_load_config_file(i, "openbox", "rc.xml", + "openbox_config")) { - obt_parse_tree_from_root(i); - obt_parse_close(i); + obt_xml_tree_from_root(i); + obt_xml_close(i); } else { g_message(_("Unable to find a valid config file, using some simple defaults")); @@ -263,7 +256,7 @@ gint main(gint argc, gchar **argv) OBT_PROP_ERASE(obt_root(ob_screen), OB_CONFIG_FILE); /* we're done with parsing now, kill it */ - obt_parse_instance_unref(i); + obt_xml_instance_unref(i); } /* load the theme specified in the rc file */ @@ -274,7 +267,8 @@ gint main(gint argc, gchar **argv) config_font_inactivewindow, config_font_menutitle, config_font_menuitem, - config_font_osd))) + config_font_activeosd, + config_font_inactiveosd))) { RrThemeFree(ob_rr_theme); ob_rr_theme = theme; @@ -353,6 +347,8 @@ gint main(gint argc, gchar **argv) ob_set_state(OB_STATE_RUNNING); + if (startup_cmd) run_startup_cmd(); + /* look for parsing errors */ { xmlErrorPtr e = xmlGetLastError(); @@ -400,16 +396,6 @@ gint main(gint argc, gchar **argv) event_shutdown(reconfigure); config_shutdown(); actions_shutdown(reconfigure); - - /* Free the key codes for built in keys */ - g_free(keys[OB_KEY_RETURN]); - g_free(keys[OB_KEY_ESCAPE]); - g_free(keys[OB_KEY_LEFT]); - g_free(keys[OB_KEY_RIGHT]); - g_free(keys[OB_KEY_UP]); - g_free(keys[OB_KEY_DOWN]); - g_free(keys[OB_KEY_TAB]); - g_free(keys[OB_KEY_SPACE]); } while (reconfigure); } @@ -499,6 +485,10 @@ static void signal_handler(gint signal, gpointer data) /* reap children */ while (waitpid(-1, NULL, WNOHANG) > 0); break; + case SIGTTIN: + case SIGTTOU: + ob_debug("Caught signal %d. Ignoring.", signal); + break; default: ob_debug("Caught signal %d. Exiting.", signal); /* TERM and INT return a 0 code */ @@ -536,6 +526,7 @@ static void print_help(void) 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")); @@ -554,6 +545,30 @@ static void remove_args(gint *argc, gchar **argv, gint index, gint num) *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; @@ -597,6 +612,18 @@ static void parse_args(gint *argc, gchar **argv) 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); @@ -726,16 +753,6 @@ Cursor ob_cursor(ObCursor cursor) return cursors[cursor]; } -gboolean ob_keycode_match(KeyCode code, ObKey key) -{ - KeyCode *k; - - g_assert(key < OB_NUM_KEYS); - for (k = keys[key]; *k; ++k) - if (*k == code) return TRUE; - return FALSE; -} - ObState ob_state(void) { return state;