From 22da44a45e84feec128e2ff1f87f007585cb518b Mon Sep 17 00:00:00 2001 From: AlmaLinux RelEng Bot Date: Wed, 15 Jul 2026 01:48:02 -0400 Subject: [PATCH] import Oracle_OSS mutter-49.4-4.el10_2 --- .gitignore | 3 +- .mutter.metadata | 1 - ...eprecated-g_qsort_with_data-with-g_s.patch | 0 ...round-Port-from-gdk-pixbuf-to-glycin.patch | 310 +++++++ ...ipeWire-damage-region-for-minimizing.patch | 211 +++++ ...itor-backlight-Add-tests-for-the-sys.patch | 790 ++++++++++++++++++ ...ny-atomic-KMS-for-tegra-RHBZ-1936991.patch | 21 +- ...t-reference-for-mtk_extrapolate_next.patch | 118 +++ ...r-Do-a-client-roundtrip-after-popup-.patch | 42 + ...d-Plumb-color-state-through-backgrou.patch | 223 +++++ ...w-Compare-input-shape-to-client-rect.patch | 66 -- ...stage-views-and-stage-dimension-from.patch | 178 ---- ...native-Cast-MetaGpu-to-MetaGpuKms-on.patch | 41 - ...native-Fix-crash-with-MUTTER_DEBUG_D.patch | 88 -- ...native-Pass-destination-format-to-sc.patch | 48 -- ...native-Skip-init_hw_cursor_support_f.patch | 45 - ...-Add-forlease-config-to-monitors.xml.patch | 338 -------- ...Return-for-lease-status-in-GetCurren.patch | 201 ----- ...-center-initial-setup-fedora-welcome.patch | 28 - ...esh-interval-reporting-in-presentati.patch | 81 -- ...tor-Special-case-shaped-Java-windows.patch | 35 - ...w-Update-comment-and-variable-name-t.patch | 47 -- ...native-Store-formats-in-MetaCursorRe.patch | 115 --- ...ssion-Disconnect-on_keymap_changed-o.patch | 41 - ...r-Keep-track-of-the-for-lease-status.patch | 462 ---------- ...Allow-to-check-if-config-has-a-visib.patch | 80 -- ...-stage-Track-overlay-damage-per-view.patch | 266 ------ ...w-Use-correct-bounding-rect-to-deter.patch | 29 - ...native-Probe-formats-supported-by-cu.patch | 176 ---- ...Configure-for-lease-monitors-in-Appl.patch | 224 ----- ...d-meta_output_kms_from_kms_connector.patch | 74 -- ...name-meta_kms_connector_is_for_lease.patch | 78 -- ...-Handle-monitors-configured-for-leas.patch | 130 --- SPECS/mutter.spec => mutter.spec | 180 ++-- sources | 2 + unmaximize-when-headless.patch | 298 +++++++ 36 files changed, 2138 insertions(+), 2932 deletions(-) delete mode 100644 .mutter.metadata rename SOURCES/0001-Revert-Replace-deprecated-g_qsort_with_data-with-g_s.patch => 0001-Revert-Replace-deprecated-g_qsort_with_data-with-g_s.patch (100%) create mode 100644 0001-Revert-background-Port-from-gdk-pixbuf-to-glycin.patch create mode 100644 0001-Revert-mdk-Use-PipeWire-damage-region-for-minimizing.patch create mode 100644 0001-Revert-tests-monitor-backlight-Add-tests-for-the-sys.patch rename SOURCES/0001-Test-deny-atomic-KMS-for-tegra-RHBZ-1936991.patch => 0001-Test-deny-atomic-KMS-for-tegra-RHBZ-1936991.patch (62%) create mode 100644 0001-mtk-Take-explicit-reference-for-mtk_extrapolate_next.patch create mode 100644 0001-tests-test-runner-Do-a-client-roundtrip-after-popup-.patch create mode 100644 0002-Revert-background-Plumb-color-state-through-backgrou.patch delete mode 100644 SOURCES/0001-Revert-x11-window-Compare-input-shape-to-client-rect.patch delete mode 100644 SOURCES/0001-backends-Update-stage-views-and-stage-dimension-from.patch delete mode 100644 SOURCES/0001-cursor-renderer-native-Cast-MetaGpu-to-MetaGpuKms-on.patch delete mode 100644 SOURCES/0001-cursor-renderer-native-Fix-crash-with-MUTTER_DEBUG_D.patch delete mode 100644 SOURCES/0001-cursor-renderer-native-Pass-destination-format-to-sc.patch delete mode 100644 SOURCES/0001-cursor-renderer-native-Skip-init_hw_cursor_support_f.patch delete mode 100644 SOURCES/0001-monitor-manager-Add-forlease-config-to-monitors.xml.patch delete mode 100644 SOURCES/0001-monitor-manager-Return-for-lease-status-in-GetCurren.patch delete mode 100644 SOURCES/0001-place-Always-center-initial-setup-fedora-welcome.patch delete mode 100644 SOURCES/0001-wayland-Fix-refresh-interval-reporting-in-presentati.patch delete mode 100644 SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch delete mode 100644 SOURCES/0002-Revert-x11-window-Update-comment-and-variable-name-t.patch delete mode 100644 SOURCES/0002-cursor-renderer-native-Store-formats-in-MetaCursorRe.patch delete mode 100644 SOURCES/0002-input-capture-session-Disconnect-on_keymap_changed-o.patch delete mode 100644 SOURCES/0002-monitor-Keep-track-of-the-for-lease-status.patch delete mode 100644 SOURCES/0002-monitor-manager-Allow-to-check-if-config-has-a-visib.patch delete mode 100644 SOURCES/0002-stage-Track-overlay-damage-per-view.patch delete mode 100644 SOURCES/0003-Revert-x11-window-Use-correct-bounding-rect-to-deter.patch delete mode 100644 SOURCES/0003-cursor-renderer-native-Probe-formats-supported-by-cu.patch delete mode 100644 SOURCES/0003-monitor-manager-Configure-for-lease-monitors-in-Appl.patch delete mode 100644 SOURCES/0003-output-kms-Add-meta_output_kms_from_kms_connector.patch delete mode 100644 SOURCES/0004-kms-connector-Rename-meta_kms_connector_is_for_lease.patch delete mode 100644 SOURCES/0005-native-drm-lease-Handle-monitors-configured-for-leas.patch rename SPECS/mutter.spec => mutter.spec (92%) create mode 100644 sources create mode 100644 unmaximize-when-headless.patch diff --git a/.gitignore b/.gitignore index 4f97827..c2dd715 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -SOURCES/mutter-47.5.tar.xz +meson-1.5.0.tar.gz +mutter-49.4.tar.xz diff --git a/.mutter.metadata b/.mutter.metadata deleted file mode 100644 index 357f868..0000000 --- a/.mutter.metadata +++ /dev/null @@ -1 +0,0 @@ -e4dbc506016b0cc64e15540709c73c162f1d14fb SOURCES/mutter-47.5.tar.xz diff --git a/SOURCES/0001-Revert-Replace-deprecated-g_qsort_with_data-with-g_s.patch b/0001-Revert-Replace-deprecated-g_qsort_with_data-with-g_s.patch similarity index 100% rename from SOURCES/0001-Revert-Replace-deprecated-g_qsort_with_data-with-g_s.patch rename to 0001-Revert-Replace-deprecated-g_qsort_with_data-with-g_s.patch diff --git a/0001-Revert-background-Port-from-gdk-pixbuf-to-glycin.patch b/0001-Revert-background-Port-from-gdk-pixbuf-to-glycin.patch new file mode 100644 index 0000000..8a3d555 --- /dev/null +++ b/0001-Revert-background-Port-from-gdk-pixbuf-to-glycin.patch @@ -0,0 +1,310 @@ +From b8383cd5dae36505f4ad1aea99cb672b7837187b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +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 ++#include + #include + + #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 + diff --git a/0001-Revert-mdk-Use-PipeWire-damage-region-for-minimizing.patch b/0001-Revert-mdk-Use-PipeWire-damage-region-for-minimizing.patch new file mode 100644 index 0000000..e48f1bb --- /dev/null +++ b/0001-Revert-mdk-Use-PipeWire-damage-region-for-minimizing.patch @@ -0,0 +1,211 @@ +From 24203b9306d75c3209969a6fdbb363afa51e15fd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +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 + diff --git a/0001-Revert-tests-monitor-backlight-Add-tests-for-the-sys.patch b/0001-Revert-tests-monitor-backlight-Add-tests-for-the-sys.patch new file mode 100644 index 0000000..c6276dc --- /dev/null +++ b/0001-Revert-tests-monitor-backlight-Add-tests-for-the-sys.patch @@ -0,0 +1,790 @@ +From 4b4bfed2a0ff7bf9581a2b993c588740ff4eea34 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +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 + + #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 . +- * +- */ +- +-#pragma once +- +-#include "config.h" +- +-#include "meta-test/meta-context-test.h" +- +-#include +- +-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 + #include +@@ -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 + + #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 + +-#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 (¶ms_builder, G_VARIANT_TYPE ("(ssu)")); +- g_variant_builder_add (¶ms_builder, "s", "backlight"); +- g_variant_builder_add (¶ms_builder, "s", name); +- g_variant_builder_add (¶ms_builder, "u", brightness); +- +- if (!g_dbus_proxy_call_sync (mock_proxy, +- "CreateBacklight", +- g_variant_builder_end (¶ms_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 (¶ms_builder, G_VARIANT_TYPE ("(ss)")); +- g_variant_builder_add (¶ms_builder, "s", "backlight"); +- g_variant_builder_add (¶ms_builder, "s", name); +- +- if (!g_dbus_proxy_call_sync (mock_proxy, +- "DestroyBacklight", +- g_variant_builder_end (¶ms_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 (¶ms_builder, G_VARIANT_TYPE ("(ss)")); +- g_variant_builder_add (¶ms_builder, "s", "backlight"); +- g_variant_builder_add (¶ms_builder, "s", name); +- +- result = g_dbus_proxy_call_sync (mock_proxy, +- "GetBacklight", +- g_variant_builder_end (¶ms_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 + diff --git a/SOURCES/0001-Test-deny-atomic-KMS-for-tegra-RHBZ-1936991.patch b/0001-Test-deny-atomic-KMS-for-tegra-RHBZ-1936991.patch similarity index 62% rename from SOURCES/0001-Test-deny-atomic-KMS-for-tegra-RHBZ-1936991.patch rename to 0001-Test-deny-atomic-KMS-for-tegra-RHBZ-1936991.patch index ece7ad1..fdca1e8 100644 --- a/SOURCES/0001-Test-deny-atomic-KMS-for-tegra-RHBZ-1936991.patch +++ b/0001-Test-deny-atomic-KMS-for-tegra-RHBZ-1936991.patch @@ -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 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 --- - 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 diff --git a/0001-mtk-Take-explicit-reference-for-mtk_extrapolate_next.patch b/0001-mtk-Take-explicit-reference-for-mtk_extrapolate_next.patch new file mode 100644 index 0000000..2774dfe --- /dev/null +++ b/0001-mtk-Take-explicit-reference-for-mtk_extrapolate_next.patch @@ -0,0 +1,118 @@ +From baee8ef5d24609d77c4fb3b897998f5c2a06147c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +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: +--- + 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 + diff --git a/0001-tests-test-runner-Do-a-client-roundtrip-after-popup-.patch b/0001-tests-test-runner-Do-a-client-roundtrip-after-popup-.patch new file mode 100644 index 0000000..86aa8a3 --- /dev/null +++ b/0001-tests-test-runner-Do-a-client-roundtrip-after-popup-.patch @@ -0,0 +1,42 @@ +From 6274d92c7da1977f7a6ba21ba490b9d1af7f34f1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +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: +(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 + diff --git a/0002-Revert-background-Plumb-color-state-through-backgrou.patch b/0002-Revert-background-Plumb-color-state-through-backgrou.patch new file mode 100644 index 0000000..274a674 --- /dev/null +++ b/0002-Revert-background-Plumb-color-state-through-backgrou.patch @@ -0,0 +1,223 @@ +From 7525f5b32799328ef2a2e8509b64dd6b7c264e15 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +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 . +- * +- * Author: Matthias Clasen +- */ +- +-#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 + #include +@@ -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 + + #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 + diff --git a/SOURCES/0001-Revert-x11-window-Compare-input-shape-to-client-rect.patch b/SOURCES/0001-Revert-x11-window-Compare-input-shape-to-client-rect.patch deleted file mode 100644 index 2d51f8d..0000000 --- a/SOURCES/0001-Revert-x11-window-Compare-input-shape-to-client-rect.patch +++ /dev/null @@ -1,66 +0,0 @@ -From beff8f13ed0cf16fa0b22f69de75f83e0378fdf1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -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 - diff --git a/SOURCES/0001-backends-Update-stage-views-and-stage-dimension-from.patch b/SOURCES/0001-backends-Update-stage-views-and-stage-dimension-from.patch deleted file mode 100644 index cf2438a..0000000 --- a/SOURCES/0001-backends-Update-stage-views-and-stage-dimension-from.patch +++ /dev/null @@ -1,178 +0,0 @@ -From cedeee4eb0c252d2450b7174b35f47ff5c27fc8e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -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 - #include - -+#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 - diff --git a/SOURCES/0001-cursor-renderer-native-Cast-MetaGpu-to-MetaGpuKms-on.patch b/SOURCES/0001-cursor-renderer-native-Cast-MetaGpu-to-MetaGpuKms-on.patch deleted file mode 100644 index 8601b19..0000000 --- a/SOURCES/0001-cursor-renderer-native-Cast-MetaGpu-to-MetaGpuKms-on.patch +++ /dev/null @@ -1,41 +0,0 @@ -From fac0854a4f25e90c26e7b1078a4a6ec305c53f66 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michel=20D=C3=A4nzer?= -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: ---- - 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 - diff --git a/SOURCES/0001-cursor-renderer-native-Fix-crash-with-MUTTER_DEBUG_D.patch b/SOURCES/0001-cursor-renderer-native-Fix-crash-with-MUTTER_DEBUG_D.patch deleted file mode 100644 index f2a5917..0000000 --- a/SOURCES/0001-cursor-renderer-native-Fix-crash-with-MUTTER_DEBUG_D.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 9b44ebf3269a7838d2288753dd66d48ebce8f8e2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michel=20D=C3=A4nzer?= -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: ---- - .../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 - diff --git a/SOURCES/0001-cursor-renderer-native-Pass-destination-format-to-sc.patch b/SOURCES/0001-cursor-renderer-native-Pass-destination-format-to-sc.patch deleted file mode 100644 index f520220..0000000 --- a/SOURCES/0001-cursor-renderer-native-Pass-destination-format-to-sc.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 7e4cae2f91f01db5083622b18d7173c8d9bf6540 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michel=20D=C3=A4nzer?= -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: ---- - 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 - diff --git a/SOURCES/0001-cursor-renderer-native-Skip-init_hw_cursor_support_f.patch b/SOURCES/0001-cursor-renderer-native-Skip-init_hw_cursor_support_f.patch deleted file mode 100644 index cd544b8..0000000 --- a/SOURCES/0001-cursor-renderer-native-Skip-init_hw_cursor_support_f.patch +++ /dev/null @@ -1,45 +0,0 @@ -From ba3b709e08e155a10abb3e88145fb7a4d342a0aa Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michel=20D=C3=A4nzer?= -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: ---- - 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 - diff --git a/SOURCES/0001-monitor-manager-Add-forlease-config-to-monitors.xml.patch b/SOURCES/0001-monitor-manager-Add-forlease-config-to-monitors.xml.patch deleted file mode 100644 index c5f1e40..0000000 --- a/SOURCES/0001-monitor-manager-Add-forlease-config-to-monitors.xml.patch +++ /dev/null @@ -1,338 +0,0 @@ -From 406de0d6d72bcd68ccc71880e618d933537d755c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= -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: ---- - 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 C - * - * -+ * -+ * -+ * LVDS3 -+ * Vendor C -+ * Product C -+ * Serial C -+ * -+ * - * - * - * -@@ -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, " \n"); - } - -+ if (config->for_lease_monitor_specs) -+ { -+ g_string_append (buffer, " \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, " \n"); -+ } -+ - g_string_append (buffer, " \n"); - } - --- -2.48.1 - diff --git a/SOURCES/0001-monitor-manager-Return-for-lease-status-in-GetCurren.patch b/SOURCES/0001-monitor-manager-Return-for-lease-status-in-GetCurren.patch deleted file mode 100644 index 20fe083..0000000 --- a/SOURCES/0001-monitor-manager-Return-for-lease-status-in-GetCurren.patch +++ /dev/null @@ -1,201 +0,0 @@ -From c93e06696fea37303e4d9143ed62a31a97532c51 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= -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: ---- - .../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 - diff --git a/SOURCES/0001-place-Always-center-initial-setup-fedora-welcome.patch b/SOURCES/0001-place-Always-center-initial-setup-fedora-welcome.patch deleted file mode 100644 index 6ac9da8..0000000 --- a/SOURCES/0001-place-Always-center-initial-setup-fedora-welcome.patch +++ /dev/null @@ -1,28 +0,0 @@ -From cbe6fb86ce1e71c7360974a960db6bf79eb1ebde Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -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 - diff --git a/SOURCES/0001-wayland-Fix-refresh-interval-reporting-in-presentati.patch b/SOURCES/0001-wayland-Fix-refresh-interval-reporting-in-presentati.patch deleted file mode 100644 index 9531ee1..0000000 --- a/SOURCES/0001-wayland-Fix-refresh-interval-reporting-in-presentati.patch +++ /dev/null @@ -1,81 +0,0 @@ -From cadb4cdbb15a58cc38cc15cfe1ad457ffda7d7a0 Mon Sep 17 00:00:00 2001 -From: Dudemanguy -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: ---- - 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 - diff --git a/SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch b/SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch deleted file mode 100644 index af7242a..0000000 --- a/SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 51e378c8f28b96b94c8da338b1b0f26cbc32c7f0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -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 - diff --git a/SOURCES/0002-Revert-x11-window-Update-comment-and-variable-name-t.patch b/SOURCES/0002-Revert-x11-window-Update-comment-and-variable-name-t.patch deleted file mode 100644 index dc2c280..0000000 --- a/SOURCES/0002-Revert-x11-window-Update-comment-and-variable-name-t.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 3a73958f7eab973189441ec9b4a4c96ee6bb8ec7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -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 - diff --git a/SOURCES/0002-cursor-renderer-native-Store-formats-in-MetaCursorRe.patch b/SOURCES/0002-cursor-renderer-native-Store-formats-in-MetaCursorRe.patch deleted file mode 100644 index 1b5850b..0000000 --- a/SOURCES/0002-cursor-renderer-native-Store-formats-in-MetaCursorRe.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 7c447b2627c3a8050a5189dd876b82ddcf317666 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michel=20D=C3=A4nzer?= -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: ---- - .../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 - diff --git a/SOURCES/0002-input-capture-session-Disconnect-on_keymap_changed-o.patch b/SOURCES/0002-input-capture-session-Disconnect-on_keymap_changed-o.patch deleted file mode 100644 index 3118573..0000000 --- a/SOURCES/0002-input-capture-session-Disconnect-on_keymap_changed-o.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 05c722d66dda0c55d3c58ccf5c7c321445664a45 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -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: - - -(cherry picked from commit 99dbcf1b8caba93acb5479d1c7ad754ff3fd0540) - -Co-authored-by: Alban Browaeys ---- - 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 - diff --git a/SOURCES/0002-monitor-Keep-track-of-the-for-lease-status.patch b/SOURCES/0002-monitor-Keep-track-of-the-for-lease-status.patch deleted file mode 100644 index e187874..0000000 --- a/SOURCES/0002-monitor-Keep-track-of-the-for-lease-status.patch +++ /dev/null @@ -1,462 +0,0 @@ -From f93e85f69b9d63d4bedeaf778d5f620ad64ddab4 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= -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: ---- - 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 @@ -+ -+ -+ logical -+ -+ 0 -+ 0 -+ 1 -+ yes -+ -+ -+ DP-1 -+ MetaProduct's Inc. -+ MetaMonitor -+ 0x123456 -+ -+ -+ 800 -+ 600 -+ 60 -+ -+ -+ -+ -+ -+ DP-1 -+ MetaProduct's Inc. -+ MetaMonitor -+ 0x123456 -+ -+ -+ -+ -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 @@ -+ -+ -+ logical -+ -+ 0 -+ 0 -+ 1 -+ yes -+ -+ -+ DP-1 -+ MetaProduct's Inc. -+ MetaMonitor -+ 0x123456 -+ -+ -+ 800 -+ 600 -+ 60 -+ -+ -+ -+ -+ -+ DP-2 -+ MetaProduct's Inc. -+ MetaMonitor -+ 0x654321 -+ -+ -+ -+ -+ DP-2 -+ MetaProduct's Inc. -+ MetaMonitor -+ 0x654321 -+ -+ -+ -+ -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 - diff --git a/SOURCES/0002-monitor-manager-Allow-to-check-if-config-has-a-visib.patch b/SOURCES/0002-monitor-manager-Allow-to-check-if-config-has-a-visib.patch deleted file mode 100644 index 60ff034..0000000 --- a/SOURCES/0002-monitor-manager-Allow-to-check-if-config-has-a-visib.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 80a19134ffb5ddd6577f00986aafcaf9db6505b9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= -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: ---- - 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 - diff --git a/SOURCES/0002-stage-Track-overlay-damage-per-view.patch b/SOURCES/0002-stage-Track-overlay-damage-per-view.patch deleted file mode 100644 index ba3b0b3..0000000 --- a/SOURCES/0002-stage-Track-overlay-damage-per-view.patch +++ /dev/null @@ -1,266 +0,0 @@ -From 3e09a7f1717d8c4b0a815fd9673471a52d6328b9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -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 - diff --git a/SOURCES/0003-Revert-x11-window-Use-correct-bounding-rect-to-deter.patch b/SOURCES/0003-Revert-x11-window-Use-correct-bounding-rect-to-deter.patch deleted file mode 100644 index c206536..0000000 --- a/SOURCES/0003-Revert-x11-window-Use-correct-bounding-rect-to-deter.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 3e6ba58c875055037e45f651bbcf866d2d47d82f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -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 - diff --git a/SOURCES/0003-cursor-renderer-native-Probe-formats-supported-by-cu.patch b/SOURCES/0003-cursor-renderer-native-Probe-formats-supported-by-cu.patch deleted file mode 100644 index 040cbca..0000000 --- a/SOURCES/0003-cursor-renderer-native-Probe-formats-supported-by-cu.patch +++ /dev/null @@ -1,176 +0,0 @@ -From f459472cfe121d491ee97fd09a8abdd970dc900a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michel=20D=C3=A4nzer?= -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: ---- - .../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 - diff --git a/SOURCES/0003-monitor-manager-Configure-for-lease-monitors-in-Appl.patch b/SOURCES/0003-monitor-manager-Configure-for-lease-monitors-in-Appl.patch deleted file mode 100644 index ff64e66..0000000 --- a/SOURCES/0003-monitor-manager-Configure-for-lease-monitors-in-Appl.patch +++ /dev/null @@ -1,224 +0,0 @@ -From 479bb6921da3d7004a74c4c7db999534b32ff214 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= -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: ---- - .../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 - --> - - -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 - diff --git a/SOURCES/0003-output-kms-Add-meta_output_kms_from_kms_connector.patch b/SOURCES/0003-output-kms-Add-meta_output_kms_from_kms_connector.patch deleted file mode 100644 index 359d27a..0000000 --- a/SOURCES/0003-output-kms-Add-meta_output_kms_from_kms_connector.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 863b31cae9be5e8e0467f1a9f93e7348d41f7e88 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= -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: ---- - 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 - diff --git a/SOURCES/0004-kms-connector-Rename-meta_kms_connector_is_for_lease.patch b/SOURCES/0004-kms-connector-Rename-meta_kms_connector_is_for_lease.patch deleted file mode 100644 index 100ab70..0000000 --- a/SOURCES/0004-kms-connector-Rename-meta_kms_connector_is_for_lease.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 63b7d958f226b05694eeeed7d1a7bc77d84464ae Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= -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: ---- - 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 - diff --git a/SOURCES/0005-native-drm-lease-Handle-monitors-configured-for-leas.patch b/SOURCES/0005-native-drm-lease-Handle-monitors-configured-for-leas.patch deleted file mode 100644 index 4c5482c..0000000 --- a/SOURCES/0005-native-drm-lease-Handle-monitors-configured-for-leas.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 55910e467f42ce9d6e761afd8f50110cb1cc3164 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= -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: ---- - 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 - -+#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 - diff --git a/SPECS/mutter.spec b/mutter.spec similarity index 92% rename from SPECS/mutter.spec rename to mutter.spec index 8506609..ac2799b 100644 --- a/SPECS/mutter.spec +++ b/mutter.spec @@ -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 - 47.5.8 -- Bump release +## START: Generated by rpmautospec +* Thu Apr 23 2026 Tomas Pelka - 49.4-4 +- Handle unmaximize when headless + +* Tue Feb 17 2026 Jonas Ådahl - 49.4-3 +- Fix flaky popup test + +* Mon Feb 16 2026 Jonas Ådahl - 49.4-2 +- Fix flaky test case + +* Fri Feb 13 2026 Jonas Ådahl - 49.4-1 +- Update to 49.4 + +* Tue Nov 11 2025 Florian Müllner - 49.1.1-1 +- Update to 49.1.1 + +* Mon Nov 10 2025 Florian Müllner - 47.5-16 +- Bundle newer meson + +* Fri Nov 07 2025 Florian Müllner - 47.5-15 +- Use SPDX license + +* Fri Nov 07 2025 Florian Müllner - 47.5-14 +- Deduce source URL from version + +* Mon Aug 18 2025 Jonas Ådahl - 47.5-13 +- Fix path to gdctl when running installed test + +* Fri Aug 15 2025 Jonas Ådahl - 47.5-12 +- Backport gdctl utility + +* Thu Jun 26 2025 Olivier Fourdan - 47.5-11 +- Fix polyinstantiation preventing Xwayland to start + +* Wed May 21 2025 Michel Dänzer - 47.5-10 +- Backport "Fix race hotplug race conditions in DRM lease manager" + +* Tue Apr 01 2025 Olivier Fourdan - 47.5-9 +- Backport the pre-configure mechanism + +* Wed Mar 26 2025 Jonas Ådahl - 47.5-8 +- Compensate for backend initialization order change in backport + +* Tue Mar 25 2025 Jonas Ådahl - 47.5-7 +- Backport Accessibility manager patches * Wed Mar 12 2025 Jonas Ådahl - 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 diff --git a/sources b/sources new file mode 100644 index 0000000..70b1509 --- /dev/null +++ b/sources @@ -0,0 +1,2 @@ +SHA512 (meson-1.5.0.tar.gz) = f0a25cf134949739c698eddaea602bf7852866b3fee3d2c11c1e6b6e48c944cf92abc3d171a2e42e21077edc01f1e7079d451f5624e2b6131382e114e814db3e +SHA512 (mutter-49.4.tar.xz) = d4cc6f9bd5367644a121bec23cfee30aa736e692cf5bdaba638635817d34f00eed6fa31e9dcbffae0c58bf7c0483d58a2c595e210071646ce361fb86650cd301 diff --git a/unmaximize-when-headless.patch b/unmaximize-when-headless.patch new file mode 100644 index 0000000..79c7374 --- /dev/null +++ b/unmaximize-when-headless.patch @@ -0,0 +1,298 @@ +From b14301e520c15fc2c5166bfbed06e14d03bbe878 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +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 ", 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?= +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?= +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?= +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 +