all repos — openbox @ 6f6ab8c442b1626a1cd28868900a00fe4bf8cb08

openbox fork - make it a bit more like ryudo

save and restore the desktop number/layout/names in the session.
also fix a segfault in some debug prints, printing ints as strings!
Dana Jansens danakj@orodu.net
commit

6f6ab8c442b1626a1cd28868900a00fe4bf8cb08

parent

3b8bcd3e3a5ccb94c8d0c832c671f1f845f2ce76

4 files changed, 80 insertions(+), 13 deletions(-)

jump to
M openbox/screen.copenbox/screen.c

@@ -56,7 +56,7 @@ guint screen_desktop;

guint screen_last_desktop; Size screen_physical_size; gboolean screen_showing_desktop; -DesktopLayout screen_desktop_layout; +ObDesktopLayout screen_desktop_layout; gchar **screen_desktop_names; Window screen_support_win; Time screen_desktop_user_time = CurrentTime;

@@ -306,7 +306,7 @@ void screen_startup(gboolean reconfig)

{ guint i, numnames; gchar **names; - GSList *it; + GSList *it, *namelist; guint32 d; desktop_cycle_popup = pager_popup_new(FALSE);

@@ -324,10 +324,12 @@ /* get the initial size */

screen_resize(); /* 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[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); /* set the root window property */

@@ -337,7 +339,10 @@ g_strfreev(names);

/* set the number of desktops */ 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 */ if (PROP_GET32(RootWindow(ob_display, ob_screen),

@@ -357,7 +362,10 @@ screen_showing_desktop = FALSE;

PROP_SET32(RootWindow(ob_display, ob_screen), 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)
M openbox/screen.hopenbox/screen.h

@@ -41,13 +41,13 @@ extern Window screen_support_win;

/*! The last time at which the user changed desktops */ extern Time screen_desktop_user_time; -typedef struct DesktopLayout { +typedef struct ObDesktopLayout { ObOrientation orientation; ObCorner start_corner; guint rows; guint columns; -} DesktopLayout; -extern DesktopLayout screen_desktop_layout; +} ObDesktopLayout; +extern ObDesktopLayout screen_desktop_layout; /*! An array of gchar*'s which are desktop names in UTF-8 format */ extern gchar **screen_desktop_names;
M openbox/session.copenbox/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 @@ #include "openbox.h"

#include "client.h" #include "prop.h" #include "focus.h" -#include "screen.h" #include "gettext.h" #include "parser/parse.h"

@@ -363,6 +366,10 @@

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;

@@ -448,6 +455,28 @@ fprintf(f, "<?xml version=\"1.0\"?>\n\n");

fprintf(f, "<openbox_session>\n\n"); 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)) {

@@ -580,14 +609,14 @@ ob_debug_type(OB_DEBUG_SM, " client id: %s \n", c->sm_client_id);

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 @@

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))

@@ -632,6 +661,31 @@ return;

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))
M openbox/session.hopenbox/session.h

@@ -20,6 +20,7 @@ #ifndef __ob__session_h

#define __ob__session_h #include "client.h" +#include "screen.h" #include <glib.h>

@@ -40,6 +41,10 @@

/*! The desktop being viewed when the session was saved. A valud of -1 means it was not saved */ 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;