diff --git a/mutter-fix-kinetic-scrolling.patch b/mutter-fix-kinetic-scrolling.patch new file mode 100644 index 0000000..dd3b9be --- /dev/null +++ b/mutter-fix-kinetic-scrolling.patch @@ -0,0 +1,29 @@ +From 26cd031be8b675bd89fc4582e0e4c11116af81d7 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Thu, 14 Sep 2017 14:55:02 +0200 +Subject: clutter: Use the ClutterScrollFinishFlags when delivering scroll + event + +This got accidentally hardcoded to CLUTTER_SCROLL_FINISHED_NONE on commit +d3c559a917, which broke kinetic scrolling for touchpads on clients. +--- + clutter/clutter/evdev/clutter-device-manager-evdev.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/clutter/clutter/evdev/clutter-device-manager-evdev.c b/clutter/clutter/evdev/clutter-device-manager-evdev.c +index 4470a62..9de2ea1 100644 +--- a/clutter/clutter/evdev/clutter-device-manager-evdev.c ++++ b/clutter/clutter/evdev/clutter-device-manager-evdev.c +@@ -1214,8 +1214,7 @@ notify_continuous_axis (ClutterSeatEvdev *seat, + + clutter_seat_evdev_notify_scroll_continuous (seat, device, time_us, + dx, dy, +- scroll_source, +- CLUTTER_SCROLL_FINISHED_NONE); ++ scroll_source, finish_flags); + } + + static void +-- +cgit v0.12 + diff --git a/mutter-monitor-refresh-rate.patch b/mutter-monitor-refresh-rate.patch new file mode 100644 index 0000000..5a08acb --- /dev/null +++ b/mutter-monitor-refresh-rate.patch @@ -0,0 +1,40 @@ +From 743e8cc249168ccc64073ab83c00c31a30ca22e7 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Thu, 14 Sep 2017 12:42:47 +0200 +Subject: backends: Add some wiggle room for refresh rate comparisons + +We have not enough control over the sources of the refresh rate +float variable to make == comparisons reliable, add some room +when comparing these. + +https://bugzilla.gnome.org/show_bug.cgi?id=787668 +--- + src/backends/meta-monitor.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c +index e3595fc..70350c3 100644 +--- a/src/backends/meta-monitor.c ++++ b/src/backends/meta-monitor.c +@@ -32,6 +32,7 @@ + #define MAXIMUM_SCALE_FACTOR 4.0f + #define MINIMUM_LOGICAL_WIDTH 800 + #define MINIMUM_LOGICAL_HEIGHT 600 ++#define MAXIMUM_REFRESH_RATE_DIFF 0.001 + + #define HANDLED_CRTC_MODE_FLAGS (META_CRTC_MODE_FLAG_INTERLACE) + +@@ -1252,8 +1253,8 @@ meta_monitor_mode_spec_equals (MetaMonitorModeSpec *monitor_mode_spec, + { + return (monitor_mode_spec->width == other_monitor_mode_spec->width && + monitor_mode_spec->height == other_monitor_mode_spec->height && +- (monitor_mode_spec->refresh_rate == +- other_monitor_mode_spec->refresh_rate) && ++ ABS (monitor_mode_spec->refresh_rate - ++ other_monitor_mode_spec->refresh_rate) < MAXIMUM_REFRESH_RATE_DIFF && + monitor_mode_spec->flags == other_monitor_mode_spec->flags); + } + +-- +cgit v0.12 + diff --git a/mutter-wayland-fixes.patch b/mutter-wayland-fixes.patch new file mode 100644 index 0000000..ce7ae20 --- /dev/null +++ b/mutter-wayland-fixes.patch @@ -0,0 +1,196 @@ +From 07f6c85cc737b2f7d106490cc4d336f2404ac9b5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Tue, 12 Sep 2017 12:20:31 +0800 +Subject: wayland/inhibit-shortcuts-dialog: Use g_new0 instead of g_new + +The code assumed the newly allocated blocked was initialized to 0, but +it wasn't since g_new was used. Fix that by using g_new0. + +https://bugzilla.gnome.org/show_bug.cgi?id=787570 +--- + src/wayland/meta-wayland-inhibit-shortcuts-dialog.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/wayland/meta-wayland-inhibit-shortcuts-dialog.c b/src/wayland/meta-wayland-inhibit-shortcuts-dialog.c +index da897b9..5f883f7 100644 +--- a/src/wayland/meta-wayland-inhibit-shortcuts-dialog.c ++++ b/src/wayland/meta-wayland-inhibit-shortcuts-dialog.c +@@ -112,7 +112,7 @@ meta_wayland_surface_ensure_inhibit_shortcuts_dialog (MetaWaylandSurface *surfac + if (data) + return data; + +- data = g_new (InhibitShortcutsData, 1); ++ data = g_new0 (InhibitShortcutsData, 1); + surface_inhibit_shortcuts_data_set (surface, data); + g_signal_connect (surface, "destroy", + G_CALLBACK (on_surface_destroyed), +-- +cgit v0.12 + + +From 9c16e4e2f3c198d3ac6a13b02b63b91f3ab56850 Mon Sep 17 00:00:00 2001 +From: Olivier Fourdan +Date: Tue, 12 Sep 2017 09:39:24 +0200 +Subject: wayland: Keep the inhibit shortcut dialog + +On Wayland, the grab()/ungrab() in gtk+/gdk are wired to the shortcut +inhibitor mechanism, which in turn shows the dialog, which can take +focus away from the client window when the dialog is shown. + +If the client issues an ungrab() when the keyboard focus is lost, we +would hide the dialog, causing the keyboard focus to be returned to the +client surface, which in turn would issue a new grab(), so forth and so +on, causing a continuous show/hide of the shortcut inhibitor dialog. + +To avoid this issue, keep the dialog around even if the shortcut inhibit +is canceled by the client, so that the user is forced to make a choice +that we can reuse on the next request without showing the dialog again. + +Instead of hiding the dialog when the shortcut inhibitor is destroyed by +the client, we simply mark the request as canceled and do not apply the +user's choice. + +https://bugzilla.gnome.org/show_bug.cgi?id=787568 +--- + src/wayland/meta-wayland-inhibit-shortcuts-dialog.c | 15 +++++++++++---- + src/wayland/meta-wayland-inhibit-shortcuts-dialog.h | 2 +- + src/wayland/meta-wayland-inhibit-shortcuts.c | 2 +- + 3 files changed, 13 insertions(+), 6 deletions(-) + +diff --git a/src/wayland/meta-wayland-inhibit-shortcuts-dialog.c b/src/wayland/meta-wayland-inhibit-shortcuts-dialog.c +index 5f883f7..a432a41 100644 +--- a/src/wayland/meta-wayland-inhibit-shortcuts-dialog.c ++++ b/src/wayland/meta-wayland-inhibit-shortcuts-dialog.c +@@ -32,6 +32,7 @@ typedef struct _InhibitShortcutsData + MetaInhibitShortcutsDialog *dialog; + gulong response_handler_id; + gboolean has_last_response; ++ gboolean request_canceled; + MetaInhibitShortcutsDialogResponse last_response; + } InhibitShortcutsData; + +@@ -93,7 +94,10 @@ inhibit_shortcuts_dialog_response_cb (MetaInhibitShortcutsDialog *dialog, + { + data->last_response = response; + data->has_last_response = TRUE; +- inhibit_shortcuts_dialog_response_apply (data); ++ ++ /* If the request was canceled, we don't need to apply the choice made */ ++ if (!data->request_canceled) ++ inhibit_shortcuts_dialog_response_apply (data); + + meta_inhibit_shortcuts_dialog_hide (data->dialog); + surface_inhibit_shortcuts_data_destroy_dialog (data); +@@ -154,11 +158,14 @@ meta_wayland_surface_show_inhibit_shortcuts_dialog (MetaWaylandSurface *surface, + } + + data = meta_wayland_surface_ensure_inhibit_shortcuts_dialog (surface, seat); ++ /* This is a new request */ ++ data->request_canceled = FALSE; ++ + meta_inhibit_shortcuts_dialog_show (data->dialog); + } + + void +-meta_wayland_surface_hide_inhibit_shortcuts_dialog (MetaWaylandSurface *surface) ++meta_wayland_surface_cancel_inhibit_shortcuts_dialog (MetaWaylandSurface *surface) + { + InhibitShortcutsData *data; + +@@ -168,8 +175,8 @@ meta_wayland_surface_hide_inhibit_shortcuts_dialog (MetaWaylandSurface *surface) + data = surface_inhibit_shortcuts_data_get (surface); + g_return_if_fail (data); + +- if (data->dialog) +- meta_inhibit_shortcuts_dialog_hide (data->dialog); ++ /* Keep the dialog on screen, but mark the request as canceled */ ++ data->request_canceled = TRUE; + } + + void +diff --git a/src/wayland/meta-wayland-inhibit-shortcuts-dialog.h b/src/wayland/meta-wayland-inhibit-shortcuts-dialog.h +index bd3fc42..a7d60cf 100644 +--- a/src/wayland/meta-wayland-inhibit-shortcuts-dialog.h ++++ b/src/wayland/meta-wayland-inhibit-shortcuts-dialog.h +@@ -24,7 +24,7 @@ + void meta_wayland_surface_show_inhibit_shortcuts_dialog (MetaWaylandSurface *surface, + MetaWaylandSeat *seat); + +-void meta_wayland_surface_hide_inhibit_shortcuts_dialog (MetaWaylandSurface *surface); ++void meta_wayland_surface_cancel_inhibit_shortcuts_dialog (MetaWaylandSurface *surface); + + void meta_wayland_surface_inhibit_shortcuts_dialog_init (void); + +diff --git a/src/wayland/meta-wayland-inhibit-shortcuts.c b/src/wayland/meta-wayland-inhibit-shortcuts.c +index cd07891..a7ba3c2 100644 +--- a/src/wayland/meta-wayland-inhibit-shortcuts.c ++++ b/src/wayland/meta-wayland-inhibit-shortcuts.c +@@ -49,7 +49,7 @@ zwp_keyboard_shortcuts_inhibit_destroy (struct wl_client *client, + shortcut_inhibit = wl_resource_get_user_data (resource); + if (shortcut_inhibit->surface) + { +- meta_wayland_surface_hide_inhibit_shortcuts_dialog (shortcut_inhibit->surface); ++ meta_wayland_surface_cancel_inhibit_shortcuts_dialog (shortcut_inhibit->surface); + + g_signal_handler_disconnect (shortcut_inhibit->surface, + shortcut_inhibit->surface_destroyed_handler); +-- +cgit v0.12 + + +From 2bf7974076ea99c9b30fe5b3d49456dba5a20c19 Mon Sep 17 00:00:00 2001 +From: Olivier Fourdan +Date: Tue, 12 Sep 2017 10:27:32 +0200 +Subject: wayland: do not leak shortcut inhibit data + +We would free the shortcut inhibit data only when the client destroys +its request, which is not the case when the clients itself is +destroyed, leading to a leak of the shortcut inhibit data. + +Free the data on resource destruction instead, and simply destroy the +resource on destroy request. + +https://bugzilla.gnome.org/show_bug.cgi?id=787568 +--- + src/wayland/meta-wayland-inhibit-shortcuts.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/src/wayland/meta-wayland-inhibit-shortcuts.c b/src/wayland/meta-wayland-inhibit-shortcuts.c +index a7ba3c2..8e5ed24 100644 +--- a/src/wayland/meta-wayland-inhibit-shortcuts.c ++++ b/src/wayland/meta-wayland-inhibit-shortcuts.c +@@ -41,8 +41,7 @@ struct _MetaWaylandKeyboardShotscutsInhibit + }; + + static void +-zwp_keyboard_shortcuts_inhibit_destroy (struct wl_client *client, +- struct wl_resource *resource) ++zwp_keyboard_shortcuts_inhibit_destructor (struct wl_resource *resource) + { + MetaWaylandKeyboardShotscutsInhibit *shortcut_inhibit; + +@@ -64,6 +63,12 @@ zwp_keyboard_shortcuts_inhibit_destroy (struct wl_client *client, + shortcut_inhibit->seat); + } + g_free (shortcut_inhibit); ++} ++ ++static void ++zwp_keyboard_shortcuts_inhibit_destroy (struct wl_client *client, ++ struct wl_resource *resource) ++{ + wl_resource_destroy (resource); + } + +@@ -148,7 +153,7 @@ zwp_keyboard_shortcuts_inhibit_manager_inhibit_shortcuts (struct wl_client *cl + wl_resource_set_implementation (keyboard_shortcuts_inhibit_resource, + &meta_keyboard_shortcuts_inhibit_interface, + shortcut_inhibit, +- NULL); ++ zwp_keyboard_shortcuts_inhibit_destructor); + } + + static const struct zwp_keyboard_shortcuts_inhibit_manager_v1_interface +-- +cgit v0.12 + diff --git a/mutter.changes b/mutter.changes index facc370..c91e974 100644 --- a/mutter.changes +++ b/mutter.changes @@ -1,9 +1,26 @@ +------------------------------------------------------------------- +Fri Sep 15 08:50:28 UTC 2017 - zaitor@opensuse.org + +- Add mutter-wayland-fixes.patch: Three bugfix commits from + upstream for wayland (bgo#787570, bgo#787568). +- Add mutter-monitor-refresh-rate.patch: Fix refresh rate for some + users (bgo#787668). +- Add mutter-fix-kinetic-scrolling.patch: Fix kinetic scrolling. + ------------------------------------------------------------------- Thu Sep 14 14:39:13 UTC 2017 - fezhang@suse.com - Drop SLE12 / Leap42 conditionals and build with wayland unconditionally. +------------------------------------------------------------------- +Tue Sep 12 19:59:13 UTC 2017 - zaitor@opensuse.org + +- Add disabled pkgconfig(libpipewire-0.1) BuildRequires and + --enable-remote-desktop configure flag, enable support for + remote desktop and screen cast when the dependency is available + in openSUSE. + ------------------------------------------------------------------- Tue Sep 12 19:33:28 UTC 2017 - luc14n0@linuxmail.org diff --git a/mutter.spec b/mutter.spec index fdbe878..838b387 100644 --- a/mutter.spec +++ b/mutter.spec @@ -28,6 +28,13 @@ Source: http://download.gnome.org/sources/mutter/3.26/%{name}-%{version} Patch0: mutter-fix-startup.patch # PATCH-FEATURE-UPSTREAM mutter-iconcache-Support-RGB16_565-format-for-16-bit-color-.patch FATE#323412 bgo#781704 bsc#1024748 vliaskovitis@suse.com -- iconcache: Support RGB16_565 format for 16-bit sessions Patch1: mutter-iconcache-Support-RGB16_565-format-for-16-bit-color-.patch +# PATCH-FIX-UPSTREAM mutter-wayland-fixes.patch bgo#787570 bgo#787568 zaitor@opensuse.org -- Three bugfix commits from upstream for wayland +Patch2: mutter-wayland-fixes.patch +# PATCH-FIX-UPSTREAM mutter-monitor-refresh-rate.patch bgo#787668 zaitor@opensuse.org -- Fix refreshrate for some user +Patch3: mutter-monitor-refresh-rate.patch +# PATCH-FIX-UPSTREAM mutter-fix-kinetic-scrolling.patch zaitor@opensuse.org -- Fix kinetic scrolling +Patch4: mutter-fix-kinetic-scrolling.patch + # SLE only patches start at 1000 # PATCH-FEATURE-SLE mutter-SLE-bell.patch FATE#316042 bnc#889218 idonmez@suse.com -- make audible bell work out of the box. Patch1000: mutter-SLE-bell.patch @@ -54,6 +61,8 @@ BuildRequires: pkgconfig(gtk+-3.0) >= 3.19.7 BuildRequires: pkgconfig(json-glib-1.0) BuildRequires: pkgconfig(libcanberra-gtk3) BuildRequires: pkgconfig(libinput) +# Not available in openSUSE yet +# BuildRequires: pkgconfig(libpipewire-0.1) BuildRequires: pkgconfig(libstartup-notification-1.0) BuildRequires: pkgconfig(libudev) >= 136 BuildRequires: pkgconfig(libwacom) @@ -135,6 +144,10 @@ applications that want to make use of the mutter library. %setup -q %patch0 -p1 %patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 + # SLE only patches and translations. %if !0%{?is_opensuse} translation-update-upstream @@ -144,6 +157,7 @@ translation-update-upstream %endif %build +# FIXME add --enable-remote-desktop when libpipewire-0.1 is available %configure \ --enable-wayland \ --enable-native-backend \