diff options
author | V3n3RiX <venerix@koprulu.sector> | 2023-05-07 17:37:01 +0100 |
---|---|---|
committer | V3n3RiX <venerix@koprulu.sector> | 2023-05-07 17:37:01 +0100 |
commit | 2fe5661a32d6ec0ba1d6b37cc8ae67e3f81459ec (patch) | |
tree | f41d653fa88967e28246f7b63dba9f2fd7be2ab7 /x11-wm/mutter/files | |
parent | 6e88bac8dd26372eea042112ad3769b1fac9ae18 (diff) |
gentoo auto-resync : 07:05:2023 - 17:37:01
Diffstat (limited to 'x11-wm/mutter/files')
-rw-r--r-- | x11-wm/mutter/files/mutter-44.1-frame-updates.patch | 158 | ||||
-rw-r--r-- | x11-wm/mutter/files/mutter-44.1-xdnd-frame-window.patch | 50 |
2 files changed, 208 insertions, 0 deletions
diff --git a/x11-wm/mutter/files/mutter-44.1-frame-updates.patch b/x11-wm/mutter/files/mutter-44.1-frame-updates.patch new file mode 100644 index 000000000000..bc6f5411204b --- /dev/null +++ b/x11-wm/mutter/files/mutter-44.1-frame-updates.patch @@ -0,0 +1,158 @@ +From 82bd40dcbcc3601da755678778f033bd9a30286d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com> +Date: Thu, 4 May 2023 12:31:41 +0200 +Subject: [PATCH] screen-cast/src: Never dequeue pw_buffer's we refuse to + record to + +The DMA buffer paths vs MemFd paths differ slightly in when content is +recorded. This was in some places done by trying to record but bail if +the dequeued buffer had the wrong type. This is problematic for two +reasons: we'd update the timestamp even if we refused to record, making +the follow-up attempt fail, and we'd dequeue and queue buffers that +didn't get any content, meaning the receiving end would see empty +buffers potentially with only cursor updates. + +Fix this by keeping track if a stream is DMA buffer able or not, and +don't attempt to record at all in the places we would previously require +DMA buffers. This avoids both issues: we don't dequeue/queue pw_buffers +that we refuse to record to, and we won't update the recorded timestamp +when we didn't intend to record to begin with. + +Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2783 +Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2987> +--- + .../meta-screen-cast-monitor-stream-src.c | 25 ++++++++++++------- + src/backends/meta-screen-cast-stream-src.c | 22 ++++++++++------ + src/backends/meta-screen-cast-stream-src.h | 3 ++- + 3 files changed, 32 insertions(+), 18 deletions(-) + +diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c b/src/backends/meta-screen-cast-monitor-stream-src.c +index efb458067e..073a4d101f 100644 +--- a/src/backends/meta-screen-cast-monitor-stream-src.c ++++ b/src/backends/meta-screen-cast-monitor-stream-src.c +@@ -158,8 +158,8 @@ stage_painted (MetaStage *stage, + MetaScreenCastMonitorStreamSrc *monitor_src = + META_SCREEN_CAST_MONITOR_STREAM_SRC (user_data); + MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src); +- MetaScreenCastRecordResult record_result; +- MetaScreenCastRecordFlag flags; ++ MetaScreenCastRecordResult record_result = ++ META_SCREEN_CAST_RECORD_RESULT_RECORDED_NOTHING; + int64_t presentation_time_us; + + if (monitor_src->maybe_record_idle_id) +@@ -168,12 +168,16 @@ stage_painted (MetaStage *stage, + if (!clutter_frame_get_target_presentation_time (frame, &presentation_time_us)) + presentation_time_us = g_get_monotonic_time (); + +- flags = META_SCREEN_CAST_RECORD_FLAG_DMABUF_ONLY; +- record_result = +- meta_screen_cast_stream_src_maybe_record_frame_with_timestamp (src, +- flags, +- NULL, +- presentation_time_us); ++ if (meta_screen_cast_stream_src_uses_dma_bufs (src)) ++ { ++ MetaScreenCastRecordFlag flags = META_SCREEN_CAST_RECORD_FLAG_NONE; ++ ++ record_result = ++ meta_screen_cast_stream_src_maybe_record_frame_with_timestamp (src, ++ flags, ++ NULL, ++ presentation_time_us); ++ } + + if (!(record_result & META_SCREEN_CAST_RECORD_RESULT_RECORDED_FRAME)) + { +@@ -200,13 +204,16 @@ before_stage_painted (MetaStage *stage, + if (monitor_src->maybe_record_idle_id) + return; + ++ if (!meta_screen_cast_stream_src_uses_dma_bufs (src)) ++ return; ++ + if (!clutter_stage_view_peek_scanout (view)) + return; + + if (!clutter_frame_get_target_presentation_time (frame, &presentation_time_us)) + presentation_time_us = g_get_monotonic_time (); + +- flags = META_SCREEN_CAST_RECORD_FLAG_DMABUF_ONLY; ++ flags = META_SCREEN_CAST_RECORD_FLAG_NONE; + meta_screen_cast_stream_src_maybe_record_frame_with_timestamp (src, + flags, + NULL, +diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c +index 91a8afab47..94fc222e43 100644 +--- a/src/backends/meta-screen-cast-stream-src.c ++++ b/src/backends/meta-screen-cast-stream-src.c +@@ -107,6 +107,7 @@ typedef struct _MetaScreenCastStreamSrcPrivate + int64_t last_frame_timestamp_us; + guint follow_up_frame_source_id; + ++ gboolean uses_dma_bufs; + GHashTable *dmabuf_handles; + + cairo_region_t *redraw_clip; +@@ -513,15 +514,9 @@ do_record_frame (MetaScreenCastStreamSrc *src, + { + MetaScreenCastStreamSrcPrivate *priv = + meta_screen_cast_stream_src_get_instance_private (src); +- gboolean dmabuf_only; + +- dmabuf_only = flags & META_SCREEN_CAST_RECORD_FLAG_DMABUF_ONLY; +- if (dmabuf_only && spa_buffer->datas[0].type != SPA_DATA_DmaBuf) +- return FALSE; +- +- if (!dmabuf_only && +- (spa_buffer->datas[0].data || +- spa_buffer->datas[0].type == SPA_DATA_MemFd)) ++ if (spa_buffer->datas[0].data || ++ spa_buffer->datas[0].type == SPA_DATA_MemFd) + { + int width = priv->video_format.size.width; + int height = priv->video_format.size.height; +@@ -1058,6 +1053,8 @@ on_stream_add_buffer (void *data, + dmabuf_handle = NULL; + } + ++ priv->uses_dma_bufs = !!dmabuf_handle; ++ + if (dmabuf_handle) + { + meta_topic (META_DEBUG_SCREEN_CAST, +@@ -1595,3 +1592,12 @@ meta_screen_cast_stream_src_class_init (MetaScreenCastStreamSrcClass *klass) + NULL, NULL, NULL, + G_TYPE_NONE, 0); + } ++ ++gboolean ++meta_screen_cast_stream_src_uses_dma_bufs (MetaScreenCastStreamSrc *src) ++{ ++ MetaScreenCastStreamSrcPrivate *priv = ++ meta_screen_cast_stream_src_get_instance_private (src); ++ ++ return priv->uses_dma_bufs; ++} +diff --git a/src/backends/meta-screen-cast-stream-src.h b/src/backends/meta-screen-cast-stream-src.h +index 63058f2c35..a15ca54f15 100644 +--- a/src/backends/meta-screen-cast-stream-src.h ++++ b/src/backends/meta-screen-cast-stream-src.h +@@ -41,7 +41,6 @@ typedef enum _MetaScreenCastRecordFlag + { + META_SCREEN_CAST_RECORD_FLAG_NONE = 0, + META_SCREEN_CAST_RECORD_FLAG_CURSOR_ONLY = 1 << 0, +- META_SCREEN_CAST_RECORD_FLAG_DMABUF_ONLY = 1 << 1, + } MetaScreenCastRecordFlag; + + typedef enum _MetaScreenCastRecordResult +@@ -132,4 +131,6 @@ void meta_screen_cast_stream_src_set_cursor_sprite_metadata (MetaScreenCastStrea + float scale, + MetaMonitorTransform transform); + ++gboolean meta_screen_cast_stream_src_uses_dma_bufs (MetaScreenCastStreamSrc *src); ++ + #endif /* META_SCREEN_CAST_STREAM_SRC_H */ +-- +GitLab + diff --git a/x11-wm/mutter/files/mutter-44.1-xdnd-frame-window.patch b/x11-wm/mutter/files/mutter-44.1-xdnd-frame-window.patch new file mode 100644 index 000000000000..4067e31ef277 --- /dev/null +++ b/x11-wm/mutter/files/mutter-44.1-xdnd-frame-window.patch @@ -0,0 +1,50 @@ +From f21cc690527010918d10638cfc7747df3eede496 Mon Sep 17 00:00:00 2001 +From: Sebastian Keller <skeller@gnome.org> +Date: Fri, 28 Apr 2023 12:20:11 +0200 +Subject: [PATCH] frames: Disable XDND support on the frame window + +All X11 surfaces created by gtk4 claim to support XDND via the XdndAware +property. This was leading some clients, e.g. Qt, to consider the frame +window as drop target instead of the client window. + +Avoid this issue by removing the XdndAware property again after gtk has +created the surface. + +Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2715 +Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2978> + + +(cherry picked from commit d643eb5c6fe50e7f1afffda0e8747a87f668a799) +--- + src/frames/meta-frame.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/frames/meta-frame.c b/src/frames/meta-frame.c +index be685c51fc..345751ad14 100644 +--- a/src/frames/meta-frame.c ++++ b/src/frames/meta-frame.c +@@ -504,6 +504,7 @@ frame_sync_wm_state (MetaFrame *frame, + GtkWidget * + meta_frame_new (Window window) + { ++ GdkDisplay *display; + GtkWidget *frame, *header, *content; + GdkSurface *surface; + int frame_height = 0; +@@ -549,6 +550,13 @@ meta_frame_new (Window window) + frame_sync_motif_wm_hints (GTK_WINDOW (frame), window); + frame_sync_wm_normal_hints (GTK_WINDOW (frame), window); + ++ /* Disable XDND support on the frame window, because it can cause some clients ++ * to try use it instead of the client window as drop target */ ++ display = gtk_widget_get_display (GTK_WIDGET (frame)); ++ XDeleteProperty (gdk_x11_display_get_xdisplay (display), ++ gdk_x11_surface_get_xid (surface), ++ gdk_x11_get_xatom_by_name_for_display (display, "XdndAware")); ++ + return frame; + } + +-- +GitLab + |