all repos — openbox @ 486c189d0b606b6dce28ff84a472979c67d5dc9c

openbox fork - make it a bit more like ryudo

save the stacking order of the windows, and sort the saved session data based on stacking when it is loaded. make the list public.
Dana Jansens danakj@orodu.net
commit

486c189d0b606b6dce28ff84a472979c67d5dc9c

parent

97e0908f16e203d26c96212231f59e67f9cf944c

2 files changed, 49 insertions(+), 18 deletions(-)

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

@@ -31,11 +31,12 @@ #endif

#include <X11/SM/SMlib.h> +GList *session_saved_state; + static SmcConn sm_conn; static gchar *save_file; static gint sm_argc; static gchar **sm_argv; -static GSList *sm_saved_state; static gboolean session_save();

@@ -217,6 +218,12 @@

SmcSetProperties(sm_conn, 1, props); SmcCloseConnection(sm_conn, 0, NULL); + + while (session_saved_state) { + session_state_free(session_saved_state->data); + session_saved_state = g_list_delete_link(session_saved_state, + session_saved_state); + } } }

@@ -281,16 +288,23 @@ success = FALSE;

g_warning("unable to save the session to %s: %s", save_file, strerror(errno)); } else { + guint stack_pos = 0; + fprintf(f, "<?xml version=\"1.0\"?>\n\n"); fprintf(f, "<openbox_session id=\"%s\">\n\n", ob_sm_id); - for (it = client_list; it; it = g_list_next(it)) { + for (it = stacking_list; it; it = g_list_next(it)) { guint num; gint32 *dimensions; gint prex, prey, prew, preh; - ObClient *c = it->data; + ObClient *c; gchar *client_id, *t; + if (WINDOW_IS_CLIENT(it->data)) + c = WINDOW_AS_CLIENT(it->data); + else + continue; + if (!client_normal(c)) continue;

@@ -327,6 +341,7 @@ fprintf(f, "\t<role>%s</role>\n", t);

g_free(t); fprintf(f, "\t<desktop>%d</desktop>\n", c->desktop); + fprintf(f, "\t<stacking>%d</stacking>\n", stack_pos); fprintf(f, "\t<x>%d</x>\n", prex); fprintf(f, "\t<y>%d</y>\n", prey); fprintf(f, "\t<width>%d</width>\n", prew);

@@ -350,6 +365,8 @@ fprintf(f, "\t<max_horz />\n");

if (c->max_vert) fprintf(f, "\t<max_vert />\n"); fprintf(f, "</window>\n\n"); + + ++stack_pos; g_free(client_id); }

@@ -379,41 +396,43 @@ g_free(state);

} } -static gboolean session_state_cmp(ObSessionState *s, ObClient *c) +gboolean session_state_cmp(ObSessionState *s, ObClient *c) { gchar *client_id; if (!(client_id = client_get_sm_client_id(c))) return FALSE; - g_print("\nsaved %s\nnow %s\n", s->id, client_id); if (strcmp(s->id, client_id)) { g_free(client_id); return FALSE; } g_free(client_id); - g_print("saved %s\nnow %s\n", s->name, c->name); if (strcmp(s->name, c->name)) return FALSE; - g_print("saved %s\nnow %s\n", s->class, c->class); if (strcmp(s->class, c->class)) return FALSE; - g_print("saved %s\nnow %s\n\n", s->role, c->role); if (strcmp(s->role, c->role)) return FALSE; return TRUE; } -ObSessionState* session_state_find(ObClient *c) +GList* session_state_find(ObClient *c) { - GSList *it; + GList *it; - for (it = sm_saved_state; it; it = g_slist_next(it)) - if (session_state_cmp(it->data, c)) { - ObSessionState *s = it->data; - sm_saved_state = g_slist_remove(sm_saved_state, s); - return s; + for (it = session_saved_state; it; it = g_list_next(it)) { + ObSessionState *s = it->data; + if (!s->matched && session_state_cmp(s, c)) { + s->matched = TRUE; + break; } - return NULL; + } + return it; +} + +static gint stack_sort(const ObSessionState *s1, const ObSessionState *s2) +{ + return s1->stacking - s2->stacking; } void session_load(char *path)

@@ -446,6 +465,9 @@ state->class = parse_string(doc, n);

if (!(n = parse_find_node("role", node->xmlChildrenNode))) goto session_load_bail; state->role = parse_string(doc, n); + if (!(n = parse_find_node("stacking", node->xmlChildrenNode))) + goto session_load_bail; + state->stacking = parse_int(doc, n); if (!(n = parse_find_node("desktop", node->xmlChildrenNode))) goto session_load_bail; state->desktop = parse_int(doc, n);

@@ -482,7 +504,7 @@ state->max_vert =

parse_find_node("max_vert", node->xmlChildrenNode) != NULL; /* save this */ - sm_saved_state = g_slist_prepend(sm_saved_state, state); + session_saved_state = g_list_prepend(session_saved_state, state); goto session_load_ok; session_load_bail:

@@ -492,6 +514,10 @@ session_load_ok:

node = parse_find_node("window", node->next); } + + /* sort them by their stacking order */ + session_saved_state = g_list_sort(session_saved_state, + (GCompareFunc)stack_sort); xmlFreeDoc(doc); }
M openbox/session.hopenbox/session.h

@@ -9,18 +9,23 @@ typedef struct _ObSessionState ObSessionState;

struct _ObSessionState { gchar *id, *name, *class, *role; + guint stacking; guint desktop; gint x, y, w, h; gboolean shaded, iconic, skip_pager, skip_taskbar, fullscreen; gboolean above, below, max_horz, max_vert; + + gboolean matched; }; +extern GList *session_saved_state; void session_load(char *path); void session_startup(int argc, char **argv); void session_shutdown(); -ObSessionState* session_state_find(struct _ObClient *c); +GList* session_state_find(struct _ObClient *c); +gboolean session_state_cmp(ObSessionState *s, struct _ObClient *c); void session_state_free(ObSessionState *state); #endif