import mutter-3.32.2-59.el8

This commit is contained in:
CentOS Sources 2021-10-05 12:02:13 -04:00 committed by Stepan Oksanichenko
parent 4782a43ef8
commit d1f670bc1a
5 changed files with 4001 additions and 1 deletions

View File

@ -0,0 +1,357 @@
From 2a2e870c139e2130b00d582546616269bca27458 Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Fri, 4 Sep 2020 17:11:36 +0200
Subject: [PATCH] clutter: Backport of ::touch-mode
In upstream/master this is a ClutterSeat readonly property. Add it to
ClutterDeviceManager here, the mechanism and triggering is the same
though.
---
clutter/clutter/clutter-device-manager.c | 24 +++
clutter/clutter/clutter-device-manager.h | 2 +
.../evdev/clutter-device-manager-evdev.c | 179 ++++++++++++++++++
3 files changed, 205 insertions(+)
diff --git a/clutter/clutter/clutter-device-manager.c b/clutter/clutter/clutter-device-manager.c
index c676384..e1cc455 100644
--- a/clutter/clutter/clutter-device-manager.c
+++ b/clutter/clutter/clutter-device-manager.c
@@ -62,6 +62,7 @@ enum
PROP_0,
PROP_BACKEND,
+ PROP_TOUCH_MODE,
PROP_LAST
};
@@ -108,6 +109,7 @@ clutter_device_manager_set_property (GObject *gobject,
priv->backend = g_value_get_object (value);
break;
+ case PROP_TOUCH_MODE:
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
}
@@ -127,6 +129,10 @@ clutter_device_manager_get_property (GObject *gobject,
g_value_set_object (value, priv->backend);
break;
+ case PROP_TOUCH_MODE:
+ g_value_set_boolean (value, FALSE);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
}
@@ -143,6 +149,12 @@ clutter_device_manager_class_init (ClutterDeviceManagerClass *klass)
P_("The ClutterBackend of the device manager"),
CLUTTER_TYPE_BACKEND,
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+ obj_props[PROP_TOUCH_MODE] =
+ g_param_spec_boolean ("touch-mode",
+ P_("Touch mode"),
+ P_("Touch mode"),
+ FALSE,
+ CLUTTER_PARAM_READABLE);
gobject_class->set_property = clutter_device_manager_set_property;
gobject_class->get_property = clutter_device_manager_get_property;
@@ -579,3 +591,15 @@ clutter_device_manager_get_kbd_a11y_settings (ClutterDeviceManager *device_man
*settings = device_manager->priv->kbd_a11y_settings;
}
+
+gboolean
+clutter_device_manager_get_touch_mode (ClutterDeviceManager *device_manager)
+{
+ gboolean touch_mode;
+
+ g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager), FALSE);
+
+ g_object_get (G_OBJECT (device_manager), "touch-mode", &touch_mode, NULL);
+
+ return touch_mode;
+}
diff --git a/clutter/clutter/clutter-device-manager.h b/clutter/clutter/clutter-device-manager.h
index 1cbf030..a4a6271 100644
--- a/clutter/clutter/clutter-device-manager.h
+++ b/clutter/clutter/clutter-device-manager.h
@@ -155,6 +155,8 @@ void clutter_device_manager_set_kbd_a11y_settings (ClutterDeviceManager *devic
CLUTTER_EXPORT
void clutter_device_manager_get_kbd_a11y_settings (ClutterDeviceManager *device_manager,
ClutterKbdA11ySettings *settings);
+CLUTTER_EXPORT
+gboolean clutter_device_manager_get_touch_mode (ClutterDeviceManager *device_manager);
G_END_DECLS
diff --git a/clutter/clutter/evdev/clutter-device-manager-evdev.c b/clutter/clutter/evdev/clutter-device-manager-evdev.c
index 84b0aad..78b5b64 100644
--- a/clutter/clutter/evdev/clutter-device-manager-evdev.c
+++ b/clutter/clutter/evdev/clutter-device-manager-evdev.c
@@ -108,6 +108,19 @@ struct _ClutterDeviceManagerEvdevPrivate
gint device_id_next;
GList *free_device_ids;
+
+ guint tablet_mode_switch_state : 1;
+ guint has_touchscreen : 1;
+ guint has_tablet_switch : 1;
+ guint has_pointer : 1;
+ guint touch_mode : 1;
+};
+
+enum
+{
+ PROP_0,
+ PROP_TOUCH_MODE,
+ N_PROPS
};
static void clutter_device_manager_evdev_event_extender_init (ClutterEventExtenderInterface *iface);
@@ -765,6 +778,34 @@ clutter_event_source_free (ClutterEventSource *source)
g_source_unref (g_source);
}
+static void
+update_touch_mode (ClutterDeviceManagerEvdev *manager_evdev)
+{
+ ClutterDeviceManagerEvdevPrivate *priv = manager_evdev->priv;
+ gboolean touch_mode;
+
+ /* No touch mode if we don't have a touchscreen, easy */
+ if (!priv->has_touchscreen)
+ touch_mode = FALSE;
+ /* If we have a tablet mode switch, honor it being unset */
+ else if (priv->has_tablet_switch && !priv->tablet_mode_switch_state)
+ touch_mode = FALSE;
+ /* If tablet mode is enabled, go for it */
+ else if (priv->has_tablet_switch && priv->tablet_mode_switch_state)
+ touch_mode = TRUE;
+ /* If there is no tablet mode switch (eg. kiosk machines),
+ * assume touch-mode is mutually exclusive with pointers.
+ */
+ else
+ touch_mode = !priv->has_pointer;
+
+ if (priv->touch_mode != touch_mode)
+ {
+ priv->touch_mode = touch_mode;
+ g_object_notify (G_OBJECT (manager_evdev), "touch-mode");
+ }
+}
+
static void
evdev_add_device (ClutterDeviceManagerEvdev *manager_evdev,
struct libinput_device *libinput_device)
@@ -942,19 +983,81 @@ flush_event_queue (void)
}
}
+static gboolean
+has_touchscreen (ClutterDeviceManagerEvdev *manager_evdev)
+{
+ ClutterDeviceManagerEvdevPrivate *priv = manager_evdev->priv;
+ GSList *l;
+
+ for (l = priv->devices; l; l = l->next)
+ {
+ ClutterInputDeviceType device_type;
+
+ device_type = clutter_input_device_get_device_type (l->data);
+
+ if (device_type == CLUTTER_TOUCHSCREEN_DEVICE)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+device_type_is_pointer (ClutterInputDeviceType device_type)
+{
+ return (device_type == CLUTTER_POINTER_DEVICE ||
+ device_type == CLUTTER_TOUCHPAD_DEVICE);
+}
+
+static gboolean
+has_pointer (ClutterDeviceManagerEvdev *manager_evdev)
+{
+ ClutterDeviceManagerEvdevPrivate *priv = manager_evdev->priv;
+ GSList *l;
+
+ for (l = priv->devices; l; l = l->next)
+ {
+ ClutterInputDeviceType device_type;
+
+ device_type = clutter_input_device_get_device_type (l->data);
+
+ if (device_type_is_pointer (device_type))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static gboolean
process_base_event (ClutterDeviceManagerEvdev *manager_evdev,
struct libinput_event *event)
{
+ ClutterDeviceManagerEvdevPrivate *priv = manager_evdev->priv;
ClutterInputDevice *device;
struct libinput_device *libinput_device;
gboolean handled = TRUE;
+ gboolean check_touch_mode;
switch (libinput_event_get_type (event))
{
case LIBINPUT_EVENT_DEVICE_ADDED:
libinput_device = libinput_event_get_device (event);
+ priv->has_touchscreen |=
+ libinput_device_has_capability (libinput_device, LIBINPUT_DEVICE_CAP_TOUCH);
+ priv->has_pointer |=
+ libinput_device_has_capability (libinput_device, LIBINPUT_DEVICE_CAP_POINTER);
+ check_touch_mode = priv->has_touchscreen | priv->has_pointer;
+
+ if (libinput_device_has_capability (libinput_device,
+ LIBINPUT_DEVICE_CAP_SWITCH) &&
+ libinput_device_switch_has_switch (libinput_device,
+ LIBINPUT_SWITCH_TABLET_MODE))
+ {
+ priv->has_tablet_switch = TRUE;
+ check_touch_mode = TRUE;
+ }
+
evdev_add_device (manager_evdev, libinput_device);
break;
@@ -966,7 +1069,17 @@ process_base_event (ClutterDeviceManagerEvdev *manager_evdev,
libinput_device = libinput_event_get_device (event);
+ check_touch_mode =
+ libinput_device_has_capability (libinput_device, LIBINPUT_DEVICE_CAP_TOUCH);
device = libinput_device_get_user_data (libinput_device);
+ if (check_touch_mode)
+ priv->has_touchscreen = has_touchscreen (manager_evdev);
+ if (device_type_is_pointer (clutter_input_device_get_device_type (device)))
+ {
+ priv->has_pointer = has_pointer (manager_evdev);
+ check_touch_mode = TRUE;
+ }
+
evdev_remove_device (manager_evdev,
CLUTTER_INPUT_DEVICE_EVDEV (device));
break;
@@ -975,6 +1088,9 @@ process_base_event (ClutterDeviceManagerEvdev *manager_evdev,
handled = FALSE;
}
+ if (check_touch_mode)
+ update_touch_mode (manager_evdev);
+
return handled;
}
@@ -1752,6 +1868,23 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
notify_pad_ring (device, time, number, source, group, mode, angle);
break;
}
+ case LIBINPUT_EVENT_SWITCH_TOGGLE:
+ {
+ ClutterDeviceManagerEvdevPrivate *priv = manager_evdev->priv;
+ struct libinput_event_switch *switch_event =
+ libinput_event_get_switch_event (event);
+ enum libinput_switch sw =
+ libinput_event_switch_get_switch (switch_event);
+ enum libinput_switch_state state =
+ libinput_event_switch_get_switch_state (switch_event);
+
+ if (sw == LIBINPUT_SWITCH_TABLET_MODE)
+ {
+ priv->tablet_mode_switch_state = (state == LIBINPUT_SWITCH_STATE_ON);
+ update_touch_mode (manager_evdev);
+ }
+ break;
+ }
default:
handled = FALSE;
}
@@ -1967,6 +2100,10 @@ clutter_device_manager_evdev_constructed (GObject *gobject)
source = clutter_event_source_new (manager_evdev);
priv->event_source = source;
+
+ priv->has_touchscreen = has_touchscreen (manager_evdev);
+ priv->has_pointer = has_pointer (manager_evdev);
+ update_touch_mode (manager_evdev);
}
static void
@@ -2001,6 +2138,43 @@ clutter_device_manager_evdev_dispose (GObject *object)
G_OBJECT_CLASS (clutter_device_manager_evdev_parent_class)->dispose (object);
}
+static void
+clutter_device_manager_evdev_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (prop_id)
+ {
+ case PROP_TOUCH_MODE:
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+clutter_device_manager_evdev_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ClutterDeviceManagerEvdev *manager_evdev;
+ ClutterDeviceManagerEvdevPrivate *priv;
+
+ manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (object);
+ priv = manager_evdev->priv;
+
+ switch (prop_id)
+ {
+ case PROP_TOUCH_MODE:
+ g_value_set_boolean (value, priv->touch_mode);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+
static void
clutter_device_manager_evdev_finalize (GObject *object)
{
@@ -2036,6 +2210,8 @@ clutter_device_manager_evdev_class_init (ClutterDeviceManagerEvdevClass *klass)
gobject_class->constructed = clutter_device_manager_evdev_constructed;
gobject_class->finalize = clutter_device_manager_evdev_finalize;
gobject_class->dispose = clutter_device_manager_evdev_dispose;
+ gobject_class->set_property = clutter_device_manager_evdev_set_property;
+ gobject_class->get_property = clutter_device_manager_evdev_get_property;
manager_class = CLUTTER_DEVICE_MANAGER_CLASS (klass);
manager_class->add_device = clutter_device_manager_evdev_add_device;
@@ -2047,6 +2223,9 @@ clutter_device_manager_evdev_class_init (ClutterDeviceManagerEvdevClass *klass)
manager_class->get_supported_virtual_device_types = clutter_device_manager_evdev_get_supported_virtual_device_types;
manager_class->compress_motion = clutter_device_manager_evdev_compress_motion;
manager_class->apply_kbd_a11y_settings = clutter_device_manager_evdev_apply_kbd_a11y_settings;
+
+ g_object_class_override_property (gobject_class, PROP_TOUCH_MODE,
+ "touch-mode");
}
static void
--
2.29.2

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,479 @@
From 8e756d48ed31bcacf12b99cbd82fb2052503f51e Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Jun 2019 16:12:46 +0200
Subject: [PATCH 1/4] xwayland: Generate a Xauth file and pass this to Xwayland
when starting it
Before this commit, sudo x11-app, e.g. sudo gvim /etc/some-file, fails
when running a Wayland session. Where as doing this under a "GNOME on Xorg"
session works fine. For a user switching from the Xorg session to the
Wayland session, this is regression, which we want to avoid.
This commit fixes this by creating and passing an xauth file to Xwayland when
mutter starts it. Just like gdm or startx pass a xauth file to Xorg when they
start Xorg.
Fixes #643
https://gitlab.gnome.org/GNOME/mutter/issues/643
---
meson.build | 1 +
src/meson.build | 1 +
src/wayland/meta-wayland-private.h | 1 +
src/wayland/meta-wayland.c | 11 +++-
src/wayland/meta-xwayland.c | 81 ++++++++++++++++++++++++++++++
5 files changed, 94 insertions(+), 1 deletion(-)
diff --git a/meson.build b/meson.build
index 8ef592bc58..2a404857ce 100644
--- a/meson.build
+++ b/meson.build
@@ -117,6 +117,7 @@ xrandr_dep = dependency('xrandr', version: xrandr_req)
xcb_randr_dep = dependency('xcb-randr')
xcb_res_dep = dependency('xcb-res')
xinerama_dep = dependency('xinerama')
+xau_dep = dependency('xau')
ice_dep = dependency('ice')
atk_dep = dependency('atk', version: atk_req)
libcanberra_dep = dependency('libcanberra', version: libcanberra_req)
diff --git a/src/meson.build b/src/meson.build
index 7cced8f534..91fe74b99a 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -101,6 +101,7 @@ if have_x11
x11_xcb_dep,
xcb_randr_dep,
xcb_res_dep,
+ xau_dep,
]
if have_sm
diff --git a/src/wayland/meta-wayland-private.h b/src/wayland/meta-wayland-private.h
index 07a71f82b1..5bcb0ea4f9 100644
--- a/src/wayland/meta-wayland-private.h
+++ b/src/wayland/meta-wayland-private.h
@@ -51,6 +51,7 @@ typedef struct
struct wl_client *client;
struct wl_resource *xserver_resource;
char *display_name;
+ char *auth_file;
GCancellable *xserver_died_cancellable;
GSubprocess *proc;
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index a593f0a7b7..129da8e20d 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -362,6 +362,12 @@ meta_wayland_override_display_name (const char *display_name)
_display_name_override = g_strdup (display_name);
}
+static const char *
+meta_wayland_get_xwayland_auth_file (MetaWaylandCompositor *compositor)
+{
+ return compositor->xwayland_manager.auth_file;
+}
+
void
meta_wayland_init (void)
{
@@ -439,7 +445,10 @@ meta_wayland_init (void)
}
if (meta_should_autostart_x11_display ())
- set_gnome_env ("DISPLAY", meta_wayland_get_xwayland_display_name (compositor));
+ {
+ set_gnome_env ("DISPLAY", meta_wayland_get_xwayland_display_name (compositor));
+ set_gnome_env ("XAUTHORITY", meta_wayland_get_xwayland_auth_file (compositor));
+ }
set_gnome_env ("WAYLAND_DISPLAY", meta_wayland_get_wayland_display_name (compositor));
}
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index f3df9766ee..c883eb3d6f 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -32,6 +32,9 @@
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
+#include <sys/random.h>
+#include <unistd.h>
+#include <X11/Xauth.h>
#include "compositor/meta-surface-actor-wayland.h"
#include "meta/main.h"
@@ -525,6 +528,75 @@ choose_xdisplay (MetaXWaylandManager *manager)
return TRUE;
}
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (FILE, fclose)
+
+static gboolean
+prepare_auth_file (MetaXWaylandManager *manager)
+{
+ Xauth auth_entry = { 0 };
+ g_autoptr (FILE) fp = NULL;
+ char hostname[HOST_NAME_MAX + 1];
+ char auth_data[16];
+ int fd;
+
+ manager->auth_file = g_build_filename (g_get_user_runtime_dir (),
+ ".mutter-Xwaylandauth.XXXXXX",
+ NULL);
+
+ if (gethostname (hostname, HOST_NAME_MAX) < 0)
+ g_strlcpy (hostname, "localhost", HOST_NAME_MAX);
+
+ if (getrandom (auth_data, sizeof (auth_data), 0) != sizeof (auth_data))
+ {
+ g_warning ("Failed to get random data: %s", g_strerror (errno));
+ return FALSE;
+ }
+
+ auth_entry.family = FamilyLocal;
+ auth_entry.address = hostname;
+ auth_entry.address_length = strlen (auth_entry.address);
+ auth_entry.name = (char *) "MIT-MAGIC-COOKIE-1";
+ auth_entry.name_length = strlen (auth_entry.name);
+ auth_entry.data = auth_data;
+ auth_entry.data_length = sizeof (auth_data);
+
+ fd = g_mkstemp (manager->auth_file);
+ if (fd < 0)
+ {
+ g_warning ("Failed to open Xauthority file: %s", g_strerror (errno));
+ return FALSE;
+ }
+
+ fp = fdopen (fd, "w+");
+ if (!fp)
+ {
+ g_warning ("Failed to open Xauthority stream: %s", g_strerror (errno));
+ close (fd);
+ return FALSE;
+ }
+
+ if (!XauWriteAuth (fp, &auth_entry))
+ {
+ g_warning ("Error writing to Xauthority file: %s", g_strerror (errno));
+ return FALSE;
+ }
+
+ auth_entry.family = FamilyWild;
+ if (!XauWriteAuth (fp, &auth_entry))
+ {
+ g_warning ("Error writing to Xauthority file: %s", g_strerror (errno));
+ return FALSE;
+ }
+
+ if (fflush (fp) == EOF)
+ {
+ g_warning ("Error writing to Xauthority file: %s", g_strerror (errno));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static void
xserver_finished_init (MetaXWaylandManager *manager)
{
@@ -566,6 +638,9 @@ meta_xwayland_start (MetaXWaylandManager *manager,
if (!choose_xdisplay (manager))
goto out;
+ if (!prepare_auth_file (manager))
+ goto out;
+
/* We want xwayland to be a wayland client so we make a socketpair to setup a
* wayland protocol connection. */
if (socketpair (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, xwayland_client_fd) < 0)
@@ -610,6 +685,7 @@ meta_xwayland_start (MetaXWaylandManager *manager,
"-terminate",
"-accessx",
"-core",
+ "-auth", manager->auth_file,
"-listen", "4",
"-listen", "5",
"-displayfd", "6",
@@ -678,6 +754,11 @@ meta_xwayland_stop (MetaXWaylandManager *manager)
unlink (path);
g_clear_pointer (&manager->display_name, g_free);
+ if (manager->auth_file)
+ {
+ unlink (manager->auth_file);
+ g_clear_pointer (&manager->auth_file, g_free);
+ }
if (manager->lock_file)
{
unlink (manager->lock_file);
--
2.31.1
From fdf6969cf89dc9127fc9f4d03d9408e54ccd1b40 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Mon, 19 Aug 2019 15:36:32 +0200
Subject: [PATCH 2/4] xwayland: pass the X11 display
Pass the X11 display to `meta_xwayland_complete_init()` so that it can
be used without poking into GDK.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/735
---
src/wayland/meta-xwayland-private.h | 3 ++-
src/wayland/meta-xwayland.c | 3 ++-
src/x11/meta-x11-display.c | 5 ++---
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/wayland/meta-xwayland-private.h b/src/wayland/meta-xwayland-private.h
index 38874eda3f..abcb09e49b 100644
--- a/src/wayland/meta-xwayland-private.h
+++ b/src/wayland/meta-xwayland-private.h
@@ -29,7 +29,8 @@ meta_xwayland_start (MetaXWaylandManager *manager,
struct wl_display *display);
void
-meta_xwayland_complete_init (MetaDisplay *display);
+meta_xwayland_complete_init (MetaDisplay *display,
+ Display *xdisplay);
void
meta_xwayland_stop (MetaXWaylandManager *manager);
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index c883eb3d6f..350626dfdb 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -727,7 +727,8 @@ on_x11_display_closing (MetaDisplay *display)
/* To be called right after connecting */
void
-meta_xwayland_complete_init (MetaDisplay *display)
+meta_xwayland_complete_init (MetaDisplay *display,
+ Display *xdisplay)
{
/* We install an X IO error handler in addition to the child watch,
because after Xlib connects our child watch may not be called soon
diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c
index 065ffcdda5..d40dcfa3f8 100644
--- a/src/x11/meta-x11-display.c
+++ b/src/x11/meta-x11-display.c
@@ -1066,14 +1066,13 @@ meta_x11_display_new (MetaDisplay *display, GError **error)
g_assert (prepared_gdk_display);
gdk_display = g_steal_pointer (&prepared_gdk_display);
+ xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display);
#ifdef HAVE_WAYLAND
if (meta_is_wayland_compositor ())
- meta_xwayland_complete_init (display);
+ meta_xwayland_complete_init (display, xdisplay);
#endif
- xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display);
-
if (meta_is_syncing ())
XSynchronize (xdisplay, True);
--
2.31.1
From 25a0945aa69c479d6356a970b39e6ae42e43c877 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Mon, 19 Aug 2019 15:48:17 +0200
Subject: [PATCH 3/4] xwayland: Use given X11 display for DnD setup
Use the provided X11 display instead of poking into GDK to get the X11
display.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/735
---
src/wayland/meta-xwayland-private.h | 4 ++--
src/wayland/meta-xwayland-selection.c | 18 +++++++++---------
src/wayland/meta-xwayland.c | 7 +++++--
3 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/src/wayland/meta-xwayland-private.h b/src/wayland/meta-xwayland-private.h
index abcb09e49b..f562d7c96d 100644
--- a/src/wayland/meta-xwayland-private.h
+++ b/src/wayland/meta-xwayland-private.h
@@ -36,8 +36,8 @@ void
meta_xwayland_stop (MetaXWaylandManager *manager);
/* wl_data_device/X11 selection interoperation */
-void meta_xwayland_init_selection (void);
-void meta_xwayland_shutdown_selection (void);
+void meta_xwayland_init_selection (Display *xdisplay);
+void meta_xwayland_shutdown_selection (Display *xdisplay);
gboolean meta_xwayland_selection_handle_event (XEvent *xevent);
const MetaWaylandDragDestFuncs * meta_xwayland_selection_get_drag_dest_funcs (void);
diff --git a/src/wayland/meta-xwayland-selection.c b/src/wayland/meta-xwayland-selection.c
index 808f913339..122bb76e1c 100644
--- a/src/wayland/meta-xwayland-selection.c
+++ b/src/wayland/meta-xwayland-selection.c
@@ -353,9 +353,9 @@ xdnd_send_status (MetaXWaylandSelection *selection_data,
}
static void
-meta_xwayland_init_dnd (MetaXWaylandManager *manager)
+meta_xwayland_init_dnd (MetaXWaylandManager *manager,
+ Display *xdisplay)
{
- Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
MetaDndBridge *dnd = &manager->selection_data->dnd;
XSetWindowAttributes attributes;
guint32 i, version = XDND_VERSION;
@@ -382,12 +382,12 @@ meta_xwayland_init_dnd (MetaXWaylandManager *manager)
}
static void
-meta_xwayland_shutdown_dnd (MetaXWaylandManager *manager)
+meta_xwayland_shutdown_dnd (MetaXWaylandManager *manager,
+ Display *xdisplay)
{
MetaDndBridge *dnd = &manager->selection_data->dnd;
- XDestroyWindow (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
- dnd->dnd_window);
+ XDestroyWindow (xdisplay, dnd->dnd_window);
dnd->dnd_window = None;
}
@@ -1755,7 +1755,7 @@ shutdown_selection_bridge (MetaSelectionBridge *selection)
}
void
-meta_xwayland_init_selection (void)
+meta_xwayland_init_selection (Display *xdisplay)
{
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
MetaXWaylandManager *manager = &compositor->xwayland_manager;
@@ -1764,7 +1764,7 @@ meta_xwayland_init_selection (void)
manager->selection_data = g_slice_new0 (MetaXWaylandSelection);
- meta_xwayland_init_dnd (manager);
+ meta_xwayland_init_dnd (manager, xdisplay);
init_selection_bridge (&manager->selection_data->clipboard,
gdk_x11_get_xatom_by_name ("CLIPBOARD"),
&compositor->seat->data_device.selection_ownership_signal);
@@ -1777,7 +1777,7 @@ meta_xwayland_init_selection (void)
}
void
-meta_xwayland_shutdown_selection (void)
+meta_xwayland_shutdown_selection (Display *xdisplay)
{
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
MetaXWaylandManager *manager = &compositor->xwayland_manager;
@@ -1787,7 +1787,7 @@ meta_xwayland_shutdown_selection (void)
g_clear_object (&selection->clipboard.source);
- meta_xwayland_shutdown_dnd (manager);
+ meta_xwayland_shutdown_dnd (manager, xdisplay);
shutdown_selection_bridge (&selection->clipboard);
shutdown_selection_bridge (&selection->primary);
shutdown_selection_bridge (&selection->dnd.selection);
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index 350626dfdb..3236711482 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -38,6 +38,7 @@
#include "compositor/meta-surface-actor-wayland.h"
#include "meta/main.h"
+#include "meta/meta-x11-display.h"
#include "wayland/meta-wayland-actor-surface.h"
enum
@@ -722,7 +723,9 @@ out:
static void
on_x11_display_closing (MetaDisplay *display)
{
- meta_xwayland_shutdown_selection ();
+ Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
+
+ meta_xwayland_shutdown_selection (xdisplay);
}
/* To be called right after connecting */
@@ -739,7 +742,7 @@ meta_xwayland_complete_init (MetaDisplay *display,
g_signal_connect (display, "x11-display-closing",
G_CALLBACK (on_x11_display_closing), NULL);
- meta_xwayland_init_selection ();
+ meta_xwayland_init_selection (xdisplay);
}
void
--
2.31.1
From a398699a53b9cc6efda4aa8abe0e3176bab80e92 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Mon, 19 Aug 2019 15:50:54 +0200
Subject: [PATCH 4/4] xwayland: Add local user to xhost
With the addition of xauth support (commit a8984a81c), Xwayland would
rely only on the provided cookies for authentication.
As a result, running an Xclient from another VT (hence without the
XAUTHORITY environment variable set) would result in an access denied.
The same on X11 is granted because the local user is automatically
granted access to Xserver by the startup scripts.
Add the local user to xhost at startup on Xwayland so that the user can
still run a client by setting the DISPLAY as long as it's the same user
on the same host.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/735
---
src/wayland/meta-xwayland.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index 3236711482..275aeb78cb 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -598,6 +598,23 @@ prepare_auth_file (MetaXWaylandManager *manager)
return TRUE;
}
+static void
+add_local_user_to_xhost (Display *xdisplay)
+{
+ XHostAddress host_entry;
+ XServerInterpretedAddress siaddr;
+
+ siaddr.type = (char *) "localuser";
+ siaddr.typelength = strlen (siaddr.type);
+ siaddr.value = (char *) g_get_user_name();
+ siaddr.valuelength = strlen (siaddr.value);
+
+ host_entry.family = FamilyServerInterpreted;
+ host_entry.address = (char *) &siaddr;
+
+ XAddHost (xdisplay, &host_entry);
+}
+
static void
xserver_finished_init (MetaXWaylandManager *manager)
{
@@ -743,6 +760,7 @@ meta_xwayland_complete_init (MetaDisplay *display,
g_signal_connect (display, "x11-display-closing",
G_CALLBACK (on_x11_display_closing), NULL);
meta_xwayland_init_selection (xdisplay);
+ add_local_user_to_xhost (xdisplay);
}
void
--
2.31.1

View File

@ -8,7 +8,7 @@
Name: mutter
Version: 3.32.2
Release: 55%{?dist}
Release: 59%{?dist}
Summary: Window and compositing manager based on Clutter
License: GPLv2+
@ -177,6 +177,18 @@ Patch508: 0001-monitor-config-manager-Handle-multiple-builtin-panel.patch
Patch509: 0001-clutter-stage-view-Hide-double-buffered-shadowfb-beh.patch
Patch510: 0002-cogl-gpu-info-Fix-software-acceleration-detection.patch
# Backport of geometric picking, improving performance and fixing picking
# 10bpc pixel formats (#1919467)
Patch511: geometric-picking.patch
Patch520: 0001-clutter-Backport-of-touch-mode.patch
# Backport passing -xauth and adding local user to xhost (#1949176)
Patch521: xwayland-xauth-xhost-user.patch
# Backport fixes avoiding frozen partly off-screen clients (#1989035)
Patch522: wayland-frame-callback-rework.patch
BuildRequires: chrpath
BuildRequires: pango-devel
BuildRequires: startup-notification-devel
@ -318,6 +330,22 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop
%{_datadir}/mutter-%{mutter_api_version}/tests
%changelog
* Fri Aug 06 2021 Jonas Ådahl <jadahl@redhat.com> - 3.32.2-59
- Backport fixes avoiding frozen partly off-screen clients
Resolves: #1989035
* Mon Jul 05 2021 Jonas Ådahl <jadahl@redhat.com> - 3.32.2-58
- Backport xauth and xhost patches
Resolves: #1949176
* Mon Feb 22 2021 Carlos Garnacho <cgarnach@redhat.com> - 3.32.2-57
- Backport touch-mode
Resolves: #1833787
* Tue Feb 09 2021 Jonas Ådahl <jadahl@redhat.com> - 3.32.2-56
- Backport geometric picking patches
Resolves: #1919467
* Tue Feb 09 2021 Jonas Ådahl <jadahl@redhat.com> - 3.32.2-55
- Fix slow nouveau with llvmpipe
Resolves: #1921151