Merge ~3v1n0/ubuntu/+source/mutter:ubuntu/master into ~ubuntu-desktop/ubuntu/+source/mutter:ubuntu/master

Proposed by Marco Trevisan (Treviño)
Status: Merged
Merged at revision: d1a5a33cb6019c1349dea2d2ae5160950e2932d4
Proposed branch: ~3v1n0/ubuntu/+source/mutter:ubuntu/master
Merge into: ~ubuntu-desktop/ubuntu/+source/mutter:ubuntu/master
Diff against target: 954 lines (+459/-106)
18 files modified
NEWS (+30/-0)
clutter/clutter/clutter-device-manager.c (+1/-7)
clutter/clutter/evdev/clutter-input-device-evdev.c (+7/-7)
cogl/cogl/winsys/cogl-winsys-glx.c (+29/-29)
debian/changelog (+29/-0)
debian/patches/clutter-evdev-disable-mousekeys-with-Numlock-ON.patch (+64/-0)
debian/patches/clutter-x11-disable-mousekeys-with-Numlock-ON.patch (+85/-0)
debian/patches/compositor-Destroy-window-actors-list-on-destruction.patch (+63/-0)
debian/patches/meson-add-back-default_driver-option.patch (+1/-1)
debian/patches/series (+3/-0)
debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch (+23/-20)
meson.build (+1/-1)
src/backends/native/meta-renderer-native.c (+68/-25)
src/core/display.c (+1/-1)
src/core/keybindings.c (+2/-0)
src/core/startup-notification.c (+47/-10)
src/wayland/meta-wayland-outputs.c (+4/-4)
src/x11/meta-startup-notification-x11.c (+1/-1)
Reviewer Review Type Date Requested Status
Iain Lane Needs Fixing
Daniel van Vugt (community) Approve
Review via email: mp+366666@code.launchpad.net

Description of the change

Merge 3.32 with debian, fix scale computation crash.

To post a comment you must log in.
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Looks reasonable. Only one note:

(1) The change to clutter/clutter/clutter-device-manager.c is out of date already (missing https://gitlab.gnome.org/GNOME/mutter/merge_requests/552). So there is a slight risk without that second part.

review: Approve
fcdf97d... by Marco Trevisan (Treviño)

debian/patch: Destroy compositor window actors list on destruction

Fixes LP: #1813716

ca22053... by Marco Trevisan (Treviño)

debian/patches: Refresh indexes

Revision history for this message
Iain Lane (laney) wrote :

ca2205311 debian/patches: Refresh indexes
fcdf97d88 debian/patch: Destroy compositor window actors list on destruction
48a697817 randr-scaling: Fix a crash computing primary monitor scale

Nope, we'll get these via mutter 3.32.1-2 that I'm uploading to experimental.

review: Needs Fixing
Revision history for this message
Iain Lane (laney) wrote :

Merged up to d1a5a33cb6019c1349dea2d2ae5160950e2932d4, thanks!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/NEWS b/NEWS
index 720e28d..5606ee4 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,33 @@
13.32.1
2======
3* Fix fallback app menu on wayland [Florian; #493]
4* Fix elogind support [Tom; !491]
5* Fix startup notifications not timing out [Carlos; #501]
6* Fix keyboard accessibility toggle from keys
7 [Olivier, Carlos; !501, #529, !531]
8* Fix touchscreen input on rotated displays [Carlos; #514]
9* Work around hangul text input bug [Carlos; #1365]
10* Fix blurry wallpaper scaling [Daniel; !505]
11* Fix placement of window menu when using fractional scaling [Jan; #527]
12* Fix repaint issues of offscreen effects on secondary monitors [Daniel; !511]
13* Fix windows not getting focus after launch [Daniel; #505]
14* Properly advertise support for 'underscan' property [Jonas; !507]
15* Improve power-saving handling [Jonas; !506]
16* Fix moving windows by super+touch [Jonas D.; !495]
17* Misc. bug fixes and cleanups [Benjamin, Florian, Adam, Marco, Pablo,
18 Erik, Jonas, Heiher, Pekka, Daniel, Olivier, Carlos; !478, !475, !480,
19 !482, #490, !488, #491, #480, !477, !496, !492, !485, !515, !519, !521,
20 !216, !538, #541, #523]
21
22Contributors:
23 Jonas Ådahl, Pablo Barciela, Benjamin Berg, Tom Briden, Jonas Dreßler,
24 Olivier Fourdan, Carlos Garnacho, Jan Alexander Steffens (heftig), Heiher,
25 Adam Jackson, Erik Kurzinger, Florian Müllner, Pekka Paalanen,
26 Marco Trevisan (Treviño), Daniel van Vugt
27
28Translators:
29 Khaled Hosny [ar], Goran Vidović [hr], Daniel Mustieles [es]
30
13.32.0313.32.0
2======32======
3* Fix deadlock when cancelling a theme sound [Andrea; !474]33* Fix deadlock when cancelling a theme sound [Andrea; !474]
diff --git a/clutter/clutter/clutter-device-manager.c b/clutter/clutter/clutter-device-manager.c
index 1800d01..c676384 100644
--- a/clutter/clutter/clutter-device-manager.c
+++ b/clutter/clutter/clutter-device-manager.c
@@ -550,13 +550,7 @@ static gboolean
550are_kbd_a11y_settings_equal (ClutterKbdA11ySettings *a,550are_kbd_a11y_settings_equal (ClutterKbdA11ySettings *a,
551 ClutterKbdA11ySettings *b)551 ClutterKbdA11ySettings *b)
552{552{
553 return (a->controls == b->controls &&553 return (memcmp (a, b, sizeof (ClutterKbdA11ySettings)) == 0);
554 a->slowkeys_delay == b->slowkeys_delay &&
555 a->debounce_delay == b->debounce_delay &&
556 a->timeout_delay == b->timeout_delay &&
557 a->mousekeys_init_delay == b->mousekeys_init_delay &&
558 a->mousekeys_max_speed == b->mousekeys_max_speed &&
559 a->mousekeys_accel_time == b->mousekeys_accel_time);
560}554}
561555
562void556void
diff --git a/clutter/clutter/evdev/clutter-input-device-evdev.c b/clutter/clutter/evdev/clutter-input-device-evdev.c
index b52689e..2ac2e11 100644
--- a/clutter/clutter/evdev/clutter-input-device-evdev.c
+++ b/clutter/clutter/evdev/clutter-input-device-evdev.c
@@ -1132,13 +1132,13 @@ clutter_input_device_evdev_process_kbd_a11y_event (ClutterEvent *e
1132 if (event->key.flags & CLUTTER_EVENT_FLAG_INPUT_METHOD)1132 if (event->key.flags & CLUTTER_EVENT_FLAG_INPUT_METHOD)
1133 goto emit_event;1133 goto emit_event;
11341134
1135 if (!(device_evdev->a11y_flags & CLUTTER_A11Y_KEYBOARD_ENABLED))1135 if (device_evdev->a11y_flags & CLUTTER_A11Y_KEYBOARD_ENABLED)
1136 goto emit_event;1136 {
11371137 if (event->type == CLUTTER_KEY_PRESS)
1138 if (event->type == CLUTTER_KEY_PRESS)1138 handle_enablekeys_press (event, device_evdev);
1139 handle_enablekeys_press (event, device_evdev);1139 else
1140 else1140 handle_enablekeys_release (event, device_evdev);
1141 handle_enablekeys_release (event, device_evdev);1141 }
11421142
1143 if (device_evdev->a11y_flags & CLUTTER_A11Y_MOUSE_KEYS_ENABLED)1143 if (device_evdev->a11y_flags & CLUTTER_A11Y_MOUSE_KEYS_ENABLED)
1144 {1144 {
diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c
index 2623d02..235cfe8 100644
--- a/cogl/cogl/winsys/cogl-winsys-glx.c
+++ b/cogl/cogl/winsys/cogl-winsys-glx.c
@@ -99,9 +99,9 @@ typedef struct _CoglOnscreenGLX
99 CoglOnscreenXlib _parent;99 CoglOnscreenXlib _parent;
100 GLXDrawable glxwin;100 GLXDrawable glxwin;
101 uint32_t last_swap_vsync_counter;101 uint32_t last_swap_vsync_counter;
102 gboolean pending_sync_notify;102 uint32_t pending_sync_notify;
103 gboolean pending_complete_notify;103 uint32_t pending_complete_notify;
104 gboolean pending_resize_notify;104 uint32_t pending_resize_notify;
105105
106 GThread *swap_wait_thread;106 GThread *swap_wait_thread;
107 GQueue *swap_wait_queue;107 GQueue *swap_wait_queue;
@@ -347,35 +347,35 @@ flush_pending_notifications_cb (void *data,
347 {347 {
348 CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);348 CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
349 CoglOnscreenGLX *glx_onscreen = onscreen->winsys;349 CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
350 gboolean pending_sync_notify = glx_onscreen->pending_sync_notify;
351 gboolean pending_complete_notify = glx_onscreen->pending_complete_notify;
352350
353 /* If swap_region is called then notifying the sync event could351 while (glx_onscreen->pending_sync_notify > 0 ||
354 * potentially immediately queue a subsequent pending notify so352 glx_onscreen->pending_complete_notify > 0 ||
355 * we need to clear the flag before invoking the callback */353 glx_onscreen->pending_resize_notify > 0)
356 glx_onscreen->pending_sync_notify = FALSE;
357 glx_onscreen->pending_complete_notify = FALSE;
358
359 if (pending_sync_notify)
360 {354 {
361 CoglFrameInfo *info = g_queue_peek_head (&onscreen->pending_frame_infos);355 if (glx_onscreen->pending_sync_notify > 0)
362356 {
363 _cogl_onscreen_notify_frame_sync (onscreen, info);357 CoglFrameInfo *info =
364 }358 g_queue_peek_head (&onscreen->pending_frame_infos);
365359
366 if (pending_complete_notify)360 _cogl_onscreen_notify_frame_sync (onscreen, info);
367 {361 glx_onscreen->pending_sync_notify--;
368 CoglFrameInfo *info = g_queue_pop_head (&onscreen->pending_frame_infos);362 }
369363
370 _cogl_onscreen_notify_complete (onscreen, info);364 if (glx_onscreen->pending_complete_notify > 0)
365 {
366 CoglFrameInfo *info =
367 g_queue_pop_head (&onscreen->pending_frame_infos);
371368
372 cogl_object_unref (info);369 _cogl_onscreen_notify_complete (onscreen, info);
373 }370 cogl_object_unref (info);
371 glx_onscreen->pending_complete_notify--;
372 }
374373
375 if (glx_onscreen->pending_resize_notify)374 if (glx_onscreen->pending_resize_notify > 0)
376 {375 {
377 _cogl_onscreen_notify_resize (onscreen);376 _cogl_onscreen_notify_resize (onscreen);
378 glx_onscreen->pending_resize_notify = FALSE;377 glx_onscreen->pending_resize_notify--;
378 }
379 }379 }
380 }380 }
381}381}
@@ -417,7 +417,7 @@ set_sync_pending (CoglOnscreen *onscreen)
417 NULL);417 NULL);
418 }418 }
419419
420 glx_onscreen->pending_sync_notify = TRUE;420 glx_onscreen->pending_sync_notify++;
421}421}
422422
423static void423static void
@@ -440,7 +440,7 @@ set_complete_pending (CoglOnscreen *onscreen)
440 NULL);440 NULL);
441 }441 }
442442
443 glx_onscreen->pending_complete_notify = TRUE;443 glx_onscreen->pending_complete_notify++;
444}444}
445445
446static void446static void
@@ -533,7 +533,7 @@ notify_resize (CoglContext *context,
533 NULL);533 NULL);
534 }534 }
535535
536 glx_onscreen->pending_resize_notify = TRUE;536 glx_onscreen->pending_resize_notify++;
537537
538 if (!xlib_onscreen->is_foreign_xwin)538 if (!xlib_onscreen->is_foreign_xwin)
539 {539 {
diff --git a/debian/changelog b/debian/changelog
index cd3e63e..93fea65 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,32 @@
1mutter (3.32.1-1ubuntu1) UNRELEASED; urgency=medium
2
3 * Merge with debian
4 - Update to 3.32.1 upstream version (LP: #1826936)
5 - Fix applications aren't focused in Wayland session (LP: #1826176)
6 - Fix crash on hotplugging a dock with a monitor (LP: #1826182)
7 Remaining changes:
8 + debian/control:
9 - Update VCS flags to point to launchpad
10 - Update maintainer to ubuntu
11 + debian/gbp.conf: update branch to point to ubuntu/master
12 + debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch:
13 - X11: Add support for fractional scaling using Randr
14 * d/p/compositor-Destroy-window-actors-list-on-destruction.patch:
15 - compositor: Destroy window actors list on destruction (LP: #1813716)
16 * d/p/x11-Add-support-for-fractional-scaling-using-Randr.patch:
17 - Fixed crash on calculation of global scale (LP: #1826933)
18 - Refreshed as per compositor code changes due to cherry-picked patch
19
20 -- Marco Trevisan (Treviño) <marco@ubuntu.com> Mon, 29 Apr 2019 16:08:24 -0500
21
22mutter (3.32.1-1) experimental; urgency=medium
23
24 * New upstream release
25 * debian/patches: disable mousekeys with Numlock ON to match the
26 documentation (cherry picked from the 3.32 branch)
27
28 -- Laurent Bigonville <bigon@debian.org> Mon, 22 Apr 2019 21:57:33 +0200
29
1mutter (3.32.0+git20190410-2) experimental; urgency=medium30mutter (3.32.0+git20190410-2) experimental; urgency=medium
231
3 [ Gunnar Hjalmarsson ]32 [ Gunnar Hjalmarsson ]
diff --git a/debian/patches/clutter-evdev-disable-mousekeys-with-Numlock-ON.patch b/debian/patches/clutter-evdev-disable-mousekeys-with-Numlock-ON.patch
4new file mode 10064433new file mode 100644
index 0000000..5c70efe
--- /dev/null
+++ b/debian/patches/clutter-evdev-disable-mousekeys-with-Numlock-ON.patch
@@ -0,0 +1,64 @@
1From: Olivier Fourdan <ofourdan@redhat.com>
2Date: Tue, 9 Apr 2019 13:39:59 +0200
3Subject: clutter/evdev: disable mousekeys with Numlock ON
4
5The clutter/evdev implementation of mousekeys is designed after the
6current implementation in X11, and works when the setting is enabled
7regardless of the status of NumLock.
8
9The GNOME documentation on accessibility features states however that
10mousekeys work only when NumLock is OFF:
11
12 https://help.gnome.org/users/gnome-help/stable/mouse-mousekeys.html
13
14Change the clutter/evdev implementation to match the documentation, i.e.
15disable mousekeys when NumLock in ON so that switching NumLock ON
16restores the numeric keypad behaviour.
17
18Closes: https://gitlab.gnome.org/GNOME/mutter/issues/530
19(cherry picked from commit 471b61bd1400435b7af977c47c21b8fc747530d9)
20---
21 clutter/clutter/evdev/clutter-input-device-evdev.c | 16 ++++++++++++++++
22 1 file changed, 16 insertions(+)
23
24diff --git a/clutter/clutter/evdev/clutter-input-device-evdev.c b/clutter/clutter/evdev/clutter-input-device-evdev.c
25index 2ac2e11..73072b4 100644
26--- a/clutter/clutter/evdev/clutter-input-device-evdev.c
27+++ b/clutter/clutter/evdev/clutter-input-device-evdev.c
28@@ -855,6 +855,14 @@ emulate_pointer_motion (ClutterInputDeviceEvdev *device,
29 clutter_virtual_input_device_notify_relative_motion (device->mousekeys_virtual_device,
30 time_us, dx_motion, dy_motion);
31 }
32+static gboolean
33+is_numlock_active (ClutterInputDeviceEvdev *device)
34+{
35+ ClutterSeatEvdev *seat = device->seat;
36+ return xkb_state_mod_name_is_active (seat->xkb,
37+ "Mod2",
38+ XKB_STATE_MODS_LOCKED);
39+}
40
41 static void
42 enable_mousekeys (ClutterInputDeviceEvdev *device)
43@@ -1013,6 +1021,10 @@ handle_mousekeys_press (ClutterEvent *event,
44 if (!(event->key.flags & CLUTTER_EVENT_FLAG_SYNTHETIC))
45 stop_mousekeys_move (device);
46
47+ /* Do not handle mousekeys if NumLock is ON */
48+ if (is_numlock_active (device))
49+ return FALSE;
50+
51 /* Button selection */
52 switch (event->key.keyval)
53 {
54@@ -1084,6 +1096,10 @@ static gboolean
55 handle_mousekeys_release (ClutterEvent *event,
56 ClutterInputDeviceEvdev *device)
57 {
58+ /* Do not handle mousekeys if NumLock is ON */
59+ if (is_numlock_active (device))
60+ return FALSE;
61+
62 switch (event->key.keyval)
63 {
64 case XKB_KEY_KP_0:
diff --git a/debian/patches/clutter-x11-disable-mousekeys-with-Numlock-ON.patch b/debian/patches/clutter-x11-disable-mousekeys-with-Numlock-ON.patch
0new file mode 10064465new file mode 100644
index 0000000..d33c9aa
--- /dev/null
+++ b/debian/patches/clutter-x11-disable-mousekeys-with-Numlock-ON.patch
@@ -0,0 +1,85 @@
1From: Olivier Fourdan <ofourdan@redhat.com>
2Date: Tue, 9 Apr 2019 16:25:57 +0200
3Subject: clutter/x11: disable mousekeys with Numlock ON
4
5GNOME documentation on accessibility features states that mousekeys
6work only when NumLock is OFF:
7
8 https://help.gnome.org/users/gnome-help/stable/mouse-mousekeys.html
9
10Change the clutter/x11 implementation to match the documentation, i.e.
11disable mousekeys when NumLock in ON so that switching NumLock ON
12restores the numeric keypad behaviour.
13
14Closes: https://gitlab.gnome.org/GNOME/mutter/issues/530
15(cherry picked from commit 251fa024c416b1507a8cb1c9115082be87d25632)
16---
17 clutter/clutter/x11/clutter-backend-x11.c | 20 ++++++++++++++++++++
18 clutter/clutter/x11/clutter-xkb-a11y-x11.c | 9 +++++++--
19 2 files changed, 27 insertions(+), 2 deletions(-)
20
21diff --git a/clutter/clutter/x11/clutter-backend-x11.c b/clutter/clutter/x11/clutter-backend-x11.c
22index 0ddd0f8..8c5ebc8 100644
23--- a/clutter/clutter/x11/clutter-backend-x11.c
24+++ b/clutter/clutter/x11/clutter-backend-x11.c
25@@ -54,6 +54,7 @@
26 #include "clutter-main.h"
27 #include "clutter-private.h"
28 #include "clutter-settings-private.h"
29+#include "clutter-xkb-a11y-x11.h"
30
31 G_DEFINE_TYPE (ClutterBackendX11, clutter_backend_x11, CLUTTER_TYPE_BACKEND)
32
33@@ -276,6 +277,20 @@ clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11)
34 _clutter_backend_add_event_translator (backend, translator);
35 }
36
37+static void
38+on_keymap_state_change (ClutterKeymapX11 *keymap_x11,
39+ gpointer data)
40+{
41+ ClutterDeviceManager *device_manager = CLUTTER_DEVICE_MANAGER (data);
42+ ClutterKbdA11ySettings kbd_a11y_settings;
43+
44+ /* On keymaps state change, just reapply the current settings, it'll
45+ * take care of enabling/disabling mousekeys based on NumLock state.
46+ */
47+ clutter_device_manager_get_kbd_a11y_settings (device_manager, &kbd_a11y_settings);
48+ clutter_device_manager_x11_apply_kbd_a11y_settings (device_manager, &kbd_a11y_settings);
49+}
50+
51 static void
52 clutter_backend_x11_create_keymap (ClutterBackendX11 *backend_x11)
53 {
54@@ -292,6 +307,11 @@ clutter_backend_x11_create_keymap (ClutterBackendX11 *backend_x11)
55 backend = CLUTTER_BACKEND (backend_x11);
56 translator = CLUTTER_EVENT_TRANSLATOR (backend_x11->keymap);
57 _clutter_backend_add_event_translator (backend, translator);
58+
59+ g_signal_connect (backend_x11->keymap,
60+ "state-changed",
61+ G_CALLBACK (on_keymap_state_change),
62+ backend->device_manager);
63 }
64 }
65
66diff --git a/clutter/clutter/x11/clutter-xkb-a11y-x11.c b/clutter/clutter/x11/clutter-xkb-a11y-x11.c
67index 6adde81..6b782c7 100644
68--- a/clutter/clutter/x11/clutter-xkb-a11y-x11.c
69+++ b/clutter/clutter/x11/clutter-xkb-a11y-x11.c
70@@ -241,8 +241,13 @@ clutter_device_manager_x11_apply_kbd_a11y_settings (ClutterDeviceManager *devi
71 }
72
73 /* mouse keys */
74- if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
75- CLUTTER_A11Y_MOUSE_KEYS_ENABLED, XkbMouseKeysMask | XkbMouseKeysAccelMask))
76+ if (clutter_keymap_get_num_lock_state (CLUTTER_KEYMAP (backend_x11->keymap)))
77+ {
78+ /* Disable mousekeys when NumLock is ON */
79+ desc->ctrls->enabled_ctrls &= ~(XkbMouseKeysMask | XkbMouseKeysAccelMask);
80+ }
81+ else if (set_xkb_ctrl (desc, kbd_a11y_settings->controls,
82+ CLUTTER_A11Y_MOUSE_KEYS_ENABLED, XkbMouseKeysMask | XkbMouseKeysAccelMask))
83 {
84 gint mk_max_speed;
85 gint mk_accel_time;
diff --git a/debian/patches/compositor-Destroy-window-actors-list-on-destruction.patch b/debian/patches/compositor-Destroy-window-actors-list-on-destruction.patch
0new file mode 10064486new file mode 100644
index 0000000..70205bc
--- /dev/null
+++ b/debian/patches/compositor-Destroy-window-actors-list-on-destruction.patch
@@ -0,0 +1,63 @@
1From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
2Date: Mon, 29 Apr 2019 14:57:03 -0500
3Subject: compositor: Destroy window actors list on destruction
4
5When the compositor is destroyed we should cleanup the list of window actors we
6created and destroy them.
7Since all the actors are added to the window_group or top_window_group we can
8just destroy these containers (together with the feedback_group), and simply
9free the windows list.
10
11This is particularly needed under X11 because before we destroy the display, we
12might do some cleanups as detaching the surface pixmaps and freeing the damages
13and if this happens at later point (for example when triggered by garbage
14collector in gnome-shell), we might crash because the x11 dpy reference is
15already gone.
16
17Destroying the window actors instead, ensures we avoid any further call to X11
18related functions and that we release the actors XServer resources.
19
20Fixes https://gitlab.gnome.org/GNOME/mutter/issues/576
21
22Ubuntu-Bug: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1813716
23Origin: https://gitlab.gnome.org/GNOME/mutter/merge_requests/557
24Applied-Upstream: 3.32.2
25---
26 src/compositor/compositor.c | 17 +++++++++++++++++
27 1 file changed, 17 insertions(+)
28
29diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
30index 0854a19..f47889f 100644
31--- a/src/compositor/compositor.c
32+++ b/src/compositor/compositor.c
33@@ -92,6 +92,10 @@ on_presented (ClutterStage *stage,
34 ClutterFrameInfo *frame_info,
35 MetaCompositor *compositor);
36
37+static void
38+on_top_window_actor_destroyed (MetaWindowActor *window_actor,
39+ MetaCompositor *compositor);
40+
41 static gboolean
42 is_modal (MetaDisplay *display)
43 {
44@@ -134,6 +138,19 @@ meta_compositor_destroy (MetaCompositor *compositor)
45 clutter_threads_remove_repaint_func (compositor->pre_paint_func_id);
46 clutter_threads_remove_repaint_func (compositor->post_paint_func_id);
47
48+ if (compositor->top_window_actor)
49+ {
50+ g_signal_handlers_disconnect_by_func (compositor->top_window_actor,
51+ on_top_window_actor_destroyed,
52+ compositor);
53+ compositor->top_window_actor = NULL;
54+ }
55+
56+ g_clear_pointer (&compositor->window_group, clutter_actor_destroy);
57+ g_clear_pointer (&compositor->top_window_group, clutter_actor_destroy);
58+ g_clear_pointer (&compositor->feedback_group, clutter_actor_destroy);
59+ g_clear_pointer (&compositor->windows, g_list_free);
60+
61 if (compositor->have_x11_sync_object)
62 meta_sync_ring_destroy ();
63 }
diff --git a/debian/patches/meson-add-back-default_driver-option.patch b/debian/patches/meson-add-back-default_driver-option.patch
index b79207c..531b95f 100644
--- a/debian/patches/meson-add-back-default_driver-option.patch
+++ b/debian/patches/meson-add-back-default_driver-option.patch
@@ -44,7 +44,7 @@ index 356d596..2ab83bd 100644
44 input: 'cogl-config.h.meson',44 input: 'cogl-config.h.meson',
45 output: 'cogl-config.h',45 output: 'cogl-config.h',
46diff --git a/meson.build b/meson.build46diff --git a/meson.build b/meson.build
47index 6ce9e59..bebe8eb 10064447index 1c86575..19aae12 100644
48--- a/meson.build48--- a/meson.build
49+++ b/meson.build49+++ b/meson.build
50@@ -210,6 +210,8 @@ if have_wayland_eglstream50@@ -210,6 +210,8 @@ if have_wayland_eglstream
diff --git a/debian/patches/series b/debian/patches/series
index 5e2b370..4c4ad35 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -2,4 +2,7 @@ theme-use-gtk_render_icon_suface-to-paint-button-icon.patch
2theme-load-icons-as-Gtk-does-with-fallback-and-RTL-suppor.patch2theme-load-icons-as-Gtk-does-with-fallback-and-RTL-suppor.patch
3meson-add-back-default_driver-option.patch3meson-add-back-default_driver-option.patch
4debian/synaptics-support.patch4debian/synaptics-support.patch
5clutter-evdev-disable-mousekeys-with-Numlock-ON.patch
6clutter-x11-disable-mousekeys-with-Numlock-ON.patch
7compositor-Destroy-window-actors-list-on-destruction.patch
5x11-Add-support-for-fractional-scaling-using-Randr.patch8x11-Add-support-for-fractional-scaling-using-Randr.patch
diff --git a/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch b/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch
index 7717be1..6a1e047 100644
--- a/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch
+++ b/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch
@@ -1,5 +1,5 @@
1From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>1From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net>
2Date: Wed, 3 Apr 2019 19:18:03 -04002Date: Wed, 3 Apr 2019 17:18:03 -0600
3Subject: x11-Add-support-for-fractional-scaling-using-Randr3Subject: x11-Add-support-for-fractional-scaling-using-Randr
44
5Add scaling support using randr under x11.5Add scaling support using randr under x11.
@@ -30,13 +30,13 @@ Forwarded: No, forwarding is in progress and planned though
30 src/backends/x11/meta-monitor-manager-xrandr.c | 485 ++++++++++++++++++-------30 src/backends/x11/meta-monitor-manager-xrandr.c | 485 ++++++++++++++++++-------
31 src/backends/x11/meta-monitor-manager-xrandr.h | 4 +-31 src/backends/x11/meta-monitor-manager-xrandr.h | 4 +-
32 src/backends/x11/meta-output-xrandr.c | 5 +-32 src/backends/x11/meta-output-xrandr.c | 5 +-
33 src/compositor/compositor.c | 54 +++33 src/compositor/compositor.c | 57 +++
34 src/core/boxes-private.h | 4 +34 src/core/boxes-private.h | 4 +
35 src/core/boxes.c | 21 ++35 src/core/boxes.c | 21 ++
36 src/core/window.c | 19 +36 src/core/window.c | 19 +
37 src/org.gnome.Mutter.DisplayConfig.xml | 5 +37 src/org.gnome.Mutter.DisplayConfig.xml | 5 +
38 src/tests/meta-monitor-manager-test.c | 14 +-38 src/tests/meta-monitor-manager-test.c | 14 +-
39 28 files changed, 1358 insertions(+), 260 deletions(-)39 28 files changed, 1361 insertions(+), 260 deletions(-)
40 create mode 100644 data/org.gnome.mutter.x11.gschema.xml.in40 create mode 100644 data/org.gnome.mutter.x11.gschema.xml.in
4141
42diff --git a/data/meson.build b/data/meson.build42diff --git a/data/meson.build b/data/meson.build
@@ -724,7 +724,7 @@ index cdb8f42..bf586ea 100644
724 meta_monitor_manager_get_capabilities (MetaMonitorManager *manager);724 meta_monitor_manager_get_capabilities (MetaMonitorManager *manager);
725 725
726diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c726diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
727index 2d898c7..a78fb37 100644727index 2d898c7..d8cf3ae 100644
728--- a/src/backends/meta-monitor-manager.c728--- a/src/backends/meta-monitor-manager.c
729+++ b/src/backends/meta-monitor-manager.c729+++ b/src/backends/meta-monitor-manager.c
730@@ -110,8 +110,18 @@ static gboolean730@@ -110,8 +110,18 @@ static gboolean
@@ -838,7 +838,7 @@ index 2d898c7..a78fb37 100644
838 838
839- if (!monitor || !meta_monitor_is_active (monitor))839- if (!monitor || !meta_monitor_is_active (monitor))
840- monitor = meta_monitor_manager_get_active_monitor (manager);840- monitor = meta_monitor_manager_get_active_monitor (manager);
841+ if (monitor)841+ if (monitor && meta_monitor_is_active (monitor))
842+ {842+ {
843+ scale = calculate_monitor_scale (manager, monitor);843+ scale = calculate_monitor_scale (manager, monitor);
844+ if (meta_monitor_manager_is_scale_supported_by_other_monitors (manager,844+ if (meta_monitor_manager_is_scale_supported_by_other_monitors (manager,
@@ -2832,12 +2832,12 @@ index 515389d..3bc7f0b 100644
2832 2832
2833 tile_atom = XInternAtom (xdisplay, "TILE", FALSE);2833 tile_atom = XInternAtom (xdisplay, "TILE", FALSE);
2834diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c2834diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
2835index 0854a19..e412784 1006442835index f47889f..28f2b4f 100644
2836--- a/src/compositor/compositor.c2836--- a/src/compositor/compositor.c
2837+++ b/src/compositor/compositor.c2837+++ b/src/compositor/compositor.c
2838@@ -92,6 +92,11 @@ on_presented (ClutterStage *stage,2838@@ -96,6 +96,11 @@ static void
2839 ClutterFrameInfo *frame_info,2839 on_top_window_actor_destroyed (MetaWindowActor *window_actor,
2840 MetaCompositor *compositor);2840 MetaCompositor *compositor);
2841 2841
2842+static void2842+static void
2843+on_redirected_monitor_changed (MetaWindow *window,2843+on_redirected_monitor_changed (MetaWindow *window,
@@ -2847,19 +2847,22 @@ index 0854a19..e412784 100644
2847 static gboolean2847 static gboolean
2848 is_modal (MetaDisplay *display)2848 is_modal (MetaDisplay *display)
2849 {2849 {
2850@@ -134,6 +139,11 @@ meta_compositor_destroy (MetaCompositor *compositor)2850@@ -146,6 +151,14 @@ meta_compositor_destroy (MetaCompositor *compositor)
2851 clutter_threads_remove_repaint_func (compositor->pre_paint_func_id);2851 compositor->top_window_actor = NULL;
2852 clutter_threads_remove_repaint_func (compositor->post_paint_func_id);2852 }
2853 2853
2854+ if (compositor->unredirected_window)2854+ if (compositor->unredirected_window)
2855+ g_signal_handlers_disconnect_by_func (compositor->unredirected_window,2855+ {
2856+ on_redirected_monitor_changed,2856+ g_signal_handlers_disconnect_by_func (compositor->unredirected_window,
2857+ compositor);2857+ on_redirected_monitor_changed,
2858+ compositor);
2859+ compositor->unredirected_window = NULL;
2860+ }
2858+2861+
2859 if (compositor->have_x11_sync_object)2862 g_clear_pointer (&compositor->window_group, clutter_actor_destroy);
2860 meta_sync_ring_destroy ();2863 g_clear_pointer (&compositor->top_window_group, clutter_actor_destroy);
2861 }2864 g_clear_pointer (&compositor->feedback_group, clutter_actor_destroy);
2862@@ -635,16 +645,54 @@ meta_shape_cow_for_window (MetaCompositor *compositor,2865@@ -652,16 +665,54 @@ meta_shape_cow_for_window (MetaCompositor *compositor,
2863 }2866 }
2864 }2867 }
2865 2868
@@ -2914,7 +2917,7 @@ index 0854a19..e412784 100644
2914 meta_window_actor_set_unredirected (window_actor, FALSE);2917 meta_window_actor_set_unredirected (window_actor, FALSE);
2915 }2918 }
2916 2919
2917@@ -654,6 +702,12 @@ set_unredirected_window (MetaCompositor *compositor,2920@@ -671,6 +722,12 @@ set_unredirected_window (MetaCompositor *compositor,
2918 if (compositor->unredirected_window != NULL)2921 if (compositor->unredirected_window != NULL)
2919 {2922 {
2920 MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (compositor->unredirected_window));2923 MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (compositor->unredirected_window));
diff --git a/meson.build b/meson.build
index 6ce9e59..1c86575 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
1project('mutter', 'c',1project('mutter', 'c',
2 version: '3.32.0',2 version: '3.32.1',
3 meson_version: '>= 0.48.0',3 meson_version: '>= 0.48.0',
4 license: 'GPLv2+'4 license: 'GPLv2+'
5)5)
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 086e8e4..dbfc97a 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -3787,16 +3787,13 @@ gpu_kms_is_hardware_rendering (MetaRendererNative *renderer_native,
3787 return data->secondary.is_hardware_rendering;3787 return data->secondary.is_hardware_rendering;
3788}3788}
37893789
3790static MetaRendererNativeGpuData *3790static EGLDisplay
3791create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,3791init_gbm_egl_display (MetaRendererNative *renderer_native,
3792 MetaGpuKms *gpu_kms,3792 struct gbm_device *gbm_device,
3793 GError **error)3793 GError **error)
3794{3794{
3795 MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);3795 MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
3796 struct gbm_device *gbm_device;
3797 EGLDisplay egl_display;3796 EGLDisplay egl_display;
3798 int kms_fd;
3799 MetaRendererNativeGpuData *renderer_gpu_data;
38003797
3801 if (!meta_egl_has_extensions (egl, EGL_NO_DISPLAY, NULL,3798 if (!meta_egl_has_extensions (egl, EGL_NO_DISPLAY, NULL,
3802 "EGL_MESA_platform_gbm",3799 "EGL_MESA_platform_gbm",
@@ -3808,9 +3805,31 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
3808 g_set_error (error, G_IO_ERROR,3805 g_set_error (error, G_IO_ERROR,
3809 G_IO_ERROR_FAILED,3806 G_IO_ERROR_FAILED,
3810 "Missing extension for GBM renderer: EGL_KHR_platform_gbm");3807 "Missing extension for GBM renderer: EGL_KHR_platform_gbm");
3811 return NULL;3808 return EGL_NO_DISPLAY;
3812 }3809 }
38133810
3811 egl_display = meta_egl_get_platform_display (egl,
3812 EGL_PLATFORM_GBM_KHR,
3813 gbm_device, NULL, error);
3814 if (egl_display == EGL_NO_DISPLAY)
3815 return EGL_NO_DISPLAY;
3816
3817 if (!meta_egl_initialize (egl, egl_display, error))
3818 return EGL_NO_DISPLAY;
3819
3820 return egl_display;
3821}
3822
3823static MetaRendererNativeGpuData *
3824create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
3825 MetaGpuKms *gpu_kms,
3826 GError **error)
3827{
3828 struct gbm_device *gbm_device;
3829 int kms_fd;
3830 MetaRendererNativeGpuData *renderer_gpu_data;
3831 g_autoptr (GError) local_error = NULL;
3832
3814 kms_fd = meta_gpu_kms_get_fd (gpu_kms);3833 kms_fd = meta_gpu_kms_get_fd (gpu_kms);
38153834
3816 gbm_device = gbm_create_device (kms_fd);3835 gbm_device = gbm_create_device (kms_fd);
@@ -3822,26 +3841,25 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
3822 return NULL;3841 return NULL;
3823 }3842 }
38243843
3825 egl_display = meta_egl_get_platform_display (egl,
3826 EGL_PLATFORM_GBM_KHR,
3827 gbm_device, NULL, error);
3828 if (egl_display == EGL_NO_DISPLAY)
3829 {
3830 gbm_device_destroy (gbm_device);
3831 return NULL;
3832 }
3833
3834 if (!meta_egl_initialize (egl, egl_display, error))
3835 return NULL;
3836
3837 renderer_gpu_data = meta_create_renderer_native_gpu_data (gpu_kms);3844 renderer_gpu_data = meta_create_renderer_native_gpu_data (gpu_kms);
3838 renderer_gpu_data->renderer_native = renderer_native;3845 renderer_gpu_data->renderer_native = renderer_native;
3839 renderer_gpu_data->gbm.device = gbm_device;3846 renderer_gpu_data->gbm.device = gbm_device;
3840 renderer_gpu_data->mode = META_RENDERER_NATIVE_MODE_GBM;3847 renderer_gpu_data->mode = META_RENDERER_NATIVE_MODE_GBM;
3841 renderer_gpu_data->egl_display = egl_display;
38423848
3843 init_secondary_gpu_data (renderer_gpu_data);3849 renderer_gpu_data->egl_display = init_gbm_egl_display (renderer_native,
3850 gbm_device,
3851 &local_error);
3852 if (renderer_gpu_data->egl_display == EGL_NO_DISPLAY)
3853 {
3854 g_debug ("GBM EGL init for %s failed: %s",
3855 meta_gpu_kms_get_file_path (gpu_kms),
3856 local_error->message);
38443857
3858 init_secondary_gpu_data_cpu (renderer_gpu_data);
3859 return renderer_gpu_data;
3860 }
3861
3862 init_secondary_gpu_data (renderer_gpu_data);
3845 return renderer_gpu_data;3863 return renderer_gpu_data;
3846}3864}
38473865
@@ -4134,8 +4152,8 @@ on_gpu_added (MetaMonitorManager *monitor_manager,
4134}4152}
41354153
4136static MetaGpuKms *4154static MetaGpuKms *
4137choose_primary_gpu (MetaMonitorManager *manager,4155choose_primary_gpu_unchecked (MetaMonitorManager *manager,
4138 MetaRendererNative *renderer_native)4156 MetaRendererNative *renderer_native)
4139{4157{
4140 GList *gpus = meta_monitor_manager_get_gpus (manager);4158 GList *gpus = meta_monitor_manager_get_gpus (manager);
4141 GList *l;4159 GList *l;
@@ -4184,6 +4202,28 @@ choose_primary_gpu (MetaMonitorManager *manager,
4184 return NULL;4202 return NULL;
4185}4203}
41864204
4205static MetaGpuKms *
4206choose_primary_gpu (MetaMonitorManager *manager,
4207 MetaRendererNative *renderer_native,
4208 GError **error)
4209{
4210 MetaGpuKms *gpu_kms;
4211 MetaRendererNativeGpuData *renderer_gpu_data;
4212
4213 gpu_kms = choose_primary_gpu_unchecked (manager, renderer_native);
4214 renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
4215 gpu_kms);
4216 if (renderer_gpu_data->egl_display == EGL_NO_DISPLAY)
4217 {
4218 g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
4219 "The GPU %s chosen as primary is not supported by EGL.",
4220 meta_gpu_kms_get_file_path (gpu_kms));
4221 return NULL;
4222 }
4223
4224 return gpu_kms;
4225}
4226
4187static gboolean4227static gboolean
4188meta_renderer_native_initable_init (GInitable *initable,4228meta_renderer_native_initable_init (GInitable *initable,
4189 GCancellable *cancellable,4229 GCancellable *cancellable,
@@ -4207,7 +4247,10 @@ meta_renderer_native_initable_init (GInitable *initable,
4207 }4247 }
42084248
4209 renderer_native->primary_gpu_kms = choose_primary_gpu (monitor_manager,4249 renderer_native->primary_gpu_kms = choose_primary_gpu (monitor_manager,
4210 renderer_native);4250 renderer_native,
4251 error);
4252 if (!renderer_native->primary_gpu_kms)
4253 return FALSE;
42114254
4212 return TRUE;4255 return TRUE;
4213}4256}
diff --git a/src/core/display.c b/src/core/display.c
index e1477d3..0de99ed 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -2236,7 +2236,7 @@ meta_display_get_tab_list (MetaDisplay *display,
2236 MetaWindow *l_window = w->data;2236 MetaWindow *l_window = w->data;
22372237
2238 if (l_window->wm_state_demands_attention &&2238 if (l_window->wm_state_demands_attention &&
2239 l_window->workspace != workspace &&2239 !meta_window_located_on_workspace (l_window, workspace) &&
2240 IN_TAB_CHAIN (l_window, type))2240 IN_TAB_CHAIN (l_window, type))
2241 tab_list = g_list_prepend (tab_list, l_window);2241 tab_list = g_list_prepend (tab_list, l_window);
2242 }2242 }
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 478d4d8..a99899f 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -2214,6 +2214,8 @@ meta_keybindings_process_event (MetaDisplay *display,
2214 {2214 {
2215 case CLUTTER_BUTTON_PRESS:2215 case CLUTTER_BUTTON_PRESS:
2216 case CLUTTER_BUTTON_RELEASE:2216 case CLUTTER_BUTTON_RELEASE:
2217 case CLUTTER_TOUCH_BEGIN:
2218 case CLUTTER_TOUCH_END:
2217 keys->overlay_key_only_pressed = FALSE;2219 keys->overlay_key_only_pressed = FALSE;
2218 return FALSE;2220 return FALSE;
22192221
diff --git a/src/core/startup-notification.c b/src/core/startup-notification.c
index d2d0d13..4cd51ac 100644
--- a/src/core/startup-notification.c
+++ b/src/core/startup-notification.c
@@ -37,7 +37,7 @@
37 * OpenOffice or whatever seems to stop launching - people37 * OpenOffice or whatever seems to stop launching - people
38 * might decide they need to launch it again.38 * might decide they need to launch it again.
39 */39 */
40#define STARTUP_TIMEOUT 1500000040#define STARTUP_TIMEOUT_MS 15000
4141
42enum42enum
43{43{
@@ -61,12 +61,19 @@ enum
6161
62enum62enum
63{63{
64 SEQ_COMPLETE,
65 N_SEQ_SIGNALS
66};
67
68enum
69{
64 CHANGED,70 CHANGED,
65 N_SIGNALS71 N_SIGNALS
66};72};
6773
68static guint sn_signals[N_SIGNALS];74static guint sn_signals[N_SIGNALS];
69static GParamSpec *sn_props[N_PROPS];75static GParamSpec *sn_props[N_PROPS];
76static guint seq_signals[N_SEQ_SIGNALS];
70static GParamSpec *seq_props[N_SEQ_PROPS];77static GParamSpec *seq_props[N_SEQ_PROPS];
7178
72typedef struct79typedef struct
@@ -106,12 +113,26 @@ G_DEFINE_TYPE_WITH_PRIVATE (MetaStartupSequence,
106113
107static void meta_startup_notification_ensure_timeout (MetaStartupNotification *sn);114static void meta_startup_notification_ensure_timeout (MetaStartupNotification *sn);
108115
116static gboolean
117meta_startup_notification_has_pending_sequences (MetaStartupNotification *sn)
118{
119 GSList *l;
120
121 for (l = sn->startup_sequences; l; l = l->next)
122 {
123 if (!meta_startup_sequence_get_completed (l->data))
124 return TRUE;
125 }
126
127 return FALSE;
128}
129
109static void130static void
110meta_startup_notification_update_feedback (MetaStartupNotification *sn)131meta_startup_notification_update_feedback (MetaStartupNotification *sn)
111{132{
112 MetaDisplay *display = sn->display;133 MetaDisplay *display = sn->display;
113134
114 if (sn->startup_sequences != NULL)135 if (meta_startup_notification_has_pending_sequences (sn))
115 {136 {
116 meta_topic (META_DEBUG_STARTUP,137 meta_topic (META_DEBUG_STARTUP,
117 "Setting busy cursor\n");138 "Setting busy cursor\n");
@@ -239,6 +260,14 @@ meta_startup_sequence_class_init (MetaStartupSequenceClass *klass)
239 object_class->set_property = meta_startup_sequence_set_property;260 object_class->set_property = meta_startup_sequence_set_property;
240 object_class->get_property = meta_startup_sequence_get_property;261 object_class->get_property = meta_startup_sequence_get_property;
241262
263 seq_signals[SEQ_COMPLETE] =
264 g_signal_new ("complete",
265 META_TYPE_STARTUP_SEQUENCE,
266 G_SIGNAL_RUN_LAST,
267 G_STRUCT_OFFSET (MetaStartupSequenceClass, complete),
268 NULL, NULL, NULL,
269 G_TYPE_NONE, 0);
270
242 seq_props[PROP_SEQ_ID] =271 seq_props[PROP_SEQ_ID] =
243 g_param_spec_string ("id",272 g_param_spec_string ("id",
244 "ID",273 "ID",
@@ -317,7 +346,6 @@ meta_startup_sequence_get_timestamp (MetaStartupSequence *seq)
317void346void
318meta_startup_sequence_complete (MetaStartupSequence *seq)347meta_startup_sequence_complete (MetaStartupSequence *seq)
319{348{
320 MetaStartupSequenceClass *klass;
321 MetaStartupSequencePrivate *priv;349 MetaStartupSequencePrivate *priv;
322350
323 g_return_if_fail (META_IS_STARTUP_SEQUENCE (seq));351 g_return_if_fail (META_IS_STARTUP_SEQUENCE (seq));
@@ -327,10 +355,7 @@ meta_startup_sequence_complete (MetaStartupSequence *seq)
327 return;355 return;
328356
329 priv->completed = TRUE;357 priv->completed = TRUE;
330 klass = META_STARTUP_SEQUENCE_GET_CLASS (seq);358 g_signal_emit (seq, seq_signals[SEQ_COMPLETE], 0);
331
332 if (klass->complete)
333 klass->complete (seq);
334}359}
335360
336gboolean361gboolean
@@ -399,12 +424,22 @@ meta_startup_sequence_get_wmclass (MetaStartupSequence *seq)
399 return priv->wmclass;424 return priv->wmclass;
400}425}
401426
427static void
428on_sequence_completed (MetaStartupSequence *seq,
429 MetaStartupNotification *sn)
430{
431 meta_startup_notification_update_feedback (sn);
432 g_signal_emit (sn, sn_signals[CHANGED], 0, seq);
433}
434
402void435void
403meta_startup_notification_add_sequence (MetaStartupNotification *sn,436meta_startup_notification_add_sequence (MetaStartupNotification *sn,
404 MetaStartupSequence *seq)437 MetaStartupSequence *seq)
405{438{
406 sn->startup_sequences = g_slist_prepend (sn->startup_sequences,439 sn->startup_sequences = g_slist_prepend (sn->startup_sequences,
407 g_object_ref (seq));440 g_object_ref (seq));
441 g_signal_connect (seq, "complete",
442 G_CALLBACK (on_sequence_completed), sn);
408443
409 meta_startup_notification_ensure_timeout (sn);444 meta_startup_notification_ensure_timeout (sn);
410 meta_startup_notification_update_feedback (sn);445 meta_startup_notification_update_feedback (sn);
@@ -425,10 +460,10 @@ collect_timed_out_foreach (void *element,
425460
426 meta_topic (META_DEBUG_STARTUP,461 meta_topic (META_DEBUG_STARTUP,
427 "Sequence used %" G_GINT64_FORMAT " ms vs. %d max: %s\n",462 "Sequence used %" G_GINT64_FORMAT " ms vs. %d max: %s\n",
428 elapsed, STARTUP_TIMEOUT,463 elapsed, STARTUP_TIMEOUT_MS,
429 meta_startup_sequence_get_id (sequence));464 meta_startup_sequence_get_id (sequence));
430465
431 if (elapsed > STARTUP_TIMEOUT)466 if (elapsed > STARTUP_TIMEOUT_MS)
432 ctod->list = g_slist_prepend (ctod->list, sequence);467 ctod->list = g_slist_prepend (ctod->list, sequence);
433}468}
434469
@@ -440,7 +475,7 @@ startup_sequence_timeout (void *data)
440 GSList *l;475 GSList *l;
441476
442 ctod.list = NULL;477 ctod.list = NULL;
443 ctod.now = g_get_monotonic_time ();478 ctod.now = g_get_monotonic_time () / 1000;
444 g_slist_foreach (sn->startup_sequences,479 g_slist_foreach (sn->startup_sequences,
445 collect_timed_out_foreach,480 collect_timed_out_foreach,
446 &ctod);481 &ctod);
@@ -494,6 +529,8 @@ meta_startup_notification_remove_sequence (MetaStartupNotification *sn,
494 sn->startup_sequences = g_slist_remove (sn->startup_sequences, seq);529 sn->startup_sequences = g_slist_remove (sn->startup_sequences, seq);
495 meta_startup_notification_update_feedback (sn);530 meta_startup_notification_update_feedback (sn);
496531
532 g_signal_handlers_disconnect_by_func (seq, on_sequence_completed, sn);
533
497 if (sn->startup_sequences == NULL &&534 if (sn->startup_sequences == NULL &&
498 sn->startup_sequence_timeout != 0)535 sn->startup_sequence_timeout != 0)
499 {536 {
diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c
index 7695d86..099e87a 100644
--- a/src/wayland/meta-wayland-outputs.c
+++ b/src/wayland/meta-wayland-outputs.c
@@ -624,14 +624,14 @@ meta_xdg_output_manager_get_xdg_output (struct wl_client *client,
624 wl_resource_get_version (resource),624 wl_resource_get_version (resource),
625 id);625 id);
626626
627 wl_resource_set_implementation (xdg_output_resource,
628 &meta_xdg_output_interface,
629 NULL, meta_xdg_output_destructor);
630
631 wayland_output = wl_resource_get_user_data (output);627 wayland_output = wl_resource_get_user_data (output);
632 if (!wayland_output)628 if (!wayland_output)
633 return;629 return;
634630
631 wl_resource_set_implementation (xdg_output_resource,
632 &meta_xdg_output_interface,
633 wayland_output, meta_xdg_output_destructor);
634
635 wayland_output->xdg_output_resources =635 wayland_output->xdg_output_resources =
636 g_list_prepend (wayland_output->xdg_output_resources, xdg_output_resource);636 g_list_prepend (wayland_output->xdg_output_resources, xdg_output_resource);
637637
diff --git a/src/x11/meta-startup-notification-x11.c b/src/x11/meta-startup-notification-x11.c
index d681492..99fcf45 100644
--- a/src/x11/meta-startup-notification-x11.c
+++ b/src/x11/meta-startup-notification-x11.c
@@ -151,7 +151,7 @@ meta_startup_sequence_x11_new (SnStartupSequence *seq)
151{151{
152 gint64 timestamp;152 gint64 timestamp;
153153
154 timestamp = sn_startup_sequence_get_timestamp (seq) * 1000;154 timestamp = sn_startup_sequence_get_timestamp (seq);
155 return g_object_new (META_TYPE_STARTUP_SEQUENCE_X11,155 return g_object_new (META_TYPE_STARTUP_SEQUENCE_X11,
156 "id", sn_startup_sequence_get_id (seq),156 "id", sn_startup_sequence_get_id (seq),
157 "icon-name", sn_startup_sequence_get_icon_name (seq),157 "icon-name", sn_startup_sequence_get_icon_name (seq),

Subscribers

People subscribed via source and target branches