]> Dogcows Code - chaz/openbox/blobdiff - openbox/session.c
don't reload the session on restart
[chaz/openbox] / openbox / session.c
index 463e98933610301a7d949702cf0a08a6f29babc2..dcb3fcef2433a891d7b86021b47ba7d3033e1249 100644 (file)
@@ -102,9 +102,11 @@ void session_startup(gint argc, gchar **argv)
     }
 
     if (ob_sm_save_file != NULL) {
-        ob_debug_type(OB_DEBUG_SM, "Loading from session file %s\n",
-                      ob_sm_save_file);
-        session_load_file(ob_sm_save_file);
+        if (ob_sm_restore) {
+            ob_debug_type(OB_DEBUG_SM, "Loading from session file %s\n",
+                          ob_sm_save_file);
+            session_load_file(ob_sm_save_file);
+        }
     } else {
         gchar *filename;
 
@@ -136,7 +138,8 @@ void session_shutdown(gboolean permanent)
     if (sm_conn) {
         /* if permanent is true then we will change our session state so that
            the SM won't run us again */
-        session_setup_restart_style(!permanent);
+        if (permanent)
+            session_setup_restart_style(FALSE);
 
         SmcCloseConnection(sm_conn, 0, NULL);
 
@@ -177,6 +180,7 @@ static gboolean session_connect()
                                 &cb, oldid, &ob_sm_id,
                                 SM_ERR_LEN-1, sm_err);
     g_free(oldid);
+    ob_debug_type(OB_DEBUG_SM, "Connected to SM with id: %s\n", ob_sm_id);
     if (sm_conn == NULL)
         ob_debug("Failed to connect to session manager: %s\n", sm_err);
     return sm_conn != NULL;
@@ -195,6 +199,7 @@ static void session_setup_program()
         .vals = &vals
     };
     SmProp *list = ∝
+    ob_debug_type(OB_DEBUG_SM, "Setting program: %s\n", sm_argv[0]);
     SmcSetProperties(sm_conn, 1, &list);
     g_free(prop.name);
     g_free(prop.type);
@@ -215,6 +220,7 @@ static void session_setup_user()
         .vals = &vals
     };
     SmProp *list = ∝
+    ob_debug_type(OB_DEBUG_SM, "Setting user: %s\n", user);
     SmcSetProperties(sm_conn, 1, &list);
     g_free(prop.name);
     g_free(prop.type);
@@ -223,7 +229,7 @@ static void session_setup_user()
 
 static void session_setup_restart_style(gboolean restart)
 {
-    char restart_hint = restart ? SmRestartImmediately : SmRestartIfRunning;
+    gchar restart_hint = restart ? SmRestartImmediately : SmRestartIfRunning;
 
     SmPropValue vals = {
         .value = &restart_hint,
@@ -236,6 +242,7 @@ static void session_setup_restart_style(gboolean restart)
         .vals = &vals
     };
     SmProp *list = ∝
+    ob_debug_type(OB_DEBUG_SM, "Setting restart: %d\n", restart);
     SmcSetProperties(sm_conn, 1, &list);
     g_free(prop.name);
     g_free(prop.type);
@@ -256,6 +263,7 @@ static void session_setup_pid()
         .vals = &vals
     };
     SmProp *list = ∝
+    ob_debug_type(OB_DEBUG_SM, "Setting pid: %s\n", pid);
     SmcSetProperties(sm_conn, 1, &list);
     g_free(prop.name);
     g_free(prop.type);
@@ -278,6 +286,7 @@ static void session_setup_priority()
         .vals = &vals
     };
     SmProp *list = ∝
+    ob_debug_type(OB_DEBUG_SM, "Setting priority: %d\n", priority);
     SmcSetProperties(sm_conn, 1, &list);
     g_free(prop.name);
     g_free(prop.type);
@@ -294,13 +303,15 @@ static void session_setup_clone_command()
         .num_vals = sm_argc,
         .vals = vals
     };
+    SmProp *list = ∝
 
+    ob_debug_type(OB_DEBUG_SM, "Setting clone command: (%d)\n", sm_argc);
     for (i = 0; i < sm_argc; ++i) {
         vals[i].value = sm_argv[i];
         vals[i].length = strlen(sm_argv[i]) + 1;
+        ob_debug_type(OB_DEBUG_SM, "    %s\n", vals[i].value);
     }
 
-    SmProp *list = &prop;
     SmcSetProperties(sm_conn, 1, &list);
     g_free(prop.name);
     g_free(prop.type);
@@ -318,23 +329,29 @@ static void session_setup_restart_command()
         .num_vals = sm_argc + 4,
         .vals = vals
     };
+    SmProp *list = &prop;
 
+    ob_debug_type(OB_DEBUG_SM, "Setting restart command: (%d)\n", sm_argc+4);
     for (i = 0; i < sm_argc; ++i) {
         vals[i].value = sm_argv[i];
         vals[i].length = strlen(sm_argv[i]) + 1;
+        ob_debug_type(OB_DEBUG_SM, "    %s\n", vals[i].value);
     }
 
-    vals[i].value = g_strdup("--sm-save-file");
-    vals[i].length = strlen("--sm-save-file") + 1;
-    vals[i+1].value = ob_sm_save_file;
-    vals[i+1].length = strlen(ob_sm_save_file) + 1;
+    vals[i].value = g_strdup("--sm-client-id");
+    vals[i].length = strlen("--sm-client-id") + 1;
+    vals[i+1].value = ob_sm_id;
+    vals[i+1].length = strlen(ob_sm_id) + 1;
+    ob_debug_type(OB_DEBUG_SM, "    %s\n", vals[i].value);
+    ob_debug_type(OB_DEBUG_SM, "    %s\n", vals[i+1].value);
 
-    vals[i+2].value = g_strdup("--sm-client-id");
-    vals[i+2].length = strlen("--sm-client-id") + 1;
-    vals[i+3].value = ob_sm_id;
-    vals[i+3].length = strlen(ob_sm_id) + 1;
+    vals[i+2].value = g_strdup("--sm-save-file");
+    vals[i+2].length = strlen("--sm-save-file") + 1;
+    vals[i+3].value = ob_sm_save_file;
+    vals[i+3].length = strlen(ob_sm_save_file) + 1;
+    ob_debug_type(OB_DEBUG_SM, "    %s\n", vals[i+2].value);
+    ob_debug_type(OB_DEBUG_SM, "    %s\n", vals[i+3].value);
 
-    SmProp *list = &prop;
     SmcSetProperties(sm_conn, 1, &list);
     g_free(prop.name);
     g_free(prop.type);
@@ -394,6 +411,7 @@ static void sm_save_yourself(SmcConn conn, SmPointer data, gint save_type,
 
     if (!SmcRequestSaveYourselfPhase2(conn, sm_save_yourself_2, savedata)) {
         ob_debug_type(OB_DEBUG_SM, "Requst for phase 2 failed\n");
+        g_free(savedata);
         SmcSaveYourselfDone(conn, FALSE);
     }
 }
@@ -497,6 +515,8 @@ static gboolean session_save_to_file(const ObSMSaveData *savedata)
             fprintf(f, "\t<role>%s</role>\n", t);
             g_free(t);
 
+            fprintf(f, "\t<windowtype>%d</windowtype>\n", c->type);
+
             fprintf(f, "\t<desktop>%d</desktop>\n", c->desktop);
             fprintf(f, "\t<x>%d</x>\n", prex);
             fprintf(f, "\t<y>%d</y>\n", prey);
@@ -560,12 +580,14 @@ static gboolean session_state_cmp(ObSessionState *s, ObClient *c)
     ob_debug_type(OB_DEBUG_SM, "  client name: %s \n", c->name);
     ob_debug_type(OB_DEBUG_SM, "  client class: %s \n", c->class);
     ob_debug_type(OB_DEBUG_SM, "  client role: %s \n", c->role);
+    ob_debug_type(OB_DEBUG_SM, "  client type: %s \n", c->type);
     ob_debug_type(OB_DEBUG_SM, "  client command: %s \n",
                   c->wm_command ? c->wm_command : "(null)");
     ob_debug_type(OB_DEBUG_SM, "  state id: %s \n", s->id);
     ob_debug_type(OB_DEBUG_SM, "  state name: %s \n", s->name);
     ob_debug_type(OB_DEBUG_SM, "  state class: %s \n", s->class);
     ob_debug_type(OB_DEBUG_SM, "  state role: %s \n", s->role);
+    ob_debug_type(OB_DEBUG_SM, "  state type: %s \n", s->type);
     ob_debug_type(OB_DEBUG_SM, "  state command: %s \n",
                   s->command ? s->command : "(null)");
 
@@ -574,7 +596,13 @@ static gboolean session_state_cmp(ObSessionState *s, ObClient *c)
     {
         return (!strcmp(s->name, c->name) &&
                 !strcmp(s->class, c->class) &&
-                !strcmp(s->role, c->role));
+                !strcmp(s->role, c->role) &&
+                /* the check for type is to catch broken clients, like
+                   firefox, which open a different window on startup
+                   with the same info as the one we saved. only do this
+                   check for old windows that dont use xsmp, others should
+                   know better ! */
+                (!s->command || c->type == s->type));
     }
     return FALSE;
 }
@@ -623,6 +651,9 @@ static void session_load_file(const gchar *path)
         if (!(n = parse_find_node("role", node->children)))
             goto session_load_bail;
         state->role = parse_string(doc, n);
+        if (!(n = parse_find_node("windowtype", node->children)))
+            goto session_load_bail;
+        state->type = parse_int(doc, n);
         if (!(n = parse_find_node("desktop", node->children)))
             goto session_load_bail;
         state->desktop = parse_int(doc, n);
This page took 0.028117 seconds and 4 git commands to generate.