summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrcaridade145 <[email protected]>2020-02-29 13:01:36 +0000
committerVictor Kareh <[email protected]>2020-05-27 11:25:49 -0400
commitc0549f97732dd57080c15bdd2b64c4162b1a856a (patch)
treef7a0b6f8d20166093e607efddc38748f54ca1d96
parent7e767379251734c6efeef9cc22b326c950470c30 (diff)
downloadmarco-c0549f97732dd57080c15bdd2b64c4162b1a856a.tar.bz2
marco-c0549f97732dd57080c15bdd2b64c4162b1a856a.tar.xz
compositor: fix possible crash closing/destroying window . Fixes to previous commit.
Partially restore call to destroy_win in compositor when calling meta_window_free. This is needed to ensure that we never call meta_window_get_frame_bounds while windows is destroying. https://bugzilla.gnome.org/show_bug.cgi?id=751833 Based on commit https://gitlab.gnome.org/GNOME/metacity/-/commit/a9f28dbc26f5211ef08889109db3dc8c7ba76aca
-rw-r--r--src/compositor/compositor-private.h3
-rw-r--r--src/compositor/compositor-xrender.c36
-rw-r--r--src/compositor/compositor.c4
-rw-r--r--src/core/window-private.h3
-rw-r--r--src/core/window.c11
5 files changed, 48 insertions, 9 deletions
diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h
index fcb15187..1fa64695 100644
--- a/src/compositor/compositor-private.h
+++ b/src/compositor/compositor-private.h
@@ -50,6 +50,9 @@ struct _MetaCompositor
MetaScreen *screen,
MetaWindow *window);
+ void (*free_window) (MetaCompositor *compositor,
+ MetaWindow *window);
+
void (*maximize_window) (MetaCompositor *compositor,
MetaWindow *window);
void (*unmaximize_window) (MetaCompositor *compositor,
diff --git a/src/compositor/compositor-xrender.c b/src/compositor/compositor-xrender.c
index 59fbd93f..5b40b82e 100644
--- a/src/compositor/compositor-xrender.c
+++ b/src/compositor/compositor-xrender.c
@@ -3041,22 +3041,39 @@ xrender_end_move (MetaCompositor *compositor,
#endif
}
+#endif /* 0 */
+
static void
xrender_free_window (MetaCompositor *compositor,
MetaWindow *window)
{
#ifdef HAVE_COMPOSITE_EXTENSIONS
- /* FIXME: When an undecorated window is hidden this is called,
- but the window does not get readded if it is subsequentally shown again
- See http://bugzilla.gnome.org/show_bug.cgi?id=504876
-
- I don't *think* theres any need for this call anyway, leaving it out
- does not seem to cause any side effects so far, but I should check with
- someone who understands more. */
- /* destroy_win (compositor->display, window->xwindow, FALSE); */
+ MetaCompositorXRender *xrc;
+ MetaFrame *frame;
+ Window xwindow;
+
+ xrc = (MetaCompositorXRender *) compositor;
+ frame = meta_window_get_frame (window);
+ xwindow = None;
+
+ if (frame)
+ {
+ xwindow = meta_frame_get_xwindow (frame);
+ }
+ else
+ {
+ /* FIXME: When an undecorated window is hidden this is called, but the
+ * window does not get readded if it is subsequentally shown again. See:
+ * http://bugzilla.gnome.org/show_bug.cgi?id=504876
+ */
+ /* xwindow = meta_window_get_xwindow (window); */
+ }
+
+ if (xwindow != None)
+ destroy_win (xrc->display, xwindow, FALSE);
#endif
}
-#endif /* 0 */
+
static void
xrender_process_event (MetaCompositor *compositor,
@@ -3360,6 +3377,7 @@ static MetaCompositor comp_info = {
xrender_process_event,
xrender_get_window_surface,
xrender_set_active_window,
+ xrender_free_window,
xrender_maximize_window,
xrender_unmaximize_window,
};
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 7e3c79c2..68f54d92 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -156,6 +156,10 @@ void meta_compositor_end_move (MetaCompositor *compositor,
void meta_compositor_free_window (MetaCompositor *compositor,
MetaWindow *window)
{
+ #ifdef HAVE_COMPOSITE_EXTENSIONS
+ if (compositor && compositor->free_window)
+ compositor->free_window (compositor, window);
+ #endif
}
void
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 5abef1e1..ca631966 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -618,6 +618,9 @@ void meta_window_set_gravity (MetaWindow *window,
void meta_window_handle_mouse_grab_op_event (MetaWindow *window,
XEvent *event);
+MetaWorkspace *
+meta_window_get_workspace (MetaWindow *window);
+
GList* meta_window_get_workspaces (MetaWindow *window);
gboolean meta_window_located_on_workspace (MetaWindow *window,
diff --git a/src/core/window.c b/src/core/window.c
index 21d605e2..603bedf3 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -6214,6 +6214,17 @@ idle_update_icon (gpointer data)
return FALSE;
}
+
+MetaWorkspace *
+meta_window_get_workspace (MetaWindow *window)
+{
+ if (window->on_all_workspaces)
+ return window->screen->active_workspace;
+ else
+ return window->workspace;
+}
+
+
GList*
meta_window_get_workspaces (MetaWindow *window)
{