import mutter-3.32.2-59.el8
This commit is contained in:
parent
4782a43ef8
commit
d1f670bc1a
357
SOURCES/0001-clutter-Backport-of-touch-mode.patch
Normal file
357
SOURCES/0001-clutter-Backport-of-touch-mode.patch
Normal 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
|
||||
|
2091
SOURCES/geometric-picking.patch
Normal file
2091
SOURCES/geometric-picking.patch
Normal file
File diff suppressed because it is too large
Load Diff
1045
SOURCES/wayland-frame-callback-rework.patch
Normal file
1045
SOURCES/wayland-frame-callback-rework.patch
Normal file
File diff suppressed because it is too large
Load Diff
479
SOURCES/xwayland-xauth-xhost-user.patch
Normal file
479
SOURCES/xwayland-xauth-xhost-user.patch
Normal 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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user