mutter/mutter-empty-input-shapes-windows.patch
Bjørn Lie c24a666def Accepting request 263924 from home:badshah400:branches:home:Zaitor:boo906687
Add post-3.14.2 release fixes from upstream git (as of 2014-12-03), seems to me that they fix important issues leading to crashes (except the black login widnow patch which is cosmetic); previous sr would have removed my branch package if accepted, which we don't want for the sake of sr#263919. Sorry abt that.

OBS-URL: https://build.opensuse.org/request/show/263924
OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/mutter?expand=0&rev=161
2014-12-07 20:15:55 +00:00

95 lines
3.4 KiB
Diff

From d7ff632c67ebddf6932d052e08ce9671ae8982d2 Mon Sep 17 00:00:00 2001
From: "Jasper St. Pierre" <jstpierre@mecheye.net>
Date: Wed, 26 Nov 2014 12:45:26 -0800
Subject: window-x11: Fix windows that set empty input shapes
Windows that set empty input shapes get n_rects of 0 when querying them
later, which makes sense, but the code that interpreted the result
translated it into a NULL input shape, which meant it was the same as
the bounding region. As such, an empty input shape would actually get
interpreted as a full input shape!
We, ourselves, set an empty input shape on tray icon windows in
gnome-shell since we would handle the picking ourselves. This meant that
we'd actually get the MetaSurfaceActorX11 when hovering over the tray
icon, instead of the ShellGTKEmbed that we capture events on and react
to.
This fixes weird tray icon behavior in gnome-shell.
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index 1dca3e3..0d6d142 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -1684,7 +1684,7 @@ meta_window_x11_update_input_region (MetaWindow *window)
/* Translate the set of XShape rectangles that we
* get from the X server to a cairo_region. */
XRectangle *rects = NULL;
- int n_rects, ordering;
+ int n_rects = -1, ordering;
meta_error_trap_push (window->display);
rects = XShapeGetRectangles (window->display->xdisplay,
@@ -1694,21 +1694,46 @@ meta_window_x11_update_input_region (MetaWindow *window)
&ordering);
meta_error_trap_pop (window->display);
- /* XXX: The x shape extension doesn't provide a way to only test if an
- * input shape has been specified, so we have to query and throw away the
- * rectangles. */
- if (rects)
- {
- if (n_rects > 1 ||
- (n_rects == 1 &&
- (rects[0].x != 0 ||
- rects[0].y != 0 ||
- rects[0].width != priv->client_rect.width ||
- rects[0].height != priv->client_rect.height)))
- region = region_create_from_x_rectangles (rects, n_rects);
+ /* XXX: The X Shape specification is quite unfortunately specified.
+ *
+ * By default, the window has a shape the same as its bounding region,
+ * which we consider "NULL".
+ *
+ * If the window sets an empty region, then we'll get n_rects as 0
+ * and rects as NULL, which we need to transform back into an empty
+ * region.
+ *
+ * It would be great to have a less-broken extension for this, but
+ * hey, it's X11!
+ */
- XFree (rects);
+ if (n_rects == -1)
+ {
+ /* We had an error. */
+ region = NULL;
+ }
+ else if (n_rects == 0)
+ {
+ /* Client set an empty region. */
+ region = cairo_region_create ();
}
+ else if (n_rects == 1 &&
+ (rects[0].x == 0 ||
+ rects[0].y == 0 ||
+ rects[0].width == priv->client_rect.width ||
+ rects[0].height == priv->client_rect.height))
+ {
+ /* This is the bounding region case. Keep the
+ * region as NULL. */
+ region = NULL;
+ }
+ else
+ {
+ /* Window has a custom shape. */
+ region = region_create_from_x_rectangles (rects, n_rects);
+ }
+
+ meta_XFree (rects);
}
if (region != NULL)
--
cgit v0.10.1