X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fsession.c;h=4cf6f1cd36bf5e785ed0f956b19940b17a1896f2;hb=ffba11aeb059bef0b4876eb6aad2a8a24e2db6f1;hp=6e4c07d213bb5727cd11132bd2d820613e352cf1;hpb=d9cc4f65221ff3a77218ea7527f82d17810c8a2e;p=chaz%2Fopenbox diff --git a/openbox/session.c b/openbox/session.c index 6e4c07d2..4cf6f1cd 100644 --- a/openbox/session.c +++ b/openbox/session.c @@ -2,9 +2,17 @@ #ifndef USE_SM +#include "session.h" +#include "client.h" + +GList *session_saved_state; + void session_load(char *path) {} void session_startup(int argc, char **argv) {} void session_shutdown() {} +GList* session_state_find(ObClient *c) { return NULL; } +gboolean session_state_cmp(ObSessionState *s, ObClient *c) { return FALSE; } +void session_state_free(ObSessionState *state) {} #else @@ -26,11 +34,12 @@ void session_shutdown() {} #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(); @@ -185,8 +194,6 @@ void session_startup(int argc, char **argv) g_free(val_uid.value); save_commands(); - - ob_debug("Connected to session manager with id %s\n", ob_sm_id); } } @@ -212,6 +219,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); + } } } @@ -276,16 +289,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; @@ -322,6 +342,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); @@ -346,6 +367,8 @@ static gboolean session_save() fprintf(f, "\t\n"); fprintf(f, "\n\n"); + ++stack_pos; + g_free(client_id); } @@ -374,41 +397,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) @@ -417,8 +442,6 @@ void session_load(char *path) xmlNodePtr node, n; gchar *sm_id; - g_message("loading session from %s", path); - if (!parse_load(path, "openbox_session", &doc, &node)) return; @@ -443,6 +466,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); @@ -478,11 +504,8 @@ void session_load(char *path) state->max_vert = parse_find_node("max_vert", node->xmlChildrenNode) != NULL; - g_message("read session window %s", state->name); - /* save this */ - g_message("saved state for %s %s", state->name, state->id); - 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 +516,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); }