X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fopenbox.c;h=1298540b9c11fd71bed5bbe5fbdb35abf5332c89;hb=6357583c396382dd6ed8ac42004177f204fabe62;hp=4329dadeff6e5bb32e054ab8dcae0182d3222a79;hpb=e6739af2825ab9fe872c2860a8eac31b742c66d5;p=chaz%2Fopenbox diff --git a/openbox/openbox.c b/openbox/openbox.c index 4329dade..1298540b 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -26,6 +26,7 @@ # include #endif #ifdef HAVE_SIGNAL_H +#define __USE_UNIX98 # include #endif #ifdef HAVE_STDLIB_H @@ -49,6 +50,7 @@ #include #ifdef USE_SM +gboolean ob_sm_use = TRUE; SmcConn ob_sm_conn; gchar *ob_sm_id = NULL; #endif @@ -107,10 +109,10 @@ int main(int argc, char **argv) sigemptyset(&sigset); action.sa_handler = dispatch_signal; action.sa_mask = sigset; - action.sa_flags = SA_NOCLDSTOP; + action.sa_flags = SA_NOCLDSTOP | SA_NODEFER; sigaction(SIGUSR1, &action, (struct sigaction *) NULL); sigaction(SIGPIPE, &action, (struct sigaction *) NULL); - sigaction(SIGSEGV, &action, (struct sigaction *) NULL); +/* sigaction(SIGSEGV, &action, (struct sigaction *) NULL);*/ sigaction(SIGFPE, &action, (struct sigaction *) NULL); sigaction(SIGTERM, &action, (struct sigaction *) NULL); sigaction(SIGINT, &action, (struct sigaction *) NULL); @@ -126,6 +128,8 @@ int main(int argc, char **argv) mkdir(path, (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH)); g_free(path); + + g_set_prgname(argv[0]); /* parse out command line args */ parse_args(argc, argv); @@ -193,12 +197,17 @@ int main(int argc, char **argv) timer_startup(); event_startup(); grab_startup(); + /* focus_backup is used for stacking, so this needs to come before + anything that calls stacking_add */ + focus_startup(); + window_startup(); plugin_startup(); /* load the plugins specified in the pluginrc */ plugin_loadall(); /* set up the kernel config shit */ config_startup(); + menu_startup(); /* parse/load user options */ if (parse_load_rc(&doc, &node)) parse_tree(doc, node->xmlChildrenNode, NULL); @@ -210,11 +219,8 @@ int main(int argc, char **argv) if (ob_rr_theme == NULL) exit_with_error("Unable to load a theme."); - window_startup(); - menu_startup(); frame_startup(); moveresize_startup(); - focus_startup(); screen_startup(); group_startup(); client_startup(); @@ -277,7 +283,6 @@ int main(int argc, char **argv) /* re-run me */ execvp(argv[0], argv); /* try how we were run */ - execlp(BINARY, BINARY, NULL); /* try this as a last resort */ } return 0; @@ -329,42 +334,44 @@ static void sm_startup(int argc, char **argv) SmProp *props[7]; gulong hint, pri; gchar pid[32]; - gint i; + gint i, j; gboolean has_id; for (i = 1; i < argc - 1; ++i) - if (strcmp(argv[i], "-sm-client-id") == 0) + if (strcmp(argv[i], "--sm-client-id") == 0) break; has_id = (i < argc - 1); prop_cmd.vals = g_new(SmPropValue, (has_id ? argc-2 : argc)); prop_cmd.num_vals = (has_id ? argc-2 : argc); - for (i = 0; i < argc; ++i) { - if (strcmp (argv[i], "-sm-client-id") == 0) { - ++i; /* skip the next as well */ + for (i = 0, j = 0; i < argc; ++i, ++j) { + if (strcmp (argv[i], "--sm-client-id") == 0) { + ++i, --j; /* skip the next as well, keep j where it is */ } else { - prop_cmd.vals[i].value = argv[i]; - prop_cmd.vals[i].length = strlen(argv[i]); + prop_cmd.vals[j].value = argv[i]; + prop_cmd.vals[j].length = strlen(argv[i]); } } prop_res.vals = g_new(SmPropValue, (has_id ? argc : argc+2)); prop_res.num_vals = (has_id ? argc : argc+2); - for (i = 0; i < argc; ++i) { - prop_res.vals[i].value = argv[i]; - prop_res.vals[i].length = strlen(argv[i]); - } - if (!has_id) { - prop_res.vals[i].value = "-sm-client-id"; - prop_res.vals[i++].length = strlen("-sm-client-id"); - prop_res.vals[i].value = ob_sm_id; - prop_res.vals[i++].length = strlen(ob_sm_id); + for (i = 0, j = 0; i < argc; ++i, ++j) { + if (strcmp (argv[i], "--sm-client-id") == 0) { + ++i, --j; /* skip the next as well, keep j where it is */ + } else { + prop_res.vals[j].value = argv[i]; + prop_res.vals[j].length = strlen(argv[i]); + } } + prop_res.vals[j].value = "--sm-client-id"; + prop_res.vals[j++].length = strlen("--sm-client-id"); + prop_res.vals[j].value = ob_sm_id; + prop_res.vals[j++].length = strlen(ob_sm_id); val_prog.value = argv[0]; val_prog.length = strlen(argv[0]); - val_uid.value = g_get_user_name(); + val_uid.value = g_strdup(g_get_user_name()); val_uid.length = strlen(val_uid.value); hint = SmRestartImmediately; @@ -396,6 +403,7 @@ static void sm_startup(int argc, char **argv) SmcSetProperties(ob_sm_conn, 7, props); + g_free(val_uid.value); g_free(prop_cmd.vals); g_free(prop_res.vals); @@ -437,7 +445,7 @@ static void signal_handler(const ObEvent *e, void *data) s = e->data.s.signal; switch (s) { case SIGUSR1: - g_message("Caught SIGUSR1 signal. Restarting."); + fprintf(stderr, "Caught SIGUSR1 signal. Restarting."); ob_shutdown = ob_restart = TRUE; break; @@ -445,13 +453,13 @@ static void signal_handler(const ObEvent *e, void *data) case SIGINT: case SIGTERM: case SIGPIPE: - g_message("Caught signal %d. Exiting.", s); + fprintf(stderr, "Caught signal %d. Exiting.", s); ob_shutdown = TRUE; break; case SIGFPE: case SIGSEGV: - g_message("Caught signal %d. Aborting and dumping core.", s); + fprintf(stderr, "Caught signal %d. Aborting and dumping core.", s); abort(); } } @@ -467,14 +475,17 @@ static void print_version() static void print_help() { print_version(); - g_print("Syntax: %s [options]\n\n", BINARY); + g_print("Syntax: openbox [options]\n\n"); g_print("Options:\n\n"); - g_print(" -rc PATH Specify the path to the rc file to use\n"); - g_print(" -sm-client-id ID Specify the session manager ID\n"); - g_print(" -help Display this help and exit\n"); - g_print(" -version Display the version and exit\n"); - g_print(" -sync Run in synchronous mode (this is slow and\n" - " meant for debugging X routines)\n"); + g_print(" --rc PATH Specify the path to the rc file to use\n"); +#ifdef USE_SM + g_print(" --sm-client-id ID Specify session management ID\n"); + g_print(" --sm-disable Disable connection to session manager\n"); +#endif + g_print(" --help Display this help and exit\n"); + g_print(" --version Display the version and exit\n"); + g_print(" --sync Run in synchronous mode (this is slow and\n" + " meant for debugging X routines)\n"); g_print("\nPlease report bugs at %s\n", PACKAGE_BUGREPORT); } @@ -483,25 +494,27 @@ static void parse_args(int argc, char **argv) int i; for (i = 1; i < argc; ++i) { - if (!strcmp(argv[i], "-version")) { + if (!strcmp(argv[i], "--version")) { print_version(); exit(0); - } else if (!strcmp(argv[i], "-help")) { + } else if (!strcmp(argv[i], "--help")) { print_help(); exit(0); - } else if (!strcmp(argv[i], "-sync")) { + } else if (!strcmp(argv[i], "--sync")) { ob_sync = TRUE; - } else if (!strcmp(argv[i], "-rc")) { + } else if (!strcmp(argv[i], "--rc")) { if (i == argc - 1) /* no args left */ - g_printerr(_("-rc requires an argument\n")); + g_printerr(_("--rc requires an argument\n")); else ob_rc_path = argv[++i]; #ifdef USE_SM - } else if (!strcmp(argv[i], "-sm-client-id")) { + } else if (!strcmp(argv[i], "--sm-client-id")) { if (i == argc - 1) /* no args left */ - g_printerr(_("-sm-client-id requires an argument\n")); + g_printerr(_("--sm-client-id requires an argument\n")); else ob_sm_id = argv[++i]; + } else if (!strcmp(argv[i], "--sm-disable")) { + ob_sm_use = FALSE; #endif } else { g_printerr("Invalid option: '%s'\n\n", argv[i]);