]> Dogcows Code - chaz/openbox/blobdiff - openbox/openbox.c
add a makefile so i can put stuff into the make dist
[chaz/openbox] / openbox / openbox.c
index 0fd67409170278cb1ba21ef0b085e3878605e6fc..d9ce9a5d8933c1c42b7d065c81fb2cdcf43ccc3a 100644 (file)
@@ -26,6 +26,7 @@
 #  include <fcntl.h>
 #endif
 #ifdef HAVE_SIGNAL_H
+#define __USE_UNIX98
 #  include <signal.h>
 #endif
 #ifdef HAVE_STDLIB_H
@@ -49,6 +50,7 @@
 #include <X11/cursorfont.h>
 
 #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,14 @@ int main(int argc, char **argv)
        timer_startup();
        event_startup();
         grab_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,8 +216,6 @@ 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();
@@ -314,39 +318,92 @@ static void sm_startup(int argc, char **argv)
     if (ob_sm_conn == NULL)
         g_warning("Failed to connect to session manager: %s", sm_err);
     else {
-        SmPropValue val_cmd;
-        SmPropValue val_res;
         SmPropValue val_prog;
         SmPropValue val_uid;
-        SmProp prop_cmd = { SmCloneCommand, "SmLISTofARRAY8", 1, };
-        SmProp prop_res = { SmRestartCommand, "SmLISTofARRAY8", 1, };
-        SmProp prop_prog = { SmProgram, "SmARRAY8", 1, };
-        SmProp prop_uid = { SmUserID, "SmARRAY8", 1, };
-        SmProp *props[4];
-
-        val_cmd.value = argv[0];
-        val_cmd.length = strlen(argv[0]);
-        val_res.value = argv[0];
-        val_res.length = strlen(argv[0]); /* XXX -id foo */
+        SmPropValue val_hint; 
+        SmPropValue val_pri;
+        SmPropValue val_pid;
+        SmProp prop_cmd = { SmCloneCommand, SmLISTofARRAY8, 1, };
+        SmProp prop_res = { SmRestartCommand, SmLISTofARRAY8, };
+        SmProp prop_prog = { SmProgram, SmARRAY8, 1, };
+        SmProp prop_uid = { SmUserID, SmARRAY8, 1, };
+        SmProp prop_hint = { SmRestartStyleHint, SmCARD8, 1, };
+        SmProp prop_pid = { SmProcessID, SmARRAY8, 1, };
+        SmProp prop_pri = { "_GSM_Priority", SmCARD8, 1, };
+        SmProp *props[7];
+        gulong hint, pri;
+        gchar pid[32];
+        gint i, j;
+        gboolean has_id;
+
+        for (i = 1; i < argc - 1; ++i)
+            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, 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[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, 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_strdup_printf("%ld", (long)getuid());
+        val_uid.value = g_get_user_name();
         val_uid.length = strlen(val_uid.value);
 
-        prop_cmd.vals = &val_cmd;
-        prop_res.vals = &val_res;
+        hint = SmRestartImmediately;
+        val_hint.value = &hint;
+        val_hint.length = 1;
+
+        sprintf(pid, "%ld", (long)getpid());
+        val_pid.value = pid;
+        val_pid.length = strlen(pid);
+
+        /* priority with gnome-session-manager, low to run before other apps */
+        pri = 20;
+        val_pri.value = &pri;
+        val_pri.length = 1;
+
         prop_prog.vals = &val_prog;
         prop_uid.vals = &val_uid;
+        prop_hint.vals = &val_hint;
+        prop_pid.vals = &val_pid;
+        prop_pri.vals = &val_pri;
 
-        props[0] = &prop_cmd;
-        props[1] = &prop_res;
-        props[2] = &prop_prog;
+        props[0] = &prop_prog;
+        props[1] = &prop_cmd;
+        props[2] = &prop_res;
         props[3] = &prop_uid;
+        props[4] = &prop_hint;
+        props[5] = &prop_pid;
+        props[6] = &prop_pri;
 
-        SmcSetProperties(ob_sm_conn, 3, props);
+        SmcSetProperties(ob_sm_conn, 7, props);
 
-        g_free(val_uid.value);
+        g_free(prop_cmd.vals);
+        g_free(prop_res.vals);
 
         g_message("Connected to session manager with id %s", ob_sm_id);
     }
@@ -357,8 +414,25 @@ static void sm_startup(int argc, char **argv)
 static void sm_shutdown()
 {
 #ifdef USE_SM
-    if (ob_sm_conn)
+    if (ob_sm_conn) {
+        SmPropValue val_hint;
+        SmProp prop_hint = { SmRestartStyleHint, SmCARD8, 1, };
+        SmProp *props[1];
+        gulong hint;
+
+        /* when we exit, we want to reset this to a more friendly state */
+        hint = SmRestartIfRunning;
+        val_hint.value = &hint;
+        val_hint.length = 1;
+
+        prop_hint.vals = &val_hint;
+
+        props[0] = &prop_hint;
+
+        SmcSetProperties(ob_sm_conn, 1, props);
+
         SmcCloseConnection(ob_sm_conn, 0, NULL);
+    }
 #endif
 }
 
@@ -369,7 +443,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;
 
@@ -377,13 +451,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();
     }
 }
@@ -401,11 +475,15 @@ static void print_help()
     print_version();
     g_print("Syntax: %s [options]\n\n", BINARY);
     g_print("Options:\n\n");
-    g_print("  -rc PATH     Specify the path to the rc file to use\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 meant\n"
-            "               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);
 }
 
@@ -424,9 +502,18 @@ static void parse_args(int argc, char **argv)
             ob_sync = TRUE;
         } 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")) {
+            if (i == argc - 1) /* no args left */
+                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]);
             print_help();
This page took 0.033575 seconds and 4 git commands to generate.