From: Dana Jansens Date: Mon, 25 Aug 2003 07:46:59 +0000 (+0000) Subject: save the stacking order of the windows, and sort the saved session data based on... X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=486c189d0b606b6dce28ff84a472979c67d5dc9c;p=chaz%2Fopenbox save the stacking order of the windows, and sort the saved session data based on stacking when it is loaded. make the list public. --- diff --git a/openbox/session.c b/openbox/session.c index f6314dd2..9deb9dfb 100644 --- a/openbox/session.c +++ b/openbox/session.c @@ -31,11 +31,12 @@ void session_state_free(ObSessionState *state) {} #include +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 @@ void session_shutdown() 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 @@ static gboolean session_save() g_warning("unable to save the session to %s: %s", save_file, strerror(errno)); } else { + guint stack_pos = 0; + fprintf(f, "\n\n"); fprintf(f, "\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 @@ static gboolean session_save() g_free(t); fprintf(f, "\t%d\n", c->desktop); + fprintf(f, "\t%d\n", stack_pos); fprintf(f, "\t%d\n", prex); fprintf(f, "\t%d\n", prey); fprintf(f, "\t%d\n", prew); @@ -351,6 +366,8 @@ static gboolean session_save() fprintf(f, "\t\n"); fprintf(f, "\n\n"); + ++stack_pos; + g_free(client_id); } @@ -379,41 +396,43 @@ void session_state_free(ObSessionState *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 @@ void session_load(char *path) 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 @@ void session_load(char *path) 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: @@ -493,6 +515,10 @@ void session_load(char *path) 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); } diff --git a/openbox/session.h b/openbox/session.h index 5247d690..6a7d40c7 100644 --- a/openbox/session.h +++ b/openbox/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