X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fopenbox.c;h=b2cdc8efded4e8cb9d465af61042828c077c0912;hb=fd77a0a7b3f892925f203287b8b46c6ec9be94ea;hp=0f9fb1793825342bbb2adf6821239d563ce0cfd6;hpb=096dad0c6c027100494ede811b33cb8558d32e25;p=chaz%2Fopenbox diff --git a/openbox/openbox.c b/openbox/openbox.c index 0f9fb179..b2cdc8ef 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -46,6 +46,7 @@ #include "obrender/render.h" #include "obrender/theme.h" #include "obt/display.h" +#include "obt/xqueue.h" #include "obt/prop.h" #include "obt/keyboard.h" #include "obt/xml.h" @@ -83,7 +84,7 @@ RrInstance *ob_rr_inst; RrImageCache *ob_rr_icons; RrTheme *ob_rr_theme; -ObtMainLoop *ob_main_loop; +GMainLoop *ob_main_loop; gint ob_screen; gboolean ob_replace_wm = FALSE; gboolean ob_sm_use = TRUE; @@ -91,6 +92,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; @@ -102,12 +104,14 @@ 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) { @@ -118,6 +122,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); @@ -152,18 +158,18 @@ gint main(gint argc, gchar **argv) exit(EXIT_SUCCESS); } - ob_main_loop = obt_main_loop_new(); + ob_main_loop = g_main_loop_new(NULL, FALSE); /* set up signal handler */ - 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); - 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); +// 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); +// 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); @@ -208,6 +214,11 @@ gint main(gint argc, gchar **argv) XC_top_left_corner); if (screen_annex()) { /* it will be ours! */ + + /* get a timestamp from after taking over as the WM. if we use the + old timestamp to set focus it can fail when replacing another WM. */ + event_reset_time(); + do { ObPrompt *xmlprompt = NULL; @@ -306,13 +317,16 @@ gint main(gint argc, gchar **argv) menu_startup(reconfigure); prompt_startup(reconfigure); + /* do this after everything is started so no events will get + missed */ + xqueue_listen(); + if (!reconfigure) { guint32 xid; ObWindow *w; /* get all the existing windows */ window_manage_all(); - focus_nothing(); /* focus what was focused if a wm was already running */ if (OBT_PROP_GET32(obt_root(ob_screen), @@ -342,6 +356,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(); @@ -356,7 +372,7 @@ gint main(gint argc, gchar **argv) } } - obt_main_loop_run(ob_main_loop); + g_main_loop_run(ob_main_loop); ob_set_state(reconfigure ? OB_STATE_RECONFIGURING : OB_STATE_EXITING); @@ -519,6 +535,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")); @@ -537,6 +554,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; @@ -580,6 +621,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); @@ -693,14 +746,14 @@ void ob_reconfigure(void) void ob_exit(gint code) { exitcode = code; - obt_main_loop_exit(ob_main_loop); + g_main_loop_quit(ob_main_loop); } void ob_exit_replace(void) { exitcode = 0; being_replaced = TRUE; - obt_main_loop_exit(ob_main_loop); + g_main_loop_quit(ob_main_loop); } Cursor ob_cursor(ObCursor cursor)