Merge ~3v1n0/ubuntu/+source/mutter:ubuntu/master into ~ubuntu-desktop/ubuntu/+source/mutter:ubuntu/master
- Git
- lp:~3v1n0/ubuntu/+source/mutter
- ubuntu/master
- Merge into 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) |
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Iain Lane | Needs Fixing | ||
Daniel van Vugt (community) | Approve | ||
Review via email: mp+366666@code.launchpad.net |
Commit message
Description of the change
Merge 3.32 with debian, fix scale computation crash.
To post a comment you must log in.
- 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 d1a5a33cb6019c1
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/NEWS b/NEWS |
2 | index 720e28d..5606ee4 100644 |
3 | --- a/NEWS |
4 | +++ b/NEWS |
5 | @@ -1,3 +1,33 @@ |
6 | +3.32.1 |
7 | +====== |
8 | +* Fix fallback app menu on wayland [Florian; #493] |
9 | +* Fix elogind support [Tom; !491] |
10 | +* Fix startup notifications not timing out [Carlos; #501] |
11 | +* Fix keyboard accessibility toggle from keys |
12 | + [Olivier, Carlos; !501, #529, !531] |
13 | +* Fix touchscreen input on rotated displays [Carlos; #514] |
14 | +* Work around hangul text input bug [Carlos; #1365] |
15 | +* Fix blurry wallpaper scaling [Daniel; !505] |
16 | +* Fix placement of window menu when using fractional scaling [Jan; #527] |
17 | +* Fix repaint issues of offscreen effects on secondary monitors [Daniel; !511] |
18 | +* Fix windows not getting focus after launch [Daniel; #505] |
19 | +* Properly advertise support for 'underscan' property [Jonas; !507] |
20 | +* Improve power-saving handling [Jonas; !506] |
21 | +* Fix moving windows by super+touch [Jonas D.; !495] |
22 | +* Misc. bug fixes and cleanups [Benjamin, Florian, Adam, Marco, Pablo, |
23 | + Erik, Jonas, Heiher, Pekka, Daniel, Olivier, Carlos; !478, !475, !480, |
24 | + !482, #490, !488, #491, #480, !477, !496, !492, !485, !515, !519, !521, |
25 | + !216, !538, #541, #523] |
26 | + |
27 | +Contributors: |
28 | + Jonas Ådahl, Pablo Barciela, Benjamin Berg, Tom Briden, Jonas Dreßler, |
29 | + Olivier Fourdan, Carlos Garnacho, Jan Alexander Steffens (heftig), Heiher, |
30 | + Adam Jackson, Erik Kurzinger, Florian Müllner, Pekka Paalanen, |
31 | + Marco Trevisan (Treviño), Daniel van Vugt |
32 | + |
33 | +Translators: |
34 | + Khaled Hosny [ar], Goran Vidović [hr], Daniel Mustieles [es] |
35 | + |
36 | 3.32.0 |
37 | ====== |
38 | * Fix deadlock when cancelling a theme sound [Andrea; !474] |
39 | diff --git a/clutter/clutter/clutter-device-manager.c b/clutter/clutter/clutter-device-manager.c |
40 | index 1800d01..c676384 100644 |
41 | --- a/clutter/clutter/clutter-device-manager.c |
42 | +++ b/clutter/clutter/clutter-device-manager.c |
43 | @@ -550,13 +550,7 @@ static gboolean |
44 | are_kbd_a11y_settings_equal (ClutterKbdA11ySettings *a, |
45 | ClutterKbdA11ySettings *b) |
46 | { |
47 | - return (a->controls == b->controls && |
48 | - a->slowkeys_delay == b->slowkeys_delay && |
49 | - a->debounce_delay == b->debounce_delay && |
50 | - a->timeout_delay == b->timeout_delay && |
51 | - a->mousekeys_init_delay == b->mousekeys_init_delay && |
52 | - a->mousekeys_max_speed == b->mousekeys_max_speed && |
53 | - a->mousekeys_accel_time == b->mousekeys_accel_time); |
54 | + return (memcmp (a, b, sizeof (ClutterKbdA11ySettings)) == 0); |
55 | } |
56 | |
57 | void |
58 | diff --git a/clutter/clutter/evdev/clutter-input-device-evdev.c b/clutter/clutter/evdev/clutter-input-device-evdev.c |
59 | index b52689e..2ac2e11 100644 |
60 | --- a/clutter/clutter/evdev/clutter-input-device-evdev.c |
61 | +++ b/clutter/clutter/evdev/clutter-input-device-evdev.c |
62 | @@ -1132,13 +1132,13 @@ clutter_input_device_evdev_process_kbd_a11y_event (ClutterEvent *e |
63 | if (event->key.flags & CLUTTER_EVENT_FLAG_INPUT_METHOD) |
64 | goto emit_event; |
65 | |
66 | - if (!(device_evdev->a11y_flags & CLUTTER_A11Y_KEYBOARD_ENABLED)) |
67 | - goto emit_event; |
68 | - |
69 | - if (event->type == CLUTTER_KEY_PRESS) |
70 | - handle_enablekeys_press (event, device_evdev); |
71 | - else |
72 | - handle_enablekeys_release (event, device_evdev); |
73 | + if (device_evdev->a11y_flags & CLUTTER_A11Y_KEYBOARD_ENABLED) |
74 | + { |
75 | + if (event->type == CLUTTER_KEY_PRESS) |
76 | + handle_enablekeys_press (event, device_evdev); |
77 | + else |
78 | + handle_enablekeys_release (event, device_evdev); |
79 | + } |
80 | |
81 | if (device_evdev->a11y_flags & CLUTTER_A11Y_MOUSE_KEYS_ENABLED) |
82 | { |
83 | diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c |
84 | index 2623d02..235cfe8 100644 |
85 | --- a/cogl/cogl/winsys/cogl-winsys-glx.c |
86 | +++ b/cogl/cogl/winsys/cogl-winsys-glx.c |
87 | @@ -99,9 +99,9 @@ typedef struct _CoglOnscreenGLX |
88 | CoglOnscreenXlib _parent; |
89 | GLXDrawable glxwin; |
90 | uint32_t last_swap_vsync_counter; |
91 | - gboolean pending_sync_notify; |
92 | - gboolean pending_complete_notify; |
93 | - gboolean pending_resize_notify; |
94 | + uint32_t pending_sync_notify; |
95 | + uint32_t pending_complete_notify; |
96 | + uint32_t pending_resize_notify; |
97 | |
98 | GThread *swap_wait_thread; |
99 | GQueue *swap_wait_queue; |
100 | @@ -347,35 +347,35 @@ flush_pending_notifications_cb (void *data, |
101 | { |
102 | CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); |
103 | CoglOnscreenGLX *glx_onscreen = onscreen->winsys; |
104 | - gboolean pending_sync_notify = glx_onscreen->pending_sync_notify; |
105 | - gboolean pending_complete_notify = glx_onscreen->pending_complete_notify; |
106 | |
107 | - /* If swap_region is called then notifying the sync event could |
108 | - * potentially immediately queue a subsequent pending notify so |
109 | - * we need to clear the flag before invoking the callback */ |
110 | - glx_onscreen->pending_sync_notify = FALSE; |
111 | - glx_onscreen->pending_complete_notify = FALSE; |
112 | - |
113 | - if (pending_sync_notify) |
114 | + while (glx_onscreen->pending_sync_notify > 0 || |
115 | + glx_onscreen->pending_complete_notify > 0 || |
116 | + glx_onscreen->pending_resize_notify > 0) |
117 | { |
118 | - CoglFrameInfo *info = g_queue_peek_head (&onscreen->pending_frame_infos); |
119 | - |
120 | - _cogl_onscreen_notify_frame_sync (onscreen, info); |
121 | - } |
122 | + if (glx_onscreen->pending_sync_notify > 0) |
123 | + { |
124 | + CoglFrameInfo *info = |
125 | + g_queue_peek_head (&onscreen->pending_frame_infos); |
126 | |
127 | - if (pending_complete_notify) |
128 | - { |
129 | - CoglFrameInfo *info = g_queue_pop_head (&onscreen->pending_frame_infos); |
130 | + _cogl_onscreen_notify_frame_sync (onscreen, info); |
131 | + glx_onscreen->pending_sync_notify--; |
132 | + } |
133 | |
134 | - _cogl_onscreen_notify_complete (onscreen, info); |
135 | + if (glx_onscreen->pending_complete_notify > 0) |
136 | + { |
137 | + CoglFrameInfo *info = |
138 | + g_queue_pop_head (&onscreen->pending_frame_infos); |
139 | |
140 | - cogl_object_unref (info); |
141 | - } |
142 | + _cogl_onscreen_notify_complete (onscreen, info); |
143 | + cogl_object_unref (info); |
144 | + glx_onscreen->pending_complete_notify--; |
145 | + } |
146 | |
147 | - if (glx_onscreen->pending_resize_notify) |
148 | - { |
149 | - _cogl_onscreen_notify_resize (onscreen); |
150 | - glx_onscreen->pending_resize_notify = FALSE; |
151 | + if (glx_onscreen->pending_resize_notify > 0) |
152 | + { |
153 | + _cogl_onscreen_notify_resize (onscreen); |
154 | + glx_onscreen->pending_resize_notify--; |
155 | + } |
156 | } |
157 | } |
158 | } |
159 | @@ -417,7 +417,7 @@ set_sync_pending (CoglOnscreen *onscreen) |
160 | NULL); |
161 | } |
162 | |
163 | - glx_onscreen->pending_sync_notify = TRUE; |
164 | + glx_onscreen->pending_sync_notify++; |
165 | } |
166 | |
167 | static void |
168 | @@ -440,7 +440,7 @@ set_complete_pending (CoglOnscreen *onscreen) |
169 | NULL); |
170 | } |
171 | |
172 | - glx_onscreen->pending_complete_notify = TRUE; |
173 | + glx_onscreen->pending_complete_notify++; |
174 | } |
175 | |
176 | static void |
177 | @@ -533,7 +533,7 @@ notify_resize (CoglContext *context, |
178 | NULL); |
179 | } |
180 | |
181 | - glx_onscreen->pending_resize_notify = TRUE; |
182 | + glx_onscreen->pending_resize_notify++; |
183 | |
184 | if (!xlib_onscreen->is_foreign_xwin) |
185 | { |
186 | diff --git a/debian/changelog b/debian/changelog |
187 | index cd3e63e..93fea65 100644 |
188 | --- a/debian/changelog |
189 | +++ b/debian/changelog |
190 | @@ -1,3 +1,32 @@ |
191 | +mutter (3.32.1-1ubuntu1) UNRELEASED; urgency=medium |
192 | + |
193 | + * Merge with debian |
194 | + - Update to 3.32.1 upstream version (LP: #1826936) |
195 | + - Fix applications aren't focused in Wayland session (LP: #1826176) |
196 | + - Fix crash on hotplugging a dock with a monitor (LP: #1826182) |
197 | + Remaining changes: |
198 | + + debian/control: |
199 | + - Update VCS flags to point to launchpad |
200 | + - Update maintainer to ubuntu |
201 | + + debian/gbp.conf: update branch to point to ubuntu/master |
202 | + + debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch: |
203 | + - X11: Add support for fractional scaling using Randr |
204 | + * d/p/compositor-Destroy-window-actors-list-on-destruction.patch: |
205 | + - compositor: Destroy window actors list on destruction (LP: #1813716) |
206 | + * d/p/x11-Add-support-for-fractional-scaling-using-Randr.patch: |
207 | + - Fixed crash on calculation of global scale (LP: #1826933) |
208 | + - Refreshed as per compositor code changes due to cherry-picked patch |
209 | + |
210 | + -- Marco Trevisan (Treviño) <marco@ubuntu.com> Mon, 29 Apr 2019 16:08:24 -0500 |
211 | + |
212 | +mutter (3.32.1-1) experimental; urgency=medium |
213 | + |
214 | + * New upstream release |
215 | + * debian/patches: disable mousekeys with Numlock ON to match the |
216 | + documentation (cherry picked from the 3.32 branch) |
217 | + |
218 | + -- Laurent Bigonville <bigon@debian.org> Mon, 22 Apr 2019 21:57:33 +0200 |
219 | + |
220 | mutter (3.32.0+git20190410-2) experimental; urgency=medium |
221 | |
222 | [ Gunnar Hjalmarsson ] |
223 | diff --git a/debian/patches/clutter-evdev-disable-mousekeys-with-Numlock-ON.patch b/debian/patches/clutter-evdev-disable-mousekeys-with-Numlock-ON.patch |
224 | new file mode 100644 |
225 | index 0000000..5c70efe |
226 | --- /dev/null |
227 | +++ b/debian/patches/clutter-evdev-disable-mousekeys-with-Numlock-ON.patch |
228 | @@ -0,0 +1,64 @@ |
229 | +From: Olivier Fourdan <ofourdan@redhat.com> |
230 | +Date: Tue, 9 Apr 2019 13:39:59 +0200 |
231 | +Subject: clutter/evdev: disable mousekeys with Numlock ON |
232 | + |
233 | +The clutter/evdev implementation of mousekeys is designed after the |
234 | +current implementation in X11, and works when the setting is enabled |
235 | +regardless of the status of NumLock. |
236 | + |
237 | +The GNOME documentation on accessibility features states however that |
238 | +mousekeys work only when NumLock is OFF: |
239 | + |
240 | + https://help.gnome.org/users/gnome-help/stable/mouse-mousekeys.html |
241 | + |
242 | +Change the clutter/evdev implementation to match the documentation, i.e. |
243 | +disable mousekeys when NumLock in ON so that switching NumLock ON |
244 | +restores the numeric keypad behaviour. |
245 | + |
246 | +Closes: https://gitlab.gnome.org/GNOME/mutter/issues/530 |
247 | +(cherry picked from commit 471b61bd1400435b7af977c47c21b8fc747530d9) |
248 | +--- |
249 | + clutter/clutter/evdev/clutter-input-device-evdev.c | 16 ++++++++++++++++ |
250 | + 1 file changed, 16 insertions(+) |
251 | + |
252 | +diff --git a/clutter/clutter/evdev/clutter-input-device-evdev.c b/clutter/clutter/evdev/clutter-input-device-evdev.c |
253 | +index 2ac2e11..73072b4 100644 |
254 | +--- a/clutter/clutter/evdev/clutter-input-device-evdev.c |
255 | ++++ b/clutter/clutter/evdev/clutter-input-device-evdev.c |
256 | +@@ -855,6 +855,14 @@ emulate_pointer_motion (ClutterInputDeviceEvdev *device, |
257 | + clutter_virtual_input_device_notify_relative_motion (device->mousekeys_virtual_device, |
258 | + time_us, dx_motion, dy_motion); |
259 | + } |
260 | ++static gboolean |
261 | ++is_numlock_active (ClutterInputDeviceEvdev *device) |
262 | ++{ |
263 | ++ ClutterSeatEvdev *seat = device->seat; |
264 | ++ return xkb_state_mod_name_is_active (seat->xkb, |
265 | ++ "Mod2", |
266 | ++ XKB_STATE_MODS_LOCKED); |
267 | ++} |
268 | + |
269 | + static void |
270 | + enable_mousekeys (ClutterInputDeviceEvdev *device) |
271 | +@@ -1013,6 +1021,10 @@ handle_mousekeys_press (ClutterEvent *event, |
272 | + if (!(event->key.flags & CLUTTER_EVENT_FLAG_SYNTHETIC)) |
273 | + stop_mousekeys_move (device); |
274 | + |
275 | ++ /* Do not handle mousekeys if NumLock is ON */ |
276 | ++ if (is_numlock_active (device)) |
277 | ++ return FALSE; |
278 | ++ |
279 | + /* Button selection */ |
280 | + switch (event->key.keyval) |
281 | + { |
282 | +@@ -1084,6 +1096,10 @@ static gboolean |
283 | + handle_mousekeys_release (ClutterEvent *event, |
284 | + ClutterInputDeviceEvdev *device) |
285 | + { |
286 | ++ /* Do not handle mousekeys if NumLock is ON */ |
287 | ++ if (is_numlock_active (device)) |
288 | ++ return FALSE; |
289 | ++ |
290 | + switch (event->key.keyval) |
291 | + { |
292 | + case XKB_KEY_KP_0: |
293 | diff --git a/debian/patches/clutter-x11-disable-mousekeys-with-Numlock-ON.patch b/debian/patches/clutter-x11-disable-mousekeys-with-Numlock-ON.patch |
294 | new file mode 100644 |
295 | index 0000000..d33c9aa |
296 | --- /dev/null |
297 | +++ b/debian/patches/clutter-x11-disable-mousekeys-with-Numlock-ON.patch |
298 | @@ -0,0 +1,85 @@ |
299 | +From: Olivier Fourdan <ofourdan@redhat.com> |
300 | +Date: Tue, 9 Apr 2019 16:25:57 +0200 |
301 | +Subject: clutter/x11: disable mousekeys with Numlock ON |
302 | + |
303 | +GNOME documentation on accessibility features states that mousekeys |
304 | +work only when NumLock is OFF: |
305 | + |
306 | + https://help.gnome.org/users/gnome-help/stable/mouse-mousekeys.html |
307 | + |
308 | +Change the clutter/x11 implementation to match the documentation, i.e. |
309 | +disable mousekeys when NumLock in ON so that switching NumLock ON |
310 | +restores the numeric keypad behaviour. |
311 | + |
312 | +Closes: https://gitlab.gnome.org/GNOME/mutter/issues/530 |
313 | +(cherry picked from commit 251fa024c416b1507a8cb1c9115082be87d25632) |
314 | +--- |
315 | + clutter/clutter/x11/clutter-backend-x11.c | 20 ++++++++++++++++++++ |
316 | + clutter/clutter/x11/clutter-xkb-a11y-x11.c | 9 +++++++-- |
317 | + 2 files changed, 27 insertions(+), 2 deletions(-) |
318 | + |
319 | +diff --git a/clutter/clutter/x11/clutter-backend-x11.c b/clutter/clutter/x11/clutter-backend-x11.c |
320 | +index 0ddd0f8..8c5ebc8 100644 |
321 | +--- a/clutter/clutter/x11/clutter-backend-x11.c |
322 | ++++ b/clutter/clutter/x11/clutter-backend-x11.c |
323 | +@@ -54,6 +54,7 @@ |
324 | + #include "clutter-main.h" |
325 | + #include "clutter-private.h" |
326 | + #include "clutter-settings-private.h" |
327 | ++#include "clutter-xkb-a11y-x11.h" |
328 | + |
329 | + G_DEFINE_TYPE (ClutterBackendX11, clutter_backend_x11, CLUTTER_TYPE_BACKEND) |
330 | + |
331 | +@@ -276,6 +277,20 @@ clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11) |
332 | + _clutter_backend_add_event_translator (backend, translator); |
333 | + } |
334 | + |
335 | ++static void |
336 | ++on_keymap_state_change (ClutterKeymapX11 *keymap_x11, |
337 | ++ gpointer data) |
338 | ++{ |
339 | ++ ClutterDeviceManager *device_manager = CLUTTER_DEVICE_MANAGER (data); |
340 | ++ ClutterKbdA11ySettings kbd_a11y_settings; |
341 | ++ |
342 | ++ /* On keymaps state change, just reapply the current settings, it'll |
343 | ++ * take care of enabling/disabling mousekeys based on NumLock state. |
344 | ++ */ |
345 | ++ clutter_device_manager_get_kbd_a11y_settings (device_manager, &kbd_a11y_settings); |
346 | ++ clutter_device_manager_x11_apply_kbd_a11y_settings (device_manager, &kbd_a11y_settings); |
347 | ++} |
348 | ++ |
349 | + static void |
350 | + clutter_backend_x11_create_keymap (ClutterBackendX11 *backend_x11) |
351 | + { |
352 | +@@ -292,6 +307,11 @@ clutter_backend_x11_create_keymap (ClutterBackendX11 *backend_x11) |
353 | + backend = CLUTTER_BACKEND (backend_x11); |
354 | + translator = CLUTTER_EVENT_TRANSLATOR (backend_x11->keymap); |
355 | + _clutter_backend_add_event_translator (backend, translator); |
356 | ++ |
357 | ++ g_signal_connect (backend_x11->keymap, |
358 | ++ "state-changed", |
359 | ++ G_CALLBACK (on_keymap_state_change), |
360 | ++ backend->device_manager); |
361 | + } |
362 | + } |
363 | + |
364 | +diff --git a/clutter/clutter/x11/clutter-xkb-a11y-x11.c b/clutter/clutter/x11/clutter-xkb-a11y-x11.c |
365 | +index 6adde81..6b782c7 100644 |
366 | +--- a/clutter/clutter/x11/clutter-xkb-a11y-x11.c |
367 | ++++ b/clutter/clutter/x11/clutter-xkb-a11y-x11.c |
368 | +@@ -241,8 +241,13 @@ clutter_device_manager_x11_apply_kbd_a11y_settings (ClutterDeviceManager *devi |
369 | + } |
370 | + |
371 | + /* mouse keys */ |
372 | +- if (set_xkb_ctrl (desc, kbd_a11y_settings->controls, |
373 | +- CLUTTER_A11Y_MOUSE_KEYS_ENABLED, XkbMouseKeysMask | XkbMouseKeysAccelMask)) |
374 | ++ if (clutter_keymap_get_num_lock_state (CLUTTER_KEYMAP (backend_x11->keymap))) |
375 | ++ { |
376 | ++ /* Disable mousekeys when NumLock is ON */ |
377 | ++ desc->ctrls->enabled_ctrls &= ~(XkbMouseKeysMask | XkbMouseKeysAccelMask); |
378 | ++ } |
379 | ++ else if (set_xkb_ctrl (desc, kbd_a11y_settings->controls, |
380 | ++ CLUTTER_A11Y_MOUSE_KEYS_ENABLED, XkbMouseKeysMask | XkbMouseKeysAccelMask)) |
381 | + { |
382 | + gint mk_max_speed; |
383 | + gint mk_accel_time; |
384 | diff --git a/debian/patches/compositor-Destroy-window-actors-list-on-destruction.patch b/debian/patches/compositor-Destroy-window-actors-list-on-destruction.patch |
385 | new file mode 100644 |
386 | index 0000000..70205bc |
387 | --- /dev/null |
388 | +++ b/debian/patches/compositor-Destroy-window-actors-list-on-destruction.patch |
389 | @@ -0,0 +1,63 @@ |
390 | +From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net> |
391 | +Date: Mon, 29 Apr 2019 14:57:03 -0500 |
392 | +Subject: compositor: Destroy window actors list on destruction |
393 | + |
394 | +When the compositor is destroyed we should cleanup the list of window actors we |
395 | +created and destroy them. |
396 | +Since all the actors are added to the window_group or top_window_group we can |
397 | +just destroy these containers (together with the feedback_group), and simply |
398 | +free the windows list. |
399 | + |
400 | +This is particularly needed under X11 because before we destroy the display, we |
401 | +might do some cleanups as detaching the surface pixmaps and freeing the damages |
402 | +and if this happens at later point (for example when triggered by garbage |
403 | +collector in gnome-shell), we might crash because the x11 dpy reference is |
404 | +already gone. |
405 | + |
406 | +Destroying the window actors instead, ensures we avoid any further call to X11 |
407 | +related functions and that we release the actors XServer resources. |
408 | + |
409 | +Fixes https://gitlab.gnome.org/GNOME/mutter/issues/576 |
410 | + |
411 | +Ubuntu-Bug: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1813716 |
412 | +Origin: https://gitlab.gnome.org/GNOME/mutter/merge_requests/557 |
413 | +Applied-Upstream: 3.32.2 |
414 | +--- |
415 | + src/compositor/compositor.c | 17 +++++++++++++++++ |
416 | + 1 file changed, 17 insertions(+) |
417 | + |
418 | +diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c |
419 | +index 0854a19..f47889f 100644 |
420 | +--- a/src/compositor/compositor.c |
421 | ++++ b/src/compositor/compositor.c |
422 | +@@ -92,6 +92,10 @@ on_presented (ClutterStage *stage, |
423 | + ClutterFrameInfo *frame_info, |
424 | + MetaCompositor *compositor); |
425 | + |
426 | ++static void |
427 | ++on_top_window_actor_destroyed (MetaWindowActor *window_actor, |
428 | ++ MetaCompositor *compositor); |
429 | ++ |
430 | + static gboolean |
431 | + is_modal (MetaDisplay *display) |
432 | + { |
433 | +@@ -134,6 +138,19 @@ meta_compositor_destroy (MetaCompositor *compositor) |
434 | + clutter_threads_remove_repaint_func (compositor->pre_paint_func_id); |
435 | + clutter_threads_remove_repaint_func (compositor->post_paint_func_id); |
436 | + |
437 | ++ if (compositor->top_window_actor) |
438 | ++ { |
439 | ++ g_signal_handlers_disconnect_by_func (compositor->top_window_actor, |
440 | ++ on_top_window_actor_destroyed, |
441 | ++ compositor); |
442 | ++ compositor->top_window_actor = NULL; |
443 | ++ } |
444 | ++ |
445 | ++ g_clear_pointer (&compositor->window_group, clutter_actor_destroy); |
446 | ++ g_clear_pointer (&compositor->top_window_group, clutter_actor_destroy); |
447 | ++ g_clear_pointer (&compositor->feedback_group, clutter_actor_destroy); |
448 | ++ g_clear_pointer (&compositor->windows, g_list_free); |
449 | ++ |
450 | + if (compositor->have_x11_sync_object) |
451 | + meta_sync_ring_destroy (); |
452 | + } |
453 | diff --git a/debian/patches/meson-add-back-default_driver-option.patch b/debian/patches/meson-add-back-default_driver-option.patch |
454 | index b79207c..531b95f 100644 |
455 | --- a/debian/patches/meson-add-back-default_driver-option.patch |
456 | +++ b/debian/patches/meson-add-back-default_driver-option.patch |
457 | @@ -44,7 +44,7 @@ index 356d596..2ab83bd 100644 |
458 | input: 'cogl-config.h.meson', |
459 | output: 'cogl-config.h', |
460 | diff --git a/meson.build b/meson.build |
461 | -index 6ce9e59..bebe8eb 100644 |
462 | +index 1c86575..19aae12 100644 |
463 | --- a/meson.build |
464 | +++ b/meson.build |
465 | @@ -210,6 +210,8 @@ if have_wayland_eglstream |
466 | diff --git a/debian/patches/series b/debian/patches/series |
467 | index 5e2b370..4c4ad35 100644 |
468 | --- a/debian/patches/series |
469 | +++ b/debian/patches/series |
470 | @@ -2,4 +2,7 @@ theme-use-gtk_render_icon_suface-to-paint-button-icon.patch |
471 | theme-load-icons-as-Gtk-does-with-fallback-and-RTL-suppor.patch |
472 | meson-add-back-default_driver-option.patch |
473 | debian/synaptics-support.patch |
474 | +clutter-evdev-disable-mousekeys-with-Numlock-ON.patch |
475 | +clutter-x11-disable-mousekeys-with-Numlock-ON.patch |
476 | +compositor-Destroy-window-actors-list-on-destruction.patch |
477 | x11-Add-support-for-fractional-scaling-using-Randr.patch |
478 | 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 |
479 | index 7717be1..6a1e047 100644 |
480 | --- a/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch |
481 | +++ b/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch |
482 | @@ -1,5 +1,5 @@ |
483 | From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net> |
484 | -Date: Wed, 3 Apr 2019 19:18:03 -0400 |
485 | +Date: Wed, 3 Apr 2019 17:18:03 -0600 |
486 | Subject: x11-Add-support-for-fractional-scaling-using-Randr |
487 | |
488 | Add scaling support using randr under x11. |
489 | @@ -30,13 +30,13 @@ Forwarded: No, forwarding is in progress and planned though |
490 | src/backends/x11/meta-monitor-manager-xrandr.c | 485 ++++++++++++++++++------- |
491 | src/backends/x11/meta-monitor-manager-xrandr.h | 4 +- |
492 | src/backends/x11/meta-output-xrandr.c | 5 +- |
493 | - src/compositor/compositor.c | 54 +++ |
494 | + src/compositor/compositor.c | 57 +++ |
495 | src/core/boxes-private.h | 4 + |
496 | src/core/boxes.c | 21 ++ |
497 | src/core/window.c | 19 + |
498 | src/org.gnome.Mutter.DisplayConfig.xml | 5 + |
499 | src/tests/meta-monitor-manager-test.c | 14 +- |
500 | - 28 files changed, 1358 insertions(+), 260 deletions(-) |
501 | + 28 files changed, 1361 insertions(+), 260 deletions(-) |
502 | create mode 100644 data/org.gnome.mutter.x11.gschema.xml.in |
503 | |
504 | diff --git a/data/meson.build b/data/meson.build |
505 | @@ -724,7 +724,7 @@ index cdb8f42..bf586ea 100644 |
506 | meta_monitor_manager_get_capabilities (MetaMonitorManager *manager); |
507 | |
508 | diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c |
509 | -index 2d898c7..a78fb37 100644 |
510 | +index 2d898c7..d8cf3ae 100644 |
511 | --- a/src/backends/meta-monitor-manager.c |
512 | +++ b/src/backends/meta-monitor-manager.c |
513 | @@ -110,8 +110,18 @@ static gboolean |
514 | @@ -838,7 +838,7 @@ index 2d898c7..a78fb37 100644 |
515 | |
516 | - if (!monitor || !meta_monitor_is_active (monitor)) |
517 | - monitor = meta_monitor_manager_get_active_monitor (manager); |
518 | -+ if (monitor) |
519 | ++ if (monitor && meta_monitor_is_active (monitor)) |
520 | + { |
521 | + scale = calculate_monitor_scale (manager, monitor); |
522 | + if (meta_monitor_manager_is_scale_supported_by_other_monitors (manager, |
523 | @@ -2832,12 +2832,12 @@ index 515389d..3bc7f0b 100644 |
524 | |
525 | tile_atom = XInternAtom (xdisplay, "TILE", FALSE); |
526 | diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c |
527 | -index 0854a19..e412784 100644 |
528 | +index f47889f..28f2b4f 100644 |
529 | --- a/src/compositor/compositor.c |
530 | +++ b/src/compositor/compositor.c |
531 | -@@ -92,6 +92,11 @@ on_presented (ClutterStage *stage, |
532 | - ClutterFrameInfo *frame_info, |
533 | - MetaCompositor *compositor); |
534 | +@@ -96,6 +96,11 @@ static void |
535 | + on_top_window_actor_destroyed (MetaWindowActor *window_actor, |
536 | + MetaCompositor *compositor); |
537 | |
538 | +static void |
539 | +on_redirected_monitor_changed (MetaWindow *window, |
540 | @@ -2847,19 +2847,22 @@ index 0854a19..e412784 100644 |
541 | static gboolean |
542 | is_modal (MetaDisplay *display) |
543 | { |
544 | -@@ -134,6 +139,11 @@ meta_compositor_destroy (MetaCompositor *compositor) |
545 | - clutter_threads_remove_repaint_func (compositor->pre_paint_func_id); |
546 | - clutter_threads_remove_repaint_func (compositor->post_paint_func_id); |
547 | +@@ -146,6 +151,14 @@ meta_compositor_destroy (MetaCompositor *compositor) |
548 | + compositor->top_window_actor = NULL; |
549 | + } |
550 | |
551 | + if (compositor->unredirected_window) |
552 | -+ g_signal_handlers_disconnect_by_func (compositor->unredirected_window, |
553 | -+ on_redirected_monitor_changed, |
554 | -+ compositor); |
555 | ++ { |
556 | ++ g_signal_handlers_disconnect_by_func (compositor->unredirected_window, |
557 | ++ on_redirected_monitor_changed, |
558 | ++ compositor); |
559 | ++ compositor->unredirected_window = NULL; |
560 | ++ } |
561 | + |
562 | - if (compositor->have_x11_sync_object) |
563 | - meta_sync_ring_destroy (); |
564 | - } |
565 | -@@ -635,16 +645,54 @@ meta_shape_cow_for_window (MetaCompositor *compositor, |
566 | + g_clear_pointer (&compositor->window_group, clutter_actor_destroy); |
567 | + g_clear_pointer (&compositor->top_window_group, clutter_actor_destroy); |
568 | + g_clear_pointer (&compositor->feedback_group, clutter_actor_destroy); |
569 | +@@ -652,16 +665,54 @@ meta_shape_cow_for_window (MetaCompositor *compositor, |
570 | } |
571 | } |
572 | |
573 | @@ -2914,7 +2917,7 @@ index 0854a19..e412784 100644 |
574 | meta_window_actor_set_unredirected (window_actor, FALSE); |
575 | } |
576 | |
577 | -@@ -654,6 +702,12 @@ set_unredirected_window (MetaCompositor *compositor, |
578 | +@@ -671,6 +722,12 @@ set_unredirected_window (MetaCompositor *compositor, |
579 | if (compositor->unredirected_window != NULL) |
580 | { |
581 | MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (compositor->unredirected_window)); |
582 | diff --git a/meson.build b/meson.build |
583 | index 6ce9e59..1c86575 100644 |
584 | --- a/meson.build |
585 | +++ b/meson.build |
586 | @@ -1,5 +1,5 @@ |
587 | project('mutter', 'c', |
588 | - version: '3.32.0', |
589 | + version: '3.32.1', |
590 | meson_version: '>= 0.48.0', |
591 | license: 'GPLv2+' |
592 | ) |
593 | diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c |
594 | index 086e8e4..dbfc97a 100644 |
595 | --- a/src/backends/native/meta-renderer-native.c |
596 | +++ b/src/backends/native/meta-renderer-native.c |
597 | @@ -3787,16 +3787,13 @@ gpu_kms_is_hardware_rendering (MetaRendererNative *renderer_native, |
598 | return data->secondary.is_hardware_rendering; |
599 | } |
600 | |
601 | -static MetaRendererNativeGpuData * |
602 | -create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native, |
603 | - MetaGpuKms *gpu_kms, |
604 | - GError **error) |
605 | +static EGLDisplay |
606 | +init_gbm_egl_display (MetaRendererNative *renderer_native, |
607 | + struct gbm_device *gbm_device, |
608 | + GError **error) |
609 | { |
610 | MetaEgl *egl = meta_renderer_native_get_egl (renderer_native); |
611 | - struct gbm_device *gbm_device; |
612 | EGLDisplay egl_display; |
613 | - int kms_fd; |
614 | - MetaRendererNativeGpuData *renderer_gpu_data; |
615 | |
616 | if (!meta_egl_has_extensions (egl, EGL_NO_DISPLAY, NULL, |
617 | "EGL_MESA_platform_gbm", |
618 | @@ -3808,9 +3805,31 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native, |
619 | g_set_error (error, G_IO_ERROR, |
620 | G_IO_ERROR_FAILED, |
621 | "Missing extension for GBM renderer: EGL_KHR_platform_gbm"); |
622 | - return NULL; |
623 | + return EGL_NO_DISPLAY; |
624 | } |
625 | |
626 | + egl_display = meta_egl_get_platform_display (egl, |
627 | + EGL_PLATFORM_GBM_KHR, |
628 | + gbm_device, NULL, error); |
629 | + if (egl_display == EGL_NO_DISPLAY) |
630 | + return EGL_NO_DISPLAY; |
631 | + |
632 | + if (!meta_egl_initialize (egl, egl_display, error)) |
633 | + return EGL_NO_DISPLAY; |
634 | + |
635 | + return egl_display; |
636 | +} |
637 | + |
638 | +static MetaRendererNativeGpuData * |
639 | +create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native, |
640 | + MetaGpuKms *gpu_kms, |
641 | + GError **error) |
642 | +{ |
643 | + struct gbm_device *gbm_device; |
644 | + int kms_fd; |
645 | + MetaRendererNativeGpuData *renderer_gpu_data; |
646 | + g_autoptr (GError) local_error = NULL; |
647 | + |
648 | kms_fd = meta_gpu_kms_get_fd (gpu_kms); |
649 | |
650 | gbm_device = gbm_create_device (kms_fd); |
651 | @@ -3822,26 +3841,25 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native, |
652 | return NULL; |
653 | } |
654 | |
655 | - egl_display = meta_egl_get_platform_display (egl, |
656 | - EGL_PLATFORM_GBM_KHR, |
657 | - gbm_device, NULL, error); |
658 | - if (egl_display == EGL_NO_DISPLAY) |
659 | - { |
660 | - gbm_device_destroy (gbm_device); |
661 | - return NULL; |
662 | - } |
663 | - |
664 | - if (!meta_egl_initialize (egl, egl_display, error)) |
665 | - return NULL; |
666 | - |
667 | renderer_gpu_data = meta_create_renderer_native_gpu_data (gpu_kms); |
668 | renderer_gpu_data->renderer_native = renderer_native; |
669 | renderer_gpu_data->gbm.device = gbm_device; |
670 | renderer_gpu_data->mode = META_RENDERER_NATIVE_MODE_GBM; |
671 | - renderer_gpu_data->egl_display = egl_display; |
672 | |
673 | - init_secondary_gpu_data (renderer_gpu_data); |
674 | + renderer_gpu_data->egl_display = init_gbm_egl_display (renderer_native, |
675 | + gbm_device, |
676 | + &local_error); |
677 | + if (renderer_gpu_data->egl_display == EGL_NO_DISPLAY) |
678 | + { |
679 | + g_debug ("GBM EGL init for %s failed: %s", |
680 | + meta_gpu_kms_get_file_path (gpu_kms), |
681 | + local_error->message); |
682 | |
683 | + init_secondary_gpu_data_cpu (renderer_gpu_data); |
684 | + return renderer_gpu_data; |
685 | + } |
686 | + |
687 | + init_secondary_gpu_data (renderer_gpu_data); |
688 | return renderer_gpu_data; |
689 | } |
690 | |
691 | @@ -4134,8 +4152,8 @@ on_gpu_added (MetaMonitorManager *monitor_manager, |
692 | } |
693 | |
694 | static MetaGpuKms * |
695 | -choose_primary_gpu (MetaMonitorManager *manager, |
696 | - MetaRendererNative *renderer_native) |
697 | +choose_primary_gpu_unchecked (MetaMonitorManager *manager, |
698 | + MetaRendererNative *renderer_native) |
699 | { |
700 | GList *gpus = meta_monitor_manager_get_gpus (manager); |
701 | GList *l; |
702 | @@ -4184,6 +4202,28 @@ choose_primary_gpu (MetaMonitorManager *manager, |
703 | return NULL; |
704 | } |
705 | |
706 | +static MetaGpuKms * |
707 | +choose_primary_gpu (MetaMonitorManager *manager, |
708 | + MetaRendererNative *renderer_native, |
709 | + GError **error) |
710 | +{ |
711 | + MetaGpuKms *gpu_kms; |
712 | + MetaRendererNativeGpuData *renderer_gpu_data; |
713 | + |
714 | + gpu_kms = choose_primary_gpu_unchecked (manager, renderer_native); |
715 | + renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native, |
716 | + gpu_kms); |
717 | + if (renderer_gpu_data->egl_display == EGL_NO_DISPLAY) |
718 | + { |
719 | + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, |
720 | + "The GPU %s chosen as primary is not supported by EGL.", |
721 | + meta_gpu_kms_get_file_path (gpu_kms)); |
722 | + return NULL; |
723 | + } |
724 | + |
725 | + return gpu_kms; |
726 | +} |
727 | + |
728 | static gboolean |
729 | meta_renderer_native_initable_init (GInitable *initable, |
730 | GCancellable *cancellable, |
731 | @@ -4207,7 +4247,10 @@ meta_renderer_native_initable_init (GInitable *initable, |
732 | } |
733 | |
734 | renderer_native->primary_gpu_kms = choose_primary_gpu (monitor_manager, |
735 | - renderer_native); |
736 | + renderer_native, |
737 | + error); |
738 | + if (!renderer_native->primary_gpu_kms) |
739 | + return FALSE; |
740 | |
741 | return TRUE; |
742 | } |
743 | diff --git a/src/core/display.c b/src/core/display.c |
744 | index e1477d3..0de99ed 100644 |
745 | --- a/src/core/display.c |
746 | +++ b/src/core/display.c |
747 | @@ -2236,7 +2236,7 @@ meta_display_get_tab_list (MetaDisplay *display, |
748 | MetaWindow *l_window = w->data; |
749 | |
750 | if (l_window->wm_state_demands_attention && |
751 | - l_window->workspace != workspace && |
752 | + !meta_window_located_on_workspace (l_window, workspace) && |
753 | IN_TAB_CHAIN (l_window, type)) |
754 | tab_list = g_list_prepend (tab_list, l_window); |
755 | } |
756 | diff --git a/src/core/keybindings.c b/src/core/keybindings.c |
757 | index 478d4d8..a99899f 100644 |
758 | --- a/src/core/keybindings.c |
759 | +++ b/src/core/keybindings.c |
760 | @@ -2214,6 +2214,8 @@ meta_keybindings_process_event (MetaDisplay *display, |
761 | { |
762 | case CLUTTER_BUTTON_PRESS: |
763 | case CLUTTER_BUTTON_RELEASE: |
764 | + case CLUTTER_TOUCH_BEGIN: |
765 | + case CLUTTER_TOUCH_END: |
766 | keys->overlay_key_only_pressed = FALSE; |
767 | return FALSE; |
768 | |
769 | diff --git a/src/core/startup-notification.c b/src/core/startup-notification.c |
770 | index d2d0d13..4cd51ac 100644 |
771 | --- a/src/core/startup-notification.c |
772 | +++ b/src/core/startup-notification.c |
773 | @@ -37,7 +37,7 @@ |
774 | * OpenOffice or whatever seems to stop launching - people |
775 | * might decide they need to launch it again. |
776 | */ |
777 | -#define STARTUP_TIMEOUT 15000000 |
778 | +#define STARTUP_TIMEOUT_MS 15000 |
779 | |
780 | enum |
781 | { |
782 | @@ -61,12 +61,19 @@ enum |
783 | |
784 | enum |
785 | { |
786 | + SEQ_COMPLETE, |
787 | + N_SEQ_SIGNALS |
788 | +}; |
789 | + |
790 | +enum |
791 | +{ |
792 | CHANGED, |
793 | N_SIGNALS |
794 | }; |
795 | |
796 | static guint sn_signals[N_SIGNALS]; |
797 | static GParamSpec *sn_props[N_PROPS]; |
798 | +static guint seq_signals[N_SEQ_SIGNALS]; |
799 | static GParamSpec *seq_props[N_SEQ_PROPS]; |
800 | |
801 | typedef struct |
802 | @@ -106,12 +113,26 @@ G_DEFINE_TYPE_WITH_PRIVATE (MetaStartupSequence, |
803 | |
804 | static void meta_startup_notification_ensure_timeout (MetaStartupNotification *sn); |
805 | |
806 | +static gboolean |
807 | +meta_startup_notification_has_pending_sequences (MetaStartupNotification *sn) |
808 | +{ |
809 | + GSList *l; |
810 | + |
811 | + for (l = sn->startup_sequences; l; l = l->next) |
812 | + { |
813 | + if (!meta_startup_sequence_get_completed (l->data)) |
814 | + return TRUE; |
815 | + } |
816 | + |
817 | + return FALSE; |
818 | +} |
819 | + |
820 | static void |
821 | meta_startup_notification_update_feedback (MetaStartupNotification *sn) |
822 | { |
823 | MetaDisplay *display = sn->display; |
824 | |
825 | - if (sn->startup_sequences != NULL) |
826 | + if (meta_startup_notification_has_pending_sequences (sn)) |
827 | { |
828 | meta_topic (META_DEBUG_STARTUP, |
829 | "Setting busy cursor\n"); |
830 | @@ -239,6 +260,14 @@ meta_startup_sequence_class_init (MetaStartupSequenceClass *klass) |
831 | object_class->set_property = meta_startup_sequence_set_property; |
832 | object_class->get_property = meta_startup_sequence_get_property; |
833 | |
834 | + seq_signals[SEQ_COMPLETE] = |
835 | + g_signal_new ("complete", |
836 | + META_TYPE_STARTUP_SEQUENCE, |
837 | + G_SIGNAL_RUN_LAST, |
838 | + G_STRUCT_OFFSET (MetaStartupSequenceClass, complete), |
839 | + NULL, NULL, NULL, |
840 | + G_TYPE_NONE, 0); |
841 | + |
842 | seq_props[PROP_SEQ_ID] = |
843 | g_param_spec_string ("id", |
844 | "ID", |
845 | @@ -317,7 +346,6 @@ meta_startup_sequence_get_timestamp (MetaStartupSequence *seq) |
846 | void |
847 | meta_startup_sequence_complete (MetaStartupSequence *seq) |
848 | { |
849 | - MetaStartupSequenceClass *klass; |
850 | MetaStartupSequencePrivate *priv; |
851 | |
852 | g_return_if_fail (META_IS_STARTUP_SEQUENCE (seq)); |
853 | @@ -327,10 +355,7 @@ meta_startup_sequence_complete (MetaStartupSequence *seq) |
854 | return; |
855 | |
856 | priv->completed = TRUE; |
857 | - klass = META_STARTUP_SEQUENCE_GET_CLASS (seq); |
858 | - |
859 | - if (klass->complete) |
860 | - klass->complete (seq); |
861 | + g_signal_emit (seq, seq_signals[SEQ_COMPLETE], 0); |
862 | } |
863 | |
864 | gboolean |
865 | @@ -399,12 +424,22 @@ meta_startup_sequence_get_wmclass (MetaStartupSequence *seq) |
866 | return priv->wmclass; |
867 | } |
868 | |
869 | +static void |
870 | +on_sequence_completed (MetaStartupSequence *seq, |
871 | + MetaStartupNotification *sn) |
872 | +{ |
873 | + meta_startup_notification_update_feedback (sn); |
874 | + g_signal_emit (sn, sn_signals[CHANGED], 0, seq); |
875 | +} |
876 | + |
877 | void |
878 | meta_startup_notification_add_sequence (MetaStartupNotification *sn, |
879 | MetaStartupSequence *seq) |
880 | { |
881 | sn->startup_sequences = g_slist_prepend (sn->startup_sequences, |
882 | g_object_ref (seq)); |
883 | + g_signal_connect (seq, "complete", |
884 | + G_CALLBACK (on_sequence_completed), sn); |
885 | |
886 | meta_startup_notification_ensure_timeout (sn); |
887 | meta_startup_notification_update_feedback (sn); |
888 | @@ -425,10 +460,10 @@ collect_timed_out_foreach (void *element, |
889 | |
890 | meta_topic (META_DEBUG_STARTUP, |
891 | "Sequence used %" G_GINT64_FORMAT " ms vs. %d max: %s\n", |
892 | - elapsed, STARTUP_TIMEOUT, |
893 | + elapsed, STARTUP_TIMEOUT_MS, |
894 | meta_startup_sequence_get_id (sequence)); |
895 | |
896 | - if (elapsed > STARTUP_TIMEOUT) |
897 | + if (elapsed > STARTUP_TIMEOUT_MS) |
898 | ctod->list = g_slist_prepend (ctod->list, sequence); |
899 | } |
900 | |
901 | @@ -440,7 +475,7 @@ startup_sequence_timeout (void *data) |
902 | GSList *l; |
903 | |
904 | ctod.list = NULL; |
905 | - ctod.now = g_get_monotonic_time (); |
906 | + ctod.now = g_get_monotonic_time () / 1000; |
907 | g_slist_foreach (sn->startup_sequences, |
908 | collect_timed_out_foreach, |
909 | &ctod); |
910 | @@ -494,6 +529,8 @@ meta_startup_notification_remove_sequence (MetaStartupNotification *sn, |
911 | sn->startup_sequences = g_slist_remove (sn->startup_sequences, seq); |
912 | meta_startup_notification_update_feedback (sn); |
913 | |
914 | + g_signal_handlers_disconnect_by_func (seq, on_sequence_completed, sn); |
915 | + |
916 | if (sn->startup_sequences == NULL && |
917 | sn->startup_sequence_timeout != 0) |
918 | { |
919 | diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c |
920 | index 7695d86..099e87a 100644 |
921 | --- a/src/wayland/meta-wayland-outputs.c |
922 | +++ b/src/wayland/meta-wayland-outputs.c |
923 | @@ -624,14 +624,14 @@ meta_xdg_output_manager_get_xdg_output (struct wl_client *client, |
924 | wl_resource_get_version (resource), |
925 | id); |
926 | |
927 | - wl_resource_set_implementation (xdg_output_resource, |
928 | - &meta_xdg_output_interface, |
929 | - NULL, meta_xdg_output_destructor); |
930 | - |
931 | wayland_output = wl_resource_get_user_data (output); |
932 | if (!wayland_output) |
933 | return; |
934 | |
935 | + wl_resource_set_implementation (xdg_output_resource, |
936 | + &meta_xdg_output_interface, |
937 | + wayland_output, meta_xdg_output_destructor); |
938 | + |
939 | wayland_output->xdg_output_resources = |
940 | g_list_prepend (wayland_output->xdg_output_resources, xdg_output_resource); |
941 | |
942 | diff --git a/src/x11/meta-startup-notification-x11.c b/src/x11/meta-startup-notification-x11.c |
943 | index d681492..99fcf45 100644 |
944 | --- a/src/x11/meta-startup-notification-x11.c |
945 | +++ b/src/x11/meta-startup-notification-x11.c |
946 | @@ -151,7 +151,7 @@ meta_startup_sequence_x11_new (SnStartupSequence *seq) |
947 | { |
948 | gint64 timestamp; |
949 | |
950 | - timestamp = sn_startup_sequence_get_timestamp (seq) * 1000; |
951 | + timestamp = sn_startup_sequence_get_timestamp (seq); |
952 | return g_object_new (META_TYPE_STARTUP_SEQUENCE_X11, |
953 | "id", sn_startup_sequence_get_id (seq), |
954 | "icon-name", sn_startup_sequence_get_icon_name (seq), |
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.