+void session_state_free(ObSessionState *state)
+{
+ if (state) {
+ g_free(state->id);
+ g_free(state->name);
+ g_free(state->class);
+ g_free(state->role);
+
+ g_free(state);
+ }
+}
+
+gboolean session_state_cmp(ObSessionState *s, ObClient *c)
+{
+ gchar *client_id;
+
+ if (!(client_id = client_get_sm_client_id(c)))
+ return FALSE;
+ if (strcmp(s->id, client_id)) {
+ g_free(client_id);
+ return FALSE;
+ }
+ g_free(client_id);
+ if (strcmp(s->name, c->name))
+ return FALSE;
+ if (strcmp(s->class, c->class))
+ return FALSE;
+ if (strcmp(s->role, c->role))
+ return FALSE;
+ return TRUE;
+}
+
+GList* session_state_find(ObClient *c)
+{
+ GList *it;
+
+ 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 it;
+}
+
+static gint stack_sort(const ObSessionState *s1, const ObSessionState *s2)
+{
+ return s1->stacking - s2->stacking;
+}
+