Version in base suite: 48.4-2 Base version: mutter_48.4-2 Target version: mutter_48.7-0+deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/m/mutter/mutter_48.4-2.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/m/mutter/mutter_48.7-0+deb13u1.dsc /srv/release.debian.org/tmp/ouS04jaDjM/mutter-48.7/src/tests/ref-tests/wayland_toplevel_fixed-size-fullscreen_0.ref.png |binary /srv/release.debian.org/tmp/ouS04jaDjM/mutter-48.7/src/tests/ref-tests/wayland_toplevel_fixed-size-fullscreen_1.ref.png |binary mutter-48.7/NEWS | 34 mutter-48.7/clutter/clutter/clutter-frame-clock.c | 6 mutter-48.7/clutter/clutter/clutter-stage.c | 2 mutter-48.7/cogl/cogl/cogl-pipeline-state.h | 6 mutter-48.7/debian/changelog | 71 mutter-48.7/debian/libmutter-test-16.symbols | 2 mutter-48.7/debian/patches/clutter-Repick-actors-when-touches-emulate-button-clicks.patch | 6 mutter-48.7/meson.build | 2 mutter-48.7/po/th.po | 765 ++++++---- mutter-48.7/src/backends/meta-monitor-manager.c | 9 mutter-48.7/src/backends/meta-output.c | 7 mutter-48.7/src/backends/meta-screen-cast-area-stream-src.c | 2 mutter-48.7/src/backends/meta-screen-cast-monitor-stream-src.c | 4 mutter-48.7/src/backends/meta-screen-cast-stream-src.c | 70 mutter-48.7/src/backends/meta-screen-cast-virtual-stream-src.c | 5 mutter-48.7/src/backends/native/meta-cursor-renderer-native.c | 8 mutter-48.7/src/backends/native/meta-input-device-native.h | 2 mutter-48.7/src/backends/native/meta-kms-connector-private.h | 6 mutter-48.7/src/backends/native/meta-seat-impl.c | 64 mutter-48.7/src/core/constraints.c | 28 mutter-48.7/src/core/delete.c | 2 mutter-48.7/src/core/meta-launch-context.c | 2 mutter-48.7/src/core/prefs.c | 5 mutter-48.7/src/tests/meta-ref-test-utils.c | 2 mutter-48.7/src/tests/meta-test-utils.c | 32 mutter-48.7/src/tests/meta-test-utils.h | 6 mutter-48.7/src/tests/meta-wayland-test-driver.c | 13 mutter-48.7/src/tests/meta-wayland-test-driver.h | 2 mutter-48.7/src/tests/meta-wayland-test-utils.h | 2 mutter-48.7/src/tests/protocol/test-driver.xml | 2 mutter-48.7/src/tests/test-runner.c | 12 mutter-48.7/src/tests/wayland-test-clients/fixed-size-client.c | 46 mutter-48.7/src/tests/wayland-test-clients/meson.build | 3 mutter-48.7/src/tests/wayland-test-clients/wayland-test-client-utils.c | 44 mutter-48.7/src/tests/wayland-test-clients/wayland-test-client-utils.h | 3 mutter-48.7/src/tests/wayland-unit-tests.c | 90 + mutter-48.7/src/wayland/meta-wayland-client.c | 3 mutter-48.7/src/wayland/meta-wayland-color-management.c | 20 mutter-48.7/src/wayland/meta-wayland-outputs.c | 26 mutter-48.7/src/wayland/meta-wayland-xdg-session-state.c | 5 mutter-48.7/src/wayland/meta-window-wayland.c | 18 mutter-48.7/src/wayland/meta-xwayland-dnd.c | 30 mutter-48.7/src/x11/events.c | 4 mutter-48.7/src/x11/meta-startup-notification-x11.c | 12 mutter-48.7/src/x11/meta-sync-counter.c | 2 mutter-48.7/src/x11/meta-x11-display.c | 11 48 files changed, 1085 insertions(+), 411 deletions(-) diff -Nru mutter-48.4/NEWS mutter-48.7/NEWS --- mutter-48.4/NEWS 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/NEWS 2025-11-22 19:16:29.000000000 +0000 @@ -1,3 +1,37 @@ +48.7 +==== +* Still constrain fullscreen wayland windows with size limits [Jonas Å.; !4587] +* Fixed crashes [Jonas, Marco; !4643, !4705] + +Contributors: + Marco Trevisan, Jonas Ådahl + +48.6 +==== +* Fix DND actions not working reliably in some X11 clients [Jonas; #4288] +* Fix presentation timings with commit-timing-v1 [Mario; !4645] +* Fixed crashes [Sebastian, Milan; !4682, !4592] +* Misc. bug fixes and cleanups [Carlos, Raihan; !4697, !4688] + +Contributors: + Raihan Ahamed, Milan Crha, Carlos Garnacho, Sebastian Keller, Mario Kleiner, + Jonas Ådahl + +48.5 +==== +* Fix DND from X11 clients using tablet stylus [Carlos; !4526] +* Fix fd leak during screencasting [Georges; !4577] +* Fix reading and updating the privacy screen property [Marco; !4603] +* Update viewport after virtual monitor size changes [Jonas; !4622] +* Fixed crashes [Michel, Jonas, Sebastian; !4547, !4654, !4638] + +Contributors: + Georges Basile Stavracas Neto, Michel Dänzer, Carlos Garnacho, + Marco Trevisan (Treviño), Sebastian Wick, Jonas Ådahl + +Translators: + Aefgh Threenine [th] + 48.4 ==== * Unlink outputs from unused connectors in update_outputs [Michel; !4474] diff -Nru mutter-48.4/clutter/clutter/clutter-frame-clock.c mutter-48.7/clutter/clutter/clutter-frame-clock.c --- mutter-48.4/clutter/clutter/clutter-frame-clock.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/clutter/clutter/clutter-frame-clock.c 2025-11-22 19:16:29.000000000 +0000 @@ -1193,17 +1193,17 @@ CLUTTER_FRAME_CLOCK_STATE_SCHEDULED); return; case CLUTTER_FRAME_CLOCK_STATE_IDLE: + case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED_LATER: clutter_frame_clock_set_state (frame_clock, CLUTTER_FRAME_CLOCK_STATE_SCHEDULED); break; case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED: case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED_NOW: - case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED_LATER: case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_ONE_AND_SCHEDULED: case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_ONE_AND_SCHEDULED_NOW: - case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_ONE_AND_SCHEDULED_LATER: return; case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_ONE: + case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_ONE_AND_SCHEDULED_LATER: if (want_triple_buffering (frame_clock)) { clutter_frame_clock_set_state (frame_clock, @@ -1321,7 +1321,7 @@ frame_clock->refresh_interval_us; extrapolated_presentation_time_us = next_presentation_time_us + frame_clock->refresh_interval_us * cycles; - max_update_time_estimate_us = next_presentation_time_us - next_frame_deadline_us; + max_update_time_estimate_us = next_presentation_time_us - next_update_time_us; ready_time_us = extrapolated_presentation_time_us - max_update_time_estimate_us; break; case CLUTTER_FRAME_CLOCK_MODE_VARIABLE: diff -Nru mutter-48.4/clutter/clutter/clutter-stage.c mutter-48.7/clutter/clutter/clutter-stage.c --- mutter-48.4/clutter/clutter/clutter-stage.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/clutter/clutter/clutter-stage.c 2025-11-22 19:16:29.000000000 +0000 @@ -2745,6 +2745,8 @@ cogl_framebuffer_pop_matrix (framebuffer); clutter_paint_context_destroy (paint_context); + + cogl_framebuffer_flush (framebuffer); } /** diff -Nru mutter-48.4/cogl/cogl/cogl-pipeline-state.h mutter-48.7/cogl/cogl/cogl-pipeline-state.h --- mutter-48.4/cogl/cogl/cogl-pipeline-state.h 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/cogl/cogl/cogl-pipeline-state.h 2025-11-22 19:16:29.000000000 +0000 @@ -515,7 +515,7 @@ * @uniform_location: The uniform's location identifier * @n_components: The number of components in the corresponding uniform's type * @count: The number of values to set - * @value: Pointer to the new values to set + * @value: (array): The array of float to set @uniform * * Sets new values for the uniform at @uniform_location. If this * pipeline has a user program attached and is later used as a source @@ -543,7 +543,7 @@ * @uniform_location: The uniform's location identifier * @n_components: The number of components in the corresponding uniform's type * @count: The number of values to set - * @value: Pointer to the new values to set + * @value: (array): The array of int to set @uniform * * Sets new values for the uniform at @uniform_location. If this * pipeline has a user program attached and is later used as a source @@ -572,7 +572,7 @@ * @dimensions: The size of the matrix * @count: The number of values to set * @transpose: Whether to transpose the matrix - * @value: Pointer to the new values to set + * @value: (array): The array of float to set @uniform * * Sets new values for the uniform at @uniform_location. If this * pipeline has a user program attached and is later used as a source diff -Nru mutter-48.4/debian/changelog mutter-48.7/debian/changelog --- mutter-48.4/debian/changelog 2025-07-13 11:27:01.000000000 +0000 +++ mutter-48.7/debian/changelog 2025-12-09 11:38:47.000000000 +0000 @@ -1,3 +1,74 @@ +mutter (48.7-0+deb13u1) trixie; urgency=medium + + * Team upload + * New upstream stable release 48.6 + - Fix drag-and-drop actions not working reliably in some X11 clients + (mutter#4288 upstream) + - Fix delayed frame presentation with the commit-timing-v1 Wayland + extension (mutter#4258 upstream) + - Avoid a crash if a GNOME Shell extension tries to delete the same + window more than once (mutter#4319 upstream) + - Avoid a crash in the Wayland session if a non-GNOME desktop + environment previously set the cursor size in GSettings to zero; + recover by resetting it to the default, 24px (mutter#3933 upstream) + - Fix crashes if a GNOME Shell extension uses certain Cogl pipeline + APIs (mutter#4352 upstream) + - Save the intended size for tiled windows when saving session state + (mutter!4697 upstream) + - Avoid potential crashes when saving the state of a window with no + valid toplevel state (mutter!4697 upstream) + - Remove dead code detected by static analysis (mutter!4697 upstream) + * New upstream stable release 48.7 + - For fullscreen Wayland windows, if the window has a size limit + smaller than the screen, add black borders around the limited size + and log a warning + (mutter!4587 upstream) + - Avoid a crash when activating a notification that has no app info + (mutter!4705 upstream) + - Avoid a potential crash when checking whether a client owns a window + that is disappearing + (mutter!4643 upstream) + - Test suite enhancements + + [ Simon McVittie ] + * d/libmutter-test-16.symbols: + Update for new ABI added by the test suite enhancements + (nothing in Debian outside the mutter source package is likely to + use this, except possibly a future version of gnome-shell) + * Revert "d/gbp/conf, d/control: Switch packaging branch for forky" + * Add a mention of #1121170 to the previous changelog entry + + -- Simon McVittie Tue, 09 Dec 2025 11:38:47 +0000 + +mutter (48.5-1) unstable; urgency=medium + + * Team upload + * New upstream stable release + - Fix X11 drag-and-drop with a graphics tablet stylus, which would + previously freeze the application + (mutter#3914 upstream) + - Fix a file descriptor leak that would cause a crash after a long + screencast + (mutter#4251 upstream, Closes: #1121170) + - Fix crash with an assertion failure when screencasting from an + Apple aarch64 system + (mutter#4224 upstream) + - Fix detection of the "Privacy Screen" feature on hardware that + supports it + (mutter#4259 upstream) + - Update the EIS viewport used for input capture when a virtual monitor + stream is resized + (mutter!4622 upstream) + - Fix a crash when combining the screen time limit's greyscale effect, + the screen magnifier and the screenshot tool + (mutter#8634 upstream) + - Fix a crash when unplugging a docking station with two monitors + (mutter#4262 upstream) + - Translation update: th + * d/gbp/conf, d/control: Switch packaging branch for forky + + -- Simon McVittie Thu, 18 Sep 2025 10:16:31 +0100 + mutter (48.4-2) unstable; urgency=medium * Team upload diff -Nru mutter-48.4/debian/libmutter-test-16.symbols mutter-48.7/debian/libmutter-test-16.symbols --- mutter-48.4/debian/libmutter-test-16.symbols 2025-07-13 11:27:01.000000000 +0000 +++ mutter-48.7/debian/libmutter-test-16.symbols 2025-12-09 11:38:47.000000000 +0000 @@ -61,6 +61,7 @@ meta_test_shell_disable_animations@Base 47.4 meta_test_shell_get_type@Base 44.3-4~ meta_test_shell_set_background_color@Base 47.4 + meta_wait_for_effects@Base 48.7 meta_wait_for_monitors_changed@Base 46~beta meta_wait_for_orientation@Base 42~beta meta_wait_for_paint@Base 42~beta @@ -70,3 +71,4 @@ meta_wait_for_window_cursor@Base 47.4 meta_wait_for_window_shown@Base 47.4 meta_wait_test_process@Base 47.4 + meta_wait_wayland_window_reconfigure@Base 48.7 diff -Nru mutter-48.4/debian/patches/clutter-Repick-actors-when-touches-emulate-button-clicks.patch mutter-48.7/debian/patches/clutter-Repick-actors-when-touches-emulate-button-clicks.patch --- mutter-48.4/debian/patches/clutter-Repick-actors-when-touches-emulate-button-clicks.patch 2025-07-13 11:27:01.000000000 +0000 +++ mutter-48.7/debian/patches/clutter-Repick-actors-when-touches-emulate-button-clicks.patch 2025-12-09 11:38:47.000000000 +0000 @@ -38,10 +38,10 @@ /* stage */ diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c -index 074f5fe..5623567 100644 +index 483d05b..81e2d02 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c -@@ -3586,10 +3586,15 @@ clutter_stage_pick_and_update_device (ClutterStage *stage, +@@ -3588,10 +3588,15 @@ clutter_stage_pick_and_update_device (ClutterStage *stage, ClutterActor *new_actor = NULL; MtkRegion *clear_area = NULL; ClutterSeat *seat; @@ -58,7 +58,7 @@ device != clutter_seat_get_pointer (seat) || clutter_seat_is_unfocus_inhibited (seat)) { -@@ -4677,6 +4682,9 @@ clutter_stage_update_device_for_event (ClutterStage *stage, +@@ -4679,6 +4684,9 @@ clutter_stage_update_device_for_event (ClutterStage *stage, flags = CLUTTER_DEVICE_UPDATE_EMIT_CROSSING; diff -Nru mutter-48.4/meson.build mutter-48.7/meson.build --- mutter-48.4/meson.build 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/meson.build 2025-11-22 19:16:29.000000000 +0000 @@ -1,5 +1,5 @@ project('mutter', 'c', - version: '48.4', + version: '48.7', meson_version: '>= 1.3.0', license: 'GPL-2.0-or-later', ) diff -Nru mutter-48.4/po/th.po mutter-48.7/po/th.po --- mutter-48.4/po/th.po 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/po/th.po 2025-11-22 19:16:29.000000000 +0000 @@ -11,10 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: mutter\n" -"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" -"product=mutter&keywords=I18N+L10N&component=general\n" -"POT-Creation-Date: 2015-07-18 22:50+0000\n" -"PO-Revision-Date: 2016-10-13 11:22+0700\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues/\n" +"POT-Creation-Date: 2025-08-10 22:54+0000\n" +"PO-Revision-Date: 2025-08-24 09:51+0700\n" "Last-Translator: Theppitak Karoonboonyanan \n" "Language-Team: Thai \n" "Language: th\n" @@ -22,580 +21,800 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Gtranslator 2.91.6\n" +"X-Generator: Poedit 3.7\n" -#: ../data/50-mutter-navigation.xml.in.h:1 +#: data/50-mutter-navigation.xml:6 msgid "Navigation" msgstr "ท่องย้าย" -#: ../data/50-mutter-navigation.xml.in.h:2 +#: data/50-mutter-navigation.xml:9 msgid "Move window to workspace 1" msgstr "ย้ายหน้าต่างไปพื้นที่ทำงาน 1" -#: ../data/50-mutter-navigation.xml.in.h:3 +#: data/50-mutter-navigation.xml:12 msgid "Move window to workspace 2" msgstr "ย้ายหน้าต่างไปพื้นที่ทำงาน 2" -#: ../data/50-mutter-navigation.xml.in.h:4 +#: data/50-mutter-navigation.xml:15 msgid "Move window to workspace 3" msgstr "ย้ายหน้าต่างไปพื้นที่ทำงาน 3" -#: ../data/50-mutter-navigation.xml.in.h:5 +#: data/50-mutter-navigation.xml:18 msgid "Move window to workspace 4" msgstr "ย้ายหน้าต่างไปพื้นที่ทำงาน 4" -#: ../data/50-mutter-navigation.xml.in.h:6 +#: data/50-mutter-navigation.xml:21 msgid "Move window to last workspace" msgstr "ย้ายหน้าต่างไปพื้นที่ทำงานสุดท้าย" -#: ../data/50-mutter-navigation.xml.in.h:7 +#: data/50-mutter-navigation.xml:24 msgid "Move window one workspace to the left" msgstr "ย้ายหน้าต่างไปพื้นที่ทำงานด้านซ้าย" -#: ../data/50-mutter-navigation.xml.in.h:8 +#: data/50-mutter-navigation.xml:27 msgid "Move window one workspace to the right" msgstr "ย้ายหน้าต่างไปพื้นที่ทำงานด้านขวา" -#: ../data/50-mutter-navigation.xml.in.h:9 +#: data/50-mutter-navigation.xml:31 msgid "Move window one workspace up" msgstr "ย้ายหน้าต่างไปพื้นที่ทำงานด้านบน" -#: ../data/50-mutter-navigation.xml.in.h:10 +#: data/50-mutter-navigation.xml:35 msgid "Move window one workspace down" msgstr "ย้ายหน้าต่างไปพื้นที่ทำงานด้านล่าง" -#: ../data/50-mutter-navigation.xml.in.h:11 +#: data/50-mutter-navigation.xml:38 msgid "Move window one monitor to the left" msgstr "ย้ายหน้าต่างไปจอภาพด้านซ้าย" -#: ../data/50-mutter-navigation.xml.in.h:12 +#: data/50-mutter-navigation.xml:41 msgid "Move window one monitor to the right" msgstr "ย้ายหน้าต่างไปจอภาพด้านขวา" -#: ../data/50-mutter-navigation.xml.in.h:13 +#: data/50-mutter-navigation.xml:44 msgid "Move window one monitor up" msgstr "ย้ายหน้าต่างไปจอภาพด้านบน" -#: ../data/50-mutter-navigation.xml.in.h:14 +#: data/50-mutter-navigation.xml:47 msgid "Move window one monitor down" msgstr "ย้ายหน้าต่างไปจอภาพด้านล่าง" -#: ../data/50-mutter-navigation.xml.in.h:15 +#: data/50-mutter-navigation.xml:51 msgid "Switch applications" -msgstr "สลับโปรแกรม" +msgstr "สลับแอปพลิเคชัน" -#: ../data/50-mutter-navigation.xml.in.h:16 +#: data/50-mutter-navigation.xml:56 msgid "Switch to previous application" -msgstr "สลับไปโปรแกรมก่อนหน้า" +msgstr "สลับไปแอปพลิเคชันก่อนหน้า" -#: ../data/50-mutter-navigation.xml.in.h:17 +#: data/50-mutter-navigation.xml:60 msgid "Switch windows" msgstr "สลับหน้าต่าง" -#: ../data/50-mutter-navigation.xml.in.h:18 +#: data/50-mutter-navigation.xml:65 msgid "Switch to previous window" msgstr "สลับไปหน้าต่างก่อนหน้า" -#: ../data/50-mutter-navigation.xml.in.h:19 +#: data/50-mutter-navigation.xml:69 msgid "Switch windows of an application" -msgstr "สลับหน้าต่างภายในโปรแกรม" +msgstr "สลับหน้าต่างภายในแอปพลิเคชัน" -#: ../data/50-mutter-navigation.xml.in.h:20 +#: data/50-mutter-navigation.xml:74 msgid "Switch to previous window of an application" -msgstr "สลับไปหน้าต่างก่อนหน้าภายในโปรแกรม" +msgstr "สลับไปหน้าต่างก่อนหน้าภายในแอปพลิเคชัน" -#: ../data/50-mutter-navigation.xml.in.h:21 +#: data/50-mutter-navigation.xml:78 msgid "Switch system controls" msgstr "สลับส่วนควบคุมระบบ" -#: ../data/50-mutter-navigation.xml.in.h:22 +#: data/50-mutter-navigation.xml:83 msgid "Switch to previous system control" msgstr "สลับไปส่วนควบคุมระบบก่อนหน้า" -#: ../data/50-mutter-navigation.xml.in.h:23 +#: data/50-mutter-navigation.xml:87 msgid "Switch windows directly" msgstr "สลับหน้าต่างโดยตรง" -#: ../data/50-mutter-navigation.xml.in.h:24 +#: data/50-mutter-navigation.xml:92 msgid "Switch directly to previous window" msgstr "สลับโดยตรงไปหน้าต่างก่อนหน้า" -#: ../data/50-mutter-navigation.xml.in.h:25 +#: data/50-mutter-navigation.xml:96 msgid "Switch windows of an app directly" -msgstr "สลับหน้าต่างภายในโปรแกรมโดยตรง" +msgstr "สลับหน้าต่างภายในแอปโดยตรง" -#: ../data/50-mutter-navigation.xml.in.h:26 +#: data/50-mutter-navigation.xml:101 msgid "Switch directly to previous window of an app" -msgstr "สลับโดยตรงไปหน้าต่างก่อนหน้าภายในโปรแกรม" +msgstr "สลับโดยตรงไปหน้าต่างก่อนหน้าภายในแอป" -#: ../data/50-mutter-navigation.xml.in.h:27 +#: data/50-mutter-navigation.xml:105 msgid "Switch system controls directly" msgstr "สลับส่วนควบคุมระบบโดยตรง" -#: ../data/50-mutter-navigation.xml.in.h:28 +#: data/50-mutter-navigation.xml:110 msgid "Switch directly to previous system control" msgstr "สลับโดยตรงไปส่วนควบคุมระบบก่อนหน้า" -#: ../data/50-mutter-navigation.xml.in.h:29 +#: data/50-mutter-navigation.xml:113 msgid "Hide all normal windows" msgstr "ซ่อนหน้าต่างทั้งหมด" -#: ../data/50-mutter-navigation.xml.in.h:30 +#: data/50-mutter-navigation.xml:116 msgid "Switch to workspace 1" msgstr "สลับไปพื้นที่ทำงาน 1" -#: ../data/50-mutter-navigation.xml.in.h:31 +#: data/50-mutter-navigation.xml:119 msgid "Switch to workspace 2" msgstr "สลับไปพื้นที่ทำงาน 2" -#: ../data/50-mutter-navigation.xml.in.h:32 +#: data/50-mutter-navigation.xml:122 msgid "Switch to workspace 3" msgstr "สลับไปพื้นที่ทำงาน 3" -#: ../data/50-mutter-navigation.xml.in.h:33 +#: data/50-mutter-navigation.xml:125 msgid "Switch to workspace 4" msgstr "สลับไปพื้นที่ทำงาน 4" -#: ../data/50-mutter-navigation.xml.in.h:34 +#: data/50-mutter-navigation.xml:128 msgid "Switch to last workspace" msgstr "สลับไปพื้นที่ทำงานสุดท้าย" -#: ../data/50-mutter-navigation.xml.in.h:35 -msgid "Move to workspace left" -msgstr "ย้ายไปพื้นที่ทำงานซ้าย" - -#: ../data/50-mutter-navigation.xml.in.h:36 -msgid "Move to workspace right" -msgstr "ย้ายไปพื้นที่ทำงานขวา" - -#: ../data/50-mutter-navigation.xml.in.h:37 -msgid "Move to workspace above" -msgstr "ย้ายไปพื้นที่ทำงานบน" - -#: ../data/50-mutter-navigation.xml.in.h:38 -msgid "Move to workspace below" -msgstr "ย้ายไปพื้นที่ทำงานล่าง" +#: data/50-mutter-navigation.xml:131 +msgid "Switch to workspace on the left" +msgstr "สลับไปพื้นที่ทำงานด้านซ้าย" + +#: data/50-mutter-navigation.xml:134 +msgid "Switch to workspace on the right" +msgstr "สลับไปพื้นที่ทำงานด้านขวา" + +#: data/50-mutter-navigation.xml:138 +msgid "Switch to workspace above" +msgstr "สลับไปพื้นที่ทำงานด้านบน" + +#: data/50-mutter-navigation.xml:142 +msgid "Switch to workspace below" +msgstr "สลับไปพื้นที่ทำงานด้านล่าง" -#: ../data/50-mutter-system.xml.in.h:1 +#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6 msgid "System" msgstr "ระบบ" -#: ../data/50-mutter-system.xml.in.h:2 +#: data/50-mutter-system.xml:8 msgid "Show the run command prompt" msgstr "แสดงกล่องเรียกคำสั่ง" -#: ../data/50-mutter-system.xml.in.h:3 -msgid "Show the activities overview" -msgstr "แสดงภาพรวมของกิจกรรมต่างๆ" +#: data/50-mutter-wayland.xml:8 +msgid "Restore the keyboard shortcuts" +msgstr "คืนค่าปุ่มลัดแป้นพิมพ์" -#: ../data/50-mutter-windows.xml.in.h:1 +#: data/50-mutter-windows.xml:6 msgid "Windows" msgstr "หน้าต่าง" -#: ../data/50-mutter-windows.xml.in.h:2 +#: data/50-mutter-windows.xml:8 msgid "Activate the window menu" msgstr "เปิดเมนูหน้าต่าง" -#: ../data/50-mutter-windows.xml.in.h:3 +#: data/50-mutter-windows.xml:10 msgid "Toggle fullscreen mode" msgstr "สลับโหมดเต็มหน้าจอ" -#: ../data/50-mutter-windows.xml.in.h:4 +#: data/50-mutter-windows.xml:12 msgid "Toggle maximization state" msgstr "สลับสถานะขยายแผ่" -#: ../data/50-mutter-windows.xml.in.h:5 +#: data/50-mutter-windows.xml:14 msgid "Maximize window" -msgstr "ขยายแผ่หน้าต่างเต็มพื้นโต๊ะ" +msgstr "ขยายแผ่หน้าต่างใหญ่สุด" -#: ../data/50-mutter-windows.xml.in.h:6 +#: data/50-mutter-windows.xml:16 msgid "Restore window" msgstr "คืนขนาดหน้าต่าง" -#: ../data/50-mutter-windows.xml.in.h:7 -msgid "Toggle shaded state" -msgstr "ม้วน/คลี่หน้าต่าง" - -#: ../data/50-mutter-windows.xml.in.h:8 +#: data/50-mutter-windows.xml:18 msgid "Close window" msgstr "ปิดหน้าต่าง" -#: ../data/50-mutter-windows.xml.in.h:9 +#: data/50-mutter-windows.xml:20 msgid "Hide window" msgstr "ซ่อนหน้าต่าง" -#: ../data/50-mutter-windows.xml.in.h:10 +#: data/50-mutter-windows.xml:22 msgid "Move window" msgstr "ย้ายหน้าต่าง" -#: ../data/50-mutter-windows.xml.in.h:11 +#: data/50-mutter-windows.xml:24 msgid "Resize window" msgstr "ปรับขนาดหน้าต่าง" -#: ../data/50-mutter-windows.xml.in.h:12 +#: data/50-mutter-windows.xml:27 msgid "Toggle window on all workspaces or one" msgstr "สลับการแสดงหน้าต่างบนทุกพื้นที่ทำงานกับบนพื้นที่เดียว" -#: ../data/50-mutter-windows.xml.in.h:13 +#: data/50-mutter-windows.xml:29 msgid "Raise window if covered, otherwise lower it" msgstr "ยกหน้าต่างขึ้นถ้าถูกบัง มิฉะนั้นก็เอาลงด้านหลัง" -#: ../data/50-mutter-windows.xml.in.h:14 +#: data/50-mutter-windows.xml:31 msgid "Raise window above other windows" msgstr "ยกหน้าต่างขึ้นมาไว้หน้าหน้าต่างอื่นๆ" -#: ../data/50-mutter-windows.xml.in.h:15 +#: data/50-mutter-windows.xml:33 msgid "Lower window below other windows" msgstr "ถอยหน้าต่างลงไปใว้หลังหน้าต่างอื่น" -#: ../data/50-mutter-windows.xml.in.h:16 +#: data/50-mutter-windows.xml:35 msgid "Maximize window vertically" msgstr "ขยายแผ่หน้าต่างเต็มด้านสูง" -#: ../data/50-mutter-windows.xml.in.h:17 +#: data/50-mutter-windows.xml:37 msgid "Maximize window horizontally" msgstr "ขยายแผ่หน้าต่างเต็มด้านกว้าง" -#: ../data/50-mutter-windows.xml.in.h:18 +#: data/50-mutter-windows.xml:41 data/org.gnome.mutter.gschema.xml.in:187 msgid "View split on left" msgstr "แบ่งจอแสดงที่ครึ่งซ้าย" -#: ../data/50-mutter-windows.xml.in.h:19 +#: data/50-mutter-windows.xml:45 data/org.gnome.mutter.gschema.xml.in:192 msgid "View split on right" msgstr "แบ่งจอแสดงที่ครึ่งขวา" -#: ../data/mutter.desktop.in.h:1 -msgid "Mutter" -msgstr "Mutter" - -#: ../data/org.gnome.mutter.gschema.xml.in.h:1 +#: data/org.gnome.mutter.gschema.xml.in:16 msgid "Modifier to use for extended window management operations" msgstr "ปุ่ม modifier เพื่อใช้เข้าสู่การจัดการหน้าต่างแบบพิเศษ" -#: ../data/org.gnome.mutter.gschema.xml.in.h:2 +#: data/org.gnome.mutter.gschema.xml.in:17 msgid "" -"This key will initiate the \"overlay\", which is a combination window " -"overview and application launching system. The default is intended to be the " -"\"Windows key\" on PC hardware. It's expected that this binding either the " -"default or set to the empty string." -msgstr "" -"ปุ่มนี้จะสร้าง \"ภาพซ้อน (overlay)\" ซึ่งประกอบด้วยภาพรวมของหน้าต่างและระบบเรียกโปรแกรม " -"ปุ่มปริยายเจตนาให้เป็นปุ่ม \"วินโดวส์\" ในเครื่องพีซีทั่วไป " -"และคาดหมายว่าค่านี้จะเป็นค่าปริยายดังกล่าว หรือมิฉะนั้นก็เป็นสตริงว่างเปล่า" +"This key will initiate the “overlay”, which is a combination window overview and application " +"launching system. The default is intended to be the “Windows key” on PC hardware. It’s " +"expected that this binding either the default or set to the empty string." +msgstr "" +"ปุ่มนี้จะสร้าง “ภาพซ้อน (overlay)” ซึ่งประกอบด้วยภาพรวมของหน้าต่างและระบบเรียกแอปพลิเคชัน ปุ่มเริ่มต้นตั้งใจให้เป็น " +"“ปุ่ม Windows” ในเครื่องพีซีทั่วไป และคาดหมายว่าค่านี้จะเป็นค่าเริ่มต้นดังกล่าว หรือมิฉะนั้นก็เป็นสตริงว่างเปล่า" -#: ../data/org.gnome.mutter.gschema.xml.in.h:3 +#: data/org.gnome.mutter.gschema.xml.in:29 msgid "Attach modal dialogs" msgstr "แนบกล่องโต้ตอบแบบโมดัล" -#: ../data/org.gnome.mutter.gschema.xml.in.h:4 +#: data/org.gnome.mutter.gschema.xml.in:30 msgid "" -"When true, instead of having independent titlebars, modal dialogs appear " -"attached to the titlebar of the parent window and are moved together with " -"the parent window." +"When true, instead of having independent titlebars, modal dialogs appear attached to the " +"titlebar of the parent window and are moved together with the parent window." msgstr "" -"ถ้ากำหนดเป็นค่าจริง แทนที่กล่องโต้ตอบโมดัลจะมีแถบหัวหน้าต่างเป็นของตัวเอง " -"ก็จะแนบติดไปกับแถบหัวหน้าต่างของหน้าต่างแม่ และจะเคลื่อนไปพร้อมกับหน้าต่างแม่ด้วย" +"ถ้ากำหนดเป็นค่าจริง แทนที่กล่องโต้ตอบโมดัลจะมีแถบหัวหน้าต่างเป็นของตัวเอง ก็จะแนบติดไปกับแถบหัวหน้าต่างของหน้าต่างแม่ " +"และจะเคลื่อนไปพร้อมกับหน้าต่างแม่ด้วย" -#: ../data/org.gnome.mutter.gschema.xml.in.h:5 +#: data/org.gnome.mutter.gschema.xml.in:39 msgid "Enable edge tiling when dropping windows on screen edges" msgstr "เปิดใช้การปูหน้าต่างชิดขอบเมื่อวางหน้าต่างที่ขอบหน้าจอ" -#: ../data/org.gnome.mutter.gschema.xml.in.h:6 +#: data/org.gnome.mutter.gschema.xml.in:40 msgid "" -"If enabled, dropping windows on vertical screen edges maximizes them " -"vertically and resizes them horizontally to cover half of the available " -"area. Dropping windows on the top screen edge maximizes them completely." +"If enabled, dropping windows on vertical screen edges maximizes them vertically and resizes " +"them horizontally to cover half of the available area. Dropping windows on the top screen edge " +"maximizes them completely." msgstr "" "ถ้าเปิดใช้ จะทำให้การวางหน้าต่างที่ขอบหน้าจอด้านแนวตั้งกลายเป็นการขยายแผ่หน้าต่างเต็มแนวตั้ง " -"และปรับขนาดให้วางปิดครึ่งหนึ่งของหน้าจอในแนวนอน " -"และการวางหน้าต่างที่ขอบหน้าจอด้านบนจะขยายแผ่หน้าต่างเต็มที่" +"และปรับขนาดให้วางปิดครึ่งหนึ่งของหน้าจอในแนวนอน และการวางหน้าต่างที่ขอบหน้าจอด้านบนจะขยายแผ่หน้าต่างเต็มที่" -#: ../data/org.gnome.mutter.gschema.xml.in.h:7 +#: data/org.gnome.mutter.gschema.xml.in:49 msgid "Workspaces are managed dynamically" msgstr "จัดการพื้นที่ทำงานตามการใช้งานจริง" -#: ../data/org.gnome.mutter.gschema.xml.in.h:8 +#: data/org.gnome.mutter.gschema.xml.in:50 msgid "" -"Determines whether workspaces are managed dynamically or whether there's a " -"static number of workspaces (determined by the num-workspaces key in org." -"gnome.desktop.wm.preferences)." +"Determines whether workspaces are managed dynamically or whether there’s a static number of " +"workspaces (determined by the num-workspaces key in org.gnome.desktop.wm.preferences)." msgstr "" -"กำหนดว่าจะจัดการพื้นที่ทำงานแบบปรับเปลี่ยนตามการใช้งานจริง หรือจะให้มีจำนวนพื้นที่ทำงานตายตัว " -"(กำหนดโดยคีย์ num-workspaces ใน org.gnome.desktop.wm.preferences)" +"กำหนดว่าจะจัดการพื้นที่ทำงานแบบปรับเปลี่ยนตามการใช้งานจริง หรือจะให้มีจำนวนพื้นที่ทำงานตายตัว (กำหนดโดยคีย์ num-" +"workspaces ใน org.gnome.desktop.wm.preferences)" -#: ../data/org.gnome.mutter.gschema.xml.in.h:9 +#: data/org.gnome.mutter.gschema.xml.in:59 msgid "Workspaces only on primary" msgstr "พื้นที่ทำงานอยู่บนจอภาพหลักเท่านั้น" -#: ../data/org.gnome.mutter.gschema.xml.in.h:10 -msgid "" -"Determines whether workspace switching should happen for windows on all " -"monitors or only for windows on the primary monitor." -msgstr "" -"กำหนดว่าการสลับพื้นที่ทำงานควรเกิดเฉพาะกับหน้าต่างบนจอภาพทั้งหมด " -"หรือเฉพาะหน้าต่างบนจอภาพหลักเท่านั้น" - -#: ../data/org.gnome.mutter.gschema.xml.in.h:11 -msgid "No tab popup" -msgstr "ไม่ใช้กล่องผุดขึ้นของปุ่มแท็บ" - -#: ../data/org.gnome.mutter.gschema.xml.in.h:12 +#: data/org.gnome.mutter.gschema.xml.in:60 msgid "" -"Determines whether the use of popup and highlight frame should be disabled " -"for window cycling." -msgstr "กำหนดว่าจะปิดการใช้กล่องผุดขึ้นและการเน้นกรอบหน้าต่างสำหรับการสลับหน้าต่างหรือไม่" +"Determines whether workspace switching should happen for windows on all monitors or only for " +"windows on the primary monitor." +msgstr "กำหนดว่าการสลับพื้นที่ทำงานควรเกิดเฉพาะกับหน้าต่างบนจอภาพทั้งหมด หรือเฉพาะหน้าต่างบนจอภาพหลักเท่านั้น" -#: ../data/org.gnome.mutter.gschema.xml.in.h:13 +#: data/org.gnome.mutter.gschema.xml.in:68 msgid "Delay focus changes until the pointer stops moving" msgstr "ชะลอการย้ายโฟกัสจนกว่าเคอร์เซอร์เมาส์จะหยุดเคลื่อน" -#: ../data/org.gnome.mutter.gschema.xml.in.h:14 +#: data/org.gnome.mutter.gschema.xml.in:69 msgid "" -"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then " -"the focus will not be changed immediately when entering a window, but only " -"after the pointer stops moving." +"If set to true, and the focus mode is either “sloppy” or “mouse” then the focus will not be " +"changed immediately when entering a window, but only after the pointer stops moving." msgstr "" -"ถ้ามีค่าเป็นจริง และโหมดโฟกัสเป็น \"sloppy\" หรือ \"mouse\" อย่างใดอย่างหนึ่งแล้ว " +"ถ้ามีค่าเป็นจริง และโหมดโฟกัสเป็น “sloppy” หรือ “mouse” อย่างใดอย่างหนึ่งแล้ว " "ก็จะไม่ย้ายโฟกัสหน้าต่างทันทีทันใดเมื่อเข้าสู่หน้าต่าง จนกว่าเคอร์เซอร์เมาส์จะหยุดเคลื่อนที่" -#: ../data/org.gnome.mutter.gschema.xml.in.h:15 +#: data/org.gnome.mutter.gschema.xml.in:79 msgid "Draggable border width" msgstr "ความกว้างของขอบหน้าต่างส่วนที่ลากได้" -#: ../data/org.gnome.mutter.gschema.xml.in.h:16 +#: data/org.gnome.mutter.gschema.xml.in:80 msgid "" -"The amount of total draggable borders. If the theme's visible borders are " -"not enough, invisible borders will be added to meet this value." +"The amount of total draggable borders. If the theme’s visible borders are not enough, " +"invisible borders will be added to meet this value." msgstr "" "ขนาดของขอบหน้าต่างส่วนที่ลากได้ ถ้าขอบหน้าต่างส่วนที่ปรากฏของชุดตกแต่งกว้างไม่พอ " "ก็จะเพิ่มขอบส่วนที่มองไม่เห็นเพื่อให้ได้เท่ากับความกว้างนี้" -#: ../data/org.gnome.mutter.gschema.xml.in.h:17 +#: data/org.gnome.mutter.gschema.xml.in:89 msgid "Auto maximize nearly monitor sized windows" msgstr "ขยายแผ่หน้าต่างที่มีขนาดใกล้เคียงกับจอภาพโดยอัตโนมัติ" -#: ../data/org.gnome.mutter.gschema.xml.in.h:18 +#: data/org.gnome.mutter.gschema.xml.in:90 msgid "" -"If enabled, new windows that are initially the size of the monitor " -"automatically get maximized." +"If enabled, new windows that are initially the size of the monitor automatically get maximized." msgstr "ถ้าเปิดใช้ หน้าต่างใหม่ที่มีขนาดเริ่มแรกเท่ากับจอภาพจะขยายแผ่โดยอัตโนมัติ" -#: ../data/org.gnome.mutter.gschema.xml.in.h:19 +#: data/org.gnome.mutter.gschema.xml.in:98 msgid "Place new windows in the center" msgstr "วางหน้าต่างใหม่กลางหน้าจอ" -#: ../data/org.gnome.mutter.gschema.xml.in.h:20 +#: data/org.gnome.mutter.gschema.xml.in:99 msgid "" -"When true, the new windows will always be put in the center of the active " -"screen of the monitor." +"When true, the new windows will always be put in the center of the active screen of the " +"monitor." msgstr "ถ้าเป็นจริง จะวางหน้าต่างใหม่ที่กลางหน้าจอที่จอภาพแสดงอยู่เสมอ" -#: ../data/org.gnome.mutter.gschema.xml.in.h:21 -msgid "Select window from tab popup" -msgstr "เลือกหน้าต่างจากกล่องผุดขึ้นของปุ่มแท็บ" - -#: ../data/org.gnome.mutter.gschema.xml.in.h:22 -msgid "Cancel tab popup" -msgstr "ยกเลิกกล่องผุดขึ้นของปุ่มแท็บ" +#: data/org.gnome.mutter.gschema.xml.in:108 +msgid "Enable experimental features" +msgstr "เปิดใช้คุณลักษณะขั้นทดลอง" + +#: data/org.gnome.mutter.gschema.xml.in:109 +msgid "" +"To enable experimental features, add the feature keyword to the list. Whether the feature " +"requires restarting the compositor depends on the given feature. Any experimental feature is " +"not required to still be available, or configurable. Don’t expect adding anything in this " +"setting to be future proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes " +"mutter default to layout logical monitors in a logical pixel coordinate space, while scaling " +"monitor framebuffers instead of window content, to manage HiDPI monitors. Does not require a " +"restart. • “kms-modifiers” — makes mutter always allocate scanout buffers with explicit " +"modifiers, if supported by the driver. Requires a restart. • “autoclose-xwayland” — " +"automatically terminates Xwayland if all relevant X11 clients are gone. Requires a restart. • " +"“variable-refresh-rate” — makes mutter dynamically adjust the refresh rate of the monitor when " +"applicable if supported by the monitor, GPU and DRM driver. Configurable in Settings. Requires " +"a restart. • “xwayland-native-scaling” — lets Xwayland clients use their native scaling " +"support. If scaling is not supported by client, the client will be unscaled. Setting only " +"takes effect when “scale-monitor-framebuffer” is enabled as well." +msgstr "" +"เมื่อต้องการเปิดใช้คุณลักษณะขั้นทดลอง ให้เพิ่มคำสำคัญของคุณลักษณะลงในรายชื่อ " +"ความจำเป็นที่คุณลักษณะต้องเริ่มคอมโพสิเตอร์ใหม่จะขึ้นอยู่กับคุณลักษณะที่ระบุ " +"คุณลักษณะขั้นทดลองทั้งหมดไม่จำเป็นต้องใช้งานได้หรือกำหนดค่าได้ " +"อย่าคาดหวังว่าการเพิ่มอะไรก็ตามในการตั้งค่านี้จะทำให้ใช้งานได้ในอนาคต คำสำคัญที่ใช้ได้ในขณะนี้คือ: • “scale-monitor-" +"framebuffer” — กำหนดค่าเริ่มต้นให้ mutter จัดวางทุกอย่างบนจอภาพเชิงตรรกะ ในพื้นที่พิกัดพิกเซลเชิงตรรกะ " +"แล้วสเกลเฟรมบัฟเฟอร์ของจอภาพแทนที่จะเป็นเนื้อหาหน้าต่าง เพื่อจัดการกับจอภาพ HiDPI ไม่จำเป็นต้องเริ่มคอมโพสิเตอร์ใหม่ " +"• “kms-modifiers” — ให้ mutter จัดสรรบัฟเฟอร์สำหรับอ่านทีละแถว (scanout) ด้วย modifier แบบชัดเจน " +"ถ้าไดรเวอร์รองรับ จำเป็นต้องเริ่มคอมโพสิเตอร์ใหม่ • “autoclose-xwayland” — จบการทำงานของ Xwayland " +"โดยอัตโนมัติ ถ้าไคลเอนต์ X11 ที่เกี่ยวข้องทั้งหมดหายไปแล้ว จำเป็นต้องเริ่มคอมโพสิเตอร์ใหม่ • “variable-refresh-" +"rate” — ให้ mutter ปรับค่าอัตราการรีเฟรชของจอภาพแบบไดนามิกเมื่อนำไปใช้ได้ถ้าจอภาพ รวมทั้งไดรเวอร์ GPU และ " +"DRM รองรับ โดยสามารถกำหนดค่าได้ในการตั้งค่า จำเป็นต้องเริ่มคอมโพสิเตอร์ใหม่ • “xwayland-native-scaling” — " +"ให้ไคลเอนต์ Xwayland ใช้ระบบรองรับการสเกลแบบเนทีฟของตัวเอง ถ้าไคลเอนต์ไม่รองรับการสเกล " +"ก็จะไม่มีการสเกลไคลเอนต์ โดยการตั้งค่าจะมีผลก็ต่อเมื่อ “scale-monitor-framebuffer” เปิดใช้ด้วย" + +#: data/org.gnome.mutter.gschema.xml.in:151 +msgid "Modifier to use to locate the pointer" +msgstr "ปุ่มประกอบที่จะใช้หาตำแหน่งตัวชี้" + +#: data/org.gnome.mutter.gschema.xml.in:152 +msgid "This key will initiate the “locate pointer” action." +msgstr "ปุ่มนี้จะตั้งต้นการกระทำ “หาตำแหน่งตัวชี้”" + +#: data/org.gnome.mutter.gschema.xml.in:159 +msgid "Timeout for check-alive ping" +msgstr "ค่าหมดเวลาสำหรับ ping ที่ใช้ตรวจสอบการค้าง" + +#: data/org.gnome.mutter.gschema.xml.in:160 +msgid "" +"Number of milliseconds a client has to respond to a ping request in order to not be detected " +"as frozen. Using 0 will disable the alive check completely." +msgstr "" +"จำนวนมิลลิวินาทีที่ไคลเอนต์จะต้องตอบกลับคำขอ ping เพื่อไม่ให้ถูกตรวจจับว่าค้าง การใช้ 0 " +"จะปิดใช้การตรวจสอบการค้างแบบสมบูรณ์" + +#. TRANSLATORS: Luminance is different from brightness. +#. See https://en.wikipedia.org/wiki/Luminance +#: data/org.gnome.mutter.gschema.xml.in:171 +msgid "Per output luminance settings" +msgstr "การตั้งค่าการส่องสว่างแยกแต่ละเอาต์พุต" + +#: data/org.gnome.mutter.gschema.xml.in:172 +msgid "" +"Per output and color mode luminance setting. Each entry consists of a tuple with connector, " +"vendor, product, serial, and a color mode, as well as an associated floating point value " +"representing the output luminance in percent (%). The default when not specified is 100%." +msgstr "" +"การตั้งค่าการส่องสว่างแยกสำหรับแต่ละเอาต์พุตและแต่ละโหมดสี " +"โดยแต่ละรายการจะประกอบด้วยทูเพิลซึ่งมีข้อมูลเกี่ยวกับตัวเชื่อมต่อ ผู้ขาย ผลิตภัณฑ์ หมายเลขซีเรียล และโหมดสี " +"พร้อมค่าจุดลอยตัวที่สัมพันธ์กันซึ่งแสดงถึงการส่องสว่างของเอาต์พุตในค่าเปอร์เซ็นต์ (%) ค่าเริ่มต้นเมื่อไม่ได้ระบุจะอยู่ที่ 100%" + +#: data/org.gnome.mutter.gschema.xml.in:197 +msgid "Switch monitor configurations" +msgstr "สลับค่ากำหนดจอภาพ" + +#: data/org.gnome.mutter.gschema.xml.in:202 +msgid "Rotates the built-in monitor configuration" +msgstr "สับเปลี่ยนค่ากำหนดจอภาพในตัว" + +#: data/org.gnome.mutter.gschema.xml.in:207 +msgid "Cancel any active input capture session" +msgstr "ยกเลิกเซสชันควบคุมอินพุตใด ๆ ที่ทำงานอยู่" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1 +#: data/org.gnome.mutter.wayland.gschema.xml.in:12 msgid "Switch to VT 1" msgstr "สลับไป VT 1" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2 +#: data/org.gnome.mutter.wayland.gschema.xml.in:16 msgid "Switch to VT 2" msgstr "สลับไป VT 2" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3 +#: data/org.gnome.mutter.wayland.gschema.xml.in:20 msgid "Switch to VT 3" msgstr "สลับไป VT 3" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4 +#: data/org.gnome.mutter.wayland.gschema.xml.in:24 msgid "Switch to VT 4" msgstr "สลับไป VT 4" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5 +#: data/org.gnome.mutter.wayland.gschema.xml.in:28 msgid "Switch to VT 5" msgstr "สลับไป VT 5" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6 +#: data/org.gnome.mutter.wayland.gschema.xml.in:32 msgid "Switch to VT 6" msgstr "สลับไป VT 6" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7 +#: data/org.gnome.mutter.wayland.gschema.xml.in:36 msgid "Switch to VT 7" msgstr "สลับไป VT 7" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8 +#: data/org.gnome.mutter.wayland.gschema.xml.in:40 msgid "Switch to VT 8" msgstr "สลับไป VT 8" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9 +#: data/org.gnome.mutter.wayland.gschema.xml.in:44 msgid "Switch to VT 9" msgstr "สลับไป VT 9" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10 +#: data/org.gnome.mutter.wayland.gschema.xml.in:48 msgid "Switch to VT 10" msgstr "สลับไป VT 10" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11 +#: data/org.gnome.mutter.wayland.gschema.xml.in:52 msgid "Switch to VT 11" msgstr "สลับไป VT 11" -#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12 +#: data/org.gnome.mutter.wayland.gschema.xml.in:56 msgid "Switch to VT 12" msgstr "สลับไป VT 12" -#: ../src/backends/meta-monitor-manager.c:500 +#: data/org.gnome.mutter.wayland.gschema.xml.in:60 +msgid "Re-enable shortcuts" +msgstr "เปิดใช้ปุ่มลัดอีกครั้ง" + +#: data/org.gnome.mutter.wayland.gschema.xml.in:70 +msgid "Allow X11 grabs to lock keyboard focus with Xwayland" +msgstr "" + +#: data/org.gnome.mutter.wayland.gschema.xml.in:71 +msgid "" +"Allow all keyboard events to be routed to X11 “override redirect” windows with a grab when " +"running in Xwayland. This option is to support X11 clients which map an “override redirect” " +"window (which do not receive keyboard focus) and issue a keyboard grab to force all keyboard " +"events to that window. This option is seldom used and has no effect on regular X11 windows " +"which can receive keyboard focus under normal circumstances. For a X11 grab to be taken into " +"account under Wayland, the client must also either send a specific X11 ClientMessage to the " +"root window or be among the applications allowed in key “xwayland-grab-access-rules”." +msgstr "" + +#: data/org.gnome.mutter.wayland.gschema.xml.in:90 +msgid "Xwayland applications allowed to issue keyboard grabs" +msgstr "" + +#: data/org.gnome.mutter.wayland.gschema.xml.in:91 +msgid "" +"List the resource names or resource class of X11 windows either allowed or not allowed to " +"issue X11 keyboard grabs under Xwayland. The resource name or resource class of a given X11 " +"window can be obtained using the command “xprop WM_CLASS”. Wildcards “*” and jokers “?” in the " +"values are supported. Values starting with “!” are denied, which has precedence over the list " +"of values allowed, to revoke applications from the default system list. The default system " +"list includes the following applications: “@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can " +"break an existing grab by using the specific keyboard shortcut defined by the keybinding key " +"“restore-shortcuts”." +msgstr "" + +#: data/org.gnome.mutter.wayland.gschema.xml.in:116 +msgid "Disable selected X extensions in Xwayland" +msgstr "" + +#: data/org.gnome.mutter.wayland.gschema.xml.in:117 +msgid "" +"This option disables the selected X extensions in Xwayland if Xwayland was built with support " +"for those X extensions. This option has no effect if Xwayland was built without support for " +"the selected extensions. Xwayland needs to be restarted for this setting to take effect." +msgstr "" + +#: data/org.gnome.mutter.wayland.gschema.xml.in:130 +msgid "Allow X11 clients with a different endianness to connect to Xwayland" +msgstr "" + +#: data/org.gnome.mutter.wayland.gschema.xml.in:131 +msgid "" +"Allow connections from clients with an endianness different to that of Xwayland. The X server " +"byte-swapping code is a huge attack surface, much of that code in Xwayland is prone to " +"security issues. The use-case of byte-swapped clients is very niche, and disabled by default " +"in Xwayland. Enable this option to instruct Xwayland to accept connections from X11 clients " +"with a different endianness. This option has no effect if Xwayland does not support the " +"command line option +byteswappedclients/-byteswappedclients to control that setting. Xwayland " +"needs to be restarted for this setting to take effect." +msgstr "" + +#: src/backends/meta-monitor.c:266 msgid "Built-in display" msgstr "จอแสดงผลในตัว" -#: ../src/backends/meta-monitor-manager.c:526 +#: src/backends/meta-monitor.c:293 msgid "Unknown" msgstr "ไม่ทราบยี่ห้อ" -#: ../src/backends/meta-monitor-manager.c:528 +#: src/backends/meta-monitor.c:295 msgid "Unknown Display" msgstr "จอแสดงผลไม่ทราบรุ่น" -#. TRANSLATORS: this is a monitor vendor name, followed by a -#. * size in inches, like 'Dell 15"' -#. -#: ../src/backends/meta-monitor-manager.c:536 +#: src/backends/meta-monitor.c:303 #, c-format +msgctxt "This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'" msgid "%s %s" msgstr "%s %s" -#. This probably means that a non-WM compositor like xcompmgr is running; -#. * we have no way to get it to exit -#: ../src/compositor/compositor.c:451 +#: src/backends/meta-monitor.c:311 #, c-format -msgid "" -"Another compositing manager is already running on screen %i on display \"%s" -"\"." -msgstr "มีโปรแกรมจัดการ composite ทำงานอยู่แล้วที่สกรีน %i ดิสเพลย์ \"%s\"" +msgctxt "" +"This is a monitor vendor name followed by product/model name where size in inches could not be " +"calculated, e.g. Dell U2414H" +msgid "%s %s" +msgstr "%s %s" -#: ../src/core/bell.c:185 +#: src/core/bell.c:237 msgid "Bell event" msgstr "เหตุการณ์กระดิ่ง" -#: ../src/core/delete.c:127 -#, c-format -msgid "“%s” is not responding." -msgstr "“%s” ไม่ตอบสนอง" +#: src/core/display.c:741 +msgid "Privacy Screen Enabled" +msgstr "ที่บังจอเปิดใช้อยู่" + +#: src/core/display.c:742 +msgid "Privacy Screen Disabled" +msgstr "ที่บังจอปิดใช้อยู่" -#: ../src/core/delete.c:129 -msgid "Application is not responding." -msgstr "โปรแกรมไม่ตอบสนอง" - -#: ../src/core/delete.c:134 -msgid "" -"You may choose to wait a short while for it to continue or force the " -"application to quit entirely." -msgstr "คุณอาจเลือกที่จะรอสักครู่ เพื่อให้โปรแกรมทำงานต่อ หรือจะบังคับโปรแกรมออกทันทีเลยก็ได้" - -#: ../src/core/delete.c:141 -msgid "_Wait" -msgstr "_รอ" - -#: ../src/core/delete.c:141 -msgid "_Force Quit" -msgstr "_บังคับออก" +#: src/core/meta-context-main.c:621 +msgid "Replace the running window manager" +msgstr "แทนที่ตัวจัดการหน้าต่างที่กำลังทำงานอยู่" -#: ../src/core/display.c:563 -#, c-format -msgid "Failed to open X Window System display '%s'\n" -msgstr "ไม่สามารถเปิดดิสเพลย์ '%s' ของระบบ X Window\n" +#: src/core/meta-context-main.c:627 +msgid "X Display to use" +msgstr "ดิสเพลย์ X ที่จะใช้" -#: ../src/core/main.c:176 +#: src/core/meta-context-main.c:633 msgid "Disable connection to session manager" -msgstr "ปิดการเชื่อมต่อไปยังโปรแกรมจัดการวาระ" +msgstr "ปิดการเชื่อมต่อไปยังตัวจัดการเซสชัน" -#: ../src/core/main.c:182 -msgid "Replace the running window manager" -msgstr "แทนที่โปรแกรมจัดการหน้าต่างที่กำลังทำงานอยู่" - -#: ../src/core/main.c:188 +#: src/core/meta-context-main.c:639 msgid "Specify session management ID" -msgstr "ระบุ ID ของการจัดการวาระ" +msgstr "ระบุ ID ของการจัดการเซสชัน" -#: ../src/core/main.c:193 -msgid "X Display to use" -msgstr "ดิสเพลย์ X ที่จะใช้" - -#: ../src/core/main.c:199 +#: src/core/meta-context-main.c:645 msgid "Initialize session from savefile" -msgstr "ใช้ค่าเริ่มต้นของวาระจากแฟ้มที่บันทึกไว้" +msgstr "ใช้ค่าตั้งต้นของเซสชันจากไฟล์ที่บันทึกไว้" -#: ../src/core/main.c:205 +#: src/core/meta-context-main.c:651 msgid "Make X calls synchronous" msgstr "ให้การเรียกฟังก์ชัน X เป็นแบบซิงโครนัส" -#: ../src/core/main.c:212 +#: src/core/meta-context-main.c:659 msgid "Run as a wayland compositor" -msgstr "เรียกทำงานในฐานะ compositor ของ wayland" +msgstr "เรียกทำงานในฐานะคอมโพสิเตอร์ของ wayland" + +#: src/core/meta-context-main.c:666 +msgid "Run as a nested compositor" +msgstr "เรียกทำงานในฐานะคอมโพสิเตอร์แบบซ้อน" -#: ../src/core/main.c:220 +#: src/core/meta-context-main.c:674 +msgid "Run wayland compositor without starting Xwayland" +msgstr "เรียกทำงานคอมโพสิเตอร์ของ wayland โดยไม่เริ่ม Xwayland" + +#: src/core/meta-context-main.c:681 +msgid "Specify Wayland display name to use" +msgstr "ระบุชื่อดิสเพลย์ Wayland ที่จะใช้" + +#: src/core/meta-context-main.c:689 msgid "Run as a full display server, rather than nested" -msgstr "เรียกทำงานในฐานเซิร์ฟเวอร์แสดงผลเต็มขั้น ไม่ใช่ซ้อนในเซิร์ฟเวอร์อื่น" +msgstr "เรียกทำงานในฐานะเซิร์ฟเวอร์แสดงผลเต็มขั้น ไม่ใช่ซ้อนในเซิร์ฟเวอร์อื่น" -# FIXME: Get a lawer to translate the legal clause. -#: ../src/core/mutter.c:39 +#: src/core/meta-context-main.c:694 +msgid "Run as a headless display server" +msgstr "เรียกทำงานในฐานะเซิร์ฟเวอร์แสดงผลแบบไม่ต่อกับจอภาพจริง" + +#: src/core/meta-context-main.c:699 +msgid "Add persistent virtual monitor (WxH or WxH@R)" +msgstr "เพิ่มจอภาพเสมือนแบบคงอยู่ตลอด (WxH หรือ WxH@R)" + +#: src/core/meta-context-main.c:711 +msgid "Run with X11 backend" +msgstr "เรียกทำงานด้วยแบ็กเอนด์ X11" + +#: src/core/meta-context-main.c:717 +msgid "Profile performance using trace instrumentation" +msgstr "ทำโปรไฟล์เกี่ยวกับประสิทธิภาพโดยใช้วิธี trace instrumentation" + +#: src/core/meta-context-main.c:723 +msgid "Enable debug control D-Bus interface" +msgstr "เปิดใช้ส่วนติดต่อ D-Bus สำหรับควบคุมการดีบัก" + +#. TRANSLATORS: This string refers to a button that switches between +#. * different modes in that button group. +#. +#: src/core/meta-pad-action-mapper.c:552 #, c-format -msgid "" -"mutter %s\n" -"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" -"This is free software; see the source for copying conditions.\n" -"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A " -"PARTICULAR PURPOSE.\n" -msgstr "" -"mutter %s\n" -"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" -"นี่เป็นซอฟต์แวร์เสรี อ่านเงื่อนไขลิขสิทธิ์ได้ในโค้ดต้นฉบับ\n" -"ไม่รับผิดชอบข้อเสียหายใดๆ " -"ไม่รับประกันความเหมาะสมในเชิงพาณิชย์หรือการใช้งานเฉพาะทางอย่างหนึ่งอย่างใด\n" +msgid "Mode Switch (Group %d)" +msgstr "สลับโหมด (กลุ่ม %d)" + +#. TRANSLATORS: This string refers to a button that switches between +#. * different modes. +#. +#: src/core/meta-pad-action-mapper.c:559 +#, c-format +msgid "Mode Switch" +msgstr "สลับโหมด" -#: ../src/core/mutter.c:53 +#. TRANSLATORS: This string refers to an action, cycles drawing tablets' +#. * mapping through the available outputs. +#. +#: src/core/meta-pad-action-mapper.c:582 +msgid "Switch monitor" +msgstr "สลับจอภาพ" + +#: src/core/meta-pad-action-mapper.c:584 +msgid "Show on-screen help" +msgstr "แสดงวิธีใช้บนหน้าจอ" + +#. Translators: this string will appear in Sysprof +#: src/core/meta-profiler.c:109 src/core/meta-profiler.c:299 +msgid "Compositor" +msgstr "คอมโพสิเตอร์" + +#: src/core/mutter.c:74 msgid "Print version" msgstr "แสดงเลขรุ่น" -#: ../src/core/mutter.c:59 +#: src/core/mutter.c:80 msgid "Mutter plugin to use" msgstr "ปลั๊กอินของ mutter ที่จะใช้" -#: ../src/core/prefs.c:2004 +#: src/core/prefs.c:1869 #, c-format msgid "Workspace %d" msgstr "พื้นที่ทำงาน %d" -#: ../src/core/screen.c:525 +#: src/core/util.c:140 +msgid "Mutter was compiled without support for verbose mode" +msgstr "Mutter ถูกคอมไพล์โดยไม่ได้เลือกรองรับโหมดข้อความละเอียด" + +#: src/core/workspace.c:508 +msgid "Workspace switched" +msgstr "สลับพื้นที่ทำงานแล้ว" + +#: src/wayland/meta-wayland-tablet-pad.c:532 +#, c-format +msgid "Mode Switch: Mode %d" +msgstr "สลับโหมด: โหมด %d" + +#: src/x11/meta-x11-display.c:858 #, c-format msgid "" -"Display \"%s\" already has a window manager; try using the --replace option " -"to replace the current window manager." -msgstr "" -"ดิสเพลย์ \"%s\" มีโปรแกรมจัดการหน้าต่างอยู่แล้ว ลองใช้ตัวเลือก --replace " -"ถ้าต้องการแทนที่โปรแกรมจัดการหน้าต่างปัจจุบัน" +"Display “%s” already has a window manager; try using the --replace option to replace the " +"current window manager." +msgstr "ดิสเพลย์ “%s” มีตัวจัดการหน้าต่างอยู่แล้ว ลองใช้ตัวเลือก --replace ถ้าต้องการแทนที่ตัวจัดการหน้าต่างปัจจุบัน" -#: ../src/core/screen.c:607 +#: src/x11/meta-x11-display.c:1243 #, c-format -msgid "Screen %d on display '%s' is invalid\n" -msgstr "สกรีน %d ที่ดิสเพลย์ '%s' ใช้ไม่ได้\n" +msgid "Failed to open X Window System display “%s”" +msgstr "ไม่สามารถเปิดดิสเพลย์ “%s” ของระบบ X Window" -#: ../src/core/util.c:118 -msgid "Mutter was compiled without support for verbose mode\n" -msgstr "Mutter ถูกคอมไพล์โดยไม่ได้เลือกรองรับโหมดข้อความละเอียด\n" +#: src/x11/meta-x11-display.c:1476 +#, c-format +msgid "Screen %d on display “%s” is invalid" +msgstr "สกรีน %d ที่ดิสเพลย์ “%s” ใช้ไม่ได้" -#: ../src/x11/session.c:1815 -msgid "" -"These windows do not support "save current setup" and will have to " -"be restarted manually next time you log in." -msgstr "" -"หน้าต่างเหล่านี้ไม่รองรับการ "บันทึกค่าตั้งปัจจุบัน" " -"และคุณต้องกำหนดใหม่เองเมื่อเข้าสู่ระบบครั้งต่อไป" +#. This probably means that a non-WM compositor like xcompmgr is running; +#. * we have no way to get it to exit +#: src/x11/meta-x11-display.c:2807 +#, c-format +msgid "Another compositing manager is already running on screen %i on display “%s”." +msgstr "มีตัวจัดการคอมโพสิตทำงานอยู่แล้วที่สกรีน %i ดิสเพลย์ “%s”" + +#: src/x11/meta-x11-selection-input-stream.c:475 +#, c-format +msgid "Format %s not supported" +msgstr "ไม่รองรับรูปแบบ %s" -#: ../src/x11/window-props.c:549 +#: src/x11/window-props.c:555 #, c-format msgid "%s (on %s)" msgstr "%s (ที่เครื่อง %s)" +#~ msgid "Move to workspace left" +#~ msgstr "ย้ายไปพื้นที่ทำงานซ้าย" + +#~ msgid "Move to workspace right" +#~ msgstr "ย้ายไปพื้นที่ทำงานขวา" + +#~ msgid "Move to workspace above" +#~ msgstr "ย้ายไปพื้นที่ทำงานบน" + +#~ msgid "Move to workspace below" +#~ msgstr "ย้ายไปพื้นที่ทำงานล่าง" + +#~ msgid "Show the activities overview" +#~ msgstr "แสดงภาพรวมของกิจกรรมต่างๆ" + +#~ msgid "Toggle shaded state" +#~ msgstr "ม้วน/คลี่หน้าต่าง" + +#~ msgid "Mutter" +#~ msgstr "Mutter" + +#~ msgid "No tab popup" +#~ msgstr "ไม่ใช้กล่องผุดขึ้นของปุ่มแท็บ" + +#~ msgid "" +#~ "Determines whether the use of popup and highlight frame should be disabled for window " +#~ "cycling." +#~ msgstr "กำหนดว่าจะปิดการใช้กล่องผุดขึ้นและการเน้นกรอบหน้าต่างสำหรับการสลับหน้าต่างหรือไม่" + +#~ msgid "Select window from tab popup" +#~ msgstr "เลือกหน้าต่างจากกล่องผุดขึ้นของปุ่มแท็บ" + +#~ msgid "Cancel tab popup" +#~ msgstr "ยกเลิกกล่องผุดขึ้นของปุ่มแท็บ" + +#, c-format +#~ msgid "“%s” is not responding." +#~ msgstr "“%s” ไม่ตอบสนอง" + +#~ msgid "Application is not responding." +#~ msgstr "โปรแกรมไม่ตอบสนอง" + +#~ msgid "" +#~ "You may choose to wait a short while for it to continue or force the application to quit " +#~ "entirely." +#~ msgstr "คุณอาจเลือกที่จะรอสักครู่ เพื่อให้โปรแกรมทำงานต่อ หรือจะบังคับโปรแกรมออกทันทีเลยก็ได้" + +#~ msgid "_Wait" +#~ msgstr "_รอ" + +#~ msgid "_Force Quit" +#~ msgstr "_บังคับออก" + +# FIXME: Get a lawer to translate the legal clause. +#, c-format +#~ msgid "" +#~ "mutter %s\n" +#~ "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" +#~ "This is free software; see the source for copying conditions.\n" +#~ "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +#~ msgstr "" +#~ "mutter %s\n" +#~ "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" +#~ "นี่เป็นซอฟต์แวร์เสรี อ่านเงื่อนไขลิขสิทธิ์ได้ในโค้ดต้นฉบับ\n" +#~ "ไม่รับผิดชอบข้อเสียหายใดๆ ไม่รับประกันความเหมาะสมในเชิงพาณิชย์หรือการใช้งานเฉพาะทางอย่างหนึ่งอย่างใด\n" + +#~ msgid "" +#~ "These windows do not support "save current setup" and will have to be restarted " +#~ "manually next time you log in." +#~ msgstr "หน้าต่างเหล่านี้ไม่รองรับการ "บันทึกค่าตั้งปัจจุบัน" และคุณต้องกำหนดใหม่เองเมื่อเข้าสู่ระบบครั้งต่อไป" diff -Nru mutter-48.4/src/backends/meta-monitor-manager.c mutter-48.7/src/backends/meta-monitor-manager.c --- mutter-48.4/src/backends/meta-monitor-manager.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/backends/meta-monitor-manager.c 2025-11-22 19:16:29.000000000 +0000 @@ -1129,9 +1129,12 @@ { MetaSettings *settings = meta_backend_get_settings (manager->backend); gboolean privacy_screen_enabled; + gboolean any_changed; GList *l; privacy_screen_enabled = meta_settings_is_privacy_screen_enabled (settings); + any_changed = FALSE; + for (l = manager->monitors; l; l = l->next) { MetaMonitor *monitor = l->data; @@ -1146,11 +1149,13 @@ g_warning ("Failed to set privacy screen setting on monitor %s: %s", meta_monitor_get_display_name (monitor), error->message); - return FALSE; + continue; } + + any_changed = TRUE; } - return TRUE; + return any_changed; } static MetaPrivacyScreenState diff -Nru mutter-48.4/src/backends/meta-output.c mutter-48.7/src/backends/meta-output.c --- mutter-48.4/src/backends/meta-output.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/backends/meta-output.c 2025-11-22 19:16:29.000000000 +0000 @@ -69,7 +69,6 @@ int backlight; - MetaPrivacyScreenState privacy_screen_state; gboolean is_privacy_screen_enabled; MetaColorMode color_mode; @@ -480,7 +479,7 @@ { MetaOutputPrivate *priv = meta_output_get_instance_private (output); - return priv->privacy_screen_state; + return priv->is_privacy_screen_enabled; } gboolean @@ -491,7 +490,7 @@ MetaOutputPrivate *priv = meta_output_get_instance_private (output); MetaPrivacyScreenState state; - state = priv->privacy_screen_state; + state = meta_output_get_privacy_screen_state (output); if (state == META_PRIVACY_SCREEN_UNAVAILABLE) { @@ -508,7 +507,7 @@ return FALSE; } - if (priv->is_privacy_screen_enabled == enabled) + if ((state == META_PRIVACY_SCREEN_ENABLED) == enabled) return TRUE; priv->is_privacy_screen_enabled = enabled; diff -Nru mutter-48.4/src/backends/meta-screen-cast-area-stream-src.c mutter-48.7/src/backends/meta-screen-cast-area-stream-src.c --- mutter-48.4/src/backends/meta-screen-cast-area-stream-src.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/backends/meta-screen-cast-area-stream-src.c 2025-11-22 19:16:29.000000000 +0000 @@ -545,8 +545,6 @@ area, scale, paint_flags); - cogl_framebuffer_flush (framebuffer); - return TRUE; } diff -Nru mutter-48.4/src/backends/meta-screen-cast-monitor-stream-src.c mutter-48.7/src/backends/meta-screen-cast-monitor-stream-src.c --- mutter-48.4/src/backends/meta-screen-cast-monitor-stream-src.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/backends/meta-screen-cast-monitor-stream-src.c 2025-11-22 19:16:29.000000000 +0000 @@ -659,6 +659,7 @@ framebuffer, x, y, &local_error); + cogl_framebuffer_flush (framebuffer); } } break; @@ -675,6 +676,7 @@ cogl_framebuffer_get_width (view_framebuffer), cogl_framebuffer_get_height (view_framebuffer), &local_error); + cogl_framebuffer_flush (framebuffer); } break; @@ -714,8 +716,6 @@ paint_flags); } - cogl_framebuffer_flush (framebuffer); - return TRUE; } diff -Nru mutter-48.4/src/backends/meta-screen-cast-stream-src.c mutter-48.7/src/backends/meta-screen-cast-stream-src.c --- mutter-48.4/src/backends/meta-screen-cast-stream-src.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/backends/meta-screen-cast-stream-src.c 2025-11-22 19:16:29.000000000 +0000 @@ -723,7 +723,7 @@ ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend); - int sync_fd; + g_autofd int sync_fd = -1; g_autoptr (GError) local_error = NULL; sync_timeline = spa_buffer_find_meta_data (spa_buffer, @@ -1447,6 +1447,46 @@ g_ptr_array_add (params, g_steal_pointer (&pod)); } +static gboolean +explicit_sync_supported (MetaScreenCastStreamSrc *src) +{ + uint64_t supported = 0; +#ifdef HAVE_NATIVE_BACKEND + MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src); + MetaScreenCastSession *session = + meta_screen_cast_stream_get_session (stream); + MetaScreenCast *screen_cast = + meta_screen_cast_session_get_screen_cast (session); + MetaBackend *backend = meta_screen_cast_get_backend (screen_cast); + ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); + CoglContext *cogl_context = + clutter_backend_get_cogl_context (clutter_backend); + CoglRenderer *cogl_renderer; + CoglRendererEGL *cogl_renderer_egl; + MetaRendererNativeGpuData *renderer_gpu_data; + MetaRenderDevice *render_device; + MetaDeviceFile *device_file; + int drm_fd; + + if (!cogl_context_has_feature (cogl_context, COGL_FEATURE_ID_SYNC_FD)) + return FALSE; + + cogl_renderer = cogl_context_get_renderer (cogl_context); + cogl_renderer_egl = cogl_renderer->winsys; + renderer_gpu_data = cogl_renderer_egl->platform; + render_device = renderer_gpu_data->render_device; + device_file = meta_render_device_get_device_file (render_device); + if (!device_file) + return FALSE; + + drm_fd = meta_device_file_get_fd (device_file); + if (drmGetCap (drm_fd, DRM_CAP_SYNCOBJ_TIMELINE, &supported) != 0) + return FALSE; +#endif /* HAVE_NATIVE_BACKEND */ + + return supported != 0; +} + static void on_stream_param_changed (void *data, uint32_t id, @@ -1602,14 +1642,26 @@ SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_header))); g_ptr_array_add (params, g_steal_pointer (&pod)); - /* we support Explicit sync */ - spa_pod_dynamic_builder_init (&pod_builder, NULL, 0, 1024); - pod = spa_pod_builder_add_object ( - &pod_builder.b, - SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, - SPA_PARAM_META_type, SPA_POD_Id (SPA_META_SyncTimeline), - SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_sync_timeline))); - g_ptr_array_add (params, g_steal_pointer (&pod)); + if (explicit_sync_supported (src)) + { + spa_pod_dynamic_builder_init (&pod_builder, NULL, 0, 1024); + pod = spa_pod_builder_add_object ( + &pod_builder.b, + SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, + SPA_PARAM_META_type, SPA_POD_Id (SPA_META_SyncTimeline), + SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_sync_timeline))); + g_ptr_array_add (params, g_steal_pointer (&pod)); + + meta_topic (META_DEBUG_SCREEN_CAST, + "Advertising explicit sync support for pw_stream %u", + pw_stream_get_node_id (priv->pipewire_stream)); + } + else + { + meta_topic (META_DEBUG_SCREEN_CAST, + "Not advertising explicit sync support for pw_stream %u", + pw_stream_get_node_id (priv->pipewire_stream)); + } add_video_damage_meta_param (params); diff -Nru mutter-48.4/src/backends/meta-screen-cast-virtual-stream-src.c mutter-48.7/src/backends/meta-screen-cast-virtual-stream-src.c --- mutter-48.4/src/backends/meta-screen-cast-virtual-stream-src.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/backends/meta-screen-cast-virtual-stream-src.c 2025-11-22 19:16:29.000000000 +0000 @@ -277,7 +277,10 @@ setup_cursor_handling (virtual_src); - meta_screen_cast_stream_notify_is_configured (stream); + if (!meta_screen_cast_stream_is_configured (stream)) + meta_screen_cast_stream_notify_is_configured (stream); + else + meta_eis_viewport_notify_changed (META_EIS_VIEWPORT (stream)); virtual_src->monitors_changed_handler_id = g_signal_connect (monitor_manager, "monitors-changed-internal", diff -Nru mutter-48.4/src/backends/native/meta-cursor-renderer-native.c mutter-48.7/src/backends/native/meta-cursor-renderer-native.c --- mutter-48.4/src/backends/native/meta-cursor-renderer-native.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/backends/native/meta-cursor-renderer-native.c 2025-11-22 19:16:29.000000000 +0000 @@ -840,6 +840,14 @@ if (!src_texture) return NULL; + if (dst_width < 1 || dst_height < 1) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Invalid size for cursor texture %d x %d", + dst_width, dst_height); + return NULL; + } + dst_texture = cogl_texture_2d_new_with_format (cogl_context, dst_width, dst_height, diff -Nru mutter-48.4/src/backends/native/meta-input-device-native.h mutter-48.7/src/backends/native/meta-input-device-native.h --- mutter-48.4/src/backends/native/meta-input-device-native.h 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/backends/native/meta-input-device-native.h 2025-11-22 19:16:29.000000000 +0000 @@ -85,6 +85,8 @@ double output_ratio; /* w:h */ MetaInputDeviceMapping mapping_mode; + ClutterModifierType button_state; + /* Pointer position */ float pointer_x; float pointer_y; diff -Nru mutter-48.4/src/backends/native/meta-kms-connector-private.h mutter-48.7/src/backends/native/meta-kms-connector-private.h --- mutter-48.4/src/backends/native/meta-kms-connector-private.h 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/backends/native/meta-kms-connector-private.h 2025-11-22 19:16:29.000000000 +0000 @@ -65,10 +65,10 @@ typedef enum _MetaKmsConnectorPrivacyScreen { - META_KMS_CONNECTOR_PRIVACY_SCREEN_ENABLED = 0, - META_KMS_CONNECTOR_PRIVACY_SCREEN_DISABLED, - META_KMS_CONNECTOR_PRIVACY_SCREEN_ENABLED_LOCKED, + META_KMS_CONNECTOR_PRIVACY_SCREEN_DISABLED = 0, + META_KMS_CONNECTOR_PRIVACY_SCREEN_ENABLED, META_KMS_CONNECTOR_PRIVACY_SCREEN_DISABLED_LOCKED, + META_KMS_CONNECTOR_PRIVACY_SCREEN_ENABLED_LOCKED, META_KMS_CONNECTOR_PRIVACY_SCREEN_N_PROPS, META_KMS_CONNECTOR_PRIVACY_SCREEN_UNKNOWN, } MetaKmsConnectorPrivacyScreen; diff -Nru mutter-48.4/src/backends/native/meta-seat-impl.c mutter-48.7/src/backends/native/meta-seat-impl.c --- mutter-48.4/src/backends/native/meta-seat-impl.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/backends/native/meta-seat-impl.c 2025-11-22 19:16:29.000000000 +0000 @@ -785,11 +785,13 @@ { meta_input_device_native_get_coords_in_impl (device_native, &cur_x, &cur_y); + modifiers = device_native->button_state; } else { meta_input_device_native_get_coords_in_impl (META_INPUT_DEVICE_NATIVE (seat_impl->core_pointer), &cur_x, &cur_y); + modifiers = seat_impl->button_state; } meta_seat_impl_filter_relative_motion (seat_impl, @@ -805,9 +807,7 @@ cur_y + dy, &x, &y); - modifiers = - xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) | - seat_impl->button_state; + modifiers |= xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE); dx_constrained = x - cur_x; dy_constrained = y - cur_y; @@ -852,9 +852,12 @@ update_device_coords_in_impl (seat_impl, input_device, GRAPHENE_POINT_INIT (x, y)); - modifiers = - xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) | - seat_impl->button_state; + if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE) + modifiers = device_native->button_state; + else + modifiers = seat_impl->button_state; + + modifiers |= xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE); g_signal_emit (seat_impl, signals[POINTER_POSITION_CHANGED_IN_IMPL], 0, &GRAPHENE_POINT_INIT (seat_impl->pointer_x, @@ -884,7 +887,7 @@ { MetaInputDeviceNative *device_native = META_INPUT_DEVICE_NATIVE (input_device); ClutterEvent *event = NULL; - ClutterModifierType modifiers; + ClutterModifierType modifiers, *button_state; int button_nr = 0; float x, y; static int maskmap[8] = @@ -953,13 +956,18 @@ } } + if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE) + button_state = &device_native->button_state; + else + button_state = &seat_impl->button_state; + if (button_nr > 0 && button_nr < G_N_ELEMENTS (maskmap)) { /* Update the modifiers */ if (state) - seat_impl->button_state |= maskmap[button_nr - 1]; + *button_state |= maskmap[button_nr - 1]; else - seat_impl->button_state &= ~maskmap[button_nr - 1]; + *button_state &= ~maskmap[button_nr - 1]; } if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE) @@ -974,7 +982,7 @@ modifiers = xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) | - seat_impl->button_state; + *button_state; event = clutter_event_button_new (state ? @@ -1012,6 +1020,8 @@ ClutterScrollFinishFlags flags, gboolean emulated) { + MetaInputDeviceNative *device_native = + META_INPUT_DEVICE_NATIVE (input_device); MetaSeatImpl *seat_impl; ClutterEvent *event = NULL; ClutterModifierType modifiers; @@ -1028,9 +1038,12 @@ x = seat_impl->pointer_x; y = seat_impl->pointer_y; - modifiers = - xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) | - seat_impl->button_state; + if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE) + modifiers = device_native->button_state; + else + modifiers = seat_impl->button_state; + + modifiers |= xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE); event = clutter_event_scroll_smooth_new (emulated ? @@ -1056,6 +1069,8 @@ ClutterScrollSource scroll_source, gboolean emulated) { + MetaInputDeviceNative *device_native = + META_INPUT_DEVICE_NATIVE (input_device); MetaSeatImpl *seat_impl; ClutterEvent *event = NULL; ClutterModifierType modifiers; @@ -1068,9 +1083,12 @@ x = seat_impl->pointer_x; y = seat_impl->pointer_y; - modifiers = - xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) | - seat_impl->button_state; + if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE) + modifiers = device_native->button_state; + else + modifiers = seat_impl->button_state; + + modifiers |= xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE); event = clutter_event_scroll_discrete_new (emulated ? @@ -1259,9 +1277,7 @@ /* "NULL" sequences are special cased in clutter */ sequence = GINT_TO_POINTER (MAX (1, slot + 1)); - modifiers = - xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) | - seat_impl->button_state; + modifiers = xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE); if (evtype == CLUTTER_TOUCH_BEGIN || evtype == CLUTTER_TOUCH_UPDATE) @@ -3412,11 +3428,13 @@ coords->y = device_native->pointer_y; } + if (clutter_input_device_get_device_type (device) == CLUTTER_TABLET_DEVICE) + mods = device_native->button_state; + else + mods = seat_impl->button_state; + if (seat_impl->xkb) - { - mods = meta_xkb_translate_modifiers (seat_impl->xkb, - seat_impl->button_state); - } + mods = meta_xkb_translate_modifiers (seat_impl->xkb, mods); retval = TRUE; } diff -Nru mutter-48.4/src/core/constraints.c mutter-48.7/src/core/constraints.c --- mutter-48.4/src/core/constraints.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/core/constraints.c 2025-11-22 19:16:29.000000000 +0000 @@ -1352,8 +1352,8 @@ ConstraintPriority priority, gboolean check_only) { - MtkRectangle min_size, max_size, monitor; - gboolean too_big, too_small, constraint_already_satisfied; + MtkRectangle monitor; + gboolean constraint_already_satisfied; if (priority > PRIORITY_FULLSCREEN) return TRUE; @@ -1364,11 +1364,19 @@ monitor = info->entire_monitor; - get_size_limits (window, &min_size, &max_size); - too_big = !mtk_rectangle_could_fit_rect (&monitor, &min_size); - too_small = !mtk_rectangle_could_fit_rect (&max_size, &monitor); - if (too_big || too_small) - return TRUE; +#ifdef HAVE_X11_CLIENT + if (window->client_type == META_WINDOW_CLIENT_TYPE_X11) + { + MtkRectangle min_size, max_size; + gboolean too_big, too_small; + + get_size_limits (window, &min_size, &max_size); + too_big = !mtk_rectangle_could_fit_rect (&monitor, &min_size); + too_small = !mtk_rectangle_could_fit_rect (&max_size, &monitor); + if (too_big || too_small) + return TRUE; + } +#endif /* HAVE_X11_CLIENT */ /* Determine whether constraint is already satisfied; exit if it is */ constraint_already_satisfied = @@ -1478,6 +1486,12 @@ if (info->action_type == ACTION_MOVE) return TRUE; +#ifdef HAVE_WAYLAND + if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND && + meta_window_is_fullscreen (window)) + return TRUE; +#endif + /* Determine whether constraint is already satisfied; exit if it is */ get_size_limits (window, &min_size, &max_size); /* We ignore max-size limits for maximized windows; see #327543 */ diff -Nru mutter-48.4/src/core/delete.c mutter-48.7/src/core/delete.c --- mutter-48.4/src/core/delete.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/core/delete.c 2025-11-22 19:16:29.000000000 +0000 @@ -116,6 +116,8 @@ meta_window_delete (MetaWindow *window, guint32 timestamp) { + g_return_if_fail (!window->unmanaging); + META_WINDOW_GET_CLASS (window)->delete (window, timestamp); meta_window_check_alive (window, timestamp); diff -Nru mutter-48.4/src/core/meta-launch-context.c mutter-48.7/src/core/meta-launch-context.c --- mutter-48.4/src/core/meta-launch-context.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/core/meta-launch-context.c 2025-11-22 19:16:29.000000000 +0000 @@ -176,7 +176,7 @@ "display", context->display, "id", startup_id, "application-id", application_id, - "name", g_app_info_get_name (info), + "name", info ? g_app_info_get_name (info) : NULL, "workspace", workspace_idx, "timestamp", (uint64_t) context->timestamp, NULL); diff -Nru mutter-48.4/src/core/prefs.c mutter-48.7/src/core/prefs.c --- mutter-48.4/src/core/prefs.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/core/prefs.c 2025-11-22 19:16:29.000000000 +0000 @@ -1206,6 +1206,11 @@ int meta_prefs_get_cursor_size (void) { + if (cursor_size <= 0) + { + g_warning_once ("Invalid cursor size (%d) in settings, resetting to 24", cursor_size); + cursor_size = 24; + } return cursor_size; } diff -Nru mutter-48.4/src/tests/meta-ref-test-utils.c mutter-48.7/src/tests/meta-ref-test-utils.c --- mutter-48.4/src/tests/meta-ref-test-utils.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/meta-ref-test-utils.c 2025-11-22 19:16:29.000000000 +0000 @@ -426,7 +426,7 @@ g_critical ("Pixel difference exceeds limits " "(min: [%d, %d, %d, %d], " "max: [%d, %d, %d, %d])\n" - "See %s, %s, and %s for details.", + "See %s %s %s for details.", diff_stat.ch[0].min_diff, diff_stat.ch[1].min_diff, diff_stat.ch[2].min_diff, diff -Nru mutter-48.4/src/tests/meta-test-utils.c mutter-48.7/src/tests/meta-test-utils.c --- mutter-48.4/src/tests/meta-test-utils.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/meta-test-utils.c 2025-11-22 19:16:29.000000000 +0000 @@ -31,10 +31,12 @@ #include "backends/native/meta-backend-native.h" #include "backends/native/meta-input-thread.h" #include "backends/native/meta-seat-native.h" +#include "compositor/meta-window-actor-private.h" #include "core/display-private.h" #include "core/window-private.h" #include "meta-test/meta-context-test.h" #include "wayland/meta-wayland.h" +#include "wayland/meta-window-wayland.h" #include "wayland/meta-xwayland.h" #include "x11/meta-x11-display-private.h" @@ -1157,3 +1159,33 @@ while (!meta_cursor_tracker_has_window_cursor (cursor_tracker)) g_main_context_iteration (NULL, TRUE); } + +void +meta_wait_for_effects (MetaWindow *window) +{ + MetaWindowActor *window_actor; + + window_actor = meta_window_actor_from_window (window); + g_object_add_weak_pointer (G_OBJECT (window_actor), + (gpointer *) &window_actor); + + while (window_actor && meta_window_actor_effect_in_progress (window_actor)) + g_main_context_iteration (NULL, TRUE); + + if (window_actor) + { + g_object_remove_weak_pointer (G_OBJECT (window_actor), + (gpointer *) &window_actor); + } +} + +void +meta_wait_wayland_window_reconfigure (MetaWindow *window) +{ + MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window); + uint32_t serial; + + g_assert_true (meta_window_wayland_get_pending_serial (wl_window, &serial)); + while (meta_window_wayland_peek_configuration (wl_window, serial)) + g_main_context_iteration (NULL, TRUE); +} diff -Nru mutter-48.4/src/tests/meta-test-utils.h mutter-48.7/src/tests/meta-test-utils.h --- mutter-48.4/src/tests/meta-test-utils.h 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/meta-test-utils.h 2025-11-22 19:16:29.000000000 +0000 @@ -152,3 +152,9 @@ META_EXPORT void meta_wait_for_window_cursor (MetaContext *context); + +META_EXPORT +void meta_wait_for_effects (MetaWindow *window); + +META_EXPORT +void meta_wait_wayland_window_reconfigure (MetaWindow *window); diff -Nru mutter-48.4/src/tests/meta-wayland-test-driver.c mutter-48.7/src/tests/meta-wayland-test-driver.c --- mutter-48.4/src/tests/meta-wayland-test-driver.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/meta-wayland-test-driver.c 2025-11-22 19:16:29.000000000 +0000 @@ -476,3 +476,16 @@ g_main_context_iteration (NULL, TRUE); g_signal_handler_disconnect (test_driver, handler_id); } + +void +meta_wayland_test_driver_terminate (MetaWaylandTestDriver *test_driver) +{ + GList *l; + + for (l = test_driver->resources; l; l = l->next) + { + struct wl_resource *resource = l->data; + + test_driver_send_terminate (resource); + } +} diff -Nru mutter-48.4/src/tests/meta-wayland-test-driver.h mutter-48.7/src/tests/meta-wayland-test-driver.h --- mutter-48.4/src/tests/meta-wayland-test-driver.h 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/meta-wayland-test-driver.h 2025-11-22 19:16:29.000000000 +0000 @@ -39,3 +39,5 @@ void meta_wayland_test_driver_wait_for_sync_point (MetaWaylandTestDriver *test_driver, unsigned int sync_point); + +void meta_wayland_test_driver_terminate (MetaWaylandTestDriver *test_driver); diff -Nru mutter-48.4/src/tests/meta-wayland-test-utils.h mutter-48.7/src/tests/meta-wayland-test-utils.h --- mutter-48.4/src/tests/meta-wayland-test-utils.h 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/meta-wayland-test-utils.h 2025-11-22 19:16:29.000000000 +0000 @@ -30,6 +30,8 @@ void meta_wayland_test_client_finish (MetaWaylandTestClient *wayland_test_client); +void meta_wayland_test_client_terminate (MetaWaylandTestClient *wayland_test_client); + MetaWindow * meta_find_client_window (MetaContext *context, const char *title); diff -Nru mutter-48.4/src/tests/protocol/test-driver.xml mutter-48.7/src/tests/protocol/test-driver.xml --- mutter-48.4/src/tests/protocol/test-driver.xml 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/protocol/test-driver.xml 2025-11-22 19:16:29.000000000 +0000 @@ -42,6 +42,8 @@ + + Binary files /srv/release.debian.org/tmp/glHWRhr5uP/mutter-48.4/src/tests/ref-tests/wayland_toplevel_fixed-size-fullscreen_0.ref.png and /srv/release.debian.org/tmp/ouS04jaDjM/mutter-48.7/src/tests/ref-tests/wayland_toplevel_fixed-size-fullscreen_0.ref.png differ Binary files /srv/release.debian.org/tmp/glHWRhr5uP/mutter-48.4/src/tests/ref-tests/wayland_toplevel_fixed-size-fullscreen_1.ref.png and /srv/release.debian.org/tmp/ouS04jaDjM/mutter-48.7/src/tests/ref-tests/wayland_toplevel_fixed-size-fullscreen_1.ref.png differ diff -Nru mutter-48.4/src/tests/test-runner.c mutter-48.7/src/tests/test-runner.c --- mutter-48.4/src/tests/test-runner.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/test-runner.c 2025-11-22 19:16:29.000000000 +0000 @@ -2064,7 +2064,6 @@ MetaTestClient *client; const char *window_id; MetaWindow *window; - MetaWindowActor *window_actor; if (argc != 2) BAD_COMMAND("usage: %s /", argv[0]); @@ -2076,16 +2075,7 @@ if (!window) return FALSE; - window_actor = meta_window_actor_from_window (window); - g_object_add_weak_pointer (G_OBJECT (window_actor), - (gpointer *) &window_actor); - while (window_actor && meta_window_actor_effect_in_progress (window_actor)) - g_main_context_iteration (NULL, TRUE); - if (window_actor) - { - g_object_remove_weak_pointer (G_OBJECT (window_actor), - (gpointer *) &window_actor); - } + meta_wait_for_effects (window); } else if (argc > 2 && g_str_equal (argv[1], "=>")) { diff -Nru mutter-48.4/src/tests/wayland-test-clients/fixed-size-client.c mutter-48.7/src/tests/wayland-test-clients/fixed-size-client.c --- mutter-48.4/src/tests/wayland-test-clients/fixed-size-client.c 1970-01-01 00:00:00.000000000 +0000 +++ mutter-48.7/src/tests/wayland-test-clients/fixed-size-client.c 2025-11-22 19:16:29.000000000 +0000 @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2025 Red Hat + * + * 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 . + */ + +#include "config.h" + +#include + +#include "wayland-test-client-utils.h" + +int +main (int argc, + char **argv) +{ + g_autoptr (WaylandDisplay) display = NULL; + g_autoptr (WaylandSurface) surface = NULL; + int width, height; + + width = atoi (argv[1]); + height = atoi (argv[2]); + + display = wayland_display_new (WAYLAND_DISPLAY_CAPABILITY_TEST_DRIVER); + surface = wayland_surface_new (display, + "fixed-size-client", + width, height, 0xff00ffff); + wayland_surface_fixate_size (surface); + wl_surface_commit (surface->wl_surface); + + while (TRUE) + wayland_display_dispatch (display); + + return EXIT_SUCCESS; +} diff -Nru mutter-48.4/src/tests/wayland-test-clients/meson.build mutter-48.7/src/tests/wayland-test-clients/meson.build --- mutter-48.4/src/tests/wayland-test-clients/meson.build 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/wayland-test-clients/meson.build 2025-11-22 19:16:29.000000000 +0000 @@ -121,6 +121,9 @@ wayland_cursor_dep, ], }, + { + 'name': 'fixed-size-client', + }, ] test_client_executables = {} diff -Nru mutter-48.4/src/tests/wayland-test-clients/wayland-test-client-utils.c mutter-48.7/src/tests/wayland-test-clients/wayland-test-client-utils.c --- mutter-48.4/src/tests/wayland-test-clients/wayland-test-client-utils.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/wayland-test-clients/wayland-test-client-utils.c 2025-11-22 19:16:29.000000000 +0000 @@ -315,6 +315,13 @@ }; static void +test_driver_handle_terminate (void *user_data, + struct test_driver *test_driver) +{ + exit (EXIT_SUCCESS); +} + +static void test_driver_handle_sync_event (void *user_data, struct test_driver *test_driver, uint32_t serial) @@ -351,6 +358,7 @@ } static const struct test_driver_listener test_driver_listener = { + test_driver_handle_terminate, test_driver_handle_sync_event, test_driver_handle_property, test_driver_handle_property_int, @@ -663,15 +671,23 @@ WaylandSurface *surface = data; uint32_t *p; - if (width == 0) - surface->width = surface->default_width; - else - surface->width = width; - - if (height == 0) - surface->height = surface->default_height; + if (surface->fixed_size) + { + surface->width = surface->default_width; + surface->height = surface->default_height; + } else - surface->height = height; + { + if (width == 0) + surface->width = surface->default_width; + else + surface->width = width; + + if (height == 0) + surface->height = surface->default_height; + else + surface->height = height; + } g_assert_null (surface->pending_state); surface->pending_state = g_hash_table_new (NULL, NULL); @@ -888,6 +904,18 @@ surface->is_opaque = TRUE; } +void +wayland_surface_fixate_size (WaylandSurface *surface) +{ + surface->fixed_size = TRUE; + xdg_toplevel_set_min_size (surface->xdg_toplevel, + surface->default_width, + surface->default_height); + xdg_toplevel_set_max_size (surface->xdg_toplevel, + surface->default_width, + surface->default_height); +} + const char * lookup_property_string (WaylandDisplay *display, const char *name) diff -Nru mutter-48.4/src/tests/wayland-test-clients/wayland-test-client-utils.h mutter-48.7/src/tests/wayland-test-clients/wayland-test-client-utils.h --- mutter-48.4/src/tests/wayland-test-clients/wayland-test-client-utils.h 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/wayland-test-clients/wayland-test-client-utils.h 2025-11-22 19:16:29.000000000 +0000 @@ -90,6 +90,7 @@ int default_height; int width; int height; + gboolean fixed_size; uint32_t color; gboolean is_opaque; @@ -129,6 +130,8 @@ void wayland_surface_set_opaque (WaylandSurface *surface); +void wayland_surface_fixate_size (WaylandSurface *surface); + void draw_surface (WaylandDisplay *display, struct wl_surface *surface, int width, diff -Nru mutter-48.4/src/tests/wayland-unit-tests.c mutter-48.7/src/tests/wayland-unit-tests.c --- mutter-48.4/src/tests/wayland-unit-tests.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/tests/wayland-unit-tests.c 2025-11-22 19:16:29.000000000 +0000 @@ -32,6 +32,7 @@ #include "meta/meta-workspace-manager.h" #include "tests/meta-test-utils.h" #include "tests/meta-monitor-test-utils.h" +#include "tests/meta-ref-test.h" #include "tests/meta-wayland-test-driver.h" #include "tests/meta-wayland-test-utils.h" #include "wayland/meta-wayland-client-private.h" @@ -1470,6 +1471,88 @@ } static void +toplevel_fixed_size_fullscreen (void) +{ + MetaBackend *backend = meta_context_get_backend (test_context); + MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend); + MetaRenderer *renderer = meta_backend_get_renderer (backend); + MetaWaylandTestClient *wayland_test_client; + GSettings *settings; + GList *views; + ClutterStageView *view; + MetaWindow *window; + + meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE); + + settings = g_settings_new ("org.gnome.mutter"); + g_assert_true (g_settings_set_boolean (settings, "center-new-windows", FALSE)); + + views = meta_renderer_get_views (renderer); + g_assert_cmpint (g_list_length (views), ==, 1); + view = CLUTTER_STAGE_VIEW (views->data); + + wayland_test_client = + meta_wayland_test_client_new_with_args (test_context, + "fixed-size-client", + "100", "100", + NULL); + + while (!(window = find_client_window ("fixed-size-client"))) + g_main_context_iteration (NULL, TRUE); + while (meta_window_is_hidden (window)) + g_main_context_iteration (NULL, TRUE); + meta_wait_for_effects (window); + + meta_ref_test_verify_view (view, + g_test_get_path (), 0, + meta_ref_test_determine_ref_test_flag ()); + + meta_window_make_fullscreen (window); + meta_wait_wayland_window_reconfigure (window); + meta_wait_for_effects (window); + + meta_ref_test_verify_view (view, + g_test_get_path (), 1, + meta_ref_test_determine_ref_test_flag ()); + + meta_wayland_test_driver_terminate (test_driver); + meta_wayland_test_client_finish (wayland_test_client); + + meta_cursor_tracker_set_pointer_visible (cursor_tracker, TRUE); +} + +static void +toplevel_fixed_size_fullscreen_exceeds (void) +{ + MetaWaylandTestClient *wayland_test_client; + MetaWindow *window; + + wayland_test_client = + meta_wayland_test_client_new_with_args (test_context, + "fixed-size-client", + "1000", "1000", + NULL); + + while (!(window = find_client_window ("fixed-size-client"))) + g_main_context_iteration (NULL, TRUE); + while (meta_window_is_hidden (window)) + g_main_context_iteration (NULL, TRUE); + meta_wait_for_effects (window); + + g_test_expect_message ("libmutter", G_LOG_LEVEL_WARNING, + "Window * (fixed-size-client) (wl_surface#*) " + "size 1000x1000 exceeds allowed maximum size 640x480"); + + meta_window_make_fullscreen (window); + meta_wait_wayland_window_reconfigure (window); + meta_wait_for_effects (window); + + meta_wayland_test_driver_terminate (test_driver); + meta_wayland_test_client_finish (wayland_test_client); + g_test_assert_expected_messages (); +} + +static void on_before_tests (void) { MetaWaylandCompositor *compositor = @@ -1572,6 +1655,10 @@ toplevel_suspended); g_test_add_func ("/wayland/cursor/shape", cursor_shape); + g_test_add_func ("/wayland/toplevel/fixed-size-fullscreen", + toplevel_fixed_size_fullscreen); + g_test_add_func ("/wayland/toplevel/fixed-size-fullscreen-exceeds", + toplevel_fixed_size_fullscreen_exceeds); } int @@ -1591,6 +1678,9 @@ META_CONTEXT_TEST_FLAG_NO_X11); #endif g_assert_true (meta_context_configure (context, &argc, &argv, NULL)); + meta_context_test_set_background_color (META_CONTEXT_TEST (context), + COGL_COLOR_INIT (255, 255, 255, 255)); + test_context = context; diff -Nru mutter-48.4/src/wayland/meta-wayland-client.c mutter-48.7/src/wayland/meta-wayland-client.c --- mutter-48.4/src/wayland/meta-wayland-client.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/wayland/meta-wayland-client.c 2025-11-22 19:16:29.000000000 +0000 @@ -20,7 +20,7 @@ /** * MetaWaylandClient: - * + * * A class that allows to launch a trusted client and detect if an specific * Wayland window belongs to it. */ @@ -423,6 +423,7 @@ g_return_val_if_fail (meta_is_wayland_compositor (), FALSE); g_return_val_if_fail (client->subprocess.subprocess != NULL, FALSE); g_return_val_if_fail (client->subprocess.process_running, FALSE); + g_return_val_if_fail (!window->unmanaging, FALSE); surface = meta_window_get_wayland_surface (window); if (surface == NULL || surface->resource == NULL) diff -Nru mutter-48.4/src/wayland/meta-wayland-color-management.c mutter-48.7/src/wayland/meta-wayland-color-management.c --- mutter-48.4/src/wayland/meta-wayland-color-management.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/wayland/meta-wayland-color-management.c 2025-11-22 19:16:29.000000000 +0000 @@ -44,7 +44,7 @@ /* struct wl_resource */ GList *resources; - /* Key: MetaMonitor + /* Key: MetaWaylandOutput * Value: MetaWaylandColorManagementOutput */ GHashTable *outputs; @@ -764,9 +764,7 @@ G_CALLBACK (on_output_destroyed), cm_output); - g_hash_table_insert (color_manager->outputs, - meta_wayland_output_get_monitor (output), - cm_output); + g_hash_table_insert (color_manager->outputs, output, cm_output); return cm_output; } @@ -788,8 +786,7 @@ g_clear_signal_handler (&cm_output->output_destroyed_handler_id, cm_output->output); - g_hash_table_remove (cm_output->color_manager->outputs, - meta_wayland_output_get_monitor (cm_output->output)); + g_hash_table_remove (cm_output->color_manager->outputs, cm_output->output); free (cm_output); } @@ -800,8 +797,7 @@ { MetaWaylandColorManagementOutput *cm_output; - cm_output = g_hash_table_lookup (color_manager->outputs, - meta_wayland_output_get_monitor (output)); + cm_output = g_hash_table_lookup (color_manager->outputs, output); if (cm_output) return cm_output; @@ -1523,7 +1519,10 @@ MetaWaylandColorManagementSurface *cm_surface; MetaWaylandOutput *wayland_output; - cm_output = g_hash_table_lookup (color_manager->outputs, monitor); + wayland_output = g_hash_table_lookup (color_manager->compositor->outputs, + meta_monitor_get_spec (monitor)); + + cm_output = g_hash_table_lookup (color_manager->outputs, wayland_output); if (cm_output) { @@ -1537,9 +1536,6 @@ } } - wayland_output = g_hash_table_lookup (color_manager->compositor->outputs, - meta_monitor_get_spec (monitor)); - g_hash_table_iter_init (&iter_surfaces, color_manager->surfaces); while (g_hash_table_iter_next (&iter_surfaces, NULL, (gpointer *)&cm_surface)) { diff -Nru mutter-48.4/src/wayland/meta-wayland-outputs.c mutter-48.7/src/wayland/meta-wayland-outputs.c --- mutter-48.4/src/wayland/meta-wayland-outputs.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/wayland/meta-wayland-outputs.c 2025-11-22 19:16:29.000000000 +0000 @@ -527,11 +527,12 @@ g_hash_table_destroy (data); } -static GHashTable * +static void meta_wayland_compositor_update_outputs (MetaWaylandCompositor *compositor, MetaMonitorManager *monitor_manager) { - GHashTable *new_table; + g_autoptr (GHashTable) new_table = NULL; + g_autoptr (GHashTable) old_table = NULL; GList *monitors, *l; monitors = meta_monitor_manager_get_monitors (monitor_manager); @@ -539,6 +540,7 @@ (GEqualFunc) meta_monitor_spec_equals, (GDestroyNotify) meta_monitor_spec_free, g_object_unref); + old_table = g_steal_pointer (&compositor->outputs); for (l = monitors; l; l = l->next) { @@ -550,8 +552,8 @@ if (!meta_monitor_is_active (monitor)) continue; - if (!compositor->outputs || - !g_hash_table_steal_extended (compositor->outputs, lookup_monitor_spec, + if (!old_table || + !g_hash_table_steal_extended (old_table, lookup_monitor_spec, (gpointer *) &monitor_spec, (gpointer *) &wayland_output)) { @@ -565,20 +567,21 @@ g_steal_pointer (&wayland_output)); } - if (compositor->outputs) + compositor->outputs = g_steal_pointer (&new_table); + + if (old_table) { - g_hash_table_foreach (compositor->outputs, make_output_inert, NULL); - g_timeout_add_seconds_once (10, delayed_destroy_outputs, compositor->outputs); + g_hash_table_foreach (old_table, make_output_inert, NULL); + g_timeout_add_seconds_once (10, delayed_destroy_outputs, + g_steal_pointer (&old_table)); } - - return new_table; } static void on_monitors_changed (MetaMonitorManager *monitors, MetaWaylandCompositor *compositor) { - compositor->outputs = meta_wayland_compositor_update_outputs (compositor, monitors); + meta_wayland_compositor_update_outputs (compositor, monitors); } static void @@ -801,8 +804,7 @@ g_signal_connect (monitor_manager, "monitors-changed", G_CALLBACK (on_monitors_changed), compositor); - compositor->outputs = - meta_wayland_compositor_update_outputs (compositor, monitor_manager); + meta_wayland_compositor_update_outputs (compositor, monitor_manager); wl_global_create (compositor->wayland_display, &zxdg_output_manager_v1_interface, diff -Nru mutter-48.4/src/wayland/meta-wayland-xdg-session-state.c mutter-48.7/src/wayland/meta-wayland-xdg-session-state.c --- mutter-48.4/src/wayland/meta-wayland-xdg-session-state.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/wayland/meta-wayland-xdg-session-state.c 2025-11-22 19:16:29.000000000 +0000 @@ -292,7 +292,7 @@ tiled_rect = gvdb_table_get_value (toplevel, "tiled-rect"); if (tiled_rect && g_variant_is_of_type (tiled_rect, G_VARIANT_TYPE ("(iiii)"))) { - variant_to_rect (floating_rect, &toplevel_state->tiled.rect); + variant_to_rect (tiled_rect, &toplevel_state->tiled.rect); } is_minimized = gvdb_table_get_value (toplevel, "is-minimized"); @@ -397,6 +397,8 @@ toplevel_state = g_hash_table_lookup (xdg_session_state->toplevels, name); if (!toplevel_state) return FALSE; + if (toplevel_state->window_state == WINDOW_STATE_NONE) + return FALSE; switch (toplevel_state->window_state) { @@ -438,6 +440,7 @@ switch (toplevel_state->window_state) { case WINDOW_STATE_NONE: + break; case WINDOW_STATE_FLOATING: break; case WINDOW_STATE_TILED_LEFT: diff -Nru mutter-48.4/src/wayland/meta-window-wayland.c mutter-48.7/src/wayland/meta-window-wayland.c --- mutter-48.4/src/wayland/meta-window-wayland.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/wayland/meta-window-wayland.c 2025-11-22 19:16:29.000000000 +0000 @@ -1255,6 +1255,24 @@ acked_configuration = acquire_acked_configuration (wl_window, pending, &is_client_resize); + if (acked_configuration && + acked_configuration->has_size && + acked_configuration->is_fullscreen && + (new_geom.width > acked_configuration->width || + new_geom.height > acked_configuration->height)) + { + g_warning ("Window %s (wl_surface#%u) size %dx%d exceeds " + "allowed maximum size %dx%d", + window->desc, + surface->resource + ? wl_resource_get_id (surface->resource) + : 0, + new_geom.width / geometry_scale, + new_geom.height / geometry_scale, + acked_configuration->width / geometry_scale, + acked_configuration->height / geometry_scale); + } + window_drag = meta_compositor_get_current_window_drag (display->compositor); /* x/y are ignored when we're doing interactive resizing */ diff -Nru mutter-48.4/src/wayland/meta-xwayland-dnd.c mutter-48.7/src/wayland/meta-xwayland-dnd.c --- mutter-48.4/src/wayland/meta-xwayland-dnd.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/wayland/meta-xwayland-dnd.c 2025-11-22 19:16:29.000000000 +0000 @@ -863,6 +863,10 @@ drag_device = meta_wayland_drag_grab_get_device (drag_grab, &drag_sequence); + if (clutter_input_device_get_device_type (device) == + CLUTTER_KEYBOARD_DEVICE) + return meta_wayland_drag_grab_get_origin (drag_grab); + if (drag_sequence != sequence || drag_device != device) return NULL; @@ -896,9 +900,12 @@ MetaWaylandSeat *seat = meta_wayland_drag_grab_get_seat (drag_grab); MetaWaylandCompositor *compositor = meta_wayland_seat_get_compositor (seat); MetaXWaylandDnd *dnd = compositor->xwayland_manager.dnd; + ClutterInputDevice *device; + + device = meta_wayland_drag_grab_get_device (drag_grab, NULL); if (clutter_event_type (event) != CLUTTER_MOTION || - clutter_event_get_device_tool (event)) + device != clutter_event_get_device (event)) return CLUTTER_EVENT_STOP; repick_drop_surface (compositor, drag_grab, event); @@ -917,9 +924,12 @@ MetaWaylandSeat *seat = meta_wayland_drag_grab_get_seat (drag_grab); MetaWaylandCompositor *compositor = meta_wayland_seat_get_compositor (seat); MetaWaylandDataSource *data_source; + ClutterInputDevice *device; + + device = meta_wayland_drag_grab_get_device (drag_grab, NULL); if (clutter_event_type (event) != CLUTTER_BUTTON_RELEASE || - clutter_event_get_device_tool (event)) + device != clutter_event_get_device (event)) return CLUTTER_EVENT_STOP; data_source = compositor->seat->data_device.dnd_data_source; @@ -1122,14 +1132,14 @@ clutter_seat_query_state (clutter_input_device_get_seat (device), device, sequence, &pos, &modifiers); - if (!sequence) - { - if ((modifiers & - (CLUTTER_BUTTON1_MASK | CLUTTER_BUTTON2_MASK | - CLUTTER_BUTTON3_MASK | CLUTTER_BUTTON4_MASK | - CLUTTER_BUTTON5_MASK)) == 0) - return TRUE; - } + if (sequence) + return TRUE; + + if ((modifiers & + (CLUTTER_BUTTON1_MASK | CLUTTER_BUTTON2_MASK | + CLUTTER_BUTTON3_MASK | CLUTTER_BUTTON4_MASK | + CLUTTER_BUTTON5_MASK)) == 0) + return TRUE; focus = meta_wayland_seat_get_current_surface (candidate->seat, device, sequence); diff -Nru mutter-48.4/src/x11/events.c mutter-48.7/src/x11/events.c --- mutter-48.4/src/x11/events.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/x11/events.c 2025-11-22 19:16:29.000000000 +0000 @@ -1078,7 +1078,7 @@ (unsigned char *)icccm_version, 2); else { - mtk_x11_error_trap_pop_with_return (x11_display->xdisplay); + mtk_x11_error_trap_pop (x11_display->xdisplay); return FALSE; } @@ -1146,7 +1146,7 @@ x11_display->atom_ATOM_PAIR, &type, &format, &num, &rest, &data) != Success) { - mtk_x11_error_trap_pop_with_return (x11_display->xdisplay); + mtk_x11_error_trap_pop (x11_display->xdisplay); return; } diff -Nru mutter-48.4/src/x11/meta-startup-notification-x11.c mutter-48.7/src/x11/meta-startup-notification-x11.c --- mutter-48.4/src/x11/meta-startup-notification-x11.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/x11/meta-startup-notification-x11.c 2025-11-22 19:16:29.000000000 +0000 @@ -368,10 +368,14 @@ screen = meta_x11_display_get_screen_number (x11_display); sn_launcher = sn_launcher_context_new (x11_sn->sn_display, screen); - sn_launcher_context_set_name (sn_launcher, g_app_info_get_name (app_info)); sn_launcher_context_set_workspace (sn_launcher, workspace); - sn_launcher_context_set_binary_name (sn_launcher, - g_app_info_get_executable (app_info)); + + if (app_info) + { + sn_launcher_context_set_name (sn_launcher, g_app_info_get_name (app_info)); + sn_launcher_context_set_binary_name (sn_launcher, + g_app_info_get_executable (app_info)); + } if (G_IS_DESKTOP_APP_INFO (app_info)) { @@ -407,7 +411,7 @@ sn_launcher_context_initiate (sn_launcher, g_get_prgname (), - g_app_info_get_name (app_info), + app_info ? g_app_info_get_name (app_info) : "", timestamp); startup_id = g_strdup (sn_launcher_context_get_startup_id (sn_launcher)); diff -Nru mutter-48.4/src/x11/meta-sync-counter.c mutter-48.7/src/x11/meta-sync-counter.c --- mutter-48.4/src/x11/meta-sync-counter.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/x11/meta-sync-counter.c 2025-11-22 19:16:29.000000000 +0000 @@ -110,7 +110,7 @@ sync_counter->sync_request_counter, &init)) { - mtk_x11_error_trap_pop_with_return (x11_display->xdisplay); + mtk_x11_error_trap_pop (x11_display->xdisplay); sync_counter->sync_request_counter = None; return; } diff -Nru mutter-48.4/src/x11/meta-x11-display.c mutter-48.7/src/x11/meta-x11-display.c --- mutter-48.4/src/x11/meta-x11-display.c 2025-06-29 10:00:20.000000000 +0000 +++ mutter-48.7/src/x11/meta-x11-display.c 2025-11-22 19:16:29.000000000 +0000 @@ -653,21 +653,10 @@ } else { - unsigned int mask = XkbBellNotifyMask; - gboolean visual_bell_auto_reset = FALSE; - /* TRUE if and when non-broken version is available */ XkbSelectEvents (x11_display->xdisplay, XkbUseCoreKbd, XkbBellNotifyMask, XkbBellNotifyMask); - - if (visual_bell_auto_reset) - { - XkbSetAutoResetControls (x11_display->xdisplay, - XkbAudibleBellMask, - &mask, - &mask); - } } /* We are playing sounds using libcanberra support, we handle the