From f4f8699d84999efac681e26f83403dbd0a45ea9a Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Wed, 22 Dec 2004 23:52:52 +0000 Subject: [PATCH] Partially resolve the conflicting requirements of windows on multiple 2004-12-22 Elijah Newren Partially resolve the conflicting requirements of windows on multiple workspaces and hidden being a global quantity for windows (fixes bug 156182; the remainder of the work is bug 87531 and is a libwnck issue) * src/display.c (event_callback): * src/window.c (meta_window_visible_on_workspace, meta_window_unstick): * src/workspace.c (meta_workspace_add_window, meta_workspace_contains_window, meta_workspace_queue_calc_showing): * src/workspace.h: Remove meta_workspace_contains_window, replace with simple comparison utilizing window->workspace * src/place.c (meta_window_place): * src/window.c (meta_window_shares_some_workspace): * src/window.h: Remove meta_window_shares_some_workspace, replace with a simple comparison utilizing window->workspace * src/session.c (save_state), * src/window.c (meta_window_new_with_attrs, meta_window_apply_session_info, meta_window_free, window_showing_on_its_workspace, meta_window_change_workspace_without_transients, meta_window_unstick, meta_window_set_current_workspace_hint, meta_window_get_workspaces): * src/window.h: * src/workspace.c (meta_workspace_free, meta_workspace_add_window, meta_workspace_remove_window): Only one workspace now --- ChangeLog | 37 +++++++++++++ src/display.c | 3 +- src/place.c | 2 +- src/session.c | 15 ++---- src/window.c | 141 ++++++++++++------------------------------------ src/window.h | 5 +- src/workspace.c | 39 +++++--------- src/workspace.h | 3 -- 8 files changed, 93 insertions(+), 152 deletions(-) diff --git a/ChangeLog b/ChangeLog index 99976dd5d..614254b01 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,40 @@ +2004-12-22 Elijah Newren + + Partially resolve the conflicting requirements of windows on + multiple workspaces and hidden being a global quantity for windows + (fixes bug 156182; the remainder of the work is bug 87531 and is a + libwnck issue) + + * src/display.c (event_callback): + * src/window.c (meta_window_visible_on_workspace, meta_window_unstick): + * src/workspace.c (meta_workspace_add_window, + meta_workspace_contains_window, + meta_workspace_queue_calc_showing): + * src/workspace.h: + + Remove meta_workspace_contains_window, replace with simple + comparison utilizing window->workspace + + * src/place.c (meta_window_place): + * src/window.c (meta_window_shares_some_workspace): + * src/window.h: + + Remove meta_window_shares_some_workspace, replace with a simple + comparison utilizing window->workspace + + * src/session.c (save_state), + * src/window.c (meta_window_new_with_attrs, + meta_window_apply_session_info, meta_window_free, + window_showing_on_its_workspace, + meta_window_change_workspace_without_transients, + meta_window_unstick, meta_window_set_current_workspace_hint, + meta_window_get_workspaces): + * src/window.h: + * src/workspace.c (meta_workspace_free, meta_workspace_add_window, + meta_workspace_remove_window): + + Only one workspace now + 2004-12-20 Elijah Newren * configure.in: post-release version bump to 2.9.3 diff --git a/src/display.c b/src/display.c index 65692a4d5..e4c57675e 100644 --- a/src/display.c +++ b/src/display.c @@ -1947,8 +1947,7 @@ event_callback (XEvent *event, if (window->minimized) { meta_window_unminimize (window); - if (!meta_workspace_contains_window (window->screen->active_workspace, - window)) + if (window->workspace != window->screen->active_workspace) { meta_verbose ("Changing workspace due to MapRequest mapped = %d minimized = %d\n", window->mapped, window->minimized); diff --git a/src/place.c b/src/place.c index 554fa877c..9eae27845 100644 --- a/src/place.c +++ b/src/place.c @@ -750,7 +750,7 @@ meta_window_place (MetaWindow *window, if (!w->minimized && w != window && - meta_window_shares_some_workspace (window, w)) + window->workspace == w->workspace) windows = g_list_prepend (windows, w); tmp = tmp->next; diff --git a/src/session.c b/src/session.c index 5dbce1c72..1e86c14ee 100644 --- a/src/session.c +++ b/src/session.c @@ -1005,17 +1005,10 @@ save_state (void) /* Workspaces we're on */ { - GList *w; - w = window->workspaces; - while (w != NULL) - { - int n; - n = meta_workspace_index (w->data); - fprintf (outfile, - " \n", n); - - w = w->next; - } + int n; + n = meta_workspace_index (window->workspace); + fprintf (outfile, + " \n", n); } /* Gravity */ diff --git a/src/window.c b/src/window.c index 97eea501d..0b1dd234c 100644 --- a/src/window.c +++ b/src/window.c @@ -368,7 +368,7 @@ meta_window_new_with_attrs (MetaDisplay *display, * type */ window->display = display; - window->workspaces = NULL; + window->workspace = NULL; #ifdef HAVE_XSYNC window->sync_request_counter = None; @@ -652,7 +652,7 @@ meta_window_new_with_attrs (MetaDisplay *display, } } - if (window->workspaces == NULL && + if (window->workspace == NULL && window->xtransient_for != None) { /* Try putting dialog on parent's workspace */ @@ -663,28 +663,20 @@ meta_window_new_with_attrs (MetaDisplay *display, if (parent) { - GList *tmp_list; - meta_topic (META_DEBUG_PLACEMENT, - "Putting window %s on some workspaces as parent %s\n", + "Putting window %s on same workspace as parent %s\n", window->desc, parent->desc); if (parent->on_all_workspaces) window->on_all_workspaces = TRUE; - tmp_list = parent->workspaces; - while (tmp_list != NULL) - { - /* this will implicitly add to the appropriate MRU lists - */ - meta_workspace_add_window (tmp_list->data, window); - - tmp_list = tmp_list->next; - } + /* this will implicitly add to the appropriate MRU lists + */ + meta_workspace_add_window (parent->workspace, window); } } - if (window->workspaces == NULL) + if (window->workspace == NULL) { meta_topic (META_DEBUG_PLACEMENT, "Putting window %s on active workspace\n", @@ -831,26 +823,20 @@ meta_window_apply_session_info (MetaWindow *window, * ensured that one of the workspaces from the session was * indeed valid, so we know we'll go right back to one. */ - while (window->workspaces) - meta_workspace_remove_window (window->workspaces->data, window); + if (window->workspace) + meta_workspace_remove_window (window->workspace, window); - tmp = spaces; - while (tmp != NULL) - { - MetaWorkspace *space; + /* Only restore to the first workspace if the window + * happened to be on more than one, since we have replaces + * window->workspaces with window->workspace + */ + meta_workspace_add_window (spaces->data, window); - space = tmp->data; + meta_topic (META_DEBUG_SM, + "Restoring saved window %s to workspace %d\n", + window->desc, + meta_workspace_index (spaces->data)); - meta_workspace_add_window (space, window); - - meta_topic (META_DEBUG_SM, - "Restoring saved window %s to workspace %d\n", - window->desc, - meta_workspace_index (space)); - - tmp = tmp->next; - } - g_slist_free (spaces); } } @@ -978,20 +964,10 @@ meta_window_free (MetaWindow *window) meta_window_unqueue_update_icon (window); meta_window_free_delete_dialog (window); - tmp = window->workspaces; - while (tmp != NULL) - { - GList *next; + if (window->workspace) + meta_workspace_remove_window (window->workspace, window); - next = tmp->next; - - /* pops front of list */ - meta_workspace_remove_window (tmp->data, window); - - tmp = next; - } - - g_assert (window->workspaces == NULL); + g_assert (window->workspace == NULL); #ifndef G_DISABLE_CHECKS tmp = window->screen->workspaces; @@ -1200,7 +1176,7 @@ meta_window_visible_on_workspace (MetaWindow *window, MetaWorkspace *workspace) { return (window->on_all_workspaces && window->screen == workspace->screen) || - meta_workspace_contains_window (workspace, window); + (window->workspace == workspace); } static gboolean @@ -1250,20 +1226,12 @@ window_showing_on_its_workspace (MetaWindow *window) &is_desktop_or_dock); if (window->on_all_workspaces) - /* Unless the behavior in bug 87531 is implemented, or else - * _NET_WM_STATE_HIDDEN can be made per-workspace instead of - * global, or else we get rid of on_all_workspaces windows - * altogether, then this will be just a hack that only sort of - * works. + /* Until the behavior in bug 87531 is implemented, this will be + * just a hack that only sort of works. */ workspace_of_window = window->screen->active_workspace; - else if (window->workspaces) - /* This is sort of hacky too; would like to guarantee that - * window->workspaces only contains a single workspace. I believe - * that's currently true in Metacity, but it isn't guaranteed to - * remain true in the future. - */ - workspace_of_window = window->workspaces->data; + else if (window->workspace) + workspace_of_window = window->workspace; else /* This only seems to be needed for startup */ workspace_of_window = NULL; @@ -3369,8 +3337,6 @@ static void meta_window_change_workspace_without_transients (MetaWindow *window, MetaWorkspace *workspace) { - GList *next; - meta_verbose ("Changing window %s to workspace %d\n", window->desc, meta_workspace_index (workspace)); @@ -3382,24 +3348,11 @@ meta_window_change_workspace_without_transients (MetaWindow *window, meta_window_unstick (window); /* See if we're already on this space. If not, make sure we are */ - if (g_list_find (window->workspaces, workspace) == NULL) - meta_workspace_add_window (workspace, window); - - /* Remove from all other spaces */ - next = window->workspaces; - while (next != NULL) + if (window->workspace != workspace) { - MetaWorkspace *remove; - remove = next->data; - next = next->next; - - if (remove != workspace) - meta_workspace_remove_window (remove, window); + meta_workspace_remove_window (window->workspace, window); + meta_workspace_add_window (workspace, window); } - - /* list size == 1 */ - g_assert (window->workspaces != NULL); - g_assert (window->workspaces->next == NULL); } static gboolean @@ -3473,7 +3426,7 @@ meta_window_unstick (MetaWindow *window) while (tmp) { workspace = (MetaWorkspace *) tmp->data; - if (!meta_workspace_contains_window (workspace, window)) + if (window->workspace != workspace) workspace->mru_list = g_list_remove (workspace->mru_list, window); tmp = tmp->next; } @@ -3483,8 +3436,7 @@ meta_window_unstick (MetaWindow *window) * on more than one workspace this should probably be add_workspace * not change_workspace. */ - if (!meta_workspace_contains_window (window->screen->active_workspace, - window)) + if (window->screen->active_workspace != window->workspace) meta_window_change_workspace (window, window->screen->active_workspace); meta_window_set_current_workspace_hint (window); @@ -3495,11 +3447,10 @@ meta_window_unstick (MetaWindow *window) unsigned long meta_window_get_net_wm_desktop (MetaWindow *window) { - if (window->on_all_workspaces || - g_list_length (window->workspaces) > 1) + if (window->on_all_workspaces) return 0xFFFFFFFF; else - return meta_workspace_index (window->workspaces->data); + return meta_workspace_index (window->workspace); } static void @@ -3540,7 +3491,7 @@ meta_window_set_current_workspace_hint (MetaWindow *window) */ unsigned long data[1]; - if (window->workspaces == NULL) + if (window->workspace == NULL) { /* this happens when unmanaging windows */ return; @@ -5189,7 +5140,7 @@ meta_window_get_workspaces (MetaWindow *window) if (window->on_all_workspaces) return window->screen->workspaces; else - return window->workspaces; + return g_list_prepend (NULL, window->workspace); } static void @@ -6591,28 +6542,6 @@ meta_window_handle_mouse_grab_op_event (MetaWindow *window, } } -gboolean -meta_window_shares_some_workspace (MetaWindow *window, - MetaWindow *with) -{ - GList *tmp; - - if (window->on_all_workspaces || - with->on_all_workspaces) - return TRUE; - - tmp = window->workspaces; - while (tmp != NULL) - { - if (g_list_find (with->workspaces, tmp->data) != NULL) - return TRUE; - - tmp = tmp->next; - } - - return FALSE; -} - void meta_window_set_gravity (MetaWindow *window, int gravity) diff --git a/src/window.h b/src/window.h index e6fd89f79..f1da0e980 100644 --- a/src/window.h +++ b/src/window.h @@ -64,7 +64,7 @@ struct _MetaWindow { MetaDisplay *display; MetaScreen *screen; - GList *workspaces; + MetaWorkspace *workspace; Window xwindow; /* may be NULL! not all windows get decorated */ MetaFrame *frame; @@ -458,9 +458,6 @@ void meta_window_show_menu (MetaWindow *window, int button, Time timestamp); -gboolean meta_window_shares_some_workspace (MetaWindow *window, - MetaWindow *with); - void meta_window_set_gravity (MetaWindow *window, int gravity); diff --git a/src/workspace.c b/src/workspace.c index 205363ff6..2eb9ec033 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -94,7 +94,7 @@ meta_workspace_free (MetaWorkspace *workspace) /* pop front of list we're iterating over */ meta_workspace_remove_window (workspace, window); - g_assert (window->workspaces != NULL); + g_assert (window->workspace != NULL); tmp = next; } @@ -125,14 +125,14 @@ void meta_workspace_add_window (MetaWorkspace *workspace, MetaWindow *window) { - g_return_if_fail (!meta_workspace_contains_window (workspace, window)); + g_return_if_fail (window->workspace == NULL); /* If the window is on all workspaces, we want to add it to all mru * lists, otherwise just add it to this workspaces mru list */ if (window->on_all_workspaces) { - if (window->workspaces == NULL) + if (window->workspace == NULL) { GList* tmp = window->screen->workspaces; while (tmp) @@ -152,7 +152,7 @@ meta_workspace_add_window (MetaWorkspace *workspace, } workspace->windows = g_list_prepend (workspace->windows, window); - window->workspaces = g_list_prepend (window->workspaces, workspace); + window->workspace = workspace; meta_window_set_current_workspace_hint (window); @@ -175,10 +175,10 @@ void meta_workspace_remove_window (MetaWorkspace *workspace, MetaWindow *window) { - g_return_if_fail (meta_workspace_contains_window (workspace, window)); + g_return_if_fail (window->workspace == workspace); workspace->windows = g_list_remove (workspace->windows, window); - window->workspaces = g_list_remove (window->workspaces, workspace); + window->workspace = NULL; /* If the window is on all workspaces, we don't want to remove it * from the MRU list unless this causes it to be removed from all @@ -186,16 +186,13 @@ meta_workspace_remove_window (MetaWorkspace *workspace, */ if (window->on_all_workspaces) { - if (window->workspaces == NULL) + GList* tmp = window->screen->workspaces; + while (tmp) { - GList* tmp = window->screen->workspaces; - while (tmp) - { - MetaWorkspace* work = (MetaWorkspace*) tmp->data; - work->mru_list = g_list_remove (work->mru_list, window); + MetaWorkspace* work = (MetaWorkspace*) tmp->data; + work->mru_list = g_list_remove (work->mru_list, window); - tmp = tmp->next; - } + tmp = tmp->next; } } else @@ -250,13 +247,6 @@ meta_workspace_relocate_windows (MetaWorkspace *workspace, g_assert (workspace->windows == NULL); } -gboolean -meta_workspace_contains_window (MetaWorkspace *workspace, - MetaWindow *window) -{ - return g_list_find (window->workspaces, workspace) != NULL; -} - void meta_workspace_queue_calc_showing (MetaWorkspace *workspace) { @@ -317,11 +307,10 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace, * never gets unmapped and we maintain the button grab * on it. */ - if (move_window) + if (move_window && (move_window->workspace != workspace)) { - if (!meta_workspace_contains_window (workspace, - move_window)) - meta_workspace_add_window (workspace, move_window); + meta_workspace_remove_window (workspace, move_window); + meta_workspace_add_window (workspace, move_window); } } diff --git a/src/workspace.h b/src/workspace.h index 403a73eab..bdb8ef36b 100644 --- a/src/workspace.h +++ b/src/workspace.h @@ -61,9 +61,6 @@ void meta_workspace_remove_window (MetaWorkspace *workspace, MetaWindow *window); void meta_workspace_relocate_windows (MetaWorkspace *workspace, MetaWorkspace *new_home); -/* don't confuse with meta_window_visible_on_workspace() */ -gboolean meta_workspace_contains_window (MetaWorkspace *workspace, - MetaWindow *window); void meta_workspace_activate_with_focus (MetaWorkspace *workspace, MetaWindow *focus_this, Time timestamp);