summaryrefslogtreecommitdiff
path: root/openbox/session.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-05-23 03:07:50 +0000
committerDana Jansens <danakj@orodu.net>2007-05-23 03:07:50 +0000
commit6f6ab8c442b1626a1cd28868900a00fe4bf8cb08 (patch)
tree0e6aa6093ca161e1de23c6ecc1bc1589f6e94295 /openbox/session.c
parent3b8bcd3e3a5ccb94c8d0c832c671f1f845f2ce76 (diff)
save and restore the desktop number/layout/names in the session.
also fix a segfault in some debug prints, printing ints as strings!
Diffstat (limited to 'openbox/session.c')
-rw-r--r--openbox/session.c62
1 files changed, 58 insertions, 4 deletions
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, "<desktop>%d</desktop>\n", savedata->desktop);
+ fprintf(f, "<numdesktops>%d</numdesktops>\n", screen_num_desktops);
+
+ fprintf(f, "<desktoplayout>\n");
+ fprintf(f, " <orientation>%d</orientation>\n",
+ screen_desktop_layout.orientation);
+ fprintf(f, " <startcorner>%d</startcorner>\n",
+ screen_desktop_layout.start_corner);
+ fprintf(f, " <columns>%d</columns>\n",
+ screen_desktop_layout.columns);
+ fprintf(f, " <rows>%d</rows>\n",
+ screen_desktop_layout.rows);
+ fprintf(f, "</desktoplayout>\n");
+
+ if (screen_desktop_names) {
+ gint i;
+
+ fprintf(f, "<desktopnames>\n");
+ for (i = 0; screen_desktop_names[i]; ++i)
+ fprintf(f, " <name>%s</name>\n", screen_desktop_names[i]);
+ fprintf(f, "</desktopnames>\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))
{