save and restore the desktop number/layout/names in the session.

also fix a segfault in some debug prints, printing ints as strings!
This commit is contained in:
Dana Jansens 2007-05-23 03:07:50 +00:00
parent 3b8bcd3e3a
commit 6f6ab8c442
4 changed files with 80 additions and 13 deletions

View file

@ -56,7 +56,7 @@ guint screen_desktop;
guint screen_last_desktop; guint screen_last_desktop;
Size screen_physical_size; Size screen_physical_size;
gboolean screen_showing_desktop; gboolean screen_showing_desktop;
DesktopLayout screen_desktop_layout; ObDesktopLayout screen_desktop_layout;
gchar **screen_desktop_names; gchar **screen_desktop_names;
Window screen_support_win; Window screen_support_win;
Time screen_desktop_user_time = CurrentTime; Time screen_desktop_user_time = CurrentTime;
@ -306,7 +306,7 @@ void screen_startup(gboolean reconfig)
{ {
guint i, numnames; guint i, numnames;
gchar **names; gchar **names;
GSList *it; GSList *it, *namelist;
guint32 d; guint32 d;
desktop_cycle_popup = pager_popup_new(FALSE); desktop_cycle_popup = pager_popup_new(FALSE);
@ -324,10 +324,12 @@ void screen_startup(gboolean reconfig)
screen_resize(); screen_resize();
/* get the desktop names */ /* get the desktop names */
numnames = g_slist_length(config_desktops_names); namelist = session_desktop_names ?
session_desktop_names : config_desktops_names;
numnames = g_slist_length(namelist);
names = g_new(gchar*, numnames + 1); names = g_new(gchar*, numnames + 1);
names[numnames] = NULL; names[numnames] = NULL;
for (i = 0, it = config_desktops_names; it; ++i, it = g_slist_next(it)) for (i = 0, it = namelist; it; ++i, it = g_slist_next(it))
names[i] = g_strdup(it->data); names[i] = g_strdup(it->data);
/* set the root window property */ /* set the root window property */
@ -337,7 +339,10 @@ void screen_startup(gboolean reconfig)
/* set the number of desktops */ /* set the number of desktops */
screen_num_desktops = 0; screen_num_desktops = 0;
screen_set_num_desktops(config_desktops_num); if (session_num_desktops)
screen_set_num_desktops(session_num_desktops);
else
screen_set_num_desktops(config_desktops_num);
/* start on the current desktop when a wm was already running */ /* start on the current desktop when a wm was already running */
if (PROP_GET32(RootWindow(ob_display, ob_screen), if (PROP_GET32(RootWindow(ob_display, ob_screen),
@ -357,7 +362,10 @@ void screen_startup(gboolean reconfig)
PROP_SET32(RootWindow(ob_display, ob_screen), PROP_SET32(RootWindow(ob_display, ob_screen),
net_showing_desktop, cardinal, screen_showing_desktop); net_showing_desktop, cardinal, screen_showing_desktop);
screen_update_layout(); if (session_desktop_layout_present)
screen_desktop_layout = session_desktop_layout;
else
screen_update_layout();
} }
void screen_shutdown(gboolean reconfig) void screen_shutdown(gboolean reconfig)

View file

@ -41,13 +41,13 @@ extern Window screen_support_win;
/*! The last time at which the user changed desktops */ /*! The last time at which the user changed desktops */
extern Time screen_desktop_user_time; extern Time screen_desktop_user_time;
typedef struct DesktopLayout { typedef struct ObDesktopLayout {
ObOrientation orientation; ObOrientation orientation;
ObCorner start_corner; ObCorner start_corner;
guint rows; guint rows;
guint columns; guint columns;
} DesktopLayout; } ObDesktopLayout;
extern DesktopLayout screen_desktop_layout; extern ObDesktopLayout screen_desktop_layout;
/*! An array of gchar*'s which are desktop names in UTF-8 format */ /*! An array of gchar*'s which are desktop names in UTF-8 format */
extern gchar **screen_desktop_names; extern gchar **screen_desktop_names;

View file

@ -24,6 +24,10 @@ struct _ObClient;
GList *session_saved_state = NULL; GList *session_saved_state = NULL;
gint session_desktop = -1; 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 #ifndef USE_SM
void session_startup(gint argc, gchar **argv) {} void session_startup(gint argc, gchar **argv) {}
@ -36,7 +40,6 @@ GList* session_state_find(struct _ObClient *c) { return NULL; }
#include "client.h" #include "client.h"
#include "prop.h" #include "prop.h"
#include "focus.h" #include "focus.h"
#include "screen.h"
#include "gettext.h" #include "gettext.h"
#include "parser/parse.h" #include "parser/parse.h"
@ -363,6 +366,10 @@ static void session_setup_restart_command()
static ObSMSaveData *sm_save_get_data() static ObSMSaveData *sm_save_get_data()
{ {
ObSMSaveData *savedata = g_new0(ObSMSaveData, 1); 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->focus_client = focus_client;
savedata->desktop = screen_desktop; savedata->desktop = screen_desktop;
return savedata; 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, "<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 */ /* they are ordered top to bottom in stacking order */
for (it = stacking_list; it; it = g_list_next(it)) { for (it = stacking_list; it; it = g_list_next(it)) {
gint prex, prey, prew, preh; 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 name: %s \n", c->name);
ob_debug_type(OB_DEBUG_SM, " client class: %s \n", c->class); 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 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", ob_debug_type(OB_DEBUG_SM, " client command: %s \n",
c->wm_command ? c->wm_command : "(null)"); 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 id: %s \n", s->id);
ob_debug_type(OB_DEBUG_SM, " state name: %s \n", s->name); 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 class: %s \n", s->class);
ob_debug_type(OB_DEBUG_SM, " state role: %s \n", s->role); 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", ob_debug_type(OB_DEBUG_SM, " state command: %s \n",
s->command ? s->command : "(null)"); s->command ? s->command : "(null)");
@ -624,7 +653,7 @@ GList* session_state_find(ObClient *c)
static void session_load_file(const gchar *path) static void session_load_file(const gchar *path)
{ {
xmlDocPtr doc; xmlDocPtr doc;
xmlNodePtr node, n; xmlNodePtr node, n, m;
GList *it, *inext; GList *it, *inext;
if (!parse_load(path, "openbox_session", &doc, &node)) 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))) if ((n = parse_find_node("desktop", node->children)))
session_desktop = parse_int(doc, n); 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; for (node = parse_find_node("window", node->children); node != NULL;
node = parse_find_node("window", node->next)) node = parse_find_node("window", node->next))
{ {

View file

@ -20,6 +20,7 @@
#define __ob__session_h #define __ob__session_h
#include "client.h" #include "client.h"
#include "screen.h"
#include <glib.h> #include <glib.h>
@ -40,6 +41,10 @@ struct _ObSessionState {
/*! The desktop being viewed when the session was saved. A valud of -1 means /*! The desktop being viewed when the session was saved. A valud of -1 means
it was not saved */ it was not saved */
extern gint session_desktop; extern gint session_desktop;
extern gint session_num_desktops;
extern gboolean session_desktop_layout_present;
extern ObDesktopLayout session_desktop_layout;
extern GSList *session_desktop_names;
extern GList *session_saved_state; extern GList *session_saved_state;