import Oracle_OSS mutter-49.4-4.el10_2

This commit is contained in:
AlmaLinux RelEng Bot 2026-07-15 01:48:02 -04:00
parent 36c3532647
commit 22da44a45e
36 changed files with 2138 additions and 2932 deletions

3
.gitignore vendored
View File

@ -1 +1,2 @@
SOURCES/mutter-47.5.tar.xz
meson-1.5.0.tar.gz
mutter-49.4.tar.xz

View File

@ -1 +0,0 @@
e4dbc506016b0cc64e15540709c73c162f1d14fb SOURCES/mutter-47.5.tar.xz

View File

@ -0,0 +1,310 @@
From b8383cd5dae36505f4ad1aea99cb672b7837187b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Wed, 5 Nov 2025 17:10:15 +0100
Subject: [PATCH] Revert "background: Port from gdk-pixbuf to glycin"
This reverts commit 34d66f86d941dc47101f1f69c54122913442dee2.
---
meson.build | 4 +-
src/compositor/meta-background-image.c | 166 ++++++-------------------
src/meson.build | 2 +-
3 files changed, 38 insertions(+), 134 deletions(-)
diff --git a/meson.build b/meson.build
index 3957cc0d7f..659e8b3dc3 100644
--- a/meson.build
+++ b/meson.build
@@ -21,7 +21,7 @@ gi_req = '>= 0.9.5'
graphene_req = '>= 1.10.2'
gtk3_req = '>= 3.19.8'
gtk4_req = '>= 4.14.0'
-glycin_req = '>= 2.0.beta.2'
+gdk_pixbuf_req = '>= 2.0'
pango_req = '>= 1.46.0'
cairo_req = '>= 1.10.0'
pangocairo_req = '>= 1.20'
@@ -117,7 +117,7 @@ subproject('gvdb')
m_dep = cc.find_library('m', required: true)
graphene_dep = dependency('graphene-gobject-1.0', version: graphene_req)
-glycin_dep = dependency('glycin-2', version: glycin_req)
+gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0', version: gdk_pixbuf_req)
cairo_dep = dependency('cairo', version: cairo_req)
pixman_dep = dependency('pixman-1', version: pixman_req)
gsettings_desktop_schemas_dep = dependency('gsettings-desktop-schemas',
diff --git a/src/compositor/meta-background-image.c b/src/compositor/meta-background-image.c
index 6cf9187d56..e5c879c892 100644
--- a/src/compositor/meta-background-image.c
+++ b/src/compositor/meta-background-image.c
@@ -20,11 +20,10 @@
#include "compositor/meta-background-image-private.h"
-#include <glycin.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gio/gio.h>
#include "clutter/clutter.h"
-#include "clutter/clutter-backend-private.h"
#include "compositor/cogl-utils.h"
enum
@@ -63,7 +62,6 @@ struct _MetaBackgroundImage
gboolean in_cache;
gboolean loaded;
CoglTexture *texture;
- ClutterColorState *color_state;
};
G_DEFINE_TYPE (MetaBackgroundImageCache, meta_background_image_cache, G_TYPE_OBJECT);
@@ -117,111 +115,33 @@ meta_background_image_cache_get_default (void)
return cache;
}
-static CoglPixelFormat
-gly_memory_format_to_cogl (GlyMemoryFormat format)
-{
- switch ((guint) format)
- {
- case GLY_MEMORY_B8G8R8A8_PREMULTIPLIED:
- return COGL_PIXEL_FORMAT_BGRA_8888_PRE;
- case GLY_MEMORY_A8R8G8B8_PREMULTIPLIED:
- return COGL_PIXEL_FORMAT_ARGB_8888_PRE;
- case GLY_MEMORY_R8G8B8A8_PREMULTIPLIED:
- return COGL_PIXEL_FORMAT_RGBA_8888_PRE;
- case GLY_MEMORY_B8G8R8A8:
- return COGL_PIXEL_FORMAT_BGRA_8888;
- case GLY_MEMORY_A8R8G8B8:
- return COGL_PIXEL_FORMAT_ARGB_8888;
- case GLY_MEMORY_R8G8B8A8:
- return COGL_PIXEL_FORMAT_RGBA_8888;
- case GLY_MEMORY_A8B8G8R8:
- return COGL_PIXEL_FORMAT_ABGR_8888;
- case GLY_MEMORY_R8G8B8:
- return COGL_PIXEL_FORMAT_RGB_888;
- case GLY_MEMORY_B8G8R8:
- return COGL_PIXEL_FORMAT_BGR_888;
- case GLY_MEMORY_R16G16B16A16_PREMULTIPLIED:
- return COGL_PIXEL_FORMAT_RGBA_16161616_PRE;
- case GLY_MEMORY_R16G16B16A16:
- return COGL_PIXEL_FORMAT_RGBA_16161616;
- case GLY_MEMORY_R16G16B16A16_FLOAT:
- return COGL_PIXEL_FORMAT_RGBA_FP_16161616;
- case GLY_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED:
- return COGL_PIXEL_FORMAT_RGBA_FP_32323232_PRE;
- case GLY_MEMORY_R32G32B32A32_FLOAT:
- return COGL_PIXEL_FORMAT_RGBA_FP_32323232;
- default:
- g_assert_not_reached ();
- }
-}
-
-static GlyMemoryFormatSelection
-glycin_supported_memory_formats (void)
-{
- return GLY_MEMORY_SELECTION_B8G8R8A8_PREMULTIPLIED |
- GLY_MEMORY_SELECTION_A8R8G8B8_PREMULTIPLIED |
- GLY_MEMORY_SELECTION_R8G8B8A8_PREMULTIPLIED |
- GLY_MEMORY_SELECTION_B8G8R8A8 |
- GLY_MEMORY_SELECTION_A8R8G8B8 |
- GLY_MEMORY_SELECTION_R8G8B8A8 |
- GLY_MEMORY_SELECTION_A8B8G8R8 |
- GLY_MEMORY_SELECTION_R8G8B8 |
- GLY_MEMORY_SELECTION_B8G8R8 |
- GLY_MEMORY_SELECTION_R16G16B16A16_PREMULTIPLIED |
- GLY_MEMORY_SELECTION_R16G16B16A16 |
- GLY_MEMORY_SELECTION_R16G16B16A16_FLOAT |
- GLY_MEMORY_SELECTION_R32G32B32A32_FLOAT_PREMULTIPLIED |
- GLY_MEMORY_SELECTION_R32G32B32A32_FLOAT;
-}
-
-static void
-gly_cicp_to_clutter (const GlyCicp *gly_cicp,
- ClutterCicp *clutter_cicp)
-{
- clutter_cicp->primaries = (ClutterCicpPrimaries) gly_cicp->color_primaries;
- clutter_cicp->transfer = (ClutterCicpTransfer) gly_cicp->transfer_characteristics;
- clutter_cicp->matrix_coefficients = gly_cicp->matrix_coefficients;
- clutter_cicp->video_full_range_flag = gly_cicp->video_full_range_flag;
-}
-
static void
load_file (GTask *task,
- MetaBackgroundImage *source,
+ MetaBackgroundImage *image,
gpointer task_data,
GCancellable *cancellable)
{
- g_autoptr (GFileInputStream) stream = NULL;
- g_autoptr (GlyLoader) loader = NULL;
- g_autoptr (GlyImage) image = NULL;
- GlyFrame *frame;
GError *error = NULL;
+ GdkPixbuf *pixbuf;
+ GFileInputStream *stream;
- stream = g_file_read (source->file, NULL, &error);
+ stream = g_file_read (image->file, NULL, &error);
if (stream == NULL)
{
g_task_return_error (task, error);
return;
}
- loader = gly_loader_new_for_stream (G_INPUT_STREAM (stream));
-
- gly_loader_set_accepted_memory_formats (loader, glycin_supported_memory_formats ());
-
- image = gly_loader_load (loader, &error);
- if (!image)
- {
- g_task_return_error (task, error);
- return;
- }
+ pixbuf = gdk_pixbuf_new_from_stream (G_INPUT_STREAM (stream), NULL, &error);
+ g_object_unref (stream);
- frame = gly_image_next_frame (image, &error);
- if (!frame)
+ if (pixbuf == NULL)
{
g_task_return_error (task, error);
return;
}
- g_task_return_pointer (task, frame, (GDestroyNotify) g_object_unref);
+ g_task_return_pointer (task, pixbuf, (GDestroyNotify) g_object_unref);
}
static void
@@ -236,16 +156,15 @@ file_loaded (GObject *source_object,
g_autoptr (GError) local_error = NULL;
GTask *task;
CoglTexture *texture;
- g_autoptr (GlyFrame) frame = NULL;
+ GdkPixbuf *pixbuf, *rotated;
int width, height, row_stride;
- GlyMemoryFormat format;
- g_autoptr (GlyCicp) cicp = NULL;
- GBytes *bytes;
+ guchar *pixels;
+ gboolean has_alpha;
task = G_TASK (result);
- frame = g_task_propagate_pointer (task, &error);
+ pixbuf = g_task_propagate_pointer (task, &error);
- if (frame == NULL)
+ if (pixbuf == NULL)
{
char *uri = g_file_get_uri (image->file);
g_warning ("Failed to load background '%s': %s",
@@ -254,23 +173,27 @@ file_loaded (GObject *source_object,
goto out;
}
- width = gly_frame_get_width (frame);
- height = gly_frame_get_height (frame);
- row_stride = gly_frame_get_stride (frame);
- bytes = gly_frame_get_buf_bytes (frame);
- format = gly_frame_get_memory_format (frame);
- cicp = gly_frame_get_color_cicp (frame);
+ rotated = gdk_pixbuf_apply_embedded_orientation (pixbuf);
+ if (rotated != NULL)
+ {
+ g_object_unref (pixbuf);
+ pixbuf = rotated;
+ }
+
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+ row_stride = gdk_pixbuf_get_rowstride (pixbuf);
+ pixels = gdk_pixbuf_get_pixels (pixbuf);
+ has_alpha = gdk_pixbuf_get_has_alpha (pixbuf);
texture = meta_create_texture (width, height, ctx,
- gly_memory_format_has_alpha (format)
- ? COGL_TEXTURE_COMPONENTS_RGBA
- : COGL_TEXTURE_COMPONENTS_RGB,
+ has_alpha ? COGL_TEXTURE_COMPONENTS_RGBA : COGL_TEXTURE_COMPONENTS_RGB,
META_TEXTURE_ALLOW_SLICING);
if (!cogl_texture_set_data (texture,
- gly_memory_format_to_cogl (format),
+ has_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888,
row_stride,
- g_bytes_get_data (bytes, NULL), 0,
+ pixels, 0,
&local_error))
{
g_warning ("Failed to create texture for background: %s",
@@ -280,28 +203,10 @@ file_loaded (GObject *source_object,
image->texture = texture;
- if (cicp)
- {
- ClutterCicp clutter_cicp;
- ClutterBackend *clutter_backend = clutter_get_default_backend ();
- ClutterContext *clutter_context = clutter_backend->context;
- g_autoptr (GError) local_error2 = NULL;
-
- gly_cicp_to_clutter (cicp, &clutter_cicp);
-
- image->color_state =
- clutter_color_state_params_new_from_cicp (clutter_context,
- &clutter_cicp,
- &local_error2);
- if (local_error2)
- g_warning ("%s", local_error2->message);
- }
- else
- {
- image->color_state = NULL;
- }
-
out:
+ if (pixbuf != NULL)
+ g_object_unref (pixbuf);
+
image->loaded = TRUE;
g_signal_emit (image, signals[LOADED], 0);
}
@@ -395,8 +300,6 @@ meta_background_image_finalize (GObject *object)
if (image->file)
g_object_unref (image->file);
- g_clear_object (&image->color_state);
-
G_OBJECT_CLASS (meta_background_image_parent_class)->finalize (object);
}
@@ -464,9 +367,10 @@ meta_background_image_get_texture (MetaBackgroundImage *image)
}
ClutterColorState *
-meta_background_image_get_color_state (MetaBackgroundImage *image)
+meta_background_image_get_color_state (MetaBackgroundImage *image,
+ ClutterContext *ctx)
{
g_return_val_if_fail (META_IS_BACKGROUND_IMAGE (image), NULL);
- return image->color_state;
+ return NULL;
}
diff --git a/src/meson.build b/src/meson.build
index 508c3416da..c36efc3a1e 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -25,7 +25,7 @@ mutter_pkg_private_deps = [
gmodule_no_export_dep,
gnome_settings_daemon_dep,
xkbcommon_dep,
- glycin_dep,
+ gdk_pixbuf_dep,
libeis_dep,
libdisplay_info_dep,
]
--
2.51.1

View File

@ -0,0 +1,211 @@
From 24203b9306d75c3209969a6fdbb363afa51e15fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Fri, 13 Feb 2026 11:20:51 +0100
Subject: [PATCH] Revert "mdk: Use PipeWire damage region for minimizing
redraws"
This reverts commit fc337eb0b81740388f6e4496c87dbd4b3a578439.
---
mdk/mdk-stream.c | 117 ++++-------------------------------------------
1 file changed, 9 insertions(+), 108 deletions(-)
diff --git a/mdk/mdk-stream.c b/mdk/mdk-stream.c
index 979f89b834..96b31ea34f 100644
--- a/mdk/mdk-stream.c
+++ b/mdk/mdk-stream.c
@@ -396,8 +396,7 @@ on_stream_param_changed (void *user_data,
MdkStream *stream = MDK_STREAM (user_data);
uint8_t params_buffer[1024];
struct spa_pod_builder pod_builder;
- const struct spa_pod *params[4];
- const size_t meta_region_size = sizeof (struct spa_meta_region);
+ const struct spa_pod *params[3];
int result;
if (!format || id != SPA_PARAM_Format)
@@ -453,15 +452,6 @@ on_stream_param_changed (void *user_data,
CURSOR_META_SIZE (384, 384)),
0);
- params[3] = spa_pod_builder_add_object (
- &pod_builder,
- SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
- SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoDamage),
- SPA_PARAM_META_size, SPA_POD_CHOICE_RANGE_Int (meta_region_size * 32,
- meta_region_size * 1,
- meta_region_size * 32),
- 0);
-
pw_stream_update_params (stream->pipewire_stream,
params, G_N_ELEMENTS (params));
}
@@ -547,60 +537,6 @@ read_cursor_metadata (MdkStream *stream,
}
}
-static cairo_region_t *
-read_damage_metadata (MdkStream *stream,
- struct spa_buffer *spa_buffer)
-{
- struct spa_meta *video_damage;
- struct spa_meta_region *meta_region;
- g_autofree cairo_rectangle_int_t *cairo_rects = NULL;
- int num_rects = 0;
-
- video_damage = spa_buffer_find_meta (spa_buffer, SPA_META_VideoDamage);
- if (!video_damage)
- return NULL;
-
- meta_region = spa_meta_first (video_damage);
- if (!meta_region)
- return NULL;
-
- spa_meta_for_each (meta_region, video_damage)
- {
- if (!spa_meta_region_is_valid (meta_region))
- break;
-
- num_rects++;
- }
-
- if (!num_rects)
- return NULL;
-
- g_debug ("Stream has damage with %d rectangles", num_rects);
-
- cairo_rects = g_new (cairo_rectangle_int_t, num_rects);
- num_rects = 0;
- spa_meta_for_each (meta_region, video_damage)
- {
- if (!spa_meta_region_is_valid (meta_region))
- break;
-
- g_debug ("Stream damage rectangle %d: %ux%u +%d+%d",
- num_rects,
- meta_region->region.size.width,
- meta_region->region.size.height,
- meta_region->region.position.x,
- meta_region->region.position.y);
-
- cairo_rects[num_rects].x = meta_region->region.position.x;
- cairo_rects[num_rects].y = meta_region->region.position.y;
- cairo_rects[num_rects].width = meta_region->region.size.width;
- cairo_rects[num_rects].height = meta_region->region.size.height;
- num_rects++;
- }
-
- return cairo_region_create_rectangles (cairo_rects, num_rects);
-}
-
static void
on_stream_process (void *user_data)
{
@@ -609,7 +545,6 @@ on_stream_process (void *user_data)
struct pw_buffer *buffer = NULL;
struct spa_buffer *spa_buffer;
struct spa_meta_header *spa_header;
- cairo_region_t *damage_region = NULL;
gboolean hold_buffer = FALSE;
gboolean has_buffer;
uint32_t drm_format;
@@ -634,13 +569,11 @@ on_stream_process (void *user_data)
if (!has_buffer)
goto read_metadata;
- damage_region = read_damage_metadata (stream, spa_buffer);
-
if (spa_buffer->datas[0].type == SPA_DATA_DmaBuf)
{
g_autoptr (GdkDmabufTextureBuilder) builder = NULL;
- g_autoptr (GError) error = NULL;
unsigned int i;
+ g_autoptr (GError) error = NULL;
if (!spa_pixel_format_to_drm_format (stream->format.info.raw.format,
&drm_format))
@@ -671,13 +604,6 @@ on_stream_process (void *user_data)
gdk_dmabuf_texture_builder_set_stride (builder, i, spa_buffer->datas[i].chunk->stride);
}
- if (GDK_IS_TEXTURE (stream->paintable))
- {
- gdk_dmabuf_texture_builder_set_update_region (builder, damage_region);
- gdk_dmabuf_texture_builder_set_update_texture (builder,
- GDK_TEXTURE (stream->paintable));
- }
-
g_clear_object (&stream->paintable);
stream->paintable =
GDK_PAINTABLE (gdk_dmabuf_texture_builder_build (builder,
@@ -703,10 +629,9 @@ on_stream_process (void *user_data)
}
else
{
- g_autoptr (GdkMemoryTextureBuilder) builder = NULL;
+ g_autoptr (GdkTexture) texture = NULL;
g_autoptr (GBytes) bytes = NULL;
GdkMemoryFormat gdk_format;
- unsigned int i;
uint8_t *map;
void *data;
uint32_t bpp;
@@ -721,29 +646,6 @@ on_stream_process (void *user_data)
goto read_metadata;
}
- builder = gdk_memory_texture_builder_new ();
- gdk_memory_texture_builder_set_width (builder,
- stream->format.info.raw.size.width);
- gdk_memory_texture_builder_set_height (builder,
- stream->format.info.raw.size.height);
- gdk_memory_texture_builder_set_format (builder,
- gdk_format);
-
- for (i = 0; i < spa_buffer->n_datas; i++)
- {
- gdk_memory_texture_builder_set_offset (builder, i,
- spa_buffer->datas[i].chunk->offset);
- gdk_memory_texture_builder_set_stride_for_plane (builder, i,
- spa_buffer->datas[i].chunk->stride);
- }
-
- if (GDK_IS_TEXTURE (stream->paintable))
- {
- gdk_memory_texture_builder_set_update_region (builder, damage_region);
- gdk_memory_texture_builder_set_update_texture (builder,
- GDK_TEXTURE (stream->paintable));
- }
-
size = spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset;
map = mmap (NULL, size, PROT_READ, MAP_PRIVATE, spa_buffer->datas[0].fd, 0);
@@ -756,11 +658,12 @@ on_stream_process (void *user_data)
bytes = g_bytes_new (data, size);
- gdk_memory_texture_builder_set_bytes (builder, bytes);
-
- g_clear_object (&stream->paintable);
- stream->paintable =
- GDK_PAINTABLE (gdk_memory_texture_builder_build (builder));
+ texture = gdk_memory_texture_new (stream->format.info.raw.size.width,
+ stream->format.info.raw.size.height,
+ gdk_format,
+ bytes,
+ spa_buffer->datas[0].chunk->stride);
+ g_set_object (&stream->paintable, GDK_PAINTABLE (texture));
munmap (map, size);
}
@@ -789,8 +692,6 @@ read_metadata:
if (!pw_stream_is_driving (stream->pipewire_stream))
gdk_paintable_invalidate_contents (GDK_PAINTABLE (stream));
-
- g_clear_pointer (&damage_region, cairo_region_destroy);
}
static void
--
2.51.0

View File

@ -0,0 +1,790 @@
From 4b4bfed2a0ff7bf9581a2b993c588740ff4eea34 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Fri, 13 Feb 2026 16:14:24 +0100
Subject: [PATCH] Revert "tests/monitor-backlight: Add tests for the sysfs
backlight"
This reverts commit f7338dfe1cd4d33646a619d83853e2b968793632.
---
.gitlab-ci.yml | 2 -
meson.build | 2 -
src/backends/meta-backlight-private.h | 3 -
src/backends/meta-backlight-sysfs-private.h | 1 -
src/backends/meta-backlight.c | 8 -
src/backends/meta-launcher.h | 2 -
src/tests/dbusmock-templates/logind.py | 23 --
src/tests/meson.build | 50 ++--
src/tests/meta-context-test-private.h | 28 --
src/tests/meta-context-test.c | 17 +-
src/tests/meta-monitor-test-utils.c | 59 ----
src/tests/meta-monitor-test-utils.h | 1 -
src/tests/monitor-backlight-tests.c | 284 +-------------------
src/tests/mutter_dbusrunner.py | 3 -
14 files changed, 32 insertions(+), 451 deletions(-)
delete mode 100644 src/tests/meta-context-test-private.h
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cab1daccc5..cea2448ef5 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -133,7 +133,6 @@ variables:
gnome-desktop-testing
ruff
mypy
- umockdev-devel
libheif-devel
libjxl-devel
lcms2-devel
@@ -152,7 +151,6 @@ variables:
'pkgconfig(xrender)'
'pkgconfig(xtst)'
-
FDO_DISTRIBUTION_EXEC: |
set -e
diff --git a/meson.build b/meson.build
index 2afc0774b8..f77badb9ae 100644
--- a/meson.build
+++ b/meson.build
@@ -44,7 +44,6 @@ libdisplay_info_req = '>= 0.2'
# optional version requirements
udev_req = '>= 228'
gudev_req = '>= 238'
-umockdev_req = '>= 0.3.0'
# wayland version requirements
wayland_server_req = '>= 1.24'
@@ -409,7 +408,6 @@ if have_tests
gtk3_dep = dependency('gtk+-3.0', version: gtk3_req)
dbusmock_dep = python.find_installation('python3', modules: ['dbusmock'], required: false)
libevdev_dep = dependency('libevdev', required: false)
- umockdev_dep = dependency('umockdev-1.0', version: umockdev_req)
if not have_native_backend
error('Tests require the native backend to be enabled')
diff --git a/src/backends/meta-backlight-private.h b/src/backends/meta-backlight-private.h
index 0010751bbb..2740932dcd 100644
--- a/src/backends/meta-backlight-private.h
+++ b/src/backends/meta-backlight-private.h
@@ -42,6 +42,3 @@ const char * meta_backlight_get_name (MetaBacklight *backlight);
void meta_backlight_update_brightness_target (MetaBacklight *backlight,
int brightness);
-
-META_EXPORT_TEST
-gboolean meta_backlight_has_pending (MetaBacklight *backlight);
diff --git a/src/backends/meta-backlight-sysfs-private.h b/src/backends/meta-backlight-sysfs-private.h
index 2045d8c50a..1f58c2959d 100644
--- a/src/backends/meta-backlight-sysfs-private.h
+++ b/src/backends/meta-backlight-sysfs-private.h
@@ -29,7 +29,6 @@ G_DECLARE_FINAL_TYPE (MetaBacklightSysfs,
META, BACKLIGHT_SYSFS,
MetaBacklight)
-META_EXPORT_TEST
MetaBacklightSysfs * meta_backlight_sysfs_new (MetaBackend *backend,
const MetaOutputInfo *output_info,
GError **error);
diff --git a/src/backends/meta-backlight.c b/src/backends/meta-backlight.c
index c01935ac18..88f1626851 100644
--- a/src/backends/meta-backlight.c
+++ b/src/backends/meta-backlight.c
@@ -72,14 +72,6 @@ meta_backlight_get_name (MetaBacklight *backlight)
return priv->name;
}
-gboolean
-meta_backlight_has_pending (MetaBacklight *backlight)
-{
- MetaBacklightPrivate *priv = meta_backlight_get_instance_private (backlight);
-
- return priv->pending;
-}
-
void
meta_backlight_update_brightness_target (MetaBacklight *backlight,
int brightness)
diff --git a/src/backends/meta-launcher.h b/src/backends/meta-launcher.h
index 9e8b177ff3..d9e882a395 100644
--- a/src/backends/meta-launcher.h
+++ b/src/backends/meta-launcher.h
@@ -20,7 +20,6 @@
#include <glib-object.h>
#include "backends/meta-backend-types.h"
-#include "core/util-private.h"
#define META_TYPE_LAUNCHER (meta_launcher_get_type ())
G_DECLARE_FINAL_TYPE (MetaLauncher,
@@ -44,7 +43,6 @@ gboolean meta_launcher_take_control (MetaLauncher *launcher,
const char * meta_launcher_get_seat_id (MetaLauncher *launcher);
-META_EXPORT_TEST
MetaDBusLogin1Session * meta_launcher_get_session_proxy (MetaLauncher *launcher);
MetaBackend * meta_launcher_get_backend (MetaLauncher *launcher);
diff --git a/src/tests/dbusmock-templates/logind.py b/src/tests/dbusmock-templates/logind.py
index cdec8e1a25..5e5878f6c7 100644
--- a/src/tests/dbusmock-templates/logind.py
+++ b/src/tests/dbusmock-templates/logind.py
@@ -89,8 +89,6 @@ class Login1Session(mockobject.DBusMockObject):
bus = kwargs.get('mock_data')
self.host_session = bus.get_object(self.bus_name.get_name(), self.path) if bus else None
- self.backlights = {}
-
@staticmethod
def add_new(manager, session_id, seat_id, host_bus):
session_path = f'{MAIN_OBJ}/session/{session_id}'
@@ -149,27 +147,6 @@ class Login1Session(mockobject.DBusMockObject):
return self.host_session.ReleaseControl(dbus_interface=SESSION_IFACE)
# noop
- @dbus.service.method(SESSION_IFACE, in_signature='ssu', out_signature='')
- def SetBrightness(self, subsystem, name, brightness):
- self.backlights[subsystem][name] = brightness
- pass
-
- @dbus.service.method(MOCK_IFACE, in_signature='ssu', out_signature='')
- def CreateBacklight(self, subsystem, name, brightness):
- if not subsystem in self.backlights:
- self.backlights[subsystem] = {}
-
- self.backlights[subsystem][name] = brightness
-
- @dbus.service.method(MOCK_IFACE, in_signature='ss', out_signature='')
- def DestroyBacklight(self, subsystem, name):
- if subsystem in self.backlights and name in self.backlights[subsystem]:
- del self.backlights[subsystem][name]
-
- @dbus.service.method(MOCK_IFACE, in_signature='ss', out_signature='u')
- def GetBacklight(self, subsystem, name):
- return self.backlights[subsystem][name]
-
@dbus.service.method(MANAGER_IFACE, in_signature='u', out_signature='o')
def GetUser(self, uid):
diff --git a/src/tests/meson.build b/src/tests/meson.build
index dd1230b47f..efd97ef24f 100644
--- a/src/tests/meson.build
+++ b/src/tests/meson.build
@@ -58,7 +58,6 @@ tests_deps = [
locally_compiled_schemas_dep,
wayland_client_dep,
gvdb_dep,
- umockdev_dep,
]
if libevdev_dep.found()
@@ -264,23 +263,6 @@ privileged_test_cases = []
subdir('mtk')
-backlight_client = executable('monitor-backlight-client',
- sources: [
- 'monitor-backlight-client.c',
- built_dbus_sources['meta-dbus-display-config'],
- ],
- include_directories: tests_includes,
- c_args: [
- tests_c_args,
- '-DG_LOG_DOMAIN="mutter-monitor-backlight-test-client"',
- ],
- dependencies: [
- gio_dep,
- ],
- install: have_installed_tests,
- install_dir: mutter_installed_tests_libexecdir,
-)
-
test_cases += [
{
'name': 'unit',
@@ -430,10 +412,7 @@ test_cases += [
{
'name': 'monitor-backlight',
'suite': 'backend',
- 'sources': [ 'monitor-backlight-tests.c', ],
- 'depends': [
- backlight_client,
- ],
+ 'sources': [ 'monitor-backlight-tests.c', ]
},
{
'name': 'monitor-gdctl',
@@ -543,6 +522,23 @@ screen_cast_client_driver = executable('mutter-screen-cast-client-driver',
install_rpath: pkglibdir,
)
+backlight_client = executable('monitor-backlight-client',
+ sources: [
+ 'monitor-backlight-client.c',
+ built_dbus_sources['meta-dbus-display-config'],
+ ],
+ include_directories: tests_includes,
+ c_args: [
+ tests_c_args,
+ '-DG_LOG_DOMAIN="mutter-monitor-backlight-test-client"',
+ ],
+ dependencies: [
+ gio_dep,
+ ],
+ install: have_installed_tests,
+ install_dir: mutter_installed_tests_libexecdir,
+)
+
input_capture_client = executable('mutter-input-capture-test-client',
sources: [
'input-capture-test-client.c',
@@ -1225,13 +1221,9 @@ if have_kvm_tests or have_tty_tests
)
foreach variant: variants
- variables = variant[1] + {
- 'META_DBUS_RUNNER_DISABLE_UMOCKDEV': '1',
- 'META_DBUS_RUNNER_DISABLE_LOGIND_PASSTHROUGH': '1',
- }
-
variant_env = environment()
- foreach name, value: variables
+ variant_env.set('META_DBUS_RUNNER_DISABLE_LOGIND_PASSTHROUGH', '1')
+ foreach name, value: variant[1]
variant_env.set(name, value)
endforeach
privileged_tests += [
@@ -1239,7 +1231,7 @@ if have_kvm_tests or have_tty_tests
'name': '@0@@1@'.format(test_case['name'], variant[0]),
'suite': test_case['suite'],
'executable': test_executable,
- 'variables': variables,
+ 'variables': variant[1],
'env': variant_env,
},
]
diff --git a/src/tests/meta-context-test-private.h b/src/tests/meta-context-test-private.h
deleted file mode 100644
index ebd7275350..0000000000
--- a/src/tests/meta-context-test-private.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2025 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#pragma once
-
-#include "config.h"
-
-#include "meta-test/meta-context-test.h"
-
-#include <umockdev.h>
-
-META_EXPORT
-UMockdevTestbed * meta_context_test_get_udev_testbed (MetaContextTest *context_test);
diff --git a/src/tests/meta-context-test.c b/src/tests/meta-context-test.c
index 8558c6b969..81fcb7afc2 100644
--- a/src/tests/meta-context-test.c
+++ b/src/tests/meta-context-test.c
@@ -18,7 +18,7 @@
#include "config.h"
-#include "tests/meta-context-test-private.h"
+#include "meta-test/meta-context-test.h"
#include <glib.h>
#include <gio/gio.h>
@@ -57,7 +57,6 @@ typedef struct _MetaContextTestPrivate
MetaContextTestFlag flags;
MetaSessionManager *session_manager;
CoglColor *background_color;
- UMockdevTestbed *udev_testbed;
} MetaContextTestPrivate;
struct _MetaContextTestClass
@@ -101,7 +100,6 @@ meta_context_test_finalize (GObject *object)
g_clear_pointer (&priv->background_color, cogl_color_free);
g_clear_object (&priv->session_manager);
- g_clear_object (&priv->udev_testbed);
G_OBJECT_CLASS (meta_context_test_parent_class)->finalize (object);
}
@@ -396,18 +394,6 @@ meta_context_test_wait_for_x11_display (MetaContextTest *context_test)
g_assert_nonnull (meta_display_get_x11_display (display));
}
-/**
- * meta_context_test_get_udev_testbed: (skip)
- */
-UMockdevTestbed *
-meta_context_test_get_udev_testbed (MetaContextTest *context_test)
-{
- MetaContextTestPrivate *priv =
- meta_context_test_get_instance_private (context_test);
-
- return priv->udev_testbed;
-}
-
/**
* meta_create_test_context: (skip)
*/
@@ -424,7 +410,6 @@ meta_create_test_context (MetaContextTestType type,
priv = meta_context_test_get_instance_private (context_test);
priv->type = type;
priv->flags = flags;
- priv->udev_testbed = umockdev_testbed_new ();
return META_CONTEXT (context_test);
}
diff --git a/src/tests/meta-monitor-test-utils.c b/src/tests/meta-monitor-test-utils.c
index 31133e09d2..35328ba5ec 100644
--- a/src/tests/meta-monitor-test-utils.c
+++ b/src/tests/meta-monitor-test-utils.c
@@ -24,12 +24,10 @@
#include <float.h>
#include "backends/meta-backend-private.h"
-#include "backends/meta-backlight-sysfs-private.h"
#include "backends/meta-crtc.h"
#include "backends/meta-logical-monitor-private.h"
#include "backends/meta-monitor-config-manager.h"
#include "backends/meta-monitor-config-store.h"
-#include "tests/meta-context-test-private.h"
#include "tests/meta-crtc-test.h"
#include "tests/meta-output-test.h"
#include "tests/meta-test-utils.h"
@@ -651,8 +649,6 @@ meta_create_monitor_test_setup (MetaBackend *backend,
MonitorTestCaseSetup *setup,
MonitorTestFlag flags)
{
- MetaContextTest *context_test =
- META_CONTEXT_TEST (meta_backend_get_context (backend));
MetaMonitorTestSetup *test_setup;
int i;
#define META_N_CONNECTOR_TYPES 21
@@ -836,61 +832,6 @@ meta_create_monitor_test_setup (MetaBackend *backend,
NULL);
}
- if (setup->outputs[i].sysfs_backlight)
- {
- UMockdevTestbed *udev_testbed =
- meta_context_test_get_udev_testbed (context_test);
- g_autofree char *max_str = NULL;
- g_autofree char *connector_name = NULL;
- g_autofree char *connector_udev = NULL;
- g_autofree char *backlight_udev = NULL;
- int min;
-
- g_assert_true (umockdev_in_mock_environment ());
-
- umockdev_testbed_clear (udev_testbed);
-
- max_str = g_strdup_printf ("%i", setup->outputs[i].backlight_max);
- connector_name = g_strdup_printf ("card0-%s", output_info->name);
-
- /* add an enabled drm connector which will be the parent of the backlight */
- connector_udev = umockdev_testbed_add_device (udev_testbed,
- /* subsystem */
- "drm",
- /* name */
- connector_name,
- /* parent */
- NULL,
- /* attributes */
- "enabled", "enabled",
- NULL,
- /* properties */
- NULL);
-
- backlight_udev = umockdev_testbed_add_device (udev_testbed,
- /* subsystem */
- "backlight",
- /* name */
- setup->outputs[i].sysfs_backlight,
- /* parent */
- connector_udev,
- /* attributes */
- "type", "raw",
- "max_brightness", max_str,
- "brightness", max_str,
- NULL,
- /* properties */
- NULL);
-
- backlight = META_BACKLIGHT (meta_backlight_sysfs_new (backend,
- output_info,
- NULL));
- g_assert_nonnull (backlight);
-
- meta_backlight_get_brightness_info (backlight, &min, NULL);
- g_assert_cmpint (min, ==, setup->outputs[i].backlight_min);
- }
-
output = g_object_new (META_TYPE_OUTPUT_TEST,
"id", (uint64_t) i,
"gpu", meta_test_get_gpu (backend),
diff --git a/src/tests/meta-monitor-test-utils.h b/src/tests/meta-monitor-test-utils.h
index 4760315263..5098f67cf5 100644
--- a/src/tests/meta-monitor-test-utils.h
+++ b/src/tests/meta-monitor-test-utils.h
@@ -117,7 +117,6 @@ typedef struct _MonitorTestCaseOutput
int suggested_y;
int backlight_min;
int backlight_max;
- const char *sysfs_backlight;
gboolean has_edid_info;
MetaEdidInfo edid_info;
uint64_t supported_color_spaces;
diff --git a/src/tests/monitor-backlight-tests.c b/src/tests/monitor-backlight-tests.c
index 652e63b583..511b9fbe76 100644
--- a/src/tests/monitor-backlight-tests.c
+++ b/src/tests/monitor-backlight-tests.c
@@ -19,7 +19,6 @@
#include <stdio.h>
-#include "backends/meta-backlight-private.h"
#include "tests/meta-test/meta-context-test.h"
#include "tests/meta-monitor-test-utils.h"
@@ -71,55 +70,16 @@ static MonitorTestCaseSetup initial_test_case_setup = {
.n_crtcs = 2
};
-static MonitorTestCaseSetup sysfs_test_case_setup = {
- .modes = {
- {
- .width = 1024,
- .height = 768,
- .refresh_rate = 60.0
- }
- },
- .n_modes = 1,
- .outputs = {
- {
- .crtc = 0,
- .modes = { 0 },
- .n_modes = 1,
- .preferred_mode = 0,
- .possible_crtcs = { 0 },
- .n_possible_crtcs = 1,
- .width_mm = 222,
- .height_mm = 125,
- .connector_type = META_CONNECTOR_TYPE_eDP,
- .sysfs_backlight = "backlight1",
- .backlight_min = 0,
- .backlight_max = 90,
- },
- {
- .crtc = 1,
- .modes = { 0 },
- .n_modes = 1,
- .preferred_mode = 0,
- .possible_crtcs = { 1 },
- .n_possible_crtcs = 1,
- .width_mm = 220,
- .height_mm = 124
- }
- },
- .n_outputs = 2,
- .crtcs = {
- {
- .current_mode = 0
- },
- {
- .current_mode = 0
- }
- },
- .n_crtcs = 2
-};
-
static MetaContext *test_context;
+static MetaMonitorTestSetup *
+create_test_setup (MetaBackend *backend)
+{
+ return meta_create_monitor_test_setup (backend,
+ &initial_test_case_setup,
+ MONITOR_TEST_FLAG_NO_STORED);
+}
+
static void
meta_test_backlight_sanity (void)
{
@@ -209,228 +169,6 @@ meta_test_backlight_api (void)
g_main_context_iteration (NULL, TRUE);
}
-static void
-meta_test_backlight_sysfs_sanity (void)
-{
- MetaBackend *backend = meta_context_get_backend (test_context);
- MetaMonitorManager *monitor_manager =
- meta_backend_get_monitor_manager (backend);
- MetaMonitorManagerTest *monitor_manager_test =
- META_MONITOR_MANAGER_TEST (monitor_manager);
- MetaMonitorTestSetup *test_setup;
- GList *monitors;
- MetaMonitor *first_monitor;
- MetaBacklight *backlight;
- int backlight_min;
- int backlight_max;
- int backlight_value;
-
- test_setup = meta_create_monitor_test_setup (backend,
- &sysfs_test_case_setup,
- MONITOR_TEST_FLAG_NO_STORED);
- meta_monitor_manager_test_emulate_hotplug (monitor_manager_test, test_setup);
-
- monitors = meta_monitor_manager_get_monitors (monitor_manager);
- g_assert_cmpuint (g_list_length (monitors), ==, 2);
- first_monitor = g_list_nth_data (monitors, 0);
-
- backlight = meta_monitor_get_backlight (first_monitor);
- g_assert_nonnull (backlight);
-
- meta_backlight_get_brightness_info (backlight, &backlight_min, &backlight_max);
- backlight_value = meta_backlight_get_brightness (backlight);
- g_assert_cmpint (backlight_min, ==, 0);
- g_assert_cmpint (backlight_max, ==, 90);
- g_assert_cmpint (backlight_value, >=, 0);
- g_assert_cmpint (backlight_value, <=, 90);
-}
-
-static GDBusProxy *
-get_logind_mock_proxy (MetaBackend *backend)
-{
- GDBusProxy *proxy;
- g_autoptr (GError) error = NULL;
-
- MetaLauncher *launcher = meta_backend_get_launcher (backend);
- MetaDBusLogin1Session *session_proxy = meta_launcher_get_session_proxy (launcher);
- const char *session_path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (session_proxy));
-
- proxy =
- g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
- G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START |
- G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
- NULL,
- "org.freedesktop.login1",
- session_path,
- "org.freedesktop.DBus.Mock",
- NULL, &error);
- if (!proxy)
- {
- g_error ("Failed to find mocked color manager system service, %s",
- error->message);
- }
-
- return proxy;
-}
-
-static void
-create_logind_backlight (MetaBackend *backend,
- const char *name,
- int brightness)
-{
-
- g_autoptr (GDBusProxy) mock_proxy = NULL;
- g_autoptr (GError) error = NULL;
- GVariantBuilder params_builder;
-
- mock_proxy = get_logind_mock_proxy (backend);
-
- g_variant_builder_init (&params_builder, G_VARIANT_TYPE ("(ssu)"));
- g_variant_builder_add (&params_builder, "s", "backlight");
- g_variant_builder_add (&params_builder, "s", name);
- g_variant_builder_add (&params_builder, "u", brightness);
-
- if (!g_dbus_proxy_call_sync (mock_proxy,
- "CreateBacklight",
- g_variant_builder_end (&params_builder),
- G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL,
- &error))
- g_error ("Failed to create logind backlight: %s", error->message);
-}
-
-static void
-destroy_logind_backlight (MetaBackend *backend,
- const char *name)
-{
-
- g_autoptr (GDBusProxy) mock_proxy = NULL;
- g_autoptr (GError) error = NULL;
- GVariantBuilder params_builder;
-
- mock_proxy = get_logind_mock_proxy (backend);
-
- g_variant_builder_init (&params_builder, G_VARIANT_TYPE ("(ss)"));
- g_variant_builder_add (&params_builder, "s", "backlight");
- g_variant_builder_add (&params_builder, "s", name);
-
- if (!g_dbus_proxy_call_sync (mock_proxy,
- "DestroyBacklight",
- g_variant_builder_end (&params_builder),
- G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL,
- &error))
- g_error ("Failed to destroy logind backlight: %s", error->message);
-}
-
-static int
-get_logind_backlight (MetaBackend *backend,
- const char *name)
-{
-
- g_autoptr (GDBusProxy) mock_proxy = NULL;
- g_autoptr (GError) error = NULL;
- GVariantBuilder params_builder;
- g_autoptr (GVariant) result = NULL;
- int backlight_value;
-
- mock_proxy = get_logind_mock_proxy (backend);
-
- g_variant_builder_init (&params_builder, G_VARIANT_TYPE ("(ss)"));
- g_variant_builder_add (&params_builder, "s", "backlight");
- g_variant_builder_add (&params_builder, "s", name);
-
- result = g_dbus_proxy_call_sync (mock_proxy,
- "GetBacklight",
- g_variant_builder_end (&params_builder),
- G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, NULL,
- &error);
- if (!result)
- g_error ("Failed to destroy logind backlight: %s", error->message);
-
- g_variant_get (result, "(u)", &backlight_value);
- return backlight_value;
-}
-
-static void
-meta_test_backlight_sysfs_set (void)
-{
- MetaBackend *backend = meta_context_get_backend (test_context);
- MetaMonitorManager *monitor_manager =
- meta_backend_get_monitor_manager (backend);
- MetaMonitorManagerTest *monitor_manager_test =
- META_MONITOR_MANAGER_TEST (monitor_manager);
- MetaMonitorTestSetup *test_setup;
- GList *monitors;
- MetaMonitor *first_monitor;
- MetaBacklight *backlight;
- int backlight_value;
-
- destroy_logind_backlight (backend, "backlight1");
- create_logind_backlight (backend, "backlight1", 90);
-
- test_setup = meta_create_monitor_test_setup (backend,
- &sysfs_test_case_setup,
- MONITOR_TEST_FLAG_NO_STORED);
- meta_monitor_manager_test_emulate_hotplug (monitor_manager_test, test_setup);
-
- monitors = meta_monitor_manager_get_monitors (monitor_manager);
- first_monitor = g_list_nth_data (monitors, 0);
-
- backlight = meta_monitor_get_backlight (first_monitor);
- g_assert_nonnull (backlight);
-
- backlight_value = meta_backlight_get_brightness (backlight);
- g_assert_cmpint (backlight_value, ==, 90);
- g_assert_cmpint (get_logind_backlight (backend, "backlight1"), ==, 90);
-
- meta_backlight_set_brightness (backlight, 30);
-
- while (meta_backlight_has_pending (backlight))
- g_main_context_iteration (NULL, TRUE);
-
- backlight_value = meta_backlight_get_brightness (backlight);
- g_assert_cmpint (backlight_value, ==, 30);
- g_assert_cmpint (get_logind_backlight (backend, "backlight1"), ==, 30);
-}
-
-static MetaMonitorTestSetup *
-create_test_setup (MetaBackend *backend)
-{
- return meta_create_monitor_test_setup (backend,
- &initial_test_case_setup,
- MONITOR_TEST_FLAG_NO_STORED);
-}
-
-static void
-prepare_backlight_test (void)
-{
- MetaBackend *backend = meta_context_get_backend (test_context);
- MetaMonitorManager *monitor_manager =
- meta_backend_get_monitor_manager (backend);
- MetaMonitorManagerTest *monitor_manager_test =
- META_MONITOR_MANAGER_TEST (monitor_manager);
- MetaMonitorTestSetup *test_setup;
-
- test_setup = meta_create_monitor_test_setup (backend,
- &initial_test_case_setup,
- MONITOR_TEST_FLAG_NO_STORED);
- meta_monitor_manager_test_emulate_hotplug (monitor_manager_test, test_setup);
-}
-
-static void
-finish_backlight_test (void)
-{
-}
-
-static void
-add_test (const char *test_path,
- GTestFunc test_func)
-{
- g_test_add_vtable (test_path, 0, NULL,
- (GTestFixtureFunc) prepare_backlight_test,
- (GTestFixtureFunc) test_func,
- (GTestFixtureFunc) finish_backlight_test);
-}
-
int
main (int argc,
char *argv[])
@@ -444,10 +182,8 @@ main (int argc,
test_context = context;
meta_init_monitor_test_setup (create_test_setup);
- add_test ("/backends/backlight/sanity", meta_test_backlight_sanity);
- add_test ("/backends/backlight/api", meta_test_backlight_api);
- add_test ("/backends/backlight/sysfs/sanity", meta_test_backlight_sysfs_sanity);
- add_test ("/backends/backlight/sysfs/set", meta_test_backlight_sysfs_set);
+ g_test_add_func ("/backends/backlight/sanity", meta_test_backlight_sanity);
+ g_test_add_func ("/backends/backlight/api", meta_test_backlight_api);
return meta_context_test_run_tests (META_CONTEXT_TEST (context),
META_TEST_RUN_FLAG_NONE);
diff --git a/src/tests/mutter_dbusrunner.py b/src/tests/mutter_dbusrunner.py
index 215ab8ac57..47ec5fa4cc 100644
--- a/src/tests/mutter_dbusrunner.py
+++ b/src/tests/mutter_dbusrunner.py
@@ -275,9 +275,6 @@ def run_test(args, extra_env):
wrapper = os.getenv('META_DBUS_RUNNER_WRAPPER')
- if not os.getenv('META_DBUS_RUNNER_DISABLE_UMOCKDEV'):
- args = ['umockdev-wrapper'] + args
-
if wrapper == 'gdb':
args = ['gdb', '-ex', 'r', '-ex', 'bt full', '--args'] + args
elif wrapper == 'rr':
--
2.51.0

View File

@ -1,28 +1,31 @@
From c0fda823b3f0c6802afe549379135719f86c6bfc Mon Sep 17 00:00:00 2001
From 163bd8ef0f0cd261e34ecb7c30bc7a30a325bd6e Mon Sep 17 00:00:00 2001
From: Adam Williamson <awilliam@redhat.com>
Date: Tue, 9 Mar 2021 17:21:59 -0800
Subject: [PATCH] Test: deny atomic KMS for "tegra" (RHBZ #1936991)
Subject: [PATCH 1/6] Test: deny atomic KMS for "tegra" (RHBZ #1936991)
Signed-off-by: Adam Williamson <awilliam@redhat.com>
---
data/61-mutter.rules | 1 +
data/61-mutter.rules | 3 ++-
src/backends/native/meta-kms-impl-device-atomic.c | 1 +
2 files changed, 2 insertions(+)
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/data/61-mutter.rules b/data/61-mutter.rules
index 9262b152b9..24f9655b69 100644
index 241424827d..b51369c89a 100644
--- a/data/61-mutter.rules
+++ b/data/61-mutter.rules
@@ -114,3 +114,4 @@ DRIVERS=="i915", SUBSYSTEM=="drm", ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9b
@@ -114,4 +114,5 @@ DRIVERS=="i915", SUBSYSTEM=="drm", ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9b
DRIVERS=="i915", SUBSYSTEM=="drm", ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9be6", TAG+="mutter-device-disable-kms-modifiers"
DRIVERS=="i915", SUBSYSTEM=="drm", ATTRS{vendor}=="0x8086", ATTRS{device}=="0x9bf6", TAG+="mutter-device-disable-kms-modifiers"
ENV{ID_PATH}=="platform-vkms", TAG+="mutter-device-ignore"
-ENV{DEVPATH}=="/devices/faux/vkms/drm/card[0-9]*", TAG+="mutter-device-ignore"
\ No newline at end of file
+ENV{DEVPATH}=="/devices/faux/vkms/drm/card[0-9]*", TAG+="mutter-device-ignore"
+DRIVER=="tegra", SUBSYSTEM=="platform", TAG+="mutter-device-disable-atomic-kms"
diff --git a/src/backends/native/meta-kms-impl-device-atomic.c b/src/backends/native/meta-kms-impl-device-atomic.c
index a4ffd70b6a..9fac299e14 100644
index 7860cc2c6b..b99e32bf5d 100644
--- a/src/backends/native/meta-kms-impl-device-atomic.c
+++ b/src/backends/native/meta-kms-impl-device-atomic.c
@@ -1306,6 +1306,7 @@ requires_hotspots (const char *driver_name)
@@ -1330,6 +1330,7 @@ requires_hotspots (const char *driver_name)
"vboxvideo",
"virtio_gpu",
"vmwgfx",
@ -31,5 +34,5 @@ index a4ffd70b6a..9fac299e14 100644
};
--
2.44.0.501.g19981daefd.dirty
2.51.0

View File

@ -0,0 +1,118 @@
From baee8ef5d24609d77c4fb3b897998f5c2a06147c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <mdaenzer@redhat.com>
Date: Sat, 20 Dec 2025 17:25:14 +0100
Subject: [PATCH] mtk: Take explicit reference for
mtk_extrapolate_next_interval_boundary
This avoids spurious failures of the time-utils test due to it taking
longer than expected, and an additional g_get_monotonic_time call in
meta_kms_crtc_determine_deadline.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4821>
---
clutter/clutter/clutter-frame-clock.c | 1 +
mtk/mtk/mtk-time-utils.c | 10 +++++-----
mtk/mtk/mtk-time-utils.h | 3 ++-
src/backends/native/meta-kms-crtc.c | 1 +
src/tests/mtk/time-utils-tests.c | 8 +++++---
5 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/clutter/clutter/clutter-frame-clock.c b/clutter/clutter/clutter-frame-clock.c
index e612227419..13c0a51705 100644
--- a/clutter/clutter/clutter-frame-clock.c
+++ b/clutter/clutter/clutter-frame-clock.c
@@ -885,6 +885,7 @@ calculate_next_update_time_us (ClutterFrameClock *frame_clock,
*/
next_presentation_time_us =
mtk_extrapolate_next_interval_boundary (next_smooth_presentation_time_us,
+ now_us,
refresh_interval_us);
if (last_presentation->target_presentation_time_us > 0)
diff --git a/mtk/mtk/mtk-time-utils.c b/mtk/mtk/mtk-time-utils.c
index 1538af627e..1d4669973e 100644
--- a/mtk/mtk/mtk-time-utils.c
+++ b/mtk/mtk/mtk-time-utils.c
@@ -24,13 +24,13 @@
#include "mtk-time-utils.h"
int64_t
-mtk_extrapolate_next_interval_boundary (int64_t base_us,
+mtk_extrapolate_next_interval_boundary (int64_t boundary_us,
+ int64_t reference_us,
int64_t interval_us)
{
- int64_t now_us;
int64_t num_intervals;
- now_us = g_get_monotonic_time ();
- num_intervals = MAX ((now_us - base_us + interval_us - 1) / interval_us, 0);
- return base_us + num_intervals * interval_us;
+ num_intervals = MAX ((reference_us - boundary_us + interval_us - 1) /
+ interval_us, 0);
+ return boundary_us + num_intervals * interval_us;
}
diff --git a/mtk/mtk/mtk-time-utils.h b/mtk/mtk/mtk-time-utils.h
index 1c8e836c65..a4b418a922 100644
--- a/mtk/mtk/mtk-time-utils.h
+++ b/mtk/mtk/mtk-time-utils.h
@@ -28,7 +28,8 @@
#include "mtk/mtk-macros.h"
MTK_EXPORT
-int64_t mtk_extrapolate_next_interval_boundary (int64_t base_us,
+int64_t mtk_extrapolate_next_interval_boundary (int64_t boundary_us,
+ int64_t base_us,
int64_t interval_us);
static inline uint64_t
diff --git a/src/backends/native/meta-kms-crtc.c b/src/backends/native/meta-kms-crtc.c
index cefaf17403..93463531ee 100644
--- a/src/backends/native/meta-kms-crtc.c
+++ b/src/backends/native/meta-kms-crtc.c
@@ -712,6 +712,7 @@ meta_kms_crtc_determine_deadline (MetaKmsCrtc *crtc,
skip_us =
mtk_extrapolate_next_interval_boundary (next_deadline_us,
+ now_us,
refresh_interval_us) -
next_deadline_us;
diff --git a/src/tests/mtk/time-utils-tests.c b/src/tests/mtk/time-utils-tests.c
index 792f82d056..3f54f6bdc6 100644
--- a/src/tests/mtk/time-utils-tests.c
+++ b/src/tests/mtk/time-utils-tests.c
@@ -31,25 +31,27 @@ test_extrapolate_interval_boundary (void)
now_us = g_get_monotonic_time ();
next_interval_boundary_us =
- mtk_extrapolate_next_interval_boundary (now_us - 1, interval_us);
+ mtk_extrapolate_next_interval_boundary (now_us - 1, now_us, interval_us);
g_assert_cmpint (next_interval_boundary_us, ==, now_us + interval_us - 1);
next_interval_boundary_us =
mtk_extrapolate_next_interval_boundary (now_us - interval_us - 1,
+ now_us,
interval_us);
g_assert_cmpint (next_interval_boundary_us, ==, now_us + interval_us - 1);
next_interval_boundary_us =
- mtk_extrapolate_next_interval_boundary (now_us, interval_us);
+ mtk_extrapolate_next_interval_boundary (now_us, now_us + 1, interval_us);
g_assert_cmpint (next_interval_boundary_us, ==, now_us + interval_us);
next_interval_boundary_us =
mtk_extrapolate_next_interval_boundary (now_us + interval_us - 1,
+ now_us,
interval_us);
g_assert_cmpint (next_interval_boundary_us, ==, now_us + interval_us - 1);
next_interval_boundary_us =
- mtk_extrapolate_next_interval_boundary (0, interval_us);
+ mtk_extrapolate_next_interval_boundary (0, now_us, interval_us);
g_assert_cmpint (next_interval_boundary_us, >=, now_us);
}
--
2.51.0

View File

@ -0,0 +1,42 @@
From 6274d92c7da1977f7a6ba21ba490b9d1af7f34f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Tue, 27 Jan 2026 23:00:55 +0100
Subject: [PATCH] tests/test-runner: Do a client roundtrip after popup
'dismiss'
Popups in the test runner are tracked by finding the popup that belongs
to a certain parent. If one creates a popup immediately after dismissing
another popup on the same parent, there is a chance that the new
`popup_at` will find the old popup that is about to be dismissed, which
will fail the test with an error message about the window being
destroyed while waiting to be shown.
Avoid this by doing a roundtrip to the client after dismissing a popup,
effectively ensuring the popup is gone from window tracking before
processing the next command.
This aims to fix a flaky `popup-positions` test.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4867>
(cherry picked from commit 4ea89f1e3a586cd6b4d00290f6d071e59c2fc74a)
---
src/tests/test-runner.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/tests/test-runner.c b/src/tests/test-runner.c
index e036b16bd6..412592e608 100644
--- a/src/tests/test-runner.c
+++ b/src/tests/test-runner.c
@@ -3056,6 +3056,9 @@ test_case_do (TestCase *test,
return FALSE;
g_hash_table_remove (test->popups, argv[1]);
+
+ if (!test_case_wait (test, error))
+ return FALSE;
}
else
{
--
2.51.0

View File

@ -0,0 +1,223 @@
From 7525f5b32799328ef2a2e8509b64dd6b7c264e15 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Fri, 7 Nov 2025 15:31:55 +0100
Subject: [PATCH] Revert "background: Plumb color state through backgrounds"
This reverts commit e1a1247fb5889181fc64367798b08b54260853cc.
---
src/compositor/meta-background-actor.c | 25 ------------------
.../meta-background-content-private.h | 2 --
src/compositor/meta-background-content.c | 12 +--------
.../meta-background-image-private.h | 26 -------------------
src/compositor/meta-background-image.c | 11 +-------
src/compositor/meta-background-private.h | 2 --
src/compositor/meta-background.c | 17 +-----------
7 files changed, 3 insertions(+), 92 deletions(-)
delete mode 100644 src/compositor/meta-background-image-private.h
diff --git a/src/compositor/meta-background-actor.c b/src/compositor/meta-background-actor.c
index cf3d6a037e..71591a7e0f 100644
--- a/src/compositor/meta-background-actor.c
+++ b/src/compositor/meta-background-actor.c
@@ -22,7 +22,6 @@
#include "config.h"
#include "compositor/meta-background-content-private.h"
-#include "compositor/meta-background-private.h"
#include "compositor/meta-cullable.h"
#include "meta/meta-background-actor.h"
@@ -47,26 +46,6 @@ static void cullable_iface_init (MetaCullableInterface *iface);
G_DEFINE_TYPE_WITH_CODE (MetaBackgroundActor, meta_background_actor, CLUTTER_TYPE_ACTOR,
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
-static void
-on_background_changed (MetaBackgroundContent *content,
- GParamSpec *pspec,
- gpointer data)
-{
- MetaBackgroundActor *self = META_BACKGROUND_ACTOR (data);
- MetaBackground *background;
- ClutterColorState *color_state;
-
- background = meta_background_content_get_background (content);
- if (!background)
- return;
-
- color_state = meta_background_get_color_state (background);
- if (!color_state)
- return;
-
- clutter_actor_set_color_state (CLUTTER_ACTOR (self), color_state);
-}
-
static void
maybe_create_content (MetaBackgroundActor *self)
{
@@ -78,10 +57,6 @@ maybe_create_content (MetaBackgroundActor *self)
content = meta_background_content_new (self->display, self->monitor);
self->content = META_BACKGROUND_CONTENT (content);
clutter_actor_set_content (CLUTTER_ACTOR (self), content);
- g_signal_connect_object (content, "notify::background",
- G_CALLBACK (on_background_changed), self,
- G_CONNECT_DEFAULT);
- on_background_changed (self->content, NULL, self);
}
static void
diff --git a/src/compositor/meta-background-content-private.h b/src/compositor/meta-background-content-private.h
index ac83784768..36031a43e1 100644
--- a/src/compositor/meta-background-content-private.h
+++ b/src/compositor/meta-background-content-private.h
@@ -11,5 +11,3 @@ void meta_background_content_cull_unobscured (MetaBackgroundContent *self,
void meta_background_content_cull_redraw_clip (MetaBackgroundContent *self,
MtkRegion *clip_region);
-
-MetaBackground * meta_background_content_get_background (MetaBackgroundContent *self);
diff --git a/src/compositor/meta-background-content.c b/src/compositor/meta-background-content.c
index 918d5f8112..481765c8e9 100644
--- a/src/compositor/meta-background-content.c
+++ b/src/compositor/meta-background-content.c
@@ -303,7 +303,6 @@ on_background_changed (MetaBackground *background,
{
invalidate_pipeline (self, CHANGED_BACKGROUND);
clutter_content_invalidate (CLUTTER_CONTENT (self));
- g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_BACKGROUND]);
}
static CoglPipeline *
@@ -970,9 +969,7 @@ meta_background_content_class_init (MetaBackgroundContentClass *klass)
properties[PROP_BACKGROUND] =
g_param_spec_object ("background", NULL, NULL,
META_TYPE_BACKGROUND,
- G_PARAM_READWRITE |
- G_PARAM_STATIC_STRINGS |
- G_PARAM_EXPLICIT_NOTIFY);
+ G_PARAM_READWRITE);
properties[PROP_GRADIENT] =
g_param_spec_boolean ("gradient", NULL, NULL,
@@ -1075,7 +1072,6 @@ meta_background_content_set_background (MetaBackgroundContent *self,
invalidate_pipeline (self, CHANGED_BACKGROUND);
clutter_content_invalidate (CLUTTER_CONTENT (self));
- g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_BACKGROUND]);
}
void
@@ -1233,9 +1229,3 @@ meta_background_content_cull_redraw_clip (MetaBackgroundContent *self,
{
set_clip_region (self, clip_region);
}
-
-MetaBackground *
-meta_background_content_get_background (MetaBackgroundContent *self)
-{
- return self->background;
-}
diff --git a/src/compositor/meta-background-image-private.h b/src/compositor/meta-background-image-private.h
deleted file mode 100644
index d29260d389..0000000000
--- a/src/compositor/meta-background-image-private.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-/*
- * Copyright 2025 Red Hat, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Matthias Clasen <mclasen@redhat.com>
- */
-
-#pragma once
-
-#include "clutter/clutter.h"
-#include "meta/meta-background-image.h"
-
-ClutterColorState * meta_background_image_get_color_state (MetaBackgroundImage *self);
diff --git a/src/compositor/meta-background-image.c b/src/compositor/meta-background-image.c
index e5c879c892..9ac93fd636 100644
--- a/src/compositor/meta-background-image.c
+++ b/src/compositor/meta-background-image.c
@@ -18,7 +18,7 @@
#include "config.h"
-#include "compositor/meta-background-image-private.h"
+#include "meta/meta-background-image.h"
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gio/gio.h>
@@ -365,12 +365,3 @@ meta_background_image_get_texture (MetaBackgroundImage *image)
return image->texture;
}
-
-ClutterColorState *
-meta_background_image_get_color_state (MetaBackgroundImage *image,
- ClutterContext *ctx)
-{
- g_return_val_if_fail (META_IS_BACKGROUND_IMAGE (image), NULL);
-
- return NULL;
-}
diff --git a/src/compositor/meta-background-private.h b/src/compositor/meta-background-private.h
index 056e274dba..dca3a5d94b 100644
--- a/src/compositor/meta-background-private.h
+++ b/src/compositor/meta-background-private.h
@@ -9,5 +9,3 @@ CoglTexture * meta_background_get_texture (MetaBackground *self,
int monitor_index,
MtkRectangle *texture_area,
CoglPipelineWrapMode *wrap_mode);
-
-ClutterColorState * meta_background_get_color_state (MetaBackground *self);
diff --git a/src/compositor/meta-background.c b/src/compositor/meta-background.c
index 18833ff2e8..7e33bc1a9a 100644
--- a/src/compositor/meta-background.c
+++ b/src/compositor/meta-background.c
@@ -24,11 +24,9 @@
#include <string.h>
#include "backends/meta-backend-private.h"
-#include "clutter/clutter-color-state.h"
#include "compositor/cogl-utils.h"
-#include "compositor/meta-background-image-private.h"
-#include "meta/compositor.h"
#include "meta/display.h"
+#include "meta/meta-background-image.h"
#include "meta/meta-background.h"
#include "meta/meta-monitor-manager.h"
#include "meta/util.h"
@@ -1034,16 +1032,3 @@ meta_background_refresh_all (void)
for (l = all_backgrounds; l; l = l->next)
mark_changed (l->data);
}
-
-ClutterColorState *
-meta_background_get_color_state (MetaBackground *self)
-{
- g_return_val_if_fail (META_IS_BACKGROUND (self), NULL);
-
- if (self->background_image1)
- return meta_background_image_get_color_state (self->background_image1);
- else if (self->background_image2)
- return meta_background_image_get_color_state (self->background_image2);
- else
- return NULL;
-}
--
2.51.1

View File

@ -1,66 +0,0 @@
From beff8f13ed0cf16fa0b22f69de75f83e0378fdf1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 22 Jul 2024 12:37:01 +0200
Subject: [PATCH 1/3] Revert "x11/window: Compare input shape to client rect
when undecorating"
This reverts commit 1f1538be764ec5018b29d31c4486c0649a4e5068.
---
src/x11/window-x11.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index adf5075a9b..e7c76dd674 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -2415,7 +2415,6 @@ meta_window_x11_update_input_region (MetaWindow *window)
g_autoptr (MtkRegion) region = NULL;
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
- MtkRectangle bounding_rect = { 0 };
Window xwindow;
if (window->decorated)
@@ -2427,14 +2426,10 @@ meta_window_x11_update_input_region (MetaWindow *window)
return;
}
xwindow = priv->frame->xwindow;
- bounding_rect.width = window->buffer_rect.width;
- bounding_rect.height = window->buffer_rect.height;
}
else
{
xwindow = priv->xwindow;
- bounding_rect.width = priv->client_rect.width;
- bounding_rect.height = priv->client_rect.height;
}
if (META_X11_DISPLAY_HAS_SHAPE (x11_display))
@@ -2478,8 +2473,8 @@ meta_window_x11_update_input_region (MetaWindow *window)
else if (n_rects == 1 &&
(rects[0].x == 0 &&
rects[0].y == 0 &&
- rects[0].width == bounding_rect.width &&
- rects[0].height == bounding_rect.height))
+ rects[0].width == window->buffer_rect.width &&
+ rects[0].height == window->buffer_rect.height))
{
/* This is the bounding region case. Keep the
* region as NULL. */
@@ -2496,6 +2491,13 @@ meta_window_x11_update_input_region (MetaWindow *window)
if (region != NULL)
{
+ MtkRectangle bounding_rect;
+
+ bounding_rect.x = 0;
+ bounding_rect.y = 0;
+ bounding_rect.width = window->buffer_rect.width;
+ bounding_rect.height = window->buffer_rect.height;
+
/* The shape we get back from the client may have coordinates
* outside of the frame. The X SHAPE Extension requires that
* the overall shape the client provides never exceeds the
--
2.44.0.501.g19981daefd.dirty

View File

@ -1,178 +0,0 @@
From cedeee4eb0c252d2450b7174b35f47ff5c27fc8e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 12 Mar 2025 11:35:17 +0800
Subject: [PATCH 1/2] backends: Update stage views and stage dimension from
MetaStage
This reduces the amount of code duplication between the native and
nested backend.
---
src/backends/meta-stage-impl-private.h | 2 ++
src/backends/meta-stage-impl.c | 12 ++++++++++++
src/backends/meta-stage-private.h | 2 ++
src/backends/meta-stage.c | 16 ++++++++++++++++
src/backends/native/meta-backend-native.c | 5 +----
src/backends/native/meta-stage-native.c | 12 ------------
src/backends/native/meta-stage-native.h | 2 --
.../x11/nested/meta-backend-x11-nested.c | 11 ++---------
8 files changed, 35 insertions(+), 27 deletions(-)
diff --git a/src/backends/meta-stage-impl-private.h b/src/backends/meta-stage-impl-private.h
index 766c283488..93b8bbad2f 100644
--- a/src/backends/meta-stage-impl-private.h
+++ b/src/backends/meta-stage-impl-private.h
@@ -64,4 +64,6 @@ MetaBackend * meta_stage_impl_get_backend (MetaStageImpl *stage_impl);
void meta_stage_impl_add_onscreen_frame_info (MetaStageImpl *stage_impl,
ClutterStageView *view);
+void meta_stage_impl_rebuild_views (MetaStageImpl *stage_impl);
+
G_END_DECLS
diff --git a/src/backends/meta-stage-impl.c b/src/backends/meta-stage-impl.c
index 945e95ff2b..804d77f25d 100644
--- a/src/backends/meta-stage-impl.c
+++ b/src/backends/meta-stage-impl.c
@@ -34,6 +34,7 @@
#include <stdlib.h>
#include <math.h>
+#include "backends/meta-renderer.h"
#include "backends/meta-stage-view-private.h"
#include "clutter/clutter-mutter.h"
#include "cogl/cogl.h"
@@ -907,3 +908,14 @@ meta_stage_impl_get_backend (MetaStageImpl *stage_impl)
return priv->backend;
}
+
+void
+meta_stage_impl_rebuild_views (MetaStageImpl *stage_impl)
+{
+ MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
+ MetaRenderer *renderer = meta_backend_get_renderer (backend);
+ ClutterActor *stage = meta_backend_get_stage (backend);
+
+ meta_renderer_rebuild_views (renderer);
+ clutter_stage_clear_stage_views (CLUTTER_STAGE (stage));
+}
diff --git a/src/backends/meta-stage-private.h b/src/backends/meta-stage-private.h
index 5546cc8ccf..e59ea35c6c 100644
--- a/src/backends/meta-stage-private.h
+++ b/src/backends/meta-stage-private.h
@@ -68,4 +68,6 @@ META_EXPORT_TEST
void meta_stage_remove_watch (MetaStage *stage,
MetaStageWatch *watch);
+void meta_stage_rebuild_views (MetaStage *stage);
+
G_END_DECLS
diff --git a/src/backends/meta-stage.c b/src/backends/meta-stage.c
index 96224a03b5..32f681c8c5 100644
--- a/src/backends/meta-stage.c
+++ b/src/backends/meta-stage.c
@@ -494,3 +494,19 @@ meta_stage_remove_watch (MetaStage *stage,
g_assert (removed);
}
+
+void
+meta_stage_rebuild_views (MetaStage *stage)
+{
+ ClutterStageWindow *stage_window =
+ _clutter_stage_get_window (CLUTTER_STAGE (stage));
+ MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_window);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (stage->backend);
+ int width, height;
+
+ meta_stage_impl_rebuild_views (stage_impl);
+
+ meta_monitor_manager_get_screen_size (monitor_manager, &width, &height);
+ clutter_actor_set_size (CLUTTER_ACTOR (stage), width, height);
+}
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index ee02b2783a..85bfeb7810 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -399,14 +399,11 @@ static void
meta_backend_native_update_stage (MetaBackend *backend)
{
ClutterActor *stage = meta_backend_get_stage (backend);
- ClutterStageWindow *stage_window =
- _clutter_stage_get_window (CLUTTER_STAGE (stage));
- MetaStageNative *stage_native = META_STAGE_NATIVE (stage_window);
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
int width, height;
- meta_stage_native_rebuild_views (stage_native);
+ meta_stage_rebuild_views (META_STAGE (stage));
meta_monitor_manager_get_screen_size (monitor_manager, &width, &height);
clutter_actor_set_size (stage, width, height);
diff --git a/src/backends/native/meta-stage-native.c b/src/backends/native/meta-stage-native.c
index 80d869b920..34849e5b9c 100644
--- a/src/backends/native/meta-stage-native.c
+++ b/src/backends/native/meta-stage-native.c
@@ -54,18 +54,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaStageNative, meta_stage_native,
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_STAGE_WINDOW,
clutter_stage_window_iface_init))
-void
-meta_stage_native_rebuild_views (MetaStageNative *stage_native)
-{
- MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_native);
- MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
- MetaRenderer *renderer = meta_backend_get_renderer (backend);
- ClutterActor *stage = meta_backend_get_stage (backend);
-
- meta_renderer_rebuild_views (renderer);
- clutter_stage_clear_stage_views (CLUTTER_STAGE (stage));
-}
-
static gboolean
meta_stage_native_can_clip_redraws (ClutterStageWindow *stage_window)
{
diff --git a/src/backends/native/meta-stage-native.h b/src/backends/native/meta-stage-native.h
index 18ce3b14bb..cf081a32ea 100644
--- a/src/backends/native/meta-stage-native.h
+++ b/src/backends/native/meta-stage-native.h
@@ -28,5 +28,3 @@
#define META_TYPE_STAGE_NATIVE (meta_stage_native_get_type ())
G_DECLARE_FINAL_TYPE (MetaStageNative, meta_stage_native,
META, STAGE_NATIVE, MetaStageImpl)
-
-void meta_stage_native_rebuild_views (MetaStageNative *stage_native);
diff --git a/src/backends/x11/nested/meta-backend-x11-nested.c b/src/backends/x11/nested/meta-backend-x11-nested.c
index ec82f1d1a9..09d2a91cb6 100644
--- a/src/backends/x11/nested/meta-backend-x11-nested.c
+++ b/src/backends/x11/nested/meta-backend-x11-nested.c
@@ -21,6 +21,7 @@
#include "backends/meta-input-settings-dummy.h"
#include "backends/meta-monitor-manager-dummy.h"
+#include "backends/meta-stage-private.h"
#include "backends/x11/nested/meta-backend-x11-nested.h"
#include "backends/x11/nested/meta-cursor-renderer-x11-nested.h"
#include "backends/x11/nested/meta-renderer-x11-nested.h"
@@ -107,16 +108,8 @@ static void
meta_backend_x11_nested_update_stage (MetaBackend *backend)
{
ClutterActor *stage = meta_backend_get_stage (backend);
- MetaRenderer *renderer = meta_backend_get_renderer (backend);
- MetaMonitorManager *monitor_manager =
- meta_backend_get_monitor_manager (backend);
- int width, height;
- meta_renderer_rebuild_views (renderer);
- clutter_stage_clear_stage_views (CLUTTER_STAGE (stage));
-
- meta_monitor_manager_get_screen_size (monitor_manager, &width, &height);
- clutter_actor_set_size (stage, width, height);
+ meta_stage_rebuild_views (META_STAGE (stage));
}
static void
--
2.44.0.501.g19981daefd.dirty

View File

@ -1,41 +0,0 @@
From fac0854a4f25e90c26e7b1078a4a6ec305c53f66 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <mdaenzer@redhat.com>
Date: Tue, 18 Feb 2025 17:43:36 +0100
Subject: [PATCH] cursor-renderer/native: Cast MetaGpu to MetaGpuKms only if it
is one
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fixes crash in gnome-shell CSS styling test.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4289>
---
src/backends/native/meta-cursor-renderer-native.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
index f0c373e7dc..9b079be023 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -329,7 +329,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *cursor_renderer,
MetaRendererView *renderer_view = META_RENDERER_VIEW (view);
MetaCrtc *crtc = meta_renderer_view_get_crtc (renderer_view);
MetaCrtcNative *crtc_native = META_CRTC_NATIVE (crtc);
- MetaGpuKms *gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
+ MetaGpu *gpu = meta_crtc_get_gpu (crtc);
ClutterColorState *target_color_state =
clutter_stage_view_get_output_color_state (CLUTTER_STAGE_VIEW (view));
CursorStageView *cursor_stage_view = NULL;
@@ -339,7 +339,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *cursor_renderer,
g_assert (cursor_stage_view);
if (!META_IS_CRTC_KMS (crtc) ||
- !is_hw_cursor_available_for_gpu (gpu_kms) ||
+ !is_hw_cursor_available_for_gpu (META_GPU_KMS (gpu)) ||
!meta_crtc_native_is_hw_cursor_supported (crtc_native))
{
if (cursor_stage_view->has_hw_cursor)
--
2.48.1

View File

@ -1,88 +0,0 @@
From 9b44ebf3269a7838d2288753dd66d48ebce8f8e2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <mdaenzer@redhat.com>
Date: Thu, 13 Feb 2025 17:36:10 +0100
Subject: [PATCH] cursor-renderer/native: Fix crash with
MUTTER_DEBUG_DISABLE_HW_CURSORS=1
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Don't try to realize the cursor sprite for the HW cursor when it's set.
v2:
* Refactor is_hw_cursor_supported helper out of
realize_cursor_sprite_from_wl_buffer_for_crtc. (Jonas Ådahl)
v3:
* Keep meta_crtc_native_is_hw_cursor_supported check in
meta_cursor_renderer_native_update_cursor, to try and avoid
mysterious CI failure.
v4:
* Rename is_hw_cursor_supported → is_hw_cursor_available_for_gpu
and take a MetaGpuKms * parameter.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4272>
---
.../native/meta-cursor-renderer-native.c | 20 +++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
index 2686e811b4..f0c373e7dc 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -285,6 +285,19 @@ on_cursor_sprite_texture_changed (MetaCursorSprite *cursor_sprite,
invalidate_cursor_gpu_state (cursor_renderer, cursor_sprite);
}
+static gboolean
+is_hw_cursor_available_for_gpu (MetaGpuKms *gpu_kms)
+{
+ MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
+
+ cursor_renderer_gpu_data =
+ meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms);
+ if (!cursor_renderer_gpu_data || cursor_renderer_gpu_data->hw_cursor_broken)
+ return FALSE;
+
+ return TRUE;
+}
+
static gboolean
meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *cursor_renderer,
MetaCursorSprite *cursor_sprite)
@@ -316,6 +329,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *cursor_renderer,
MetaRendererView *renderer_view = META_RENDERER_VIEW (view);
MetaCrtc *crtc = meta_renderer_view_get_crtc (renderer_view);
MetaCrtcNative *crtc_native = META_CRTC_NATIVE (crtc);
+ MetaGpuKms *gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
ClutterColorState *target_color_state =
clutter_stage_view_get_output_color_state (CLUTTER_STAGE_VIEW (view));
CursorStageView *cursor_stage_view = NULL;
@@ -325,6 +339,7 @@ meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *cursor_renderer,
g_assert (cursor_stage_view);
if (!META_IS_CRTC_KMS (crtc) ||
+ !is_hw_cursor_available_for_gpu (gpu_kms) ||
!meta_crtc_native_is_hw_cursor_supported (crtc_native))
{
if (cursor_stage_view->has_hw_cursor)
@@ -1051,16 +1066,13 @@ realize_cursor_sprite_from_wl_buffer_for_crtc (MetaCursorRenderer *renderer
MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (sprite_wayland);
MetaGpu *gpu = meta_crtc_get_gpu (META_CRTC (crtc_kms));
MetaGpuKms *gpu_kms = META_GPU_KMS (gpu);
- MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
CoglTexture *texture;
uint width, height;
MetaWaylandBuffer *buffer;
struct wl_resource *buffer_resource;
struct wl_shm_buffer *shm_buffer;
- cursor_renderer_gpu_data =
- meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms);
- if (!cursor_renderer_gpu_data || cursor_renderer_gpu_data->hw_cursor_broken)
+ if (!is_hw_cursor_available_for_gpu (gpu_kms))
return FALSE;
buffer = meta_cursor_sprite_wayland_get_buffer (sprite_wayland);
--
2.48.1

View File

@ -1,48 +0,0 @@
From 7e4cae2f91f01db5083622b18d7173c8d9bf6540 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <mdaenzer@redhat.com>
Date: Thu, 6 Feb 2025 17:34:47 +0100
Subject: [PATCH 1/3] cursor-renderer/native: Pass destination format to
scale_and_transform
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Preparation for next commit, no functional change intended.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4255>
---
src/backends/native/meta-cursor-renderer-native.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
index 103d8e66e1..0db0dde022 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -774,6 +774,7 @@ scale_and_transform_cursor_sprite_cpu (MetaCursorRendererNative *cursor_renderer
int height,
int rowstride,
const graphene_matrix_t *matrix,
+ CoglPixelFormat dst_format,
int dst_width,
int dst_height,
GError **error)
@@ -801,7 +802,7 @@ scale_and_transform_cursor_sprite_cpu (MetaCursorRendererNative *cursor_renderer
dst_texture = cogl_texture_2d_new_with_format (cogl_context,
dst_width,
dst_height,
- COGL_PIXEL_FORMAT_BGRA_8888_PRE);
+ dst_format);
offscreen = cogl_offscreen_new_with_texture (dst_texture);
if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (offscreen), error))
return NULL;
@@ -976,6 +977,7 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
height,
rowstride,
&matrix,
+ COGL_PIXEL_FORMAT_BGRA_8888_PRE,
crtc_dst_width,
crtc_dst_height,
&error);
--
2.48.1

View File

@ -1,45 +0,0 @@
From ba3b709e08e155a10abb3e88145fb7a4d342a0aa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <mdaenzer@redhat.com>
Date: Tue, 11 Feb 2025 15:42:43 +0100
Subject: [PATCH] cursor-renderer/native: Skip init_hw_cursor_support_for_gpu
for headless
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
By definition, headless means no HW display output, so initializing HW
cursor support makes no sense.
Fixes hitting the g_warning in tests when there's a GPU device
available, breaking them.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4259>
---
src/backends/native/meta-cursor-renderer-native.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
index 7581d9b492..2686e811b4 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -1350,12 +1350,17 @@ static void
init_hw_cursor_support_for_gpu (MetaGpuKms *gpu_kms)
{
MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
+ MetaKms *kms = meta_kms_device_get_kms (kms_device);
+ MetaBackend *backend = meta_kms_get_backend (kms);
MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
const MetaFormatInfo *format_info;
struct gbm_device *gbm_device;
uint64_t width, height;
MetaDrmFormatBuf tmp;
+ if (meta_backend_is_headless (backend))
+ return;
+
cursor_renderer_gpu_data =
meta_create_cursor_renderer_native_gpu_data (gpu_kms);
--
2.48.1

View File

@ -1,338 +0,0 @@
From 406de0d6d72bcd68ccc71880e618d933537d755c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jexposit@redhat.com>
Date: Mon, 28 Oct 2024 08:37:12 +0100
Subject: [PATCH 1/5] monitor-manager: Add forlease config to monitors.xml
Allow to configure a list of monitors as available for lease in
monitors.xml.
The monitors available for lease, must be disabled as well.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4112>
---
src/backends/meta-monitor-config-manager.c | 23 +++++++
src/backends/meta-monitor-config-manager.h | 2 +
src/backends/meta-monitor-config-store.c | 79 +++++++++++++++++++++-
3 files changed, 103 insertions(+), 1 deletion(-)
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index 279169ace9..ecf4ee8202 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -1495,6 +1495,8 @@ meta_monitors_config_key_new (GList *logical_monitor_conf
}
}
+ /* Monitors for lease must be disabled (see meta_verify_monitors_config ()).
+ Therefore, there is no need to include them here. */
for (l = disabled_monitor_specs; l; l = l->next)
{
MetaMonitorSpec *monitor_spec = l->data;
@@ -1598,6 +1600,7 @@ meta_monitors_config_set_parent_config (MetaMonitorsConfig *config,
MetaMonitorsConfig *
meta_monitors_config_new_full (GList *logical_monitor_configs,
GList *disabled_monitor_specs,
+ GList *for_lease_monitor_specs,
MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorsConfigFlag flags)
{
@@ -1606,6 +1609,7 @@ meta_monitors_config_new_full (GList *logical_monitor_con
config = g_object_new (META_TYPE_MONITORS_CONFIG, NULL);
config->logical_monitor_configs = logical_monitor_configs;
config->disabled_monitor_specs = disabled_monitor_specs;
+ config->for_lease_monitor_specs = for_lease_monitor_specs;
config->layout_mode = layout_mode;
config->key = meta_monitors_config_key_new (logical_monitor_configs,
disabled_monitor_specs,
@@ -1649,6 +1653,7 @@ meta_monitors_config_new (MetaMonitorManager *monitor_manager,
return meta_monitors_config_new_full (logical_monitor_configs,
disabled_monitor_specs,
+ NULL,
layout_mode,
flags);
}
@@ -1664,6 +1669,8 @@ meta_monitors_config_finalize (GObject *object)
(GDestroyNotify) meta_logical_monitor_config_free);
g_list_free_full (config->disabled_monitor_specs,
(GDestroyNotify) meta_monitor_spec_free);
+ g_list_free_full (config->for_lease_monitor_specs,
+ (GDestroyNotify) meta_monitor_spec_free);
G_OBJECT_CLASS (meta_monitors_config_parent_class)->finalize (object);
}
@@ -1907,5 +1914,21 @@ meta_verify_monitors_config (MetaMonitorsConfig *config,
}
}
+ for (l = config->for_lease_monitor_specs; l; l = l->next)
+ {
+ MetaMonitorSpec *monitor_spec = l->data;
+ gpointer disabled = NULL;
+
+ disabled = g_list_find_custom (config->disabled_monitor_specs,
+ monitor_spec,
+ (GCompareFunc) meta_monitor_spec_compare);
+ if (!disabled)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "For lease monitor must be explicitly disabled");
+ return FALSE;
+ }
+ }
+
return TRUE;
}
diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
index 8d21c8694c..87a29bc2dd 100644
--- a/src/backends/meta-monitor-config-manager.h
+++ b/src/backends/meta-monitor-config-manager.h
@@ -67,6 +67,7 @@ struct _MetaMonitorsConfig
GList *logical_monitor_configs;
GList *disabled_monitor_specs;
+ GList *for_lease_monitor_specs;
MetaMonitorsConfigFlag flags;
@@ -142,6 +143,7 @@ void meta_monitor_config_manager_save_current (MetaMonitorConfigManager *config_
META_EXPORT_TEST
MetaMonitorsConfig * meta_monitors_config_new_full (GList *logical_monitor_configs,
GList *disabled_monitors,
+ GList *for_lease_monitors,
MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorsConfigFlag flags);
diff --git a/src/backends/meta-monitor-config-store.c b/src/backends/meta-monitor-config-store.c
index 6e8aed1f9e..eb22dc3f36 100644
--- a/src/backends/meta-monitor-config-store.c
+++ b/src/backends/meta-monitor-config-store.c
@@ -89,6 +89,14 @@
* <serial>Serial C</serial>
* </monitorspec>
* </disabled>
+ * <forlease>
+ * <monitorspec>
+ * <connector>LVDS3</connector>
+ * <vendor>Vendor C</vendor>
+ * <product>Product C</product>
+ * <serial>Serial C</serial>
+ * </monitorspec>
+ * </forlease>
* </configuration>
* </monitors>
*
@@ -158,6 +166,7 @@ typedef enum
STATE_MONITOR_MAXBPC,
STATE_MONITOR_RGB_RANGE,
STATE_DISABLED,
+ STATE_FOR_LEASE,
STATE_POLICY,
STATE_STORES,
STATE_STORE,
@@ -184,6 +193,7 @@ typedef struct
MetaMonitorConfig *current_monitor_config;
MetaLogicalMonitorConfig *current_logical_monitor_config;
GList *current_disabled_monitor_specs;
+ GList *current_for_lease_monitor_specs;
gboolean seen_policy;
gboolean seen_stores;
gboolean seen_dbus;
@@ -333,6 +343,10 @@ handle_start_element (GMarkupParseContext *context,
{
parser->state = STATE_DISABLED;
}
+ else if (g_str_equal (element_name, "forlease"))
+ {
+ parser->state = STATE_FOR_LEASE;
+ }
else
{
enter_unknown_element (parser, element_name,
@@ -578,6 +592,22 @@ handle_start_element (GMarkupParseContext *context,
return;
}
+ case STATE_FOR_LEASE:
+ {
+ if (!g_str_equal (element_name, "monitorspec"))
+ {
+ g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Invalid element '%s' under forlease", element_name);
+ return;
+ }
+
+ parser->current_monitor_spec = g_new0 (MetaMonitorSpec, 1);
+ parser->monitor_spec_parent_state = STATE_FOR_LEASE;
+ parser->state = STATE_MONITOR_SPEC;
+
+ return;
+ }
+
case STATE_POLICY:
{
if (!(parser->extra_config_flags &
@@ -673,6 +703,15 @@ finish_monitor_spec (ConfigParser *parser)
parser->current_monitor_spec);
parser->current_monitor_spec = NULL;
+ return;
+ }
+ case STATE_FOR_LEASE:
+ {
+ parser->current_for_lease_monitor_specs =
+ g_list_prepend (parser->current_for_lease_monitor_specs,
+ parser->current_monitor_spec);
+ parser->current_monitor_spec = NULL;
+
return;
}
@@ -729,12 +768,15 @@ static gboolean
detect_layout_mode_configs (MetaMonitorManager *monitor_manager,
GList *logical_monitor_configs,
GList *disabled_monitor_specs,
+ GList *for_lease_monitor_specs,
MetaMonitorsConfigFlag config_flags,
MetaMonitorsConfig **physical_layout_mode_config,
MetaMonitorsConfig **logical_layout_mode_config,
GError **error)
{
- GList *logical_monitor_configs_copy, *disabled_monitor_specs_copy;
+ GList *logical_monitor_configs_copy;
+ GList *disabled_monitor_specs_copy;
+ GList *for_lease_monitor_specs_copy;
MetaMonitorsConfig *physical_config, *logical_config;
g_autoptr (GError) local_error_physical = NULL;
g_autoptr (GError) local_error_logical = NULL;
@@ -743,12 +785,15 @@ detect_layout_mode_configs (MetaMonitorManager *monitor_manager,
meta_clone_logical_monitor_config_list (logical_monitor_configs);
disabled_monitor_specs_copy =
g_list_copy_deep (disabled_monitor_specs, (GCopyFunc) meta_monitor_spec_clone, NULL);
+ for_lease_monitor_specs_copy =
+ g_list_copy_deep (for_lease_monitor_specs, (GCopyFunc) meta_monitor_spec_clone, NULL);
derive_logical_monitor_layouts (logical_monitor_configs,
META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL);
physical_config =
meta_monitors_config_new_full (g_steal_pointer (&logical_monitor_configs),
g_steal_pointer (&disabled_monitor_specs),
+ g_steal_pointer (&for_lease_monitor_specs),
META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL,
config_flags);
@@ -761,6 +806,7 @@ detect_layout_mode_configs (MetaMonitorManager *monitor_manager,
logical_config =
meta_monitors_config_new_full (g_steal_pointer (&logical_monitor_configs_copy),
g_steal_pointer (&disabled_monitor_specs_copy),
+ g_steal_pointer (&for_lease_monitor_specs_copy),
META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL,
config_flags);
@@ -1207,6 +1253,7 @@ static MetaMonitorsConfig *
attempt_layout_mode_conversion (MetaMonitorManager *monitor_manager,
GList *logical_monitor_configs,
GList *disabled_monitor_specs,
+ GList *for_lease_monitor_specs,
MetaMonitorsConfigFlag config_flags)
{
GList *logical_monitor_configs_copy;
@@ -1251,6 +1298,9 @@ create_full_config:
g_list_copy_deep (disabled_monitor_specs,
(GCopyFunc) meta_monitor_spec_clone,
NULL),
+ g_list_copy_deep (for_lease_monitor_specs,
+ (GCopyFunc) meta_monitor_spec_clone,
+ NULL),
META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL,
config_flags);
@@ -1438,6 +1488,14 @@ handle_end_element (GMarkupParseContext *context,
return;
}
+ case STATE_FOR_LEASE:
+ {
+ g_assert (g_str_equal (element_name, "forlease"));
+
+ parser->state = STATE_CONFIGURATION;
+ return;
+ }
+
case STATE_CONFIGURATION:
{
MetaMonitorConfigStore *store = parser->config_store;
@@ -1458,6 +1516,7 @@ handle_end_element (GMarkupParseContext *context,
if (!detect_layout_mode_configs (store->monitor_manager,
parser->current_logical_monitor_configs,
parser->current_disabled_monitor_specs,
+ parser->current_for_lease_monitor_specs,
config_flags,
&physical_layout_mode_config,
&logical_layout_mode_config,
@@ -1465,11 +1524,13 @@ handle_end_element (GMarkupParseContext *context,
{
parser->current_logical_monitor_configs = NULL;
parser->current_disabled_monitor_specs = NULL;
+ parser->current_for_lease_monitor_specs = NULL;
return;
}
parser->current_logical_monitor_configs = NULL;
parser->current_disabled_monitor_specs = NULL;
+ parser->current_for_lease_monitor_specs = NULL;
if (physical_layout_mode_config)
{
@@ -1487,6 +1548,7 @@ handle_end_element (GMarkupParseContext *context,
attempt_layout_mode_conversion (store->monitor_manager,
physical_layout_mode_config->logical_monitor_configs,
physical_layout_mode_config->disabled_monitor_specs,
+ physical_layout_mode_config->for_lease_monitor_specs,
config_flags);
}
}
@@ -1508,11 +1570,13 @@ handle_end_element (GMarkupParseContext *context,
config =
meta_monitors_config_new_full (parser->current_logical_monitor_configs,
parser->current_disabled_monitor_specs,
+ parser->current_for_lease_monitor_specs,
layout_mode,
config_flags);
parser->current_logical_monitor_configs = NULL;
parser->current_disabled_monitor_specs = NULL;
+ parser->current_for_lease_monitor_specs = NULL;
if (!meta_verify_monitors_config (config, store->monitor_manager,
error))
@@ -1747,6 +1811,7 @@ handle_text (GMarkupParseContext *context,
case STATE_MONITOR_MODE:
case STATE_TRANSFORM:
case STATE_DISABLED:
+ case STATE_FOR_LEASE:
case STATE_POLICY:
case STATE_STORES:
{
@@ -2323,6 +2388,18 @@ generate_config_xml (MetaMonitorConfigStore *config_store)
g_string_append (buffer, " </disabled>\n");
}
+ if (config->for_lease_monitor_specs)
+ {
+ g_string_append (buffer, " <forlease>\n");
+ for (l = config->for_lease_monitor_specs; l; l = l->next)
+ {
+ MetaMonitorSpec *monitor_spec = l->data;
+
+ append_monitor_spec (buffer, monitor_spec, " ");
+ }
+ g_string_append (buffer, " </forlease>\n");
+ }
+
g_string_append (buffer, " </configuration>\n");
}
--
2.48.1

View File

@ -1,201 +0,0 @@
From c93e06696fea37303e4d9143ed62a31a97532c51 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jexposit@redhat.com>
Date: Mon, 4 Nov 2024 19:12:19 +0100
Subject: [PATCH 1/3] monitor-manager: Return for lease status in
GetCurrentState
Add a new property to the list of monitors returned by the
GetCurrentState D-Bus API indicating whether the monitor is available
for lease or not.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4121>
---
.../org.gnome.Mutter.DisplayConfig.xml | 1 +
src/backends/meta-monitor-manager.c | 6 +
src/tests/monitor-unit-tests.c | 127 ++++++++++++++++++
3 files changed, 134 insertions(+)
diff --git a/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml b/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml
index 3c28814b16..192c08a796 100644
--- a/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml
+++ b/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml
@@ -392,6 +392,7 @@
- "min-refresh-rate" (i): minimum refresh rate of monitor when
Variable Refresh Rate is active (absence
of this means unknown)
+ - "is-for-lease" (b): whether the monitor is for lease or not
Possible mode flags:
1 : preferred mode
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 55816ed7bb..127181df60 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -2032,6 +2032,7 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton,
GVariantBuilder monitor_properties_builder;
GList *k;
gboolean is_builtin;
+ gboolean is_for_lease;
const char *display_name;
current_mode = meta_monitor_get_current_mode (monitor);
@@ -2153,6 +2154,11 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton,
g_variant_new_int32 (min_refresh_rate));
}
+ is_for_lease = meta_monitor_is_for_lease (monitor);
+ g_variant_builder_add (&monitor_properties_builder, "{sv}",
+ "is-for-lease",
+ g_variant_new_boolean (is_for_lease));
+
g_variant_builder_add (&monitors_builder, MONITOR_FORMAT,
monitor_spec->connector,
monitor_spec->vendor,
diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c
index 0d5d1511ea..1f87c36528 100644
--- a/src/tests/monitor-unit-tests.c
+++ b/src/tests/monitor-unit-tests.c
@@ -9474,6 +9474,131 @@ meta_test_monitor_custom_for_lease_invalid_config (void)
g_test_assert_expected_messages ();
}
+static void
+on_proxy_call_cb (GObject *object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ g_autoptr (GError) error = NULL;
+ GVariant **ret = user_data;
+
+ *ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (object), res, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (ret);
+}
+
+static void
+assert_monitor_state (GVariant *state,
+ guint monitor_index,
+ const char *connector,
+ gboolean is_for_lease)
+{
+ g_autoptr (GVariant) monitors = NULL;
+ g_autoptr (GVariant) monitor = NULL;
+ g_autoptr (GVariant) monitor_spec = NULL;
+ g_autoptr (GVariant) spec_connector = NULL;
+ g_autoptr (GVariant) monitor_properties = NULL;
+ g_autoptr (GVariant) for_lease_property = NULL;
+
+ monitors = g_variant_get_child_value (state, 1);
+ monitor = g_variant_get_child_value (monitors, monitor_index);
+
+ monitor_spec = g_variant_get_child_value (monitor, 0);
+ spec_connector = g_variant_get_child_value (monitor_spec, 0);
+ g_assert_cmpstr (g_variant_get_string (spec_connector, NULL), ==, connector);
+
+ monitor_properties = g_variant_get_child_value (monitor, 2);
+ for_lease_property = g_variant_lookup_value (monitor_properties,
+ "is-for-lease",
+ G_VARIANT_TYPE_BOOLEAN);
+ g_assert (g_variant_get_boolean (for_lease_property) == is_for_lease);
+}
+
+static void
+meta_test_monitor_custom_for_lease_config_dbus (void)
+{
+ MonitorTestCaseSetup test_case_setup = {
+ .modes = {
+ {
+ .width = 800,
+ .height = 600,
+ .refresh_rate = 60.0
+ }
+ },
+ .n_modes = 1,
+ .outputs = {
+ {
+ .crtc = -1,
+ .modes = { 0 },
+ .n_modes = 1,
+ .preferred_mode = 0,
+ .possible_crtcs = { 0, 1 },
+ .n_possible_crtcs = 2,
+ .width_mm = 222,
+ .height_mm = 125,
+ .serial = "0x123456",
+ },
+ {
+ .crtc = -1,
+ .modes = { 0 },
+ .n_modes = 1,
+ .preferred_mode = 0,
+ .possible_crtcs = { 0, 1 },
+ .n_possible_crtcs = 2,
+ .width_mm = 222,
+ .height_mm = 125,
+ .serial = "0x654321"
+ }
+ },
+ .n_outputs = 2,
+ .crtcs = {
+ {
+ .current_mode = -1
+ },
+ {
+ .current_mode = -1
+ }
+ },
+ .n_crtcs = 2
+ };
+ MetaMonitorTestSetup *test_setup;
+ g_autoptr (GDBusProxy) display_config_proxy = NULL;
+ g_autoptr (GVariant) state = NULL;
+
+ test_setup = meta_create_monitor_test_setup (test_backend,
+ &test_case_setup,
+ MONITOR_TEST_FLAG_NONE);
+ meta_set_custom_monitor_config (test_context, "forlease.xml");
+ emulate_hotplug (test_setup);
+ check_monitor_test_clients_state ();
+
+ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+ NULL,
+ "org.gnome.Mutter.DisplayConfig",
+ "/org/gnome/Mutter/DisplayConfig",
+ "org.gnome.Mutter.DisplayConfig",
+ NULL,
+ proxy_ready_cb,
+ &display_config_proxy);
+ while (!display_config_proxy)
+ g_main_context_iteration (NULL, TRUE);
+
+ g_dbus_proxy_call (display_config_proxy,
+ "GetCurrentState",
+ NULL,
+ G_DBUS_CALL_FLAGS_NO_AUTO_START,
+ -1,
+ NULL,
+ on_proxy_call_cb,
+ &state);
+ while (!state)
+ g_main_context_iteration (NULL, TRUE);
+
+ assert_monitor_state (state, 0, "DP-1", FALSE);
+ assert_monitor_state (state, 1, "DP-2", TRUE);
+}
+
static gboolean
quit_main_loop (gpointer data)
{
@@ -10704,6 +10829,8 @@ init_monitor_tests (void)
meta_test_monitor_custom_for_lease_config);
add_monitor_test ("/backends/monitor/custom/for-lease-invalid-config",
meta_test_monitor_custom_for_lease_invalid_config);
+ add_monitor_test ("/backends/monitor/custom/for-lease-config-dbus",
+ meta_test_monitor_custom_for_lease_config_dbus);
add_monitor_test ("/backends/monitor/migrated/rotated",
meta_test_monitor_migrated_rotated);
--
2.48.1

View File

@ -1,28 +0,0 @@
From cbe6fb86ce1e71c7360974a960db6bf79eb1ebde Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Fri, 2 Dec 2022 22:49:41 +0100
Subject: [PATCH] place: Always center initial-setup/fedora-welcome
---
src/core/place.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/core/place.c b/src/core/place.c
index 8a06ccb667..f34ae7f43d 100644
--- a/src/core/place.c
+++ b/src/core/place.c
@@ -377,6 +377,11 @@ window_place_centered (MetaWindow *window)
type = window->type;
+ if (g_strcmp0 (meta_window_get_wm_class (window), "org.gnome.InitialSetup") == 0 ||
+ g_strcmp0 (meta_window_get_wm_class (window), "org.fedoraproject.welcome-screen") == 0 ||
+ g_strcmp0 (meta_window_get_wm_class (window), "fedora-welcome") == 0)
+ return TRUE;
+
return (type == META_WINDOW_DIALOG ||
type == META_WINDOW_MODAL_DIALOG ||
type == META_WINDOW_SPLASHSCREEN ||
--
2.44.0.501.g19981daefd.dirty

View File

@ -1,81 +0,0 @@
From cadb4cdbb15a58cc38cc15cfe1ad457ffda7d7a0 Mon Sep 17 00:00:00 2001
From: Dudemanguy <random342@airmail.cc>
Date: Thu, 6 Feb 2025 08:21:16 -0600
Subject: [PATCH 1/2] wayland: Fix refresh interval reporting in
presentation-time version 1
Version 1 of the presentation protocol requires that 0 be sent for the
refresh rate for variable refresh rate. Fix this by checking the mode
during the presentation event.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4227>
---
src/wayland/meta-wayland-outputs.c | 6 ++++++
src/wayland/meta-wayland-outputs.h | 2 ++
src/wayland/meta-wayland-presentation-time.c | 13 ++++++++++++-
3 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c
index d860ac91f7..1c09f6f101 100644
--- a/src/wayland/meta-wayland-outputs.c
+++ b/src/wayland/meta-wayland-outputs.c
@@ -92,6 +92,12 @@ meta_wayland_output_get_monitor (MetaWaylandOutput *wayland_output)
return wayland_output->monitor;
}
+MetaMonitorMode *
+meta_wayland_output_get_monitor_mode (MetaWaylandOutput *wayland_output)
+{
+ return wayland_output->mode;
+}
+
static void
output_resource_destroy (struct wl_resource *res)
{
diff --git a/src/wayland/meta-wayland-outputs.h b/src/wayland/meta-wayland-outputs.h
index f28b591220..d27948d153 100644
--- a/src/wayland/meta-wayland-outputs.h
+++ b/src/wayland/meta-wayland-outputs.h
@@ -33,6 +33,8 @@ const GList * meta_wayland_output_get_resources (MetaWaylandOutput *wayland_outp
MetaMonitor * meta_wayland_output_get_monitor (MetaWaylandOutput *wayland_output);
+MetaMonitorMode * meta_wayland_output_get_monitor_mode (MetaWaylandOutput *wayland_output);
+
void meta_wayland_outputs_finalize (MetaWaylandCompositor *compositor);
void meta_wayland_outputs_init (MetaWaylandCompositor *compositor);
diff --git a/src/wayland/meta-wayland-presentation-time.c b/src/wayland/meta-wayland-presentation-time.c
index abddb63b12..13a98a984b 100644
--- a/src/wayland/meta-wayland-presentation-time.c
+++ b/src/wayland/meta-wayland-presentation-time.c
@@ -323,6 +323,8 @@ meta_wayland_presentation_feedback_present (MetaWaylandPresentationFeedback *fee
uint32_t seq_hi, seq_lo;
uint32_t flags;
const GList *l;
+ MetaMonitorMode *mode;
+ gboolean is_vrr;
if (output == NULL)
{
@@ -337,7 +339,16 @@ meta_wayland_presentation_feedback_present (MetaWaylandPresentationFeedback *fee
tv_sec_lo = time_s;
tv_nsec = (uint32_t) us2ns (time_us - s2us (time_s));
- refresh_interval_ns = (uint32_t) (0.5 + s2ns (1) / frame_info->refresh_rate);
+ mode = meta_wayland_output_get_monitor_mode (output);
+
+ is_vrr = meta_monitor_mode_get_refresh_rate_mode (mode) ==
+ META_CRTC_REFRESH_RATE_MODE_VARIABLE;
+
+ /* The refresh rate interval is required to be 0 for vrr. */
+ if (is_vrr)
+ refresh_interval_ns = 0;
+ else
+ refresh_interval_ns = (uint32_t) (0.5 + s2ns (1) / frame_info->refresh_rate);
maybe_update_presentation_sequence (surface, frame_info, output);
--
2.44.0.501.g19981daefd.dirty

View File

@ -1,35 +0,0 @@
From 51e378c8f28b96b94c8da338b1b0f26cbc32c7f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Fri, 12 May 2017 13:40:31 +0200
Subject: [PATCH] window-actor: Special-case shaped Java windows
OpenJDK wrongly assumes that shaping a window implies no shadows.
They got lucky until commit b975676c changed the fallback case,
but now their compliance tests are broken. Make them happy again
by special-casing shaped Java windows.
---
src/compositor/meta-window-actor-x11.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/compositor/meta-window-actor-x11.c b/src/compositor/meta-window-actor-x11.c
index 2781df09cc..8748f3aa3a 100644
--- a/src/compositor/meta-window-actor-x11.c
+++ b/src/compositor/meta-window-actor-x11.c
@@ -431,6 +431,14 @@ has_shadow (MetaWindowActorX11 *actor_x11)
if (priv->has_custom_frame_extents)
return FALSE;
+ /*
+ * OpenJDK wrongly assumes that shaping a window implies no compositor
+ * shadows; make its compliance tests happy to give it what it wants ...
+ */
+ if (g_strcmp0 (window->res_name, "sun-awt-X11-XWindowPeer") == 0 &&
+ priv->shape_region != NULL)
+ return FALSE;
+
/*
* Generate shadows for all other windows.
*/
--
2.44.0.501.g19981daefd.dirty

View File

@ -1,47 +0,0 @@
From 3a73958f7eab973189441ec9b4a4c96ee6bb8ec7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 22 Jul 2024 12:55:30 +0200
Subject: [PATCH 2/3] Revert "x11/window: Update comment and variable name to
reflect current behavior"
This reverts commit e4763d00e8512aeb408ae118597d753f12217487.
---
src/x11/window-x11.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index e7c76dd674..b358b64bf2 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -2491,20 +2491,21 @@ meta_window_x11_update_input_region (MetaWindow *window)
if (region != NULL)
{
- MtkRectangle bounding_rect;
+ MtkRectangle client_area;
- bounding_rect.x = 0;
- bounding_rect.y = 0;
- bounding_rect.width = window->buffer_rect.width;
- bounding_rect.height = window->buffer_rect.height;
+ client_area.x = 0;
+ client_area.y = 0;
+ client_area.width = window->buffer_rect.width;
+ client_area.height = window->buffer_rect.height;
/* The shape we get back from the client may have coordinates
* outside of the frame. The X SHAPE Extension requires that
* the overall shape the client provides never exceeds the
* "bounding rectangle" of the window -- the shape that the
- * window would have gotten if it was unshaped.
+ * window would have gotten if it was unshaped. In our case,
+ * this is simply the client area.
*/
- mtk_region_intersect_rectangle (region, &bounding_rect);
+ mtk_region_intersect_rectangle (region, &client_area);
}
meta_window_set_input_region (window, region);
--
2.44.0.501.g19981daefd.dirty

View File

@ -1,115 +0,0 @@
From 7c447b2627c3a8050a5189dd876b82ddcf317666 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <mdaenzer@redhat.com>
Date: Thu, 6 Feb 2025 17:43:46 +0100
Subject: [PATCH 2/3] cursor-renderer/native: Store formats in
MetaCursorRendererNativeGpuData
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Instead of hard-coding them everywhere.
Preparation for next commit, no behaviour change intended.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4255>
---
.../native/meta-cursor-renderer-native.c | 23 ++++++++++++++-----
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
index 0db0dde022..b4a45bfca7 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -99,6 +99,8 @@ typedef struct _MetaCursorRendererNativeGpuData
{
gboolean hw_cursor_broken;
+ uint32_t drm_format;
+ CoglPixelFormat cogl_format;
uint64_t cursor_width;
uint64_t cursor_height;
} MetaCursorRendererNativeGpuData;
@@ -849,7 +851,10 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
{
MetaCursorRendererNativePrivate *priv =
meta_cursor_renderer_native_get_instance_private (native);
+ MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
MetaCrtc *crtc = META_CRTC (crtc_kms);
+ MetaGpu *gpu = meta_crtc_get_gpu (crtc);
+ MetaGpuKms *gpu_kms = META_GPU_KMS (gpu);
MetaLogicalMonitor *logical_monitor;
MetaMonitor *monitor;
float monitor_scale;
@@ -873,6 +878,9 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
graphene_point_t hotspot;
int hot_x, hot_y;
+ cursor_renderer_gpu_data =
+ meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms);
+
monitor = meta_output_get_monitor (meta_crtc_get_outputs (crtc)->data);
logical_monitor = meta_monitor_get_logical_monitor (monitor);
@@ -954,7 +962,7 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
if (width != crtc_dst_width || height != crtc_dst_height ||
!graphene_matrix_is_identity (&matrix) ||
- gbm_format != GBM_FORMAT_ARGB8888 ||
+ gbm_format != cursor_renderer_gpu_data->drm_format ||
!clutter_color_state_equals (cursor_color_state, target_color_state))
{
const MetaFormatInfo *format_info;
@@ -977,7 +985,7 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
height,
rowstride,
&matrix,
- COGL_PIXEL_FORMAT_BGRA_8888_PRE,
+ cursor_renderer_gpu_data->cogl_format,
crtc_dst_width,
crtc_dst_height,
&error);
@@ -989,11 +997,11 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
}
bpp =
- cogl_pixel_format_get_bytes_per_pixel (COGL_PIXEL_FORMAT_BGRA_8888_PRE,
+ cogl_pixel_format_get_bytes_per_pixel (cursor_renderer_gpu_data->cogl_format,
0);
cursor_rowstride = crtc_dst_width * bpp;
cursor_data = g_malloc (crtc_dst_height * cursor_rowstride);
- cogl_texture_get_data (texture, COGL_PIXEL_FORMAT_BGRA_8888_PRE,
+ cogl_texture_get_data (texture, cursor_renderer_gpu_data->cogl_format,
cursor_rowstride,
cursor_data);
@@ -1007,7 +1015,7 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
cursor_rowstride,
&hotspot,
relative_transform,
- GBM_FORMAT_ARGB8888);
+ cursor_renderer_gpu_data->drm_format);
}
else
{
@@ -1020,7 +1028,7 @@ load_scaled_and_transformed_cursor_sprite (MetaCursorRendererNative *native,
rowstride,
&hotspot,
MTK_MONITOR_TRANSFORM_NORMAL,
- GBM_FORMAT_ARGB8888);
+ cursor_renderer_gpu_data->drm_format);
}
return retval;
@@ -1285,6 +1293,9 @@ init_hw_cursor_support_for_gpu (MetaGpuKms *gpu_kms)
cursor_renderer_gpu_data =
meta_create_cursor_renderer_native_gpu_data (gpu_kms);
+ cursor_renderer_gpu_data->drm_format = DRM_FORMAT_ARGB8888;
+ cursor_renderer_gpu_data->cogl_format = COGL_PIXEL_FORMAT_BGRA_8888_PRE;
+
if (!meta_kms_device_get_cursor_size (kms_device, &width, &height))
{
width = 64;
--
2.48.1

View File

@ -1,41 +0,0 @@
From 05c722d66dda0c55d3c58ccf5c7c321445664a45 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 12 Feb 2025 07:52:14 +0000
Subject: [PATCH 2/2] input-capture/session: Disconnect on_keymap_changed on
session finalize
When Input Capture was enabled on Input Leap server startup and then
finalized when Input Leap server was stopped, switching keymap was
still triggering its on_keymap_changed callback, but on a freed session
thus triggering use after free a segfault.
Fixes: 2fb3bdf77 - input-capture: Hook up capturing of events to active session
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3360
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4257>
(cherry picked from commit 99dbcf1b8caba93acb5479d1c7ad754ff3fd0540)
Co-authored-by: Alban Browaeys <alban.browaeys@gmail.com>
---
src/backends/meta-input-capture-session.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/backends/meta-input-capture-session.c b/src/backends/meta-input-capture-session.c
index 14973e3e75..4f9d854273 100644
--- a/src/backends/meta-input-capture-session.c
+++ b/src/backends/meta-input-capture-session.c
@@ -1188,6 +1188,10 @@ static void
meta_input_capture_session_finalize (GObject *object)
{
MetaInputCaptureSession *session = META_INPUT_CAPTURE_SESSION (object);
+ MetaBackend *backend =
+ meta_dbus_session_manager_get_backend (session->session_manager);
+
+ g_signal_handlers_disconnect_by_func (backend, on_keymap_changed, session);
g_clear_pointer (&session->barriers, g_hash_table_unref);
--
2.44.0.501.g19981daefd.dirty

View File

@ -1,462 +0,0 @@
From f93e85f69b9d63d4bedeaf778d5f620ad64ddab4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jexposit@redhat.com>
Date: Mon, 28 Oct 2024 08:44:35 +0100
Subject: [PATCH 2/5] monitor: Keep track of the for lease status
Add a flag to MetaMonitor indicating if the monitor is available for
lease and store/update it from the monitor configuration.
Also, add unit tests validating that the configuration is applied and
that invalid configurations fail.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4112>
---
src/backends/meta-monitor-config-manager.c | 10 +-
src/backends/meta-monitor-manager-private.h | 3 +
src/backends/meta-monitor-manager.c | 41 +++++
src/backends/meta-monitor.c | 19 ++
src/backends/meta-monitor.h | 6 +
.../native/meta-monitor-manager-native.c | 1 +
.../monitor-configs/forlease-invalid.xml | 32 ++++
src/tests/monitor-configs/forlease.xml | 40 +++++
src/tests/monitor-unit-tests.c | 165 ++++++++++++++++++
9 files changed, 316 insertions(+), 1 deletion(-)
create mode 100644 src/tests/monitor-configs/forlease-invalid.xml
create mode 100644 src/tests/monitor-configs/forlease.xml
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index ecf4ee8202..0df193f0a4 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -1628,6 +1628,7 @@ meta_monitors_config_new (MetaMonitorManager *monitor_manager,
MetaMonitorsConfigFlag flags)
{
GList *disabled_monitor_specs = NULL;
+ GList *for_lease_monitor_specs = NULL;
GList *monitors;
GList *l;
@@ -1649,11 +1650,18 @@ meta_monitors_config_new (MetaMonitorManager *monitor_manager,
disabled_monitor_specs =
g_list_prepend (disabled_monitor_specs,
meta_monitor_spec_clone (monitor_spec));
+
+ if (meta_monitor_is_for_lease (monitor))
+ {
+ for_lease_monitor_specs =
+ g_list_prepend (for_lease_monitor_specs,
+ meta_monitor_spec_clone (monitor_spec));
+ }
}
return meta_monitors_config_new_full (logical_monitor_configs,
disabled_monitor_specs,
- NULL,
+ for_lease_monitor_specs,
layout_mode,
flags);
}
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index 977ce417cc..66492c2a5f 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -345,6 +345,9 @@ META_EXPORT_TEST
void meta_monitor_manager_update_logical_state (MetaMonitorManager *manager,
MetaMonitorsConfig *config);
+void meta_monitor_manager_update_for_lease_state (MetaMonitorManager *manager,
+ MetaMonitorsConfig *config);
+
META_EXPORT_TEST
void meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager,
MetaMonitorsConfig *config);
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 4fcc8a696c..55816ed7bb 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -3824,6 +3824,46 @@ meta_monitor_manager_update_logical_state (MetaMonitorManager *manager,
meta_monitor_manager_rebuild_logical_monitors (manager, config);
}
+static gboolean
+is_monitor_configured_for_lease (MetaMonitor *monitor,
+ MetaMonitorsConfig *config)
+{
+ MetaMonitorSpec *monitor_spec;
+ GList *l;
+
+ monitor_spec = meta_monitor_get_spec (monitor);
+
+ for (l = config->for_lease_monitor_specs; l; l = l->next)
+ {
+ MetaMonitorSpec *spec = l->data;
+
+ if (meta_monitor_spec_equals (monitor_spec, spec))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void
+meta_monitor_manager_update_for_lease_state (MetaMonitorManager *manager,
+ MetaMonitorsConfig *config)
+{
+ GList *l;
+
+ for (l = manager->monitors; l; l = l->next)
+ {
+ MetaMonitor *monitor = l->data;
+ gboolean is_for_lease;
+
+ if (config)
+ is_for_lease = is_monitor_configured_for_lease (monitor, config);
+ else
+ is_for_lease = FALSE;
+
+ meta_monitor_set_for_lease (monitor, is_for_lease);
+ }
+}
+
void
meta_monitor_manager_rebuild (MetaMonitorManager *manager,
MetaMonitorsConfig *config)
@@ -3838,6 +3878,7 @@ meta_monitor_manager_rebuild (MetaMonitorManager *manager,
old_logical_monitors = manager->logical_monitors;
meta_monitor_manager_update_logical_state (manager, config);
+ meta_monitor_manager_update_for_lease_state (manager, config);
ensure_privacy_screen_settings (manager);
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index b7efabda2c..badde7cea2 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -67,6 +67,8 @@ typedef struct _MetaMonitorPrivate
MetaLogicalMonitor *logical_monitor;
char *display_name;
+
+ gboolean is_for_lease;
} MetaMonitorPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (MetaMonitor, meta_monitor, G_TYPE_OBJECT)
@@ -2459,3 +2461,20 @@ meta_monitor_get_backlight (MetaMonitor *monitor,
return FALSE;
}
}
+
+void
+meta_monitor_set_for_lease (MetaMonitor *monitor,
+ gboolean for_lease)
+{
+ MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
+
+ priv->is_for_lease = for_lease;
+}
+
+gboolean
+meta_monitor_is_for_lease (MetaMonitor *monitor)
+{
+ MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
+
+ return priv->is_for_lease;
+}
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index 01836dc0e7..cc11348b35 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -349,4 +349,10 @@ META_EXPORT_TEST
gboolean meta_monitor_get_backlight (MetaMonitor *monitor,
int *value);
+void meta_monitor_set_for_lease (MetaMonitor *monitor,
+ gboolean for_lease);
+
+META_EXPORT_TEST
+gboolean meta_monitor_is_for_lease (MetaMonitor *monitor);
+
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaMonitorSpec, meta_monitor_spec_free)
diff --git a/src/backends/native/meta-monitor-manager-native.c b/src/backends/native/meta-monitor-manager-native.c
index 668f4e0eb4..21cc1b95be 100644
--- a/src/backends/native/meta-monitor-manager-native.c
+++ b/src/backends/native/meta-monitor-manager-native.c
@@ -156,6 +156,7 @@ meta_monitor_manager_native_ensure_initial_config (MetaMonitorManager *manager)
config = meta_monitor_manager_ensure_configured (manager);
meta_monitor_manager_update_logical_state (manager, config);
+ meta_monitor_manager_update_for_lease_state (manager, config);
}
static void
diff --git a/src/tests/monitor-configs/forlease-invalid.xml b/src/tests/monitor-configs/forlease-invalid.xml
new file mode 100644
index 0000000000..4a7ff9d5da
--- /dev/null
+++ b/src/tests/monitor-configs/forlease-invalid.xml
@@ -0,0 +1,32 @@
+<monitors version="2">
+ <configuration>
+ <layoutmode>logical</layoutmode>
+ <logicalmonitor>
+ <x>0</x>
+ <y>0</y>
+ <scale>1</scale>
+ <primary>yes</primary>
+ <monitor>
+ <monitorspec>
+ <connector>DP-1</connector>
+ <vendor>MetaProduct&apos;s Inc.</vendor>
+ <product>MetaMonitor</product>
+ <serial>0x123456</serial>
+ </monitorspec>
+ <mode>
+ <width>800</width>
+ <height>600</height>
+ <rate>60</rate>
+ </mode>
+ </monitor>
+ </logicalmonitor>
+ <forlease>
+ <monitorspec>
+ <connector>DP-1</connector>
+ <vendor>MetaProduct&apos;s Inc.</vendor>
+ <product>MetaMonitor</product>
+ <serial>0x123456</serial>
+ </monitorspec>
+ </forlease>
+ </configuration>
+</monitors>
diff --git a/src/tests/monitor-configs/forlease.xml b/src/tests/monitor-configs/forlease.xml
new file mode 100644
index 0000000000..482f095a6d
--- /dev/null
+++ b/src/tests/monitor-configs/forlease.xml
@@ -0,0 +1,40 @@
+<monitors version="2">
+ <configuration>
+ <layoutmode>logical</layoutmode>
+ <logicalmonitor>
+ <x>0</x>
+ <y>0</y>
+ <scale>1</scale>
+ <primary>yes</primary>
+ <monitor>
+ <monitorspec>
+ <connector>DP-1</connector>
+ <vendor>MetaProduct&apos;s Inc.</vendor>
+ <product>MetaMonitor</product>
+ <serial>0x123456</serial>
+ </monitorspec>
+ <mode>
+ <width>800</width>
+ <height>600</height>
+ <rate>60</rate>
+ </mode>
+ </monitor>
+ </logicalmonitor>
+ <disabled>
+ <monitorspec>
+ <connector>DP-2</connector>
+ <vendor>MetaProduct&apos;s Inc.</vendor>
+ <product>MetaMonitor</product>
+ <serial>0x654321</serial>
+ </monitorspec>
+ </disabled>
+ <forlease>
+ <monitorspec>
+ <connector>DP-2</connector>
+ <vendor>MetaProduct&apos;s Inc.</vendor>
+ <product>MetaMonitor</product>
+ <serial>0x654321</serial>
+ </monitorspec>
+ </forlease>
+ </configuration>
+</monitors>
diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c
index 2414789bab..326dd83855 100644
--- a/src/tests/monitor-unit-tests.c
+++ b/src/tests/monitor-unit-tests.c
@@ -9176,6 +9176,167 @@ meta_test_monitor_custom_detached_groups (void)
g_assert_cmpstr (error->message, ==, "Logical monitors not adjacent");
}
+static void
+meta_test_monitor_custom_for_lease_config (void)
+{
+ MonitorTestCase test_case = {
+ .setup = {
+ .modes = {
+ {
+ .width = 800,
+ .height = 600,
+ .refresh_rate = 60.0
+ }
+ },
+ .n_modes = 1,
+ .outputs = {
+ {
+ .crtc = -1,
+ .modes = { 0 },
+ .n_modes = 1,
+ .preferred_mode = 0,
+ .possible_crtcs = { 0, 1 },
+ .n_possible_crtcs = 2,
+ .width_mm = 222,
+ .height_mm = 125,
+ .serial = "0x123456",
+ },
+ {
+ .crtc = -1,
+ .modes = { 0 },
+ .n_modes = 1,
+ .preferred_mode = 0,
+ .possible_crtcs = { 0, 1 },
+ .n_possible_crtcs = 2,
+ .width_mm = 222,
+ .height_mm = 125,
+ .serial = "0x654321"
+ }
+ },
+ .n_outputs = 2,
+ .crtcs = {
+ {
+ .current_mode = -1
+ },
+ {
+ .current_mode = -1
+ }
+ },
+ .n_crtcs = 2
+ },
+
+ .expect = {
+ .monitors = {
+ {
+ .outputs = { 0 },
+ .n_outputs = 1,
+ .modes = {
+ {
+ .width = 800,
+ .height = 600,
+ .refresh_rate = 60.0,
+ .crtc_modes = {
+ {
+ .output = 0,
+ .crtc_mode = 0
+ }
+ }
+ }
+ },
+ .n_modes = 1,
+ .current_mode = 0,
+ .width_mm = 222,
+ .height_mm = 125
+ },
+ {
+ .outputs = { 1 },
+ .n_outputs = 1,
+ .modes = {
+ {
+ .width = 800,
+ .height = 600,
+ .refresh_rate = 60.0,
+ .crtc_modes = {
+ {
+ .output = 1,
+ .crtc_mode = 0
+ }
+ }
+ }
+ },
+ .n_modes = 1,
+ .current_mode = -1,
+ .width_mm = 222,
+ .height_mm = 125
+ }
+ },
+ .n_monitors = 2,
+ .logical_monitors = {
+ {
+ .monitors = { 0 },
+ .n_monitors = 1,
+ .layout = { .x = 0, .y = 0, .width = 800, .height = 600 },
+ .scale = 1,
+ .transform = MTK_MONITOR_TRANSFORM_NORMAL
+ },
+ },
+ .n_logical_monitors = 1,
+ .primary_logical_monitor = 0,
+ .n_outputs = 2,
+ .crtcs = {
+ {
+ .current_mode = 0,
+ },
+ {
+ .current_mode = -1,
+ }
+ },
+ .n_crtcs = 2,
+ .screen_width = 800,
+ .screen_height = 600,
+ }
+ };
+ MetaMonitorTestSetup *test_setup;
+ MetaBackend *backend = meta_context_get_backend (test_context);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
+ GList *monitors;
+ MetaMonitor *first_monitor;
+ MetaMonitor *second_monitor;
+
+ test_setup = meta_create_monitor_test_setup (test_backend,
+ &test_case.setup,
+ MONITOR_TEST_FLAG_NONE);
+ meta_set_custom_monitor_config (test_context, "forlease.xml");
+ emulate_hotplug (test_setup);
+
+ META_TEST_LOG_CALL ("Checking monitor configuration",
+ meta_check_monitor_configuration (test_context,
+ &test_case.expect));
+ check_monitor_test_clients_state ();
+
+ monitors = meta_monitor_manager_get_monitors (monitor_manager);
+ g_assert_cmpuint (g_list_length (monitors), ==, 2);
+
+ first_monitor = g_list_nth_data (monitors, 0);
+ second_monitor = g_list_nth_data (monitors, 1);
+
+ g_assert_true (meta_monitor_is_active (first_monitor));
+ g_assert_false (meta_monitor_is_for_lease (first_monitor));
+
+ g_assert_false (meta_monitor_is_active (second_monitor));
+ g_assert_true (meta_monitor_is_for_lease (second_monitor));
+}
+
+static void
+meta_test_monitor_custom_for_lease_invalid_config (void)
+{
+ g_test_expect_message ("libmutter-test", G_LOG_LEVEL_WARNING,
+ "*For lease monitor must be explicitly disabled");
+ meta_set_custom_monitor_config (test_context, "forlease-invalid.xml");
+ g_test_assert_expected_messages ();
+}
+
static gboolean
quit_main_loop (gpointer data)
{
@@ -10400,6 +10561,10 @@ init_monitor_tests (void)
meta_test_monitor_custom_lid_switch_config);
add_monitor_test ("/backends/monitor/custom/detached-groups",
meta_test_monitor_custom_detached_groups);
+ add_monitor_test ("/backends/monitor/custom/for-lease-config",
+ meta_test_monitor_custom_for_lease_config);
+ add_monitor_test ("/backends/monitor/custom/for-lease-invalid-config",
+ meta_test_monitor_custom_for_lease_invalid_config);
add_monitor_test ("/backends/monitor/migrated/rotated",
meta_test_monitor_migrated_rotated);
--
2.48.1

View File

@ -1,80 +0,0 @@
From 80a19134ffb5ddd6577f00986aafcaf9db6505b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jexposit@redhat.com>
Date: Tue, 5 Nov 2024 12:03:49 +0100
Subject: [PATCH 2/3] monitor-manager: Allow to check if config has a visible
monitor
Add a new function, similar to meta_logical_monitor_configs_have_monitor()
that, in addition, checks if the monitor is visible.
Refactor, no functional change.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4121>
---
src/backends/meta-monitor-config-manager.c | 24 +++++++++++++++++-----
src/backends/meta-monitor-config-manager.h | 4 ++++
2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index 0df193f0a4..74aa2df4b1 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -1638,14 +1638,12 @@ meta_monitors_config_new (MetaMonitorManager *monitor_manager,
MetaMonitor *monitor = l->data;
MetaMonitorSpec *monitor_spec;
- if (!monitor_matches_rule (monitor, monitor_manager,
- MONITOR_MATCH_VISIBLE))
+ if (meta_logical_monitor_configs_have_visible_monitor (monitor_manager,
+ logical_monitor_configs,
+ monitor))
continue;
monitor_spec = meta_monitor_get_spec (monitor);
- if (meta_logical_monitor_configs_have_monitor (logical_monitor_configs,
- monitor_spec))
- continue;
disabled_monitor_specs =
g_list_prepend (disabled_monitor_specs,
@@ -1889,6 +1887,22 @@ meta_logical_monitor_configs_have_monitor (GList *logical_monitor_conf
return FALSE;
}
+gboolean
+meta_logical_monitor_configs_have_visible_monitor (MetaMonitorManager *monitor_manager,
+ GList *logical_monitor_configs,
+ MetaMonitor *monitor)
+{
+ MetaMonitorSpec *monitor_spec;
+
+ if (!monitor_matches_rule (monitor, monitor_manager, MONITOR_MATCH_VISIBLE))
+ return TRUE;
+
+ monitor_spec = meta_monitor_get_spec (monitor);
+
+ return meta_logical_monitor_configs_have_monitor (logical_monitor_configs,
+ monitor_spec);
+}
+
static gboolean
meta_monitors_config_is_monitor_enabled (MetaMonitorsConfig *config,
MetaMonitorSpec *monitor_spec)
diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
index 87a29bc2dd..f033ac6555 100644
--- a/src/backends/meta-monitor-config-manager.h
+++ b/src/backends/meta-monitor-config-manager.h
@@ -187,6 +187,10 @@ META_EXPORT_TEST
gboolean meta_logical_monitor_configs_have_monitor (GList *logical_monitor_configs,
MetaMonitorSpec *monitor_spec);
+gboolean meta_logical_monitor_configs_have_visible_monitor (MetaMonitorManager *monitor_manager,
+ GList *logical_monitor_configs,
+ MetaMonitor *monitor);
+
META_EXPORT_TEST
gboolean meta_verify_monitor_mode_spec (MetaMonitorModeSpec *monitor_mode_spec,
GError **error);
--
2.48.1

View File

@ -1,266 +0,0 @@
From 3e09a7f1717d8c4b0a815fd9673471a52d6328b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 12 Mar 2025 11:56:46 +0800
Subject: [PATCH 2/2] stage: Track overlay damage per view
The previously painted rectangle of an overlay is not a global state,
but depends on what view it was painted on. There was also an issue
where an overlay being updated but not changing position, e.g. due to a
0,0 pointer movement or an absolute pointer movement with the position
not changing, not properly triggering damage of the old position when it
eventually actually moved.
Fix this by tracking damage per view, while also fixing the state
tracking to handle unchanged positions.
---
src/backends/meta-stage.c | 163 +++++++++++++++++++++++++-------------
1 file changed, 107 insertions(+), 56 deletions(-)
diff --git a/src/backends/meta-stage.c b/src/backends/meta-stage.c
index 32f681c8c5..58f15bbb33 100644
--- a/src/backends/meta-stage.c
+++ b/src/backends/meta-stage.c
@@ -38,6 +38,12 @@ struct _MetaStageWatch
gpointer user_data;
};
+typedef struct _MetaOverlayViewState
+{
+ graphene_rect_t painted_rect;
+ gboolean has_painted_rect;
+} MetaOverlayViewState;
+
struct _MetaOverlay
{
MetaStage *stage;
@@ -49,8 +55,8 @@ struct _MetaOverlay
graphene_matrix_t transform;
graphene_rect_t current_rect;
- graphene_rect_t previous_rect;
- gboolean previous_is_valid;
+
+ GHashTable *view_states;
};
struct _MetaStage
@@ -77,6 +83,7 @@ meta_overlay_new (MetaStage *stage)
overlay = g_new0 (MetaOverlay, 1);
overlay->stage = stage;
overlay->pipeline = cogl_pipeline_new (ctx);
+ overlay->view_states = g_hash_table_new_full (NULL, NULL, NULL, g_free);
return overlay;
}
@@ -86,6 +93,7 @@ meta_overlay_free (MetaOverlay *overlay)
{
if (overlay->pipeline)
g_object_unref (overlay->pipeline);
+ g_hash_table_unref (overlay->view_states);
g_free (overlay);
}
@@ -115,19 +123,57 @@ meta_overlay_set (MetaOverlay *overlay,
overlay->current_rect = *dst_rect;
}
+static MetaOverlayViewState *
+get_view_state (MetaOverlay *overlay,
+ ClutterStageView *view)
+{
+ return g_hash_table_lookup (overlay->view_states, view);
+}
+
+static MetaOverlayViewState *
+ensure_view_state (MetaOverlay *overlay,
+ ClutterStageView *view)
+{
+ MetaOverlayViewState *view_state;
+
+ view_state = get_view_state (overlay, view);
+
+ if (!view_state)
+ {
+ view_state = g_new0 (MetaOverlayViewState, 1);
+ g_hash_table_insert (overlay->view_states, view, view_state);
+ }
+
+ return view_state;
+}
+
+static void
+meta_overlay_invalidate_views (MetaOverlay *overlay)
+{
+ g_hash_table_remove_all (overlay->view_states);
+}
+
static void
meta_overlay_paint (MetaOverlay *overlay,
ClutterPaintContext *paint_context)
{
+ ClutterStageView *view;
+ MetaOverlayViewState *view_state = NULL;
CoglFramebuffer *framebuffer;
- if (!overlay->texture)
- return;
+ view = clutter_paint_context_get_stage_view (paint_context);
+ if (view)
+ view_state = ensure_view_state (overlay, view);
- if (!overlay->is_visible &&
+ if ((!overlay->texture ||
+ !overlay->is_visible) &&
!(clutter_paint_context_get_paint_flags (paint_context) &
CLUTTER_PAINT_FLAG_FORCE_CURSORS))
- return;
+ {
+ if (view_state)
+ view_state->has_painted_rect = FALSE;
+ return;
+ }
framebuffer = clutter_paint_context_get_framebuffer (paint_context);
cogl_framebuffer_draw_rectangle (framebuffer,
@@ -139,10 +185,10 @@ meta_overlay_paint (MetaOverlay *overlay,
(overlay->current_rect.origin.y +
overlay->current_rect.size.height));
- if (!graphene_rect_equal (&overlay->previous_rect, &overlay->current_rect))
+ if (view_state)
{
- overlay->previous_rect = overlay->current_rect;
- overlay->previous_is_valid = TRUE;
+ view_state->painted_rect = overlay->current_rect;
+ view_state->has_painted_rect = TRUE;
}
}
@@ -343,67 +389,68 @@ meta_stage_new (MetaBackend *backend)
}
static void
-queue_cursor_overlay_redraw_clutter_rect (MetaStage *stage,
- MetaOverlay *overlay,
- graphene_rect_t *rect)
+intersect_and_queue_redraw (ClutterStageView *view,
+ const MtkRectangle *clip)
{
- MtkRectangle clip = {
- .x = (int) floorf (rect->origin.x),
- .y = (int) floorf (rect->origin.y),
- .width = (int) ceilf (rect->size.width),
- .height = (int) ceilf (rect->size.height)
- };
- GList *l;
+ MtkRectangle view_layout;
+ MtkRectangle view_clip;
- /* Since we're flooring the coordinates, we need to enlarge the clip by the
- * difference between the actual coordinate and the floored value */
- clip.width += (int) ceilf (rect->origin.x - clip.x) * 2;
- clip.height += (int) ceilf (rect->origin.y - clip.y) * 2;
+ clutter_stage_view_get_layout (view, &view_layout);
- for (l = clutter_stage_peek_stage_views (CLUTTER_STAGE (stage));
- l;
- l = l->next)
+ if (mtk_rectangle_intersect (clip, &view_layout, &view_clip))
{
- ClutterStageView *view = l->data;
- MtkRectangle view_layout;
- MtkRectangle view_clip;
-
- if (clutter_stage_view_get_default_paint_flags (view) &
- CLUTTER_PAINT_FLAG_NO_CURSORS)
- continue;
-
- if (meta_stage_view_is_cursor_overlay_inhibited (META_STAGE_VIEW (view)))
- return;
+ clutter_stage_view_add_redraw_clip (view, &view_clip);
+ clutter_stage_view_schedule_update (view);
+ }
+}
- clutter_stage_view_get_layout (view, &view_layout);
+static void
+cursor_rect_to_clip (const graphene_rect_t *cursor_rect,
+ MtkRectangle *clip_rect)
+{
+ mtk_rectangle_from_graphene_rect (cursor_rect,
+ MTK_ROUNDING_STRATEGY_GROW,
+ clip_rect);
- if (mtk_rectangle_intersect (&clip, &view_layout, &view_clip))
- {
- clutter_stage_view_add_redraw_clip (view, &view_clip);
- clutter_stage_view_schedule_update (view);
- }
- }
+ /* Since we're flooring the coordinates, we need to enlarge the clip by the
+ * difference between the actual coordinate and the floored value */
+ clip_rect->width += (int) ceilf (cursor_rect->origin.x - clip_rect->x) * 2;
+ clip_rect->height += (int) ceilf (cursor_rect->origin.y - clip_rect->y) * 2;
}
static void
queue_redraw_for_cursor_overlay (MetaStage *stage,
MetaOverlay *overlay)
{
- /* Clear the location the overlay was at before, if we need to. */
- if (overlay->previous_is_valid)
- {
- queue_cursor_overlay_redraw_clutter_rect (stage,
- overlay,
- &overlay->previous_rect);
- overlay->previous_is_valid = FALSE;
- }
+ GList *l;
- /* Draw the overlay at the new position */
- if (overlay->is_visible && overlay->texture)
+ for (l = clutter_stage_peek_stage_views (CLUTTER_STAGE (stage));
+ l;
+ l = l->next)
{
- queue_cursor_overlay_redraw_clutter_rect (stage,
- overlay,
- &overlay->current_rect);
+ ClutterStageView *view = CLUTTER_STAGE_VIEW (l->data);
+ MetaOverlayViewState *view_state;
+
+ view_state = ensure_view_state (overlay, view);
+ if (view_state->has_painted_rect)
+ {
+ MtkRectangle clip;
+
+ cursor_rect_to_clip (&view_state->painted_rect, &clip);
+ intersect_and_queue_redraw (view, &clip);
+ }
+
+ if (overlay->is_visible &&
+ overlay->texture &&
+ !(clutter_stage_view_get_default_paint_flags (view) &
+ CLUTTER_PAINT_FLAG_NO_CURSORS) &&
+ !meta_stage_view_is_cursor_overlay_inhibited (META_STAGE_VIEW (view)))
+ {
+ MtkRectangle clip;
+
+ cursor_rect_to_clip (&overlay->current_rect, &clip);
+ intersect_and_queue_redraw (view, &clip);
+ }
}
}
@@ -509,4 +556,8 @@ meta_stage_rebuild_views (MetaStage *stage)
meta_monitor_manager_get_screen_size (monitor_manager, &width, &height);
clutter_actor_set_size (CLUTTER_ACTOR (stage), width, height);
+
+ g_list_foreach (stage->overlays,
+ (GFunc) meta_overlay_invalidate_views,
+ NULL);
}
--
2.44.0.501.g19981daefd.dirty

View File

@ -1,29 +0,0 @@
From 3e6ba58c875055037e45f651bbcf866d2d47d82f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 22 Jul 2024 12:55:44 +0200
Subject: [PATCH 3/3] Revert "x11/window: Use correct bounding rect to
determine NULL input region"
This reverts commit 6bd920b355d12395dbf00b99374fc1f23783caaf.
---
src/x11/window-x11.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index b358b64bf2..16dc57eec2 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -2473,8 +2473,8 @@ meta_window_x11_update_input_region (MetaWindow *window)
else if (n_rects == 1 &&
(rects[0].x == 0 &&
rects[0].y == 0 &&
- rects[0].width == window->buffer_rect.width &&
- rects[0].height == window->buffer_rect.height))
+ 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. */
--
2.44.0.501.g19981daefd.dirty

View File

@ -1,176 +0,0 @@
From f459472cfe121d491ee97fd09a8abdd970dc900a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <mdaenzer@redhat.com>
Date: Thu, 6 Feb 2025 18:31:16 +0100
Subject: [PATCH 3/3] cursor-renderer/native: Probe formats supported by cursor
planes
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Probe all RGBA 8888 variants.
If there's a GBM device, prefer a format also supported by GBM, if any.
Fall back to dumb BOs otherwise.
This allows the HW cursor to work correctly using BGRA8888 on s390x.
v2:
* Rename get_cursor_format_info → find_cursor_format_info.
* Log device path if we can't find any suitable cursor plane format.
v3:
* Split cursor_planes_support_format helper out of
find_cursor_format_info to make logic clearer. (Sebastian Wick)
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4255>
---
.../native/meta-cursor-renderer-native.c | 101 +++++++++++++++++-
1 file changed, 96 insertions(+), 5 deletions(-)
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
index b4a45bfca7..7581d9b492 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -51,6 +51,7 @@
#include "backends/native/meta-renderer-native.h"
#include "backends/native/meta-seat-native.h"
#include "common/meta-cogl-drm-formats.h"
+#include "common/meta-drm-format-helpers.h"
#include "core/boxes-private.h"
#include "meta/boxes.h"
#include "meta/meta-backend.h"
@@ -99,6 +100,7 @@ typedef struct _MetaCursorRendererNativeGpuData
{
gboolean hw_cursor_broken;
+ gboolean use_gbm;
uint32_t drm_format;
CoglPixelFormat cogl_format;
uint64_t cursor_width;
@@ -546,11 +548,13 @@ create_cursor_drm_buffer (MetaGpuKms *gpu_kms,
uint32_t format,
GError **error)
{
- struct gbm_device *gbm_device;
+ MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data =
+ meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms);
- gbm_device = meta_gbm_device_from_gpu (gpu_kms);
- if (gbm_device)
+ if (cursor_renderer_gpu_data->use_gbm)
{
+ struct gbm_device *gbm_device = meta_gbm_device_from_gpu (gpu_kms);
+
return create_cursor_drm_buffer_gbm (gpu_kms, device_file, gbm_device,
pixels,
width, height, stride,
@@ -1283,18 +1287,105 @@ on_monitors_changed (MetaMonitorManager *monitors,
meta_cursor_renderer_force_update (renderer);
}
+static gboolean
+cursor_planes_support_format (MetaKmsDevice *kms_device,
+ const uint32_t format)
+{
+ gboolean supported = FALSE;
+ GList *l;
+
+ for (l = meta_kms_device_get_planes (kms_device); l; l = l->next)
+ {
+ MetaKmsPlane *plane = l->data;
+
+ if (meta_kms_plane_get_plane_type (plane) != META_KMS_PLANE_TYPE_CURSOR)
+ continue;
+
+ if (!meta_kms_plane_is_format_supported (plane, format))
+ return FALSE;
+
+ supported = TRUE;
+ }
+
+ return supported;
+}
+
+static const MetaFormatInfo *
+find_cursor_format_info (MetaGpuKms *gpu_kms,
+ struct gbm_device *gbm_device)
+{
+ MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
+ uint32_t formats[] = {
+ DRM_FORMAT_ARGB8888,
+ DRM_FORMAT_RGBA8888,
+ DRM_FORMAT_BGRA8888,
+ DRM_FORMAT_ABGR8888
+ };
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (formats); i++)
+ {
+ if (gbm_device &&
+ !gbm_device_is_format_supported (gbm_device, formats[i],
+ GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))
+ {
+ meta_topic (META_DEBUG_KMS,
+ "GBM doesn't support format 0x%x for %s",
+ formats[i], meta_kms_device_get_path (kms_device));
+ continue;
+ }
+
+ if (cursor_planes_support_format (kms_device, formats[i]))
+ return meta_format_info_from_drm_format (formats[i]);
+
+ meta_topic (META_DEBUG_KMS,
+ "Cursor plane doesn't support format 0x%x for %s",
+ formats[i], meta_kms_device_get_path (kms_device));
+ }
+
+ return NULL;
+}
+
static void
init_hw_cursor_support_for_gpu (MetaGpuKms *gpu_kms)
{
MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
+ const MetaFormatInfo *format_info;
+ struct gbm_device *gbm_device;
uint64_t width, height;
+ MetaDrmFormatBuf tmp;
cursor_renderer_gpu_data =
meta_create_cursor_renderer_native_gpu_data (gpu_kms);
- cursor_renderer_gpu_data->drm_format = DRM_FORMAT_ARGB8888;
- cursor_renderer_gpu_data->cogl_format = COGL_PIXEL_FORMAT_BGRA_8888_PRE;
+ gbm_device = meta_gbm_device_from_gpu (gpu_kms);
+ format_info = find_cursor_format_info (gpu_kms, gbm_device);
+ if (!format_info && gbm_device)
+ {
+ gbm_device = NULL;
+ format_info = find_cursor_format_info (gpu_kms, NULL);
+ }
+
+ if (!format_info)
+ {
+ g_warning ("Couldn't find suitable cursor plane format for %s, "
+ "disabling HW cursor",
+ meta_kms_device_get_path (kms_device));
+ cursor_renderer_gpu_data->hw_cursor_broken = TRUE;
+ return;
+ }
+
+ cursor_renderer_gpu_data->use_gbm = gbm_device != NULL;
+ cursor_renderer_gpu_data->drm_format = format_info->drm_format;
+ cursor_renderer_gpu_data->cogl_format = format_info->cogl_format;
+
+ meta_topic (META_DEBUG_KMS,
+ "Using cursor plane format %s (0x%x) for %s, use_gbm=%d",
+ meta_drm_format_to_string (&tmp, format_info->drm_format),
+ format_info->drm_format,
+ meta_kms_device_get_path (kms_device),
+ cursor_renderer_gpu_data->use_gbm);
if (!meta_kms_device_get_cursor_size (kms_device, &width, &height))
{
--
2.48.1

View File

@ -1,224 +0,0 @@
From 479bb6921da3d7004a74c4c7db999534b32ff214 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jexposit@redhat.com>
Date: Tue, 5 Nov 2024 12:26:42 +0100
Subject: [PATCH 3/3] monitor-manager: Configure for lease monitors in
ApplyMonitorsConfig
Add a new property to the ApplyMonitorsConfig D-Bus API allowing to set
a list of monitors for lease.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4121>
---
.../org.gnome.Mutter.DisplayConfig.xml | 6 ++
src/backends/meta-monitor-manager.c | 85 ++++++++++++++++++-
src/tests/monitor-unit-tests.c | 60 +++++++++++++
3 files changed, 147 insertions(+), 4 deletions(-)
diff --git a/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml b/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml
index 192c08a796..fec38a34a8 100644
--- a/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml
+++ b/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml
@@ -501,6 +501,12 @@
* "layout-mode" (u): layout mode the passed configuration is in; may
only be set when changing the layout mode is
supported (see GetCurrentState).
+ * "monitors-for-lease" (a(ssss)): a list of monitors to be made available for
+ lease. Monitors listed here must not be listed in @logical_monitors:
+ * s connector: connector name (e.g. HDMI-1, DP-1, etc)
+ * s vendor: vendor name
+ * s product: product name
+ * s serial: product serial
-->
<method name="ApplyMonitorsConfig">
<arg name="serial" direction="in" type="u" />
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 127181df60..abe1db6649 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -2713,6 +2713,74 @@ is_valid_layout_mode (MetaLogicalMonitorLayoutMode layout_mode)
return FALSE;
}
+static GList *
+create_disabled_monitor_specs_for_config (MetaMonitorManager *monitor_manager,
+ GList *logical_monitor_configs)
+{
+ GList *disabled_monitor_specs = NULL;
+ GList *monitors;
+ GList *l;
+
+ monitors = meta_monitor_manager_get_monitors (monitor_manager);
+ for (l = monitors; l; l = l->next)
+ {
+ MetaMonitor *monitor = l->data;
+
+ if (!meta_logical_monitor_configs_have_visible_monitor (monitor_manager,
+ logical_monitor_configs,
+ monitor))
+ {
+ MetaMonitorSpec *monitor_spec = meta_monitor_get_spec (monitor);
+
+ disabled_monitor_specs =
+ g_list_prepend (disabled_monitor_specs,
+ meta_monitor_spec_clone (monitor_spec));
+ }
+ }
+
+ return disabled_monitor_specs;
+}
+
+static GList *
+create_for_lease_monitor_specs_from_variant (GVariant *properties_variant)
+{
+ GList *for_lease_monitor_specs = NULL;
+ g_autoptr (GVariant) for_lease_variant = NULL;
+ GVariantIter iter;
+ char *connector = NULL;
+ char *vendor = NULL;
+ char *product = NULL;
+ char *serial = NULL;
+
+ if (!properties_variant)
+ return NULL;
+
+ for_lease_variant = g_variant_lookup_value (properties_variant,
+ "monitors-for-lease",
+ G_VARIANT_TYPE ("a(ssss)"));
+ if (!for_lease_variant)
+ return NULL;
+
+ g_variant_iter_init (&iter, for_lease_variant);
+ while (g_variant_iter_next (&iter, "(ssss)", &connector, &vendor, &product, &serial))
+ {
+ MetaMonitorSpec *monitor_spec;
+
+ monitor_spec = g_new0 (MetaMonitorSpec, 1);
+ *monitor_spec = (MetaMonitorSpec) {
+ .connector = connector,
+ .vendor = vendor,
+ .product = product,
+ .serial = serial
+ };
+
+ for_lease_monitor_specs =
+ g_list_append (for_lease_monitor_specs, monitor_spec);
+ }
+
+ return for_lease_monitor_specs;
+}
+
static gboolean
meta_monitor_manager_handle_apply_monitors_config (MetaDBusDisplayConfig *skeleton,
GDBusMethodInvocation *invocation,
@@ -2730,6 +2798,8 @@ meta_monitor_manager_handle_apply_monitors_config (MetaDBusDisplayConfig *skelet
GVariantIter logical_monitor_configs_iter;
MetaMonitorsConfig *config;
GList *logical_monitor_configs = NULL;
+ GList *disabled_monitor_specs = NULL;
+ GList *for_lease_monitor_specs = NULL;
GError *error = NULL;
if (serial != manager->serial)
@@ -2818,10 +2888,17 @@ meta_monitor_manager_handle_apply_monitors_config (MetaDBusDisplayConfig *skelet
logical_monitor_config);
}
- config = meta_monitors_config_new (manager,
- logical_monitor_configs,
- layout_mode,
- META_MONITORS_CONFIG_FLAG_NONE);
+ disabled_monitor_specs =
+ create_disabled_monitor_specs_for_config (manager,
+ logical_monitor_configs);
+ for_lease_monitor_specs =
+ create_for_lease_monitor_specs_from_variant (properties_variant);
+
+ config = meta_monitors_config_new_full (logical_monitor_configs,
+ disabled_monitor_specs,
+ for_lease_monitor_specs,
+ layout_mode,
+ META_MONITORS_CONFIG_FLAG_NONE);
if (!meta_verify_monitors_config (config, manager, &error))
{
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c
index 1f87c36528..380f55cc75 100644
--- a/src/tests/monitor-unit-tests.c
+++ b/src/tests/monitor-unit-tests.c
@@ -9564,6 +9564,10 @@ meta_test_monitor_custom_for_lease_config_dbus (void)
MetaMonitorTestSetup *test_setup;
g_autoptr (GDBusProxy) display_config_proxy = NULL;
g_autoptr (GVariant) state = NULL;
+ uint32_t serial;
+ GVariantBuilder b;
+ g_autoptr (GVariant) apply_config_ret = NULL;
+ g_autoptr (GVariant) new_state = NULL;
test_setup = meta_create_monitor_test_setup (test_backend,
&test_case_setup,
@@ -9597,6 +9601,62 @@ meta_test_monitor_custom_for_lease_config_dbus (void)
assert_monitor_state (state, 0, "DP-1", FALSE);
assert_monitor_state (state, 1, "DP-2", TRUE);
+
+ /* Swap monitor for lease */
+ serial = g_variant_get_uint32 (g_variant_get_child_value (state, 0));
+
+ g_variant_builder_init (&b, G_VARIANT_TYPE ("(uua(iiduba(ssa{sv}))a{sv})"));
+ g_variant_builder_add (&b, "u", serial); /* Serial from GetCurrentState */
+ g_variant_builder_add (&b, "u", 1); /* Method: Temporary */
+
+ /* Logical monitors */
+ g_variant_builder_open (&b, G_VARIANT_TYPE ("a(iiduba(ssa{sv}))"));
+ g_variant_builder_open (&b, G_VARIANT_TYPE ("(iiduba(ssa{sv}))"));
+ g_variant_builder_add (&b, "i", 0); /* x */
+ g_variant_builder_add (&b, "i", 0); /* y */
+ g_variant_builder_add (&b, "d", 1.0); /* Scale */
+ g_variant_builder_add (&b, "u", 0); /* Transform */
+ g_variant_builder_add (&b, "b", TRUE); /* Primary */
+ g_variant_builder_add_parsed (&b, "[(%s, %s, @a{sv} {})]", /* Monitors */
+ "DP-2",
+ "800x600@60.000");
+ g_variant_builder_close (&b);
+ g_variant_builder_close (&b);
+
+ /* Properties */
+ g_variant_builder_open (&b, G_VARIANT_TYPE ("a{sv}"));
+ g_variant_builder_add_parsed (&b, "{'monitors-for-lease', <[(%s, %s, %s, %s)]>}",
+ "DP-1",
+ "MetaProduct\'s Inc.",
+ "MetaMonitor",
+ "0x123456");
+ g_variant_builder_close (&b);
+
+ g_dbus_proxy_call (display_config_proxy,
+ "ApplyMonitorsConfig",
+ g_variant_builder_end (&b),
+ G_DBUS_CALL_FLAGS_NO_AUTO_START,
+ -1,
+ NULL,
+ on_proxy_call_cb,
+ &apply_config_ret);
+ while (!apply_config_ret)
+ g_main_context_iteration (NULL, TRUE);
+
+ /* Check that monitors changed */
+ g_dbus_proxy_call (display_config_proxy,
+ "GetCurrentState",
+ NULL,
+ G_DBUS_CALL_FLAGS_NO_AUTO_START,
+ -1,
+ NULL,
+ on_proxy_call_cb,
+ &new_state);
+ while (!new_state)
+ g_main_context_iteration (NULL, TRUE);
+
+ assert_monitor_state (new_state, 0, "DP-1", TRUE);
+ assert_monitor_state (new_state, 1, "DP-2", FALSE);
}
static gboolean
--
2.48.1

View File

@ -1,74 +0,0 @@
From 863b31cae9be5e8e0467f1a9f93e7348d41f7e88 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jexposit@redhat.com>
Date: Tue, 29 Oct 2024 11:35:17 +0100
Subject: [PATCH 3/5] output/kms: Add meta_output_kms_from_kms_connector()
Add a function that returns a MetaOutputKms (if any) from a
MetaKmsConnector.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4112>
---
src/backends/native/meta-output-kms.c | 19 +++++++++++++++++++
src/backends/native/meta-output-kms.h | 2 ++
2 files changed, 21 insertions(+)
diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c
index 684cf0e094..27b7533a5e 100644
--- a/src/backends/native/meta-output-kms.c
+++ b/src/backends/native/meta-output-kms.c
@@ -47,6 +47,8 @@ struct _MetaOutputKms
G_DEFINE_TYPE (MetaOutputKms, meta_output_kms, META_TYPE_OUTPUT_NATIVE)
+static GQuark kms_connector_output_kms_quark;
+
MetaKmsConnector *
meta_output_kms_get_kms_connector (MetaOutputKms *output_kms)
{
@@ -90,6 +92,13 @@ meta_output_kms_can_clone (MetaOutputKms *output_kms,
return TRUE;
}
+MetaOutputKms *
+meta_output_kms_from_kms_connector (MetaKmsConnector *connector)
+{
+ return g_object_get_qdata (G_OBJECT (connector),
+ kms_connector_output_kms_quark);
+}
+
static GBytes *
meta_output_kms_read_edid (MetaOutputNative *output_native)
{
@@ -534,6 +543,16 @@ meta_output_kms_new (MetaGpuKms *gpu_kms,
meta_output_unassign_crtc (output);
}
+ if (!kms_connector_output_kms_quark)
+ {
+ kms_connector_output_kms_quark =
+ g_quark_from_static_string ("kms-connector-output-kms-quark");
+ }
+
+ g_object_set_qdata (G_OBJECT (kms_connector),
+ kms_connector_output_kms_quark,
+ output_kms);
+
return output_kms;
}
diff --git a/src/backends/native/meta-output-kms.h b/src/backends/native/meta-output-kms.h
index e0eb60eb4d..4391dc1899 100644
--- a/src/backends/native/meta-output-kms.h
+++ b/src/backends/native/meta-output-kms.h
@@ -39,6 +39,8 @@ MetaKmsConnector * meta_output_kms_get_kms_connector (MetaOutputKms *output_kms)
uint32_t meta_output_kms_get_connector_id (MetaOutputKms *output_kms);
+MetaOutputKms * meta_output_kms_from_kms_connector (MetaKmsConnector *connector);
+
MetaOutputKms * meta_output_kms_new (MetaGpuKms *gpu_kms,
MetaKmsConnector *kms_connector,
MetaOutput *old_output,
--
2.48.1

View File

@ -1,78 +0,0 @@
From 63b7d958f226b05694eeeed7d1a7bc77d84464ae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jexposit@redhat.com>
Date: Tue, 29 Oct 2024 12:09:21 +0100
Subject: [PATCH 4/5] kms/connector: Rename meta_kms_connector_is_for_lease()
Now that connectors can be configured as for lease, rename the function
to meta_kms_connector_is_non_desktop() to make clear that it returns
the hardware configuration rather than the user configuration.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4112>
---
src/backends/native/meta-drm-lease.c | 4 ++--
src/backends/native/meta-gpu-kms.c | 2 +-
src/backends/native/meta-kms-connector.c | 2 +-
src/backends/native/meta-kms-connector.h | 2 +-
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/backends/native/meta-drm-lease.c b/src/backends/native/meta-drm-lease.c
index 7cddb6c8ed..302147e9bb 100644
--- a/src/backends/native/meta-drm-lease.c
+++ b/src/backends/native/meta-drm-lease.c
@@ -227,7 +227,7 @@ find_resources_to_lease (MetaDrmLeaseManager *lease_manager,
MetaKmsDevice *connector_device;
if (!g_list_find (available_connectors, connector) ||
- !meta_kms_connector_is_for_lease (connector))
+ !meta_kms_connector_is_non_desktop (connector))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"Failed to find connector %u (%s)",
@@ -645,7 +645,7 @@ update_connectors (MetaDrmLeaseManager *lease_manager,
kms_connector = o->data;
lease = NULL;
- if (!meta_kms_connector_is_for_lease (kms_connector))
+ if (!meta_kms_connector_is_non_desktop (kms_connector))
continue;
if (g_list_find (lease_manager->connectors, kms_connector))
diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
index 3b4356ca6b..c633d6d68e 100644
--- a/src/backends/native/meta-gpu-kms.c
+++ b/src/backends/native/meta-gpu-kms.c
@@ -355,7 +355,7 @@ init_outputs (MetaGpuKms *gpu_kms)
if (!meta_kms_connector_get_current_state (kms_connector))
continue;
- if (meta_kms_connector_is_for_lease (kms_connector))
+ if (meta_kms_connector_is_non_desktop (kms_connector))
continue;
old_output =
diff --git a/src/backends/native/meta-kms-connector.c b/src/backends/native/meta-kms-connector.c
index cc6cd89f56..7723416aa3 100644
--- a/src/backends/native/meta-kms-connector.c
+++ b/src/backends/native/meta-kms-connector.c
@@ -165,7 +165,7 @@ meta_kms_connector_get_current_state (MetaKmsConnector *connector)
}
gboolean
-meta_kms_connector_is_for_lease (MetaKmsConnector *connector)
+meta_kms_connector_is_non_desktop (MetaKmsConnector *connector)
{
const char *lease_connectors_str;
diff --git a/src/backends/native/meta-kms-connector.h b/src/backends/native/meta-kms-connector.h
index 84ee7f5c26..328465d0fa 100644
--- a/src/backends/native/meta-kms-connector.h
+++ b/src/backends/native/meta-kms-connector.h
@@ -102,4 +102,4 @@ MetaKmsMode * meta_kms_connector_get_preferred_mode (MetaKmsConnector *connector
META_EXPORT_TEST
const MetaKmsConnectorState * meta_kms_connector_get_current_state (MetaKmsConnector *connector);
-gboolean meta_kms_connector_is_for_lease (MetaKmsConnector *connector);
+gboolean meta_kms_connector_is_non_desktop (MetaKmsConnector *connector);
--
2.48.1

View File

@ -1,130 +0,0 @@
From 55910e467f42ce9d6e761afd8f50110cb1cc3164 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jexposit@redhat.com>
Date: Mon, 28 Oct 2024 08:54:45 +0100
Subject: [PATCH 5/5] native/drm-lease: Handle monitors configured for lease
Follow the configuration stored in MetaMonitor and make connectors
configured as for lease available to Wayland clients.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4112>
---
src/backends/native/meta-drm-lease.c | 45 ++++++++++++++++++++++++++--
1 file changed, 43 insertions(+), 2 deletions(-)
diff --git a/src/backends/native/meta-drm-lease.c b/src/backends/native/meta-drm-lease.c
index 302147e9bb..582f869b3b 100644
--- a/src/backends/native/meta-drm-lease.c
+++ b/src/backends/native/meta-drm-lease.c
@@ -21,12 +21,14 @@
#include <glib.h>
+#include "backends/meta-logical-monitor.h"
#include "backends/native/meta-crtc-kms.h"
#include "backends/native/meta-kms.h"
#include "backends/native/meta-kms-connector.h"
#include "backends/native/meta-kms-crtc-private.h"
#include "backends/native/meta-kms-device.h"
#include "backends/native/meta-kms-plane.h"
+#include "backends/native/meta-output-kms.h"
enum
{
@@ -68,6 +70,7 @@ struct _MetaDrmLeaseManager
gulong resources_changed_handler_id;
gulong lease_changed_handler_id;
+ gulong monitors_changed_handler_id;
/* MetaKmsDevice *kms_device */
GList *devices;
@@ -179,6 +182,32 @@ find_plane_to_lease (MetaKmsCrtc *kms_crtc,
return NULL;
}
+static gboolean
+is_connector_configured_for_lease (MetaKmsConnector *connector)
+{
+ const MetaKmsConnectorState *connector_state;
+ MetaOutputKms *output_kms;
+ MetaMonitor *monitor;
+
+ connector_state = meta_kms_connector_get_current_state (connector);
+ if (!connector_state)
+ return FALSE;
+
+ output_kms = meta_output_kms_from_kms_connector (connector);
+ if (!output_kms)
+ return FALSE;
+
+ monitor = meta_output_get_monitor (META_OUTPUT (output_kms));
+ return meta_monitor_is_for_lease (monitor);
+}
+
+static gboolean
+is_connector_for_lease (MetaKmsConnector *connector)
+{
+ return meta_kms_connector_is_non_desktop (connector) ||
+ is_connector_configured_for_lease (connector);
+}
+
static gboolean
find_resources_to_lease (MetaDrmLeaseManager *lease_manager,
MetaKmsDevice *kms_device,
@@ -227,7 +256,7 @@ find_resources_to_lease (MetaDrmLeaseManager *lease_manager,
MetaKmsDevice *connector_device;
if (!g_list_find (available_connectors, connector) ||
- !meta_kms_connector_is_non_desktop (connector))
+ !is_connector_for_lease (connector))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"Failed to find connector %u (%s)",
@@ -645,7 +674,7 @@ update_connectors (MetaDrmLeaseManager *lease_manager,
kms_connector = o->data;
lease = NULL;
- if (!meta_kms_connector_is_non_desktop (kms_connector))
+ if (!is_connector_for_lease (kms_connector))
continue;
if (g_list_find (lease_manager->connectors, kms_connector))
@@ -845,6 +874,9 @@ meta_drm_lease_manager_constructed (GObject *object)
{
MetaDrmLeaseManager *lease_manager = META_DRM_LEASE_MANAGER (object);
MetaKms *kms = lease_manager->kms;
+ MetaBackend *backend = meta_kms_get_backend (kms);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
lease_manager->resources_changed_handler_id =
g_signal_connect (kms, "resources-changed",
@@ -854,6 +886,10 @@ meta_drm_lease_manager_constructed (GObject *object)
g_signal_connect (kms, "lease-changed",
G_CALLBACK (on_lease_changed),
lease_manager);
+ lease_manager->monitors_changed_handler_id =
+ g_signal_connect_swapped (monitor_manager, "monitors-changed-internal",
+ G_CALLBACK (update_resources),
+ lease_manager);
lease_manager->leases =
g_hash_table_new_full (NULL, NULL,
@@ -905,9 +941,14 @@ meta_drm_lease_manager_dispose (GObject *object)
{
MetaDrmLeaseManager *lease_manager = META_DRM_LEASE_MANAGER (object);
MetaKms *kms = lease_manager->kms;
+ MetaBackend *backend = meta_kms_get_backend (kms);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
g_clear_signal_handler (&lease_manager->resources_changed_handler_id, kms);
g_clear_signal_handler (&lease_manager->lease_changed_handler_id, kms);
+ g_clear_signal_handler (&lease_manager->monitors_changed_handler_id,
+ monitor_manager);
g_list_free_full (g_steal_pointer (&lease_manager->devices), g_object_unref);
g_list_free_full (g_steal_pointer (&lease_manager->connectors),
--
2.48.1

View File

@ -1,76 +1,67 @@
## START: Set by rpmautospec
## (rpmautospec version 0.8.3)
## RPMAUTOSPEC: autorelease, autochangelog
%define autorelease(e:s:pb:n) %{?-p:0.}%{lua:
release_number = 4;
base_release_number = tonumber(rpm.expand("%{?-b*}%{!?-b:1}"));
print(release_number + base_release_number - 1);
}%{?-e:.%{-e*}}%{?-s:.%{-s*}}%{!?-n:%{?dist}}
## END: Set by rpmautospec
%global glib_version 2.75.1
%global gtk3_version 3.19.8
%global gtk4_version 4.0.0
%global gsettings_desktop_schemas_version 47~beta
%global libinput_version 1.19.0
%global pipewire_version 0.3.33
%global libinput_version 1.27.0
%global pipewire_version 1.2.7
%global lcms2_version 2.6
%global colord_version 1.4.5
%global libei_version 1.0.901
%global mutter_api_version 15
%global libei_version 1.3.901
%global mutter_api_version 17
%global major_version %%(echo %{version} | cut -d '.' -f1 | cut -d '~' -f 1)
%global tarball_version %%(echo %{version} | tr '~' '.')
Name: mutter
Version: 47.5
Release: 8%{?dist}
Version: 49.4
Release: %autorelease
Summary: Window and compositing manager based on Clutter
License: GPLv2+
License: GPL-2.0-or-later
URL: http://www.gnome.org
Source0: http://download.gnome.org/sources/%{name}/47/%{name}-%{tarball_version}.tar.xz
Source0: http://download.gnome.org/sources/%{name}/%{major_version}/%{name}-%{tarball_version}.tar.xz
# Work-around for OpenJDK's compliance test
Patch: 0001-window-actor-Special-case-shaped-Java-windows.patch
# meson >= 1.5.0 is required
%global meson_ver 1.5.0
Source2: https://github.com/mesonbuild/meson/releases/download/%{meson_ver}/meson-%{meson_ver}.tar.gz
# https://bugzilla.redhat.com/show_bug.cgi?id=1936991
Patch: 0001-Test-deny-atomic-KMS-for-tegra-RHBZ-1936991.patch
# https://pagure.io/fedora-workstation/issue/79
Patch: 0001-place-Always-center-initial-setup-fedora-welcome.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=2239128
# https://gitlab.gnome.org/GNOME/mutter/-/issues/3068
# not upstreamed because for upstream we'd really want to find a way
# to fix *both* problems
Patch: 0001-Revert-x11-window-Compare-input-shape-to-client-rect.patch
Patch: 0002-Revert-x11-window-Update-comment-and-variable-name-t.patch
Patch: 0003-Revert-x11-window-Use-correct-bounding-rect-to-deter.patch
# Revert deprecation fix to avoid newer glib requirement
Patch: 0001-Revert-Replace-deprecated-g_qsort_with_data-with-g_s.patch
# RHEL-74359
Patch: 0001-cursor-renderer-native-Pass-destination-format-to-sc.patch
Patch: 0002-cursor-renderer-native-Store-formats-in-MetaCursorRe.patch
Patch: 0003-cursor-renderer-native-Probe-formats-supported-by-cu.patch
Patch: 0001-cursor-renderer-native-Skip-init_hw_cursor_support_f.patch
Patch: 0001-cursor-renderer-native-Fix-crash-with-MUTTER_DEBUG_D.patch
Patch: 0001-cursor-renderer-native-Cast-MetaGpu-to-MetaGpuKms-on.patch
# Avoid glycin dependency (only needed for HDR backgrounds)
Patch: 0001-Revert-background-Port-from-gdk-pixbuf-to-glycin.patch
Patch: 0002-Revert-background-Plumb-color-state-through-backgrou.patch
# RHEL-62220
# DRM lease configuration via monitors.xml and D-Bus:
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4112
Patch: 0001-monitor-manager-Add-forlease-config-to-monitors.xml.patch
Patch: 0002-monitor-Keep-track-of-the-for-lease-status.patch
Patch: 0003-output-kms-Add-meta_output_kms_from_kms_connector.patch
Patch: 0004-kms-connector-Rename-meta_kms_connector_is_for_lease.patch
Patch: 0005-native-drm-lease-Handle-monitors-configured-for-leas.patch
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4121
Patch: 0001-monitor-manager-Return-for-lease-status-in-GetCurren.patch
Patch: 0002-monitor-manager-Allow-to-check-if-config-has-a-visib.patch
Patch: 0003-monitor-manager-Configure-for-lease-monitors-in-Appl.patch
# Revert upstream devkit commit that depends on newer gtk4
Patch: 0001-Revert-mdk-Use-PipeWire-damage-region-for-minimizing.patch
# Backports from gnome-47 branch between 47.5 and 47.6
Patch: 0001-wayland-Fix-refresh-interval-reporting-in-presentati.patch
Patch: 0002-input-capture-session-Disconnect-on_keymap_changed-o.patch
# Revert upstream test suite patch that depends on umockdev, which isn't
# available in the appropriate repository.
Patch: 0001-Revert-tests-monitor-backlight-Add-tests-for-the-sys.patch
# Overlay cursor damage fix: RHEL-58079, RHEL-81897
Patch: 0001-backends-Update-stage-views-and-stage-dimension-from.patch
Patch: 0002-stage-Track-overlay-damage-per-view.patch
# Fix flaky tests
Patch: 0001-mtk-Take-explicit-reference-for-mtk_extrapolate_next.patch
Patch: 0001-tests-test-runner-Do-a-client-roundtrip-after-popup-.patch
# Handle unmaximize when headless
# https://redhat.atlassian.net/browse/RHEL-156728
Patch: unmaximize-when-headless.patch
BuildRequires: pkgconfig(gobject-introspection-1.0) >= 1.41.0
BuildRequires: pkgconfig(sm)
BuildRequires: pkgconfig(libadwaita-1)
BuildRequires: pkgconfig(libwacom)
BuildRequires: pkgconfig(x11)
BuildRequires: pkgconfig(xdamage)
@ -101,10 +92,12 @@ BuildRequires: pkgconfig(libsystemd)
BuildRequires: pkgconfig(xkeyboard-config)
BuildRequires: desktop-file-utils
BuildRequires: cvt
BuildRequires: python3-argcomplete
BuildRequires: python3-docutils
# Bootstrap requirements
BuildRequires: gettext-devel git-core
BuildRequires: pkgconfig(libcanberra)
BuildRequires: gsettings-desktop-schemas-devel >= %{gsettings_desktop_schemas_version}
BuildRequires: pkgconfig(gsettings-desktop-schemas) >= %{gsettings_desktop_schemas_version}
BuildRequires: pkgconfig(gnome-settings-daemon)
BuildRequires: meson
BuildRequires: pkgconfig(gbm)
@ -121,9 +114,13 @@ BuildRequires: pkgconfig(libeis-1.0) >= %{libei_version}
BuildRequires: pkgconfig(libinput) >= %{libinput_version}
BuildRequires: pkgconfig(xwayland)
BuildRequires: pkgconfig(bash-completion)
BuildRequires: python3-dbusmock
# for meson
BuildRequires: python3-devel
Requires: control-center-filesystem
Requires: gsettings-desktop-schemas%{?_isa} >= %{gsettings_desktop_schemas_version}
Requires: gnome-settings-daemon
@ -132,6 +129,7 @@ Requires: libinput%{?_isa} >= %{libinput_version}
Requires: pipewire%{_isa} >= %{pipewire_version}
Requires: startup-notification
Requires: dbus
Requires: python3-argcomplete
# Need common
Requires: %{name}-common = %{version}-%{release}
@ -194,24 +192,57 @@ the functionality of the installed %{name} package.
%prep
%autosetup -S git -n %{name}-%{tarball_version}
# Extract meson
tar -xvf %{SOURCE2}
%build
%meson -Degl_device=true
# Build meson
cd meson-%{meson_ver}
%py3_build
%py3_install
%global __meson %{buildroot}%{_bindir}/meson
export PYTHONPATH=%{buildroot}%{python3_sitelib}:%{python3_sitelib}
cd -
%meson -Degl_device=true -Dx11=true
%meson_build
%install
cd meson-%{meson_ver}
%py3_build
%py3_install
%global __meson %{buildroot}%{_bindir}/meson
export PYTHONPATH=%{buildroot}%{python3_sitelib}:%{python3_sitelib}
cd -
%meson_install
# Delete files installed by meson
rm -f %{buildroot}%{_bindir}/meson
rm -rf %{buildroot}%{_mandir}/man1/meson.1*
rm -f %{buildroot}%{_datadir}/polkit-1/actions/com.mesonbuild.install.policy
rm -f %{buildroot}%{_datadir}/bash-completion/completions/meson
rm -f %{buildroot}%{_datadir}/zsh/site-functions/_meson
rm -rf %{buildroot}%{python3_sitelib}
%find_lang %{name}
%files -f %{name}.lang
%license COPYING
%doc NEWS
%{_bindir}/mutter
%{_datadir}/polkit-1/actions/org.gnome.mutter.*.policy
%{_bindir}/gdctl
%{_bindir}/gnome-service-client
%{_datadir}/bash-completion/completions/gdctl
%{_libdir}/lib*.so.*
%{_libdir}/mutter-%{mutter_api_version}/
%{_libexecdir}/mutter-backlight-helper
%{_libexecdir}/mutter-restart-helper
%{_libexecdir}/mutter-x11-frames
%{_mandir}/man1/mutter.1*
%{_mandir}/man1/gdctl.1*
%{_mandir}/man1/gnome-service-client.1*
%files common
%{_datadir}/GConf/gsettings/mutter-schemas.convert
@ -221,9 +252,14 @@ the functionality of the installed %{name} package.
%{_udevrulesdir}/61-mutter.rules
%files devel
%{_datadir}/applications/org.gnome.Mutter.Mdk.desktop
%{_datadir}/glib-2.0/schemas/org.gnome.mutter.devkit.gschema.xml
%{_datadir}/icons/hicolor/*/apps/org.gnome.Mutter.Mdk*
%{_includedir}/*
%{_libdir}/lib*.so
%{_libdir}/mutter-%{mutter_api_version}/*.gir
%{_libdir}/pkgconfig/*
%{_libexecdir}/mutter-devkit
%files tests
%{_libexecdir}/installed-tests/mutter-%{mutter_api_version}
@ -231,8 +267,51 @@ the functionality of the installed %{name} package.
%{_datadir}/mutter-%{mutter_api_version}/tests
%changelog
* Tue Jul 01 2025 Craig Guiller <craig.guiller@oracle.com> - 47.5.8
- Bump release
## START: Generated by rpmautospec
* Thu Apr 23 2026 Tomas Pelka <tpelka@redhat.com> - 49.4-4
- Handle unmaximize when headless
* Tue Feb 17 2026 Jonas Ådahl <jadahl@redhat.com> - 49.4-3
- Fix flaky popup test
* Mon Feb 16 2026 Jonas Ådahl <jadahl@redhat.com> - 49.4-2
- Fix flaky test case
* Fri Feb 13 2026 Jonas Ådahl <jadahl@redhat.com> - 49.4-1
- Update to 49.4
* Tue Nov 11 2025 Florian Müllner <fmuellner@redhat.com> - 49.1.1-1
- Update to 49.1.1
* Mon Nov 10 2025 Florian Müllner <fmuellner@redhat.com> - 47.5-16
- Bundle newer meson
* Fri Nov 07 2025 Florian Müllner <fmuellner@redhat.com> - 47.5-15
- Use SPDX license
* Fri Nov 07 2025 Florian Müllner <fmuellner@redhat.com> - 47.5-14
- Deduce source URL from version
* Mon Aug 18 2025 Jonas Ådahl <jadahl@redhat.com> - 47.5-13
- Fix path to gdctl when running installed test
* Fri Aug 15 2025 Jonas Ådahl <jadahl@redhat.com> - 47.5-12
- Backport gdctl utility
* Thu Jun 26 2025 Olivier Fourdan <ofourdan@redhat.com> - 47.5-11
- Fix polyinstantiation preventing Xwayland to start
* Wed May 21 2025 Michel Dänzer <mdaenzer@redhat.com> - 47.5-10
- Backport "Fix race hotplug race conditions in DRM lease manager"
* Tue Apr 01 2025 Olivier Fourdan <ofourdan@redhat.com> - 47.5-9
- Backport the pre-configure mechanism
* Wed Mar 26 2025 Jonas Ådahl <jadahl@redhat.com> - 47.5-8
- Compensate for backend initialization order change in backport
* Tue Mar 25 2025 Jonas Ådahl <jadahl@redhat.com> - 47.5-7
- Backport Accessibility manager patches
* Wed Mar 12 2025 Jonas Ådahl <jadahl@redhat.com> - 47.5-6
- Backport fix for software cursors artifacts
@ -1724,3 +1803,4 @@ the functionality of the installed %{name} package.
- Initial packaging
## END: Generated by rpmautospec

2
sources Normal file
View File

@ -0,0 +1,2 @@
SHA512 (meson-1.5.0.tar.gz) = f0a25cf134949739c698eddaea602bf7852866b3fee3d2c11c1e6b6e48c944cf92abc3d171a2e42e21077edc01f1e7079d451f5624e2b6131382e114e814db3e
SHA512 (mutter-49.4.tar.xz) = d4cc6f9bd5367644a121bec23cfee30aa736e692cf5bdaba638635817d34f00eed6fa31e9dcbffae0c58bf7c0483d58a2c595e210071646ce361fb86650cd301

View File

@ -0,0 +1,298 @@
From b14301e520c15fc2c5166bfbed06e14d03bbe878 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Tue, 17 Mar 2026 16:50:04 +0100
Subject: [PATCH 1/4] tests/test-runner: Add 'remove_monitor' command
This allows removing any added monitor, or the monitor added by default.
---
src/tests/test-runner.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/tests/test-runner.c b/src/tests/test-runner.c
index e036b16bd6..6a8375144d 100644
--- a/src/tests/test-runner.c
+++ b/src/tests/test-runner.c
@@ -2324,6 +2324,18 @@ test_case_do (TestCase *test,
g_hash_table_insert (test->virtual_monitors, g_strdup (argv[1]), monitor);
}
+ else if (strcmp (argv[0], "remove_monitor") == 0)
+ {
+ MetaBackend *backend = meta_context_get_backend (test->context);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
+
+ if (argc != 2)
+ BAD_COMMAND ("usage: %s <monitor-id>", argv[0]);
+
+ g_hash_table_remove (test->virtual_monitors, g_strdup (argv[1]));
+ meta_monitor_manager_reload (monitor_manager);
+ }
else if (strcmp (argv[0], "set_monitor_order") == 0)
{
MetaBackend *backend = meta_context_get_backend (test->context);
--
2.51.0
From b4f6e1b3fac0440216c319ec4936df8cd4108f61 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Tue, 17 Mar 2026 16:50:44 +0100
Subject: [PATCH 2/4] tests/test-runner: Handle sanity checking while headless
When headless, monitors will not have a current monitor, as there is
none. Handle this.
---
src/backends/meta-monitor-manager-private.h | 1 +
src/tests/test-runner.c | 21 +++++++++++++++++----
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index e219c95aaf..522730c904 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -353,6 +353,7 @@ void meta_monitor_manager_update_logical_state_derived (MetaMonito
META_EXPORT_TEST
void meta_monitor_manager_lid_is_closed_changed (MetaMonitorManager *manager);
+META_EXPORT_TEST
gboolean meta_monitor_manager_is_headless (MetaMonitorManager *manager);
float meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager *manager,
diff --git a/src/tests/test-runner.c b/src/tests/test-runner.c
index 6a8375144d..551ac15357 100644
--- a/src/tests/test-runner.c
+++ b/src/tests/test-runner.c
@@ -3183,11 +3183,24 @@ sanity_check_monitor (MetaWindow *window)
{
if (!meta_window_is_hidden (window))
{
- MtkRectangle rect;
+ MetaContext *context = meta_display_get_context (window->display);
+ MetaBackend *backend = meta_context_get_backend (context);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
- g_assert_nonnull (window->monitor);
- rect = meta_window_config_get_rect (window->config);
- g_assert_true (mtk_rectangle_overlap (&rect, &window->monitor->rect));
+ if (meta_monitor_manager_is_headless (monitor_manager))
+ {
+ g_assert_null (window->monitor);
+ }
+ else
+ {
+ MtkRectangle rect;
+
+ g_assert_nonnull (window->monitor);
+
+ rect = meta_window_config_get_rect (window->config);
+ g_assert_true (mtk_rectangle_overlap (&rect, &window->monitor->rect));
+ }
}
}
--
2.51.0
From dd0811b6a1576df8d1d8fd9c0fdb0381fec805e0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Fri, 17 Apr 2026 09:37:43 +0200
Subject: [PATCH 3/4] window: Bail proper unmaximizing when headless
We don't have any information to handle placing a window when
unmaximizing and headless, so just place it at 0,0.
---
src/core/window.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/core/window.c b/src/core/window.c
index 8f44f60d22..2b2ad8b0ac 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -3443,6 +3443,7 @@ meta_window_set_unmaximize_flags (MetaWindow *window,
gboolean has_desired_rect = FALSE;
MtkRectangle target_rect;
MtkRectangle work_area;
+ gboolean has_work_area = FALSE;
MtkRectangle old_frame_rect, old_buffer_rect;
gboolean has_target_size;
MetaPlaceFlag place_flags = META_PLACE_FLAG_NONE;
@@ -3452,7 +3453,11 @@ meta_window_set_unmaximize_flags (MetaWindow *window,
reset_pending_auto_maximize (window);
- meta_window_get_work_area_current_monitor (window, &work_area);
+ if (window->monitor)
+ {
+ meta_window_get_work_area_current_monitor (window, &work_area);
+ has_work_area = TRUE;
+ }
meta_window_get_frame_rect (window, &old_frame_rect);
meta_window_get_buffer_rect (window, &old_buffer_rect);
@@ -3508,6 +3513,7 @@ meta_window_set_unmaximize_flags (MetaWindow *window,
*/
if (unmaximize_horizontally && unmaximize_vertically &&
has_desired_rect &&
+ has_work_area &&
desired_rect.width * desired_rect.height >
work_area.width * work_area.height * MAX_UNMAXIMIZED_WINDOW_AREA)
{
@@ -3572,7 +3578,7 @@ meta_window_set_unmaximize_flags (MetaWindow *window,
meta_window_recalc_features (window);
set_net_wm_state (window);
- if (!window->monitor->in_fullscreen)
+ if (window->monitor && !window->monitor->in_fullscreen)
meta_display_queue_check_fullscreen (window->display);
}
--
2.51.0
From 0c410fe7c31a9cbc1c9c2a5a1f115f509a97332f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Thu, 16 Apr 2026 23:38:28 +0200
Subject: [PATCH 4/4] tests: Add test for unmaximizing while headless
A test is added that verifies the behavior when unmaximizing while no
monitor is connected. The 'dispatch' test runner command had to be
adapted to handle not getting any frame clock dispatches, since there
are no frame CRTC associated frame clocks to dispatch from.
---
src/tests/meson.build | 1 +
.../stacking/unmaximize-headless.metatest | 61 +++++++++++++++++++
src/tests/test-runner.c | 32 ++++++----
3 files changed, 83 insertions(+), 11 deletions(-)
create mode 100644 src/tests/stacking/unmaximize-headless.metatest
diff --git a/src/tests/meson.build b/src/tests/meson.build
index 8c3773033f..64ea5303b1 100644
--- a/src/tests/meson.build
+++ b/src/tests/meson.build
@@ -1181,6 +1181,7 @@ stacking_tests = [
'partially-maximized',
'move-to-monitor',
'keyboard-resize',
+ 'unmaximize-headless',
]
foreach stacking_test: stacking_tests
diff --git a/src/tests/stacking/unmaximize-headless.metatest b/src/tests/stacking/unmaximize-headless.metatest
new file mode 100644
index 0000000000..0a738c35d0
--- /dev/null
+++ b/src/tests/stacking/unmaximize-headless.metatest
@@ -0,0 +1,61 @@
+set_pref center-new-windows true
+
+# Test unmaximizing when there is no monitor to place on
+
+new_client w wayland
+create w/1 csd
+resize w/1 200 200
+maximize w/1
+show w/1
+wait
+
+remove_monitor default
+
+unmaximize w/1
+wait_reconfigure w/1
+
+add_monitor default 800 600
+wait_reconfigure w/1
+assert_size w/1 200 200
+# Incorrect placement expected.
+#assert_position w/1 300 200
+
+remove_monitor default
+
+maximize w/1
+wait_reconfigure w/1
+
+add_monitor default 1024 768
+wait_reconfigure w/1
+assert_size w/1 1024 768
+assert_position w/1 0 0
+
+# Same test with an X11 client
+
+new_client x x11
+create x/1 csd
+resize x/1 200 200
+maximize x/1
+show x/1
+wait
+
+remove_monitor default
+
+unmaximize x/1
+wait_reconfigure x/1
+
+add_monitor default 800 600
+wait_reconfigure x/1
+assert_size x/1 200 200
+# Incorrect placement expected.
+#assert_position x/1 300 200
+
+remove_monitor default
+
+maximize x/1
+wait_reconfigure x/1
+
+add_monitor default 1024 768
+wait_reconfigure x/1
+assert_size x/1 1024 768
+assert_position x/1 0 0
diff --git a/src/tests/test-runner.c b/src/tests/test-runner.c
index 551ac15357..235575660f 100644
--- a/src/tests/test-runner.c
+++ b/src/tests/test-runner.c
@@ -163,19 +163,29 @@ test_case_dispatch (TestCase *test,
MetaDisplay *display = meta_context_get_display (test->context);
MetaCompositor *compositor = meta_display_get_compositor (display);
MetaLaters *laters = meta_compositor_get_laters (compositor);
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
- /* Wait until we've done any outstanding queued up work.
- * Though we add this as BEFORE_REDRAW, the iteration that runs the
- * BEFORE_REDRAW idles will proceed on and do the redraw, so we're
- * waiting until after *all* frame processing.
- */
- meta_laters_add (laters, META_LATER_BEFORE_REDRAW,
- test_case_loop_quit,
- test,
- NULL);
+ if (meta_monitor_manager_is_headless (monitor_manager))
+ {
+ while (g_main_context_iteration (NULL, FALSE))
+ ;
+ }
+ else
+ {
+ /* Wait until we've done any outstanding queued up work.
+ * Though we add this as BEFORE_REDRAW, the iteration that runs the
+ * BEFORE_REDRAW idles will proceed on and do the redraw, so we're
+ * waiting until after *all* frame processing.
+ */
+ meta_laters_add (laters, META_LATER_BEFORE_REDRAW,
+ test_case_loop_quit,
+ test,
+ NULL);
- clutter_stage_schedule_update (CLUTTER_STAGE (stage));
- g_main_loop_run (test->loop);
+ clutter_stage_schedule_update (CLUTTER_STAGE (stage));
+ g_main_loop_run (test->loop);
+ }
return TRUE;
}
--
2.51.0