X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fsession.c;h=0f74ec28bdcda79ea67dc62cdac017e2fec2513e;hb=dd97c9beac2778cddb97603315b21778323a25c7;hp=969d2f00d8825c6dee58c9ef8e8d153adec9bfd3;hpb=53309da211ec1a11c5eb452eb78bfb640d1701a1;p=chaz%2Fopenbox
diff --git a/openbox/session.c b/openbox/session.c
index 969d2f00..0f74ec28 100644
--- a/openbox/session.c
+++ b/openbox/session.c
@@ -24,6 +24,10 @@ struct _ObClient;
GList *session_saved_state = NULL;
gint session_desktop = -1;
+gint session_num_desktops = 0;
+gboolean session_desktop_layout_present = FALSE;
+ObDesktopLayout session_desktop_layout;
+GSList *session_desktop_names = NULL;
#ifndef USE_SM
void session_startup(gint argc, gchar **argv) {}
@@ -36,7 +40,6 @@ GList* session_state_find(struct _ObClient *c) { return NULL; }
#include "client.h"
#include "prop.h"
#include "focus.h"
-#include "screen.h"
#include "gettext.h"
#include "parser/parse.h"
@@ -97,7 +100,7 @@ void session_startup(gint argc, gchar **argv)
dir = g_build_filename(parse_xdg_data_home_path(),
"openbox", "sessions", NULL);
if (!parse_mkdir_path(dir, 0700)) {
- g_message(_("Unable to make directory '%s': %s"),
+ g_message(_("Unable to make directory \"%s\": %s"),
dir, g_strerror(errno));
}
@@ -363,6 +366,10 @@ static void session_setup_restart_command()
static ObSMSaveData *sm_save_get_data()
{
ObSMSaveData *savedata = g_new0(ObSMSaveData, 1);
+ /* save the active desktop and client.
+ we don't bother to preemptively save the other desktop state like
+ number and names of desktops, cuz those shouldn't be changing during
+ the save.. */
savedata->focus_client = focus_client;
savedata->desktop = screen_desktop;
return savedata;
@@ -429,7 +436,7 @@ static void sm_save_complete(SmcConn conn, SmPointer data)
static void sm_shutdown_cancelled(SmcConn conn, SmPointer data)
{
- ob_debug_type(OB_DEBUG_SM, "Shutdown cancelled\n");
+ ob_debug_type(OB_DEBUG_SM, "Shutdown cancelled\n");
}
static gboolean session_save_to_file(const ObSMSaveData *savedata)
@@ -441,7 +448,7 @@ static gboolean session_save_to_file(const ObSMSaveData *savedata)
f = fopen(ob_sm_save_file, "w");
if (!f) {
success = FALSE;
- g_message(_("Unable to save the session to '%s': %s"),
+ g_message(_("Unable to save the session to \"%s\": %s"),
ob_sm_save_file, g_strerror(errno));
} else {
fprintf(f, "\n\n");
@@ -449,6 +456,28 @@ static gboolean session_save_to_file(const ObSMSaveData *savedata)
fprintf(f, "%d\n", savedata->desktop);
+ fprintf(f, "%d\n", screen_num_desktops);
+
+ fprintf(f, "\n");
+ fprintf(f, " %d\n",
+ screen_desktop_layout.orientation);
+ fprintf(f, " %d\n",
+ screen_desktop_layout.start_corner);
+ fprintf(f, " %d\n",
+ screen_desktop_layout.columns);
+ fprintf(f, " %d\n",
+ screen_desktop_layout.rows);
+ fprintf(f, "\n");
+
+ if (screen_desktop_names) {
+ gint i;
+
+ fprintf(f, "\n");
+ for (i = 0; screen_desktop_names[i]; ++i)
+ fprintf(f, " %s\n", screen_desktop_names[i]);
+ fprintf(f, "\n");
+ }
+
/* they are ordered top to bottom in stacking order */
for (it = stacking_list; it; it = g_list_next(it)) {
gint prex, prey, prew, preh;
@@ -551,7 +580,7 @@ static gboolean session_save_to_file(const ObSMSaveData *savedata)
if (fflush(f)) {
success = FALSE;
- g_message(_("Error while saving the session to '%s': %s"),
+ g_message(_("Error while saving the session to \"%s\": %s"),
ob_sm_save_file, g_strerror(errno));
}
fclose(f);
@@ -580,14 +609,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 type: %d \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 type: %d \n", s->type);
ob_debug_type(OB_DEBUG_SM, " state command: %s \n",
s->command ? s->command : "(null)");
@@ -624,7 +653,7 @@ GList* session_state_find(ObClient *c)
static void session_load_file(const gchar *path)
{
xmlDocPtr doc;
- xmlNodePtr node, n;
+ xmlNodePtr node, n, m;
GList *it, *inext;
if (!parse_load(path, "openbox_session", &doc, &node))
@@ -633,6 +662,31 @@ static void session_load_file(const gchar *path)
if ((n = parse_find_node("desktop", node->children)))
session_desktop = parse_int(doc, n);
+ if ((n = parse_find_node("numdesktops", node->children)))
+ session_num_desktops = parse_int(doc, n);
+
+ if ((n = parse_find_node("desktoplayout", node->children))) {
+ /* make sure they are all there for it to be valid */
+ if ((m = parse_find_node("orientation", n->children)))
+ session_desktop_layout.orientation = parse_int(doc, m);
+ if (m && (m = parse_find_node("startcorner", n->children)))
+ session_desktop_layout.start_corner = parse_int(doc, m);
+ if (m && (m = parse_find_node("columns", n->children)))
+ session_desktop_layout.columns = parse_int(doc, m);
+ if (m && (m = parse_find_node("rows", n->children)))
+ session_desktop_layout.rows = parse_int(doc, m);
+ session_desktop_layout_present = m != NULL;
+ }
+
+ if ((n = parse_find_node("desktopnames", node->children))) {
+ for (m = parse_find_node("name", n->children); m;
+ m = parse_find_node("name", m->next))
+ {
+ session_desktop_names = g_slist_append(session_desktop_names,
+ parse_string(doc, m));
+ }
+ }
+
for (node = parse_find_node("window", node->children); node != NULL;
node = parse_find_node("window", node->next))
{
@@ -693,7 +747,7 @@ static void session_load_file(const gchar *path)
parse_find_node("undecorated", node->children) != NULL;
state->focused =
parse_find_node("focused", node->children) != NULL;
-
+
/* save this. they are in the file in stacking order, so preserve
that order here */
session_saved_state = g_list_append(session_saved_state, state);