X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fsession.c;h=5918aa1312778f08f319e8e86295f7a34c097c71;hb=a76ac8205cbfe484a5fee7749daa20ed2b7e8a2b;hp=969d2f00d8825c6dee58c9ef8e8d153adec9bfd3;hpb=53309da211ec1a11c5eb452eb78bfb640d1701a1;p=chaz%2Fopenbox
diff --git a/openbox/session.c b/openbox/session.c
index 969d2f00..5918aa13 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"
@@ -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;
@@ -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;
@@ -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))
{