Accepting request 265368 from GNOME:Factory

1

OBS-URL: https://build.opensuse.org/request/show/265368
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/mutter?expand=0&rev=77
This commit is contained in:
Dominique Leuenberger 2014-12-17 18:19:33 +00:00 committed by Git OBS Bridge
commit aa2898f5aa
7 changed files with 467 additions and 1 deletions

View File

@ -0,0 +1,43 @@
From 6d3e64226d43a55f4554e1dcacaf56d81d3dae86 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 20 Nov 2014 14:40:19 -0500
Subject: Revert "screen: Set a black background for testing purposes"
This reverts commit ec8ed1dbb04ce8169c0a38ddf066d5565117c587.
1) It turns out to add a momentary flicker from the transition
between the login screen and user session
2) It actually isn't needed anymore since bug 733026
https://bugzilla.gnome.org/show_bug.cgi?id=740377
diff --git a/src/core/screen.c b/src/core/screen.c
index dbf3f60..b26137e 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -496,15 +496,6 @@ create_guard_window (Display *xdisplay, MetaScreen *screen)
return guard_window;
}
-/* Set a black background on the root window so that we don't
- * see confusing old copies of old windows when debugging
- * and testing. */
-static void
-meta_screen_set_background (MetaScreen *screen)
-{
- XSetWindowBackground (screen->display->xdisplay, screen->xroot, 0x00000000);
-}
-
MetaScreen*
meta_screen_new (MetaDisplay *display,
int number,
@@ -709,7 +700,6 @@ meta_screen_new (MetaDisplay *display,
reload_monitor_infos (screen);
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);
- meta_screen_set_background (screen);
/* Handle creating a no_focus_window for this screen */
screen->no_focus_window =
--
cgit v0.10.1

View File

@ -0,0 +1,29 @@
From 56e74b1ea8ae37b88ba4b48388cd582d77c9dd91 Mon Sep 17 00:00:00 2001
From: "Owen W. Taylor" <otaylor@fishsoup.net>
Date: Fri, 17 Oct 2014 08:58:28 -0400
Subject: MetaWindowActor: don't overwrite send_frame_messages_timer
If the app finished multiple frames before we sent _NET_WM_FRAME_DRAWN,
we could add the send_frame_messages_timer multiple times. In the rare
case that the app immediately closed the window, the older timeout
could potentially then run on the freed actor.
https://bugzilla.gnome.org/show_bug.cgi?id=738686
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index 254a1a9..3d6fab1 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -939,6 +939,10 @@ static void
queue_send_frame_messages_timeout (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv = self->priv;
+
+ if (priv->send_frame_messages_timer != 0)
+ return;
+
MetaDisplay *display = meta_window_get_display (priv->window);
gint64 current_time = meta_compositor_monotonic_time_to_server_time (display, g_get_monotonic_time ());
MetaMonitorManager *monitor_manager = meta_monitor_manager_get ();
--
cgit v0.10.1

View File

@ -0,0 +1,94 @@
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

View File

@ -0,0 +1,226 @@
From 7d3204b1965fd54f28f73013f4700caf37dd8216 Mon Sep 17 00:00:00 2001
From: "Owen W. Taylor" <otaylor@fishsoup.net>
Date: Fri, 17 Oct 2014 08:49:54 -0400
Subject: Fix problems resulting in left-over queued frames
* Use -1 rather than 0 as a flag for pending queue entries; 0 is
a valid frame_counter value from Cogl.
* Consistently handle the fact we can have more than one pending
entry. It's app misbehavior to submit a new frame before
_NET_WM_FRAME_DRAWN is received; but we accept such frame messages,
so we can't just leak them.
* If we remove send_frame_message_timer, assign the current frame counter
to pending entries.
* To try to avoid regressing on this, when sending _NET_WM_FRAME_TIMINGS
messages, if we have stale messages, or messages with no frame drawn
time, warn and remove them from the queue rather than just accumulating.
* Improve commenting.
https://bugzilla.gnome.org/show_bug.cgi?id=738686
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index eb21c46..254a1a9 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -100,7 +100,7 @@ struct _MetaWindowActorPrivate
guint disposed : 1;
/* If set, the client needs to be sent a _NET_WM_FRAME_DRAWN
- * client message using the most recent frame in ->frames */
+ * client message for one or more messages in ->frames */
guint needs_frame_drawn : 1;
guint repaint_scheduled : 1;
@@ -118,10 +118,21 @@ struct _MetaWindowActorPrivate
typedef struct _FrameData FrameData;
+/* Each time the application updates the sync request counter to a new even value
+ * value, we queue a frame into the windows list of frames. Once we're painting
+ * an update "in response" to the window, we fill in frame_counter with the
+ * Cogl counter for that frame, and send _NET_WM_FRAME_DRAWN at the end of the
+ * frame. _NET_WM_FRAME_TIMINGS is sent when we get a frame_complete callback.
+ *
+ * As an exception, if a window is completely obscured, we try to throttle drawning
+ * to a slower frame rate. In this case, frame_counter stays -1 until
+ * send_frame_message_timeout() runs, at which point we send both the
+ * _NET_WM_FRAME_DRAWN and _NET_WM_FRAME_TIMINGS messages.
+ */
struct _FrameData
{
- int64_t frame_counter;
guint64 sync_request_serial;
+ int64_t frame_counter;
gint64 frame_drawn_time;
};
@@ -656,6 +667,30 @@ clip_shadow_under_window (MetaWindowActor *self)
}
static void
+assign_frame_counter_to_frames (MetaWindowActor *self)
+{
+ MetaWindowActorPrivate *priv = self->priv;
+ GList *l;
+
+ /* If the window is obscured, then we're expecting to deal with sending
+ * frame messages in a timeout, rather than in this paint cycle.
+ */
+ if (priv->send_frame_messages_timer != 0)
+ return;
+
+ for (l = priv->frames; l; l = l->next)
+ {
+ FrameData *frame = l->data;
+
+ if (frame->frame_counter == -1)
+ {
+ CoglOnscreen *onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer());
+ frame->frame_counter = cogl_onscreen_get_frame_counter (onscreen);
+ }
+ }
+}
+
+static void
meta_window_actor_paint (ClutterActor *actor)
{
MetaWindowActor *self = META_WINDOW_ACTOR (actor);
@@ -671,6 +706,8 @@ meta_window_actor_paint (ClutterActor *actor)
{
g_source_remove (priv->send_frame_messages_timer);
priv->send_frame_messages_timer = 0;
+
+ assign_frame_counter_to_frames (self);
}
if (shadow != NULL)
@@ -873,16 +910,27 @@ send_frame_messages_timeout (gpointer data)
{
MetaWindowActor *self = (MetaWindowActor *) data;
MetaWindowActorPrivate *priv = self->priv;
- FrameData *frame = g_slice_new0 (FrameData);
+ GList *l;
- frame->sync_request_serial = priv->window->sync_request_serial;
+ for (l = priv->frames; l;)
+ {
+ GList *l_next = l->next;
+ FrameData *frame = l->data;
- do_send_frame_drawn (self, frame);
- do_send_frame_timings (self, frame, 0, 0);
+ if (frame->frame_counter == -1)
+ {
+ do_send_frame_drawn (self, frame);
+ do_send_frame_timings (self, frame, 0, 0);
+
+ priv->frames = g_list_delete_link (priv->frames, l);
+ frame_data_free (frame);
+ }
+
+ l = l_next;
+ }
priv->needs_frame_drawn = FALSE;
priv->send_frame_messages_timer = 0;
- frame_data_free (frame);
return FALSE;
}
@@ -933,6 +981,7 @@ meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
return;
frame = g_slice_new0 (FrameData);
+ frame->frame_counter = -1;
priv->needs_frame_drawn = TRUE;
@@ -1905,24 +1954,12 @@ meta_window_actor_handle_updates (MetaWindowActor *self)
void
meta_window_actor_pre_paint (MetaWindowActor *self)
{
- MetaWindowActorPrivate *priv = self->priv;
- GList *l;
-
if (meta_window_actor_is_destroyed (self))
return;
meta_window_actor_handle_updates (self);
- for (l = priv->frames; l != NULL; l = l->next)
- {
- FrameData *frame = l->data;
-
- if (frame->frame_counter == 0)
- {
- CoglOnscreen *onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer());
- frame->frame_counter = cogl_onscreen_get_frame_counter (onscreen);
- }
- }
+ assign_frame_counter_to_frames (self);
}
static void
@@ -1963,16 +2000,23 @@ meta_window_actor_post_paint (MetaWindowActor *self)
if (meta_window_actor_is_destroyed (self))
return;
- /* This window had damage, but wasn't actually redrawn because
- * it is obscured. So we should wait until timer expiration
- * before sending _NET_WM_FRAME_* messages.
- */
- if (priv->send_frame_messages_timer != 0)
- return;
-
- if (priv->needs_frame_drawn)
+ /* If the window had damage, but wasn't actually redrawn because
+ * it is obscured, we should wait until timer expiration before
+ * sending _NET_WM_FRAME_* messages.
+ */
+ if (priv->send_frame_messages_timer == 0 &&
+ priv->needs_frame_drawn)
{
- do_send_frame_drawn (self, priv->frames->data);
+ GList *l;
+
+ for (l = priv->frames; l; l = l->next)
+ {
+ FrameData *frame = l->data;
+
+ if (frame->frame_drawn_time == 0)
+ do_send_frame_drawn (self, frame);
+ }
+
priv->needs_frame_drawn = FALSE;
}
@@ -2057,15 +2101,20 @@ meta_window_actor_frame_complete (MetaWindowActor *self,
{
GList *l_next = l->next;
FrameData *frame = l->data;
+ gint64 frame_counter = cogl_frame_info_get_frame_counter (frame_info);
- if (frame->frame_counter == cogl_frame_info_get_frame_counter (frame_info))
+ if (frame->frame_counter != -1 && frame->frame_counter <= frame_counter)
{
- if (frame->frame_drawn_time != 0)
- {
- priv->frames = g_list_delete_link (priv->frames, l);
- send_frame_timings (self, frame, frame_info, presentation_time);
- frame_data_free (frame);
- }
+ if (G_UNLIKELY (frame->frame_drawn_time == 0))
+ g_warning ("%s: Frame has assigned frame counter but no frame drawn time",
+ priv->window->desc);
+ if (G_UNLIKELY (frame->frame_counter < frame_counter))
+ g_warning ("%s: frame_complete callback never occurred for frame %" G_GINT64_FORMAT,
+ priv->window->desc, frame->frame_counter);
+
+ priv->frames = g_list_delete_link (priv->frames, l);
+ send_frame_timings (self, frame, frame_info, presentation_time);
+ frame_data_free (frame);
}
l = l_next;
--
cgit v0.10.1

View File

@ -0,0 +1,26 @@
From 2e7b9e0dfed8ca637cf70bc160489610b93234fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Fri, 14 Nov 2014 13:23:15 +0100
Subject: window-actor: Do not request unredirection when destroyed
WindowActors can outlive their corresponding window to animate unmap.
Unredirecting the actor does not make sense in that case, so make
sure to not request it.
https://bugzilla.gnome.org/show_bug.cgi?id=740133
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index 39864d6..eb21c46 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -1155,7 +1155,7 @@ gboolean
meta_window_actor_should_unredirect (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv = self->priv;
- if (priv->surface)
+ if (!meta_window_actor_is_destroyed (self) && priv->surface)
return meta_surface_actor_should_unredirect (priv->surface);
else
return FALSE;
--
cgit v0.10.1

View File

@ -1,3 +1,27 @@
-------------------------------------------------------------------
Fri Dec 12 15:51:53 UTC 2014 - fcrozat@suse.com
- Disable wayland on SLE12.
- Remove BuildRequires pkgconfig(gbm), not needed unless building
native backend.
-------------------------------------------------------------------
Wed Dec 3 23:35:43 UTC 2014 - badshah400@gmail.com
- Add post-release fixes from upstream:
+ mutter-black-screen-during-login.patch: Disable ugly black
screen during login (bgo#740377).
+ mutter-window-actor-unredirection-when-destroyed.patch:
window-actor: Do not request unredirection when destroyed
(bgo#740133).
+ mutter-empty-input-shapes-windows.patch: window-x11: Fix
windows that set empty input shapes.
+ mutter-left-over-queued-frames.patch: Fix problems resulting
in left-over queued frames (bgo#738686).
+ mutter-dont-overwrite-send_frame_messages_timer.patch:
MetaWindowActor: don't overwrite send_frame_messages_timer
(bgo#738686).
-------------------------------------------------------------------
Wed Nov 12 20:53:02 UTC 2014 - zaitor@opensuse.org

View File

@ -16,6 +16,12 @@
#
%if 0%{?suse_version} == 1315
%define build_wayland 0
%else
%define build_wayland 1
%endif
Name: mutter
Version: 3.14.2
Release: 0
@ -24,6 +30,16 @@ License: GPL-2.0+
Group: System/GUI/GNOME
Url: http://www.gnome.org
Source: http://download.gnome.org/sources/mutter/3.14/%{name}-%{version}.tar.xz
# PATCH-FIX-UPSTREAM mutter-black-screen-during-login.patch bgo#740377 badshah400@gmail.com --Disable ugly black screen during login; patch taken from upstream git
Patch0: mutter-black-screen-during-login.patch
# PATCH-FIX-UPSTREAM mutter-window-actor-unredirection-when-destroyed.patch bgo#740133 badshah400@gmail.com -- window-actor: Do not request unredirection when destroyed; patch taken from upstream
Patch1: mutter-window-actor-unredirection-when-destroyed.patch
# PATCH-FIX-UPSTREAM mutter-empty-input-shapes-windows.patch badshah400@gmail.com -- window-x11: Fix windows that set empty input shapes; patch taken from upstream git
Patch2: mutter-empty-input-shapes-windows.patch
# PATCH-FIX-UPSTREAM mutter-left-over-queued-frames.patch bgo#738686 badshah400@gmail.com -- Fix problems resulting in left-over queued frames; patch taken from upstream git
Patch3: mutter-left-over-queued-frames.patch
# PATCH-FIX-UPSTREAM mutter-dont-overwrite-send_frame_messages_timer.patch bgo#738686 badshah400@gmail.com -- MetaWindowActor: don't overwrite send_frame_messages_timer; patch taken from upstream git
Patch4: mutter-dont-overwrite-send_frame_messages_timer.patch
BuildRequires: fdupes
BuildRequires: gobject-introspection-devel >= 0.9.5
BuildRequires: intltool
@ -35,11 +51,12 @@ BuildRequires: update-desktop-files
BuildRequires: zenity
BuildRequires: pkgconfig(cairo) >= 1.10.0
BuildRequires: pkgconfig(clutter-1.0) >= 1.19.7
%if %{build_wayland}
BuildRequires: pkgconfig(clutter-egl-1.0)
BuildRequires: pkgconfig(clutter-wayland-1.0)
BuildRequires: pkgconfig(clutter-wayland-compositor-1.0)
%endif
BuildRequires: pkgconfig(cogl-1.0) >= 1.17.1
BuildRequires: pkgconfig(gbm) >= 10.3
BuildRequires: pkgconfig(gio-unix-2.0) >= 2.25.10
BuildRequires: pkgconfig(gnome-desktop-3.0)
BuildRequires: pkgconfig(gsettings-desktop-schemas) >= 3.7.3
@ -51,7 +68,9 @@ BuildRequires: pkgconfig(libstartup-notification-1.0)
BuildRequires: pkgconfig(libsystemd)
BuildRequires: pkgconfig(pango) >= 1.2.0
BuildRequires: pkgconfig(upower-glib) >= 0.99.0
%if %{build_wayland}
BuildRequires: pkgconfig(wayland-server) >= 1.4.93
%endif
BuildRequires: pkgconfig(x11-xcb)
BuildRequires: pkgconfig(xcb-randr)
BuildRequires: pkgconfig(xcomposite) >= 0.2
@ -132,6 +151,11 @@ to develop applications that require these.
%lang_package
%prep
%setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
translation-update-upstream
%build