From 97b629ad5b547e1e803ab68538fbc43a5089f5b0 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sun, 23 Jun 2002 00:21:20 +0000 Subject: [PATCH] Partially fix Jacob's SM bugs. 2002-06-22 Havoc Pennington Partially fix Jacob's SM bugs. * src/window.c (meta_window_apply_session_info): restore the extra stuff we're saving, except stack position I didn't figure out yet. * src/session.c: save stack position, minimized, maximized, in the session file. --- ChangeLog | 10 +++++++++ src/session.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++----- src/session.h | 7 ++++++ src/window.c | 29 ++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5cc63c481..51c14d640 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2002-06-22 Havoc Pennington + + Partially fix Jacob's SM bugs. + + * src/window.c (meta_window_apply_session_info): restore the extra + stuff we're saving, except stack position I didn't figure out yet. + + * src/session.c: save stack position, minimized, maximized, + in the session file. + 2002-06-22 Havoc Pennington * src/workspace.c (set_number_of_spaces_hint): do nothing if diff --git a/src/session.c b/src/session.c index 3f9981b24..f09584595 100644 --- a/src/session.c +++ b/src/session.c @@ -826,6 +826,24 @@ decode_text_from_utf8 (const char *text) return g_string_free (str, FALSE); } +static int +stack_cmp (const void *a, + const void *b) +{ + MetaWindow *aw = (void*) a; + MetaWindow *bw = (void*) b; + + if (aw->screen == bw->screen) + return meta_stack_windows_cmp (aw->screen->stack, aw, bw); + /* Then assume screens are stacked by number */ + else if (aw->screen->number < bw->screen->number) + return -1; + else if (aw->screen->number > bw->screen->number) + return 1; + else + return 0; /* not reached in theory, if windows on same display */ +} + static void save_state (void) { @@ -872,10 +890,10 @@ save_state (void) /* The file format is: * - * + * * * - * + * * * * @@ -895,8 +913,12 @@ save_state (void) { GSList *windows; GSList *tmp; - + int stack_position; + windows = meta_display_list_windows (display_iter->data); + windows = g_slist_sort (windows, stack_cmp); + + stack_position = 0; tmp = windows; while (tmp != NULL) { @@ -928,13 +950,14 @@ save_state (void) window->desc, window->sm_client_id); fprintf (outfile, - " \n", + " \n", sm_client_id, res_class ? res_class : "", res_name ? res_name : "", window->title ? window->title : "", role ? role : "", - window_type_to_string (window->type)); + window_type_to_string (window->type), + stack_position); g_free (sm_client_id); g_free (res_class); @@ -945,6 +968,14 @@ save_state (void) if (window->on_all_workspaces) fputs (" \n", outfile); + /* Minimized */ + if (window->minimized) + fputs (" \n", outfile); + + /* Maximized */ + if (window->maximized) + fputs (" \n", outfile); + /* Workspaces we're on */ { GList *w; @@ -980,6 +1011,7 @@ save_state (void) } tmp = tmp->next; + ++stack_position; } g_slist_free (windows); @@ -1016,6 +1048,8 @@ typedef enum WINDOW_TAG_NONE, WINDOW_TAG_DESKTOP, WINDOW_TAG_STICKY, + WINDOW_TAG_MINIMIZED, + WINDOW_TAG_MAXIMIZED, WINDOW_TAG_GEOMETRY } WindowTag; @@ -1234,6 +1268,14 @@ start_element_handler (GMarkupParseContext *context, if (*val) pd->info->type = window_type_from_string (val); } + else if (strcmp (name, "stacking") == 0) + { + if (*val) + { + pd->info->stack_position = atoi (val); + pd->info->stack_position_set = TRUE; + } + } else { g_set_error (error, @@ -1286,6 +1328,16 @@ start_element_handler (GMarkupParseContext *context, pd->info->on_all_workspaces = TRUE; pd->info->on_all_workspaces_set = TRUE; } + else if (strcmp (element_name, "minimized") == 0) + { + pd->info->minimized = TRUE; + pd->info->minimized_set = TRUE; + } + else if (strcmp (element_name, "maximized") == 0) + { + pd->info->maximized = TRUE; + pd->info->maximized_set = TRUE; + } else if (strcmp (element_name, "geometry") == 0) { int i; diff --git a/src/session.h b/src/session.h index 93c9df558..35f267f7b 100644 --- a/src/session.h +++ b/src/session.h @@ -40,6 +40,8 @@ struct _MetaWindowSessionInfo /* Information we restore */ GSList *workspace_indices; + + int stack_position; /* width/height should be multiplied by resize inc and * added to base size; position should be interpreted in @@ -49,9 +51,14 @@ struct _MetaWindowSessionInfo int gravity; MetaRectangle rect; guint on_all_workspaces : 1; + guint minimized : 1; + guint maximized : 1; + guint stack_position_set : 1; guint geometry_set : 1; guint on_all_workspaces_set : 1; + guint minimized_set : 1; + guint maximized_set : 1; }; /* If lookup_saved_state returns something, it should be used, diff --git a/src/window.c b/src/window.c index 0c1d9fc76..221190525 100644 --- a/src/window.c +++ b/src/window.c @@ -628,6 +628,35 @@ static void meta_window_apply_session_info (MetaWindow *window, const MetaWindowSessionInfo *info) { + if (info->stack_position_set) + { + meta_topic (META_DEBUG_SM, + "Restoring stack position %d for window %s\n", + info->stack_position, window->desc); + + /* FIXME well, I'm not sure how to do this. */ + } + + if (info->minimized_set) + { + meta_topic (META_DEBUG_SM, + "Restoring minimized state %d for window %s\n", + info->minimized, window->desc); + + if (window->has_minimize_func && info->minimized) + meta_window_minimize (window); + } + + if (info->maximized_set) + { + meta_topic (META_DEBUG_SM, + "Restoring maximized state %d for window %s\n", + info->maximized, window->desc); + + if (window->has_maximize_func && info->maximized) + meta_window_maximize (window); + } + if (info->on_all_workspaces_set) { window->on_all_workspaces = info->on_all_workspaces;