]> Dogcows Code - chaz/openbox/blobdiff - openbox/session.c
1) translate all of openbox's output
[chaz/openbox] / openbox / session.c
index e671a3194fe06490f632f18fc209b9f319a20958..1ff41519e9098de0ac433a34c23e8427d0cfcd6d 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
 
    session.c for the Openbox window manager
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2003-2007   Dana Jansens
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -25,8 +25,8 @@
 
 GList *session_saved_state;
 
-void session_startup(int *argc, char ***argv) {}
-void session_shutdown() {}
+void session_startup(gint argc, gchar **argv) {}
+void session_shutdown(gboolean permanent) {}
 GList* session_state_find(ObClient *c) { return NULL; }
 gboolean session_state_cmp(ObSessionState *s, ObClient *c) { return FALSE; }
 void session_state_free(ObSessionState *state) {}
@@ -62,11 +62,11 @@ static gint        sm_argc;
 static gchar     **sm_argv;
 static gchar      *sm_sessions_path;
 
-static void session_load(char *path);
+static void session_load(gchar *path);
 static gboolean session_save();
 
-static void sm_save_yourself(SmcConn conn, SmPointer data, int save_type,
-                             Bool shutdown, int interact_style, Bool fast);
+static void sm_save_yourself(SmcConn conn, SmPointer data, gint save_type,
+                             Bool shutdown, gint interact_style, Bool fast);
 static void sm_die(SmcConn conn, SmPointer data);
 static void sm_save_complete(SmcConn conn, SmPointer data);
 static void sm_shutdown_cancelled(SmcConn conn, SmPointer data);
@@ -92,17 +92,10 @@ static void save_commands()
         prop_res.vals[i].length = strlen(sm_argv[i]);
     }
 
-    if (save_file) {
-        prop_res.vals[i].value = "--sm-save-file";
-        prop_res.vals[i++].length = strlen("--sm-save-file");
-        prop_res.vals[i].value = save_file;
-        prop_res.vals[i++].length = strlen(save_file);
-    } else {
-        prop_res.vals[i].value = "--sm-client-id";
-        prop_res.vals[i++].length = strlen("--sm-client-id");
-        prop_res.vals[i].value = sm_id;
-        prop_res.vals[i++].length = strlen(sm_id);
-    }
+    prop_res.vals[i].value = "--sm-save-file";
+    prop_res.vals[i++].length = strlen("--sm-save-file");
+    prop_res.vals[i].value = save_file;
+    prop_res.vals[i++].length = strlen(save_file);
 
     props[0] = &prop_res;
     props[1] = &prop_cmd;
@@ -112,18 +105,18 @@ static void save_commands()
     g_free(prop_cmd.vals);
 }
 
-static void remove_two_args(int *argc, char ***argv, int index)
+static void remove_args(gint *argc, gchar ***argv, gint index, gint num)
 {
-    int i;
+    gint i;
 
-    for (i = index; i < index + 2; ++i)
-        (*argv)[i] = (*argv)[i+2];
-    *argc -= 2;
+    for (i = index; i < index + num; ++i)
+        (*argv)[i] = (*argv)[i+num];
+    *argc -= num;
 }
 
-static void parse_args(int *argc, char ***argv)
+static void parse_args(gint *argc, gchar ***argv)
 {
-    int i;
+    gint i;
 
     for (i = 1; i < *argc; ++i) {
         if (!strcmp((*argv)[i], "--sm-client-id")) {
@@ -131,7 +124,7 @@ static void parse_args(int *argc, char ***argv)
                 g_printerr(_("--sm-client-id requires an argument\n"));
             else {
                 sm_id = g_strdup((*argv)[i+1]);
-                remove_two_args(argc, argv, i);
+                remove_args(argc, argv, i, 2);
                 ++i;
             }
         } else if (!strcmp((*argv)[i], "--sm-save-file")) {
@@ -139,36 +132,56 @@ static void parse_args(int *argc, char ***argv)
                 g_printerr(_("--sm-save-file requires an argument\n"));
             else {
                 save_file = g_strdup((*argv)[i+1]);
-                remove_two_args(argc, argv, i);
+                remove_args(argc, argv, i, 2);
                 ++i;
             }
         } else if (!strcmp((*argv)[i], "--sm-disable")) {
             sm_disable = TRUE;
+            remove_args(argc, argv, i, 1);
         }
     }
 }
 
-void session_startup(int *argc, char ***argv)
+void session_startup(gint argc, gchar **argv)
 {
 #define SM_ERR_LEN 1024
 
     SmcCallbacks cb;
-    char sm_err[SM_ERR_LEN];
+    gchar sm_err[SM_ERR_LEN];
+    gint i;
 
-    parse_args(argc, argv);
+    sm_argc = argc;
+    sm_argv = g_new(gchar*, argc);
+    for (i = 0; i < argc; ++i)
+        sm_argv[i] = argv[i];
 
-    if (sm_disable)
+    parse_args(&sm_argc, &sm_argv);
+
+    if (sm_disable) {
+        g_free(sm_argv);
         return;
+    }
 
     sm_sessions_path = g_build_filename(parse_xdg_data_home_path(),
                                         "openbox", "sessions", NULL);
-    parse_mkdir_path(sm_sessions_path, 0700);
+    if (!parse_mkdir_path(sm_sessions_path, 0700)) {
+        g_message(_("Unable to make directory '%s': %s"),
+                  sm_sessions_path, g_strerror(errno));
+    }
 
     if (save_file)
         session_load(save_file);
-
-    sm_argc = *argc;
-    sm_argv = *argv;
+    else {
+        gchar *filename;
+
+        /* this algo is from metacity */
+        filename = g_strdup_printf("%d-%d-%u.obs",
+                                   (gint) time(NULL),
+                                   (gint) getpid(),
+                                   g_random_int());
+        save_file = g_build_filename(sm_sessions_path, filename, NULL);
+        g_free(filename);
+    }
 
     cb.save_yourself.callback = sm_save_yourself;
     cb.save_yourself.client_data = NULL;
@@ -190,7 +203,7 @@ void session_startup(int *argc, char ***argv)
                                 &cb, sm_id, &sm_id,
                                 SM_ERR_LEN, sm_err);
     if (sm_conn == NULL)
-        ob_debug("Failed to connect to session manager: %s", sm_err);
+        ob_debug("Failed to connect to session manager: %s\n", sm_err);
     else {
         SmPropValue val_prog;
         SmPropValue val_uid;
@@ -216,7 +229,7 @@ void session_startup(int *argc, char ***argv)
         val_hint.value = &hint;
         val_hint.length = 1;
 
-        sprintf(pid, "%ld", (long)getpid());
+        g_snprintf(pid, sizeof(pid), "%ld", (glong) getpid());
         val_pid.value = pid;
         val_pid.length = strlen(pid);
 
@@ -245,28 +258,36 @@ void session_startup(int *argc, char ***argv)
     }
 }
 
-void session_shutdown()
+void session_shutdown(gboolean permanent)
 {
+    if (sm_disable)
+        return;
+
     g_free(sm_sessions_path);
     g_free(save_file);
     g_free(sm_id);
+    g_free(sm_argv);
 
     if (sm_conn) {
-        SmPropValue val_hint;
-        SmProp prop_hint = { SmRestartStyleHint, SmCARD8, 1, };
-        SmProp *props[1];
-        gulong hint;
+        /* if permanent is true then we will change our session state so that
+           the SM won't run us again */
+        if (permanent) {
+            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;
+            /* 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;
+            prop_hint.vals = &val_hint;
 
-        props[0] = &prop_hint;
+            props[0] = &prop_hint;
 
-        SmcSetProperties(sm_conn, 1, props);
+            SmcSetProperties(sm_conn, 1, props);
+        }
 
         SmcCloseConnection(sm_conn, 0, NULL);
 
@@ -288,8 +309,8 @@ static void sm_save_yourself_phase2(SmcConn conn, SmPointer data)
     SmcSaveYourselfDone(conn, success);
 }
 
-static void sm_save_yourself(SmcConn conn, SmPointer data, int save_type,
-                             Bool shutdown, int interact_style, Bool fast)
+static void sm_save_yourself(SmcConn conn, SmPointer data, gint save_type,
+                             Bool shutdown, gint interact_style, Bool fast)
 {
     if (!SmcRequestSaveYourselfPhase2(conn, sm_save_yourself_phase2, data)) {
         ob_debug("SAVE YOURSELF PHASE 2 failed\n");
@@ -312,24 +333,15 @@ static void sm_shutdown_cancelled(SmcConn conn, SmPointer data)
 
 static gboolean session_save()
 {
-    gchar *filename;
     FILE *f;
     GList *it;
     gboolean success = TRUE;
 
-    /* this algo is from metacity */
-    filename = g_strdup_printf("%d-%d-%u.obs",
-                               (int) time(NULL),
-                               (int) getpid(),
-                               g_random_int());
-    save_file = g_build_filename(sm_sessions_path, filename, NULL);
-    g_free(filename);
-
     f = fopen(save_file, "w");
     if (!f) {
         success = FALSE;
-        g_warning("unable to save the session to %s: %s",
-                  save_file, strerror(errno));
+        g_message(_("Unable to save the session to '%s': %s"),
+                  save_file, g_strerror(errno));
     } else {
         guint stack_pos = 0;
 
@@ -337,8 +349,6 @@ static gboolean session_save()
         fprintf(f, "<openbox_session id=\"%s\">\n\n", sm_id);
 
         for (it = stacking_list; it; it = g_list_next(it)) {
-            guint num;
-            gint32 *dimensions;
             gint prex, prey, prew, preh;
             ObClient *c;
             gchar *t;
@@ -358,15 +368,19 @@ static gboolean session_save()
             prey = c->area.y;
             prew = c->area.width;
             preh = c->area.height;
-            if (PROP_GETA32(c->window, openbox_premax, cardinal,
-                            (guint32**)&dimensions, &num)) {
-                if (num == 4) {
-                    prex = dimensions[0];
-                    prey = dimensions[1];
-                    prew = dimensions[2];
-                    preh = dimensions[3];
-                }
-                g_free(dimensions);
+            if (c->fullscreen) {
+                prex = c->pre_fullscreen_area.x;
+                prey = c->pre_fullscreen_area.x;
+                prew = c->pre_fullscreen_area.width;
+                preh = c->pre_fullscreen_area.height;
+            }
+            if (c->max_horz) {
+                prex = c->pre_max_area.x;
+                prew = c->pre_max_area.width;
+            }
+            if (c->max_vert) {
+                prey = c->pre_max_area.y;
+                preh = c->pre_max_area.height;
             }
 
             fprintf(f, "<window id=\"%s\">\n", c->sm_client_id);
@@ -416,8 +430,8 @@ static gboolean session_save()
 
         if (fflush(f)) {
             success = FALSE;
-            g_warning("error while saving the session to %s: %s",
-                      save_file, strerror(errno));
+            g_message(_("Error while saving the session to '%s': %s"),
+                      save_file, g_strerror(errno));
         }
         fclose(f);
     }
@@ -465,7 +479,7 @@ static gint stack_sort(const ObSessionState *s1, const ObSessionState *s2)
     return s1->stacking - s2->stacking;
 }
 
-static void session_load(char *path)
+static void session_load(gchar *path)
 {
     xmlDocPtr doc;
     xmlNodePtr node, n;
This page took 0.033176 seconds and 4 git commands to generate.