X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fopenbox.c;h=9fd5fe40b451a188249ba6ca6af7416b2321e1df;hb=6f92931f843f8049d27d73937977b54d5f869499;hp=40b614a9e8211ffad913dd42bcc7cec6f8fce827;hpb=2c5d755bd8bfea13fc9830c74b00877e17294e61;p=chaz%2Fopenbox diff --git a/openbox/openbox.c b/openbox/openbox.c index 40b614a9..9fd5fe40 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -46,6 +46,8 @@ #include "obrender/render.h" #include "obrender/theme.h" #include "obt/display.h" +#include "obt/xqueue.h" +#include "obt/signal.h" #include "obt/prop.h" #include "obt/keyboard.h" #include "obt/xml.h" @@ -83,7 +85,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 +93,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; @@ -115,11 +118,15 @@ gint main(gint argc, gchar **argv) { gchar *program_name; + obt_signal_listen(); + ob_set_state(OB_STATE_STARTING); 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); @@ -154,18 +161,19 @@ 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); + /* set up signal handlers, they are called from the mainloop + in the main program's thread */ + obt_signal_add_callback(SIGUSR1, signal_handler, NULL); + obt_signal_add_callback(SIGUSR2, signal_handler, NULL); + obt_signal_add_callback(SIGTERM, signal_handler, NULL); + obt_signal_add_callback(SIGINT, signal_handler, NULL); + obt_signal_add_callback(SIGHUP, signal_handler, NULL); + obt_signal_add_callback(SIGPIPE, signal_handler, NULL); + obt_signal_add_callback(SIGCHLD, signal_handler, NULL); + obt_signal_add_callback(SIGTTIN, signal_handler, NULL); + obt_signal_add_callback(SIGTTOU, signal_handler, NULL); ob_screen = DefaultScreen(obt_display); @@ -210,6 +218,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; @@ -245,8 +258,7 @@ gint main(gint argc, gchar **argv) gchar *p = g_filename_to_utf8(config_file, -1, NULL, NULL, NULL); if (p) - OBT_PROP_SETS(obt_root(ob_screen), OB_CONFIG_FILE, - utf8, p); + OBT_PROP_SETS(obt_root(ob_screen), OB_CONFIG_FILE, p); g_free(p); } else @@ -273,8 +285,8 @@ gint main(gint argc, gchar **argv) if (ob_rr_theme == NULL) ob_exit_with_error(_("Unable to load a theme.")); - OBT_PROP_SETS(obt_root(ob_screen), - OB_THEME, utf8, ob_rr_theme->name); + OBT_PROP_SETS(obt_root(ob_screen), OB_THEME, + ob_rr_theme->name); } if (reconfigure) { @@ -308,13 +320,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), @@ -360,7 +375,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); @@ -408,6 +423,7 @@ gint main(gint argc, gchar **argv) if (restart) { ob_debug_shutdown(); + obt_signal_stop(); if (restart_path != NULL) { gint argcp; gchar **argvp; @@ -461,8 +477,10 @@ gint main(gint argc, gchar **argv) g_free(ob_sm_id); g_free(program_name); - if (!restart) + if (!restart) { ob_debug_shutdown(); + obt_signal_stop(); + } return exitcode; } @@ -734,14 +752,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)