summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-08-25 07:46:59 +0000
committerDana Jansens <danakj@orodu.net>2003-08-25 07:46:59 +0000
commit486c189d0b606b6dce28ff84a472979c67d5dc9c (patch)
tree95f754da374e39106aa65adb5e199c3ff56231a9 /openbox
parent97e0908f16e203d26c96212231f59e67f9cf944c (diff)
save the stacking order of the windows, and sort the saved session data based on stacking when it is loaded. make the list public.
Diffstat (limited to 'openbox')
-rw-r--r--openbox/session.c60
-rw-r--r--openbox/session.h7
2 files changed, 49 insertions, 18 deletions
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 <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 @@ 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, "<?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 @@ static gboolean session_save()
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);
@@ -351,6 +366,8 @@ static gboolean session_save()
fprintf(f, "\t<max_vert />\n");
fprintf(f, "</window>\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