Your message dated Thu, 20 Apr 2023 21:54:24 +0200 with message-id <ec09a078-938d-1f59-e070-822fe3f81c13@debian.org> and subject line Re: Bug#1034162: unblock: cinnamon/5.6.8-1 has caused the Debian Bug report #1034162, regarding unblock: cinnamon/5.6.8-1 to be marked as done. This means that you claim that the problem has been dealt with. If this is not the case it is now your responsibility to reopen the Bug report if necessary, and/or fix the problem forthwith. (NB: If you are a system administrator and have no idea what this message is talking about, this may indicate a serious mail system misconfiguration somewhere. Please contact owner@bugs.debian.org immediately.) -- 1034162: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1034162 Debian Bug Tracking System Contact owner@bugs.debian.org with problems
--- Begin Message ---
- To: Debian Bug Tracking System <submit@bugs.debian.org>
- Subject: unblock: cinnamon/5.6.8-1
- From: Fabio Fantoni <fantonifabio@tiscali.it>
- Date: Mon, 10 Apr 2023 15:26:46 +0200
- Message-id: <[🔎] cc6d55f1-802b-62f3-e803-bc6af680b9a8@tiscali.it>
- Reply-to: fantonifabio@tiscali.it
Package: release.debian.org Severity: normal User: release.debian.org@packages.debian.org Usertags: unblock X-Debbugs-Cc: cinnamon@packages.debian.org, fantonifabio@tiscali.it Control: affects -1 + src:cinnamon Please unblock package cinnamon 5.6.8-1 include a new bugfix release with some fixes:- grouped-window-list: Make appGroup's flashButton sane, fix invalid source id.- cinnamon-screenshot.c: Disable unredirection when taking a screenshot. - remove unused import cairo - cs_themes: load theme thumbnail from XDG_DATA_DIRS - gwl: Fix typo. - sound applet: Clear the source ID in Seeker._timerCallback(). - window-list: Fix signal name for tile notifications. - overrides.js: Silently fail to install polyfills.One fix seems a "big patch" (https://github.com/linuxmint/cinnamon/commit/fcffd73eace934c817db394d347705f81e564f3c) but solves cinnamon crash in some cases doing screenshot (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1032912)No regression found or reported, I think is good to have in bookworm. [ Risks ] I consider the risk of regression small [ Checklist ] [x] all changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in testing [ Other info ] unblock cinnamon/5.6.8-1diff --git a/debian/changelog b/debian/changelog index 6ca12b51a..8bd8d7d27 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cinnamon (5.6.8-1) unstable; urgency=medium + + * New upstream bugfix version 5.6.8 (Closes: #1032912) + + -- Fabio Fantoni <fantonifabio@tiscali.it> Sun, 19 Mar 2023 22:38:37 +0100 + cinnamon (5.6.7-1) unstable; urgency=medium * New upstream version 5.6.7 diff --git a/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/appGroup.js b/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/appGroup.js index ef0a7e5b8..9ca6b37d5 100644 --- a/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/appGroup.js +++ b/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/appGroup.js @@ -1,6 +1,7 @@ const Cinnamon = imports.gi.Cinnamon; const Meta = imports.gi.Meta; const Clutter = imports.gi.Clutter; +const GLib = imports.gi.GLib; const St = imports.gi.St; const Main = imports.ui.main; const Tweener = imports.ui.tweener; @@ -304,35 +305,40 @@ class AppGroup { if (this._needsAttention) return; this._needsAttention = true; - let counter = 0; - this.flashButton(counter); + this.flashButton(); } - flashButton(counter) { - if (!this._needsAttention || !this.actor) return; + flashButton() { + if (!this._needsAttention || !this.actor || this.flashTimer) + return; - // If the app was closed during a flash sequence, stop looping. - if (!this.groupState.groupReady && this.groupState.isFavoriteApp) { - this.actor.remove_style_class_name('grouped-window-list-item-demands-attention'); + if (!this.groupState.groupReady && this.groupState.isFavoriteApp) return; - } - this.actor.remove_style_pseudo_class('active'); - this.actor.add_style_class_name('grouped-window-list-item-demands-attention'); - if (counter < FLASH_MAX_COUNT) { - this.flashTimer = Mainloop.timeout_add(FLASH_INTERVAL, () => { - if (this.actor && this.actor.has_style_class_name('grouped-window-list-item-demands-attention')) { - this.actor.remove_style_class_name('grouped-window-list-item-demands-attention'); - this.actor.add_style_pseudo_class('active'); - } + let counter = 0; + const sc = "grouped-window-list-item-demands-attention"; - this.flashTimer = Mainloop.timeout_add(FLASH_INTERVAL, () => { - this.flashButton(++counter); - }); - }); - } else { - this.flashTimer = 0; - } + this.flashTimer = Mainloop.timeout_add(FLASH_INTERVAL, () => { + if (!this._needsAttention) { + this.flashTimer = 0; + return GLib.SOURCE_REMOVE; + } + + if (this.actor.has_style_class_name(sc)) { + this.actor.add_style_class_name("active"); + this.actor.remove_style_class_name(sc); + } + else { + this.actor.remove_style_class_name("active") + this.actor.add_style_class_name(sc); + } + + const continueFlashing = (counter++ < FLASH_MAX_COUNT); + if (!continueFlashing) { + this.flashTimer = 0; + } + return continueFlashing; + }); } getPreferredWidth(actor, forHeight, alloc) { @@ -597,9 +603,7 @@ class AppGroup { if (hasFocus) { this.listState.trigger('updateFocusState', appId); this.actor.add_style_pseudo_class('focus'); - if (this.actor.has_style_class_name('grouped-window-list-item-demands-attention')) { - this.actor.remove_style_class_name('grouped-window-list-item-demands-attention'); - } + this.actor.remove_style_class_name('grouped-window-list-item-demands-attention'); this._needsAttention = false; } else { this.actor.remove_style_pseudo_class('focus'); diff --git a/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js index 9bdd5a036..a6eb90ea3 100644 --- a/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js +++ b/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js @@ -333,14 +333,15 @@ class Seeker extends Slider.Slider { this._timerTicker = 0; this._getPosition(); } - return true; + return GLib.SOURCE_CONTINUE; } - return false; + this._timeoutId = 0; + return GLib.SOURCE_REMOVE; } _updateTimer() { - if (this._timeoutId !== 0) { + if (this._timeoutId > 0) { Mainloop.source_remove(this._timeoutId); this._timeoutId = 0; } @@ -403,12 +404,14 @@ class Seeker extends Slider.Slider { } destroy() { - if (this._timeoutId != 0) { + if (this._timeoutId > 0) { Mainloop.source_remove(this._timeoutId); this._timeoutId = 0; } - if (this._seekChangedId) + if (this._seekChangedId) { this._mediaServerPlayer.disconnectSignal(this._seekChangedId); + this._seekChangedId = 0; + } this.disconnectAll(); this._mediaServerPlayer = null; @@ -1101,6 +1104,7 @@ class CinnamonSoundApplet extends Applet.TextIconApplet { this.unregisterSystrayIcons(); if (this._iconTimeoutId) { Mainloop.source_remove(this._iconTimeoutId); + this._iconTimeoutId = 0; } this._dbus.disconnectSignal(this._ownerChangedId); @@ -1224,7 +1228,7 @@ class CinnamonSoundApplet extends Applet.TextIconApplet { setIcon(icon, source) { if (this._iconTimeoutId) { Mainloop.source_remove(this._iconTimeoutId); - this._iconTimeoutId = null; + this._iconTimeoutId = 0; } //save the icon @@ -1240,7 +1244,6 @@ class CinnamonSoundApplet extends Applet.TextIconApplet { //if we have an active player, but are changing the volume, show the output icon and after three seconds change back to the player icon this.set_applet_icon_symbolic_name(this._outputIcon); this._iconTimeoutId = Mainloop.timeout_add_seconds(OUTPUT_ICON_SHOW_TIME_SECONDS, () => { - this._iconTimeoutId = null; this.setIcon(); }); } else { diff --git a/files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js b/files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js index 15fe40493..0e693d879 100644 --- a/files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js +++ b/files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js @@ -371,7 +371,7 @@ class AppMenuButton { this._signals.connect(this.metaWindow, 'notify::title', this.setDisplayTitle, this); this._signals.connect(this.metaWindow, "notify::minimized", this.setDisplayTitle, this); - this._signals.connect(this.metaWindow, "notify::tile-type", this.setDisplayTitle, this); + this._signals.connect(this.metaWindow, "notify::tile-mode", this.setDisplayTitle, this); this._signals.connect(this.metaWindow, "notify::icon", this.setIcon, this); this._signals.connect(this.metaWindow, "notify::appears-focused", this.onFocus, this); this._signals.connect(this.metaWindow, "unmanaged", this.onUnmanaged, this); diff --git a/files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py b/files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py index 1801f2a0e..f885f3819 100644 --- a/files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py +++ b/files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py @@ -1,7 +1,6 @@ #!/usr/bin/python3 from gi.repository import Gtk, GObject, GLib, Gdk, GdkPixbuf, Gio -import cairo import os import gettext import datetime diff --git a/files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py b/files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py index e64f89798..d646234ff 100755 --- a/files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py +++ b/files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py @@ -319,10 +319,10 @@ class Module: chooser.set_picture_from_file(path) else: try: - for path in ["/usr/share/%s/%s/%s/thumbnail.png" % (path_prefix, theme, path_suffix), - os.path.expanduser("~/.%s/%s/%s/thumbnail.png" % (path_prefix, theme, path_suffix)), + for path in ([os.path.join(datadir, path_prefix, theme, path_suffix, "thumbnail.png") for datadir in GLib.get_system_data_dirs()] + + [os.path.expanduser("~/.%s/%s/%s/thumbnail.png" % (path_prefix, theme, path_suffix)), "/usr/share/cinnamon/thumbnails/%s/%s.png" % (path_suffix, theme), - "/usr/share/cinnamon/thumbnails/%s/unknown.png" % path_suffix]: + "/usr/share/cinnamon/thumbnails/%s/unknown.png" % path_suffix]): if os.path.exists(path): chooser.set_picture_from_file(path) break diff --git a/js/ui/overrides.js b/js/ui/overrides.js index eadcba077..8d47fb2d5 100644 --- a/js/ui/overrides.js +++ b/js/ui/overrides.js @@ -243,16 +243,25 @@ function installPolyfills(readOnlyError) { // These abstractions around Mainloop are safer and easier // to use for people learning GObject introspection bindings. - Object.defineProperty(window, 'setTimeout', { - get: function() { - return setTimeout; - }, - set: function() { - readOnlyError('setTimeout'); - }, - configurable: false, - enumerable: false - }); + + // Starting with mozjs 102, these polyfills are no longer needed, and will + // crash Cinnamon if we try to redifine them. Try to do the first one and bail + // if it complains (TypeError: can't redefine non-configurable property) + try { + Object.defineProperty(window, 'setTimeout', { + get: function() { + return setTimeout; + }, + set: function() { + readOnlyError('setTimeout'); + }, + configurable: false, + enumerable: false + }); + } catch (e) { + return; + } + Object.defineProperty(window, 'clearTimeout', { get: function() { return clearTimeout; diff --git a/meson.build b/meson.build index 38f0bb897..9c94f03f6 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -project('Cinnamon', 'c', version : '5.6.7', meson_version : '>=0.47.0') +project('Cinnamon', 'c', version : '5.6.8', meson_version : '>=0.47.0') gnome = import('gnome') i18n = import('i18n') diff --git a/src/cinnamon-screenshot.c b/src/cinnamon-screenshot.c index 44315c46c..6a8f0f538 100644 --- a/src/cinnamon-screenshot.c +++ b/src/cinnamon-screenshot.c @@ -28,6 +28,7 @@ struct _CinnamonScreenshot /* Used for async screenshot grabbing */ typedef struct _screenshot_data { CinnamonScreenshot *screenshot; + MetaWindow *window; char *filename; @@ -35,6 +36,7 @@ typedef struct _screenshot_data { cairo_rectangle_int_t screenshot_area; gboolean include_cursor; + gboolean include_frame; CinnamonScreenshotCallback callback; } _screenshot_data; @@ -205,15 +207,16 @@ grab_screenshot (ClutterActor *stage, ClutterPaintContext *paint_context, _screenshot_data *screenshot_data) { - CinnamonScreen *screen = cinnamon_global_get_screen (screenshot_data->screenshot->global); - int width, height; + MetaDisplay *display = cinnamon_global_get_display (screenshot_data->screenshot->global); + int width, height, n_monitors; GSimpleAsyncResult *result; - cinnamon_screen_get_size (screen, &width, &height); + meta_display_get_size (display, &width, &height); do_grab_screenshot (screenshot_data, paint_context, 0, 0, width, height); - if (cinnamon_screen_get_n_monitors (screen) > 1) + n_monitors = meta_display_get_n_monitors (display); + if (n_monitors > 1) { cairo_region_t *screen_region = cairo_region_create (); cairo_region_t *stage_region; @@ -222,9 +225,9 @@ grab_screenshot (ClutterActor *stage, int i; cairo_t *cr; - for (i = cinnamon_screen_get_n_monitors (screen) - 1; i >= 0; i--) + for (i = n_monitors - 1; i >= 0; i--) { - cinnamon_screen_get_monitor_geometry (screen, i, &monitor_rect); + meta_display_get_monitor_geometry (display, i, &monitor_rect); cairo_region_union_rectangle (screen_region, (const cairo_rectangle_int_t *) &monitor_rect); } @@ -261,6 +264,8 @@ grab_screenshot (ClutterActor *stage, g_signal_handlers_disconnect_by_func (stage, (void *)grab_screenshot, (gpointer)screenshot_data); + meta_enable_unredirect_for_display (display); + result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, grab_screenshot); g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL); g_object_unref (result); @@ -271,6 +276,7 @@ grab_area_screenshot (ClutterActor *stage, ClutterPaintContext *paint_context, _screenshot_data *screenshot_data) { + MetaDisplay *display = cinnamon_global_get_display (screenshot_data->screenshot->global); GSimpleAsyncResult *result; do_grab_screenshot (screenshot_data, @@ -284,11 +290,71 @@ grab_area_screenshot (ClutterActor *stage, _draw_cursor_image (screenshot_data->image, screenshot_data->screenshot_area); g_signal_handlers_disconnect_by_func (stage, (void *)grab_area_screenshot, (gpointer)screenshot_data); + + meta_enable_unredirect_for_display (display); + result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, grab_area_screenshot); g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL); g_object_unref (result); } +static void +grab_window_screenshot (ClutterActor *stage, + ClutterPaintContext *paint_context, + _screenshot_data *screenshot_data) +{ + MetaDisplay *display = cinnamon_global_get_display (screenshot_data->screenshot->global); + GSimpleAsyncResult *result; + ClutterActor *window_actor; + gfloat actor_x, actor_y; + MetaShapedTexture *stex; + MetaRectangle rect; + cairo_rectangle_int_t clip; + + g_return_if_fail (META_IS_WINDOW (screenshot_data->window)); + + window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (screenshot_data->window)); + clutter_actor_get_position (window_actor, &actor_x, &actor_y); + + if (screenshot_data->include_frame || !meta_window_get_frame (screenshot_data->window)) + { + meta_window_get_frame_rect (screenshot_data->window, &rect); + + screenshot_data->screenshot_area.x = rect.x; + screenshot_data->screenshot_area.y = rect.y; + + clip.x = rect.x - (gint) actor_x; + clip.y = rect.y - (gint) actor_y; + } + else + { + meta_window_get_buffer_rect (screenshot_data->window, &rect); + + screenshot_data->screenshot_area.x = (gint) actor_x + rect.x; + screenshot_data->screenshot_area.y = (gint) actor_y + rect.y; + + clip.x = rect.x; + clip.y = rect.y; + } + + clip.width = screenshot_data->screenshot_area.width = rect.width; + clip.height = screenshot_data->screenshot_area.height = rect.height; + + stex = META_SHAPED_TEXTURE (meta_window_actor_get_texture (META_WINDOW_ACTOR (window_actor))); + screenshot_data->image = meta_shaped_texture_get_image (stex, &clip); + + if (screenshot_data->include_cursor) + _draw_cursor_image (screenshot_data->image, screenshot_data->screenshot_area); + + g_signal_handlers_disconnect_by_func (stage, (void *)grab_window_screenshot, (gpointer) screenshot_data); + + meta_enable_unredirect_for_display (display); + + result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, cinnamon_screenshot_screenshot_window); + g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL); + g_object_unref (result); +} + /** * cinnamon_screenshot_screenshot: * @screenshot: the #CinnamonScreenshot @@ -307,6 +373,7 @@ cinnamon_screenshot_screenshot (CinnamonScreenshot *screenshot, const char *filename, CinnamonScreenshotCallback callback) { + MetaDisplay *display; ClutterActor *stage; _screenshot_data *data = g_new0 (_screenshot_data, 1); @@ -315,10 +382,11 @@ cinnamon_screenshot_screenshot (CinnamonScreenshot *screenshot, data->callback = callback; data->include_cursor = include_cursor; + display = cinnamon_global_get_display (screenshot->global); stage = CLUTTER_ACTOR (cinnamon_global_get_stage (screenshot->global)); + meta_disable_unredirect_for_display (display); g_signal_connect_after (stage, "paint", G_CALLBACK (grab_screenshot), (gpointer)data); - clutter_actor_queue_redraw (stage); } @@ -347,6 +415,7 @@ cinnamon_screenshot_screenshot_area (CinnamonScreenshot *screenshot, const char *filename, CinnamonScreenshotCallback callback) { + MetaDisplay *display; ClutterActor *stage; _screenshot_data *data = g_new0 (_screenshot_data, 1); @@ -359,8 +428,10 @@ cinnamon_screenshot_screenshot_area (CinnamonScreenshot *screenshot, data->callback = callback; data->include_cursor = include_cursor; + display = cinnamon_global_get_display (screenshot->global); stage = CLUTTER_ACTOR (cinnamon_global_get_stage (screenshot->global)); + meta_disable_unredirect_for_display (display); g_signal_connect_after (stage, "paint", G_CALLBACK (grab_area_screenshot), (gpointer)data); clutter_actor_queue_redraw (stage); @@ -386,11 +457,9 @@ cinnamon_screenshot_screenshot_window (CinnamonScreenshot *screenshot, const char *filename, CinnamonScreenshotCallback callback) { - GSimpleAsyncResult *result; - - CinnamonScreen *screen = cinnamon_global_get_screen (screenshot->global); - MetaDisplay *display = cinnamon_screen_get_display (screen); + MetaDisplay *display = cinnamon_global_get_display (screenshot->global); MetaWindow *window = meta_display_get_focus_window (display); + ClutterActor *stage; if (window == NULL || g_strcmp0 (meta_window_get_title (window), "Desktop") == 0) { @@ -398,54 +467,22 @@ cinnamon_screenshot_screenshot_window (CinnamonScreenshot *screenshot, return; } - _screenshot_data *screenshot_data = g_new0 (_screenshot_data, 1); - - ClutterActor *window_actor; - gfloat actor_x, actor_y; - MetaShapedTexture *stex; - MetaRectangle rect; - cairo_rectangle_int_t clip; - - screenshot_data->screenshot = g_object_ref (screenshot); - screenshot_data->filename = g_strdup (filename); - screenshot_data->callback = callback; - - window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (window)); - clutter_actor_get_position (window_actor, &actor_x, &actor_y); - - if (include_frame || !meta_window_get_frame (window)) - { - meta_window_get_frame_rect (window, &rect); - - screenshot_data->screenshot_area.x = rect.x; - screenshot_data->screenshot_area.y = rect.y; - - clip.x = rect.x - (gint) actor_x; - clip.y = rect.y - (gint) actor_y; - } - else - { - meta_window_get_buffer_rect (window, &rect); - - screenshot_data->screenshot_area.x = (gint) actor_x + rect.x; - screenshot_data->screenshot_area.y = (gint) actor_y + rect.y; - - clip.x = rect.x; - clip.y = rect.y; - } + _screenshot_data *data = g_new0 (_screenshot_data, 1); - clip.width = screenshot_data->screenshot_area.width = rect.width; - clip.height = screenshot_data->screenshot_area.height = rect.height; + data->window = window; + data->screenshot = g_object_ref (screenshot); + data->filename = g_strdup (filename); + data->callback = callback; + data->include_cursor = include_cursor; + data->include_frame = include_frame; - stex = META_SHAPED_TEXTURE (meta_window_actor_get_texture (META_WINDOW_ACTOR (window_actor))); - screenshot_data->image = meta_shaped_texture_get_image (stex, &clip); + display = cinnamon_global_get_display (screenshot->global); + stage = CLUTTER_ACTOR (cinnamon_global_get_stage (screenshot->global)); - if (include_cursor) - _draw_cursor_image (screenshot_data->image, screenshot_data->screenshot_area); + meta_disable_unredirect_for_display (display); + g_signal_connect_after (stage, "paint", G_CALLBACK (grab_window_screenshot), (gpointer) data); - result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, cinnamon_screenshot_screenshot_window); - g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL); - g_object_unref (result); + clutter_actor_queue_redraw (stage); } CinnamonScreenshot *
--- End Message ---
--- Begin Message ---
- To: fantonifabio@tiscali.it, 1034162-done@bugs.debian.org
- Subject: Re: Bug#1034162: unblock: cinnamon/5.6.8-1
- From: Paul Gevers <elbrus@debian.org>
- Date: Thu, 20 Apr 2023 21:54:24 +0200
- Message-id: <ec09a078-938d-1f59-e070-822fe3f81c13@debian.org>
- In-reply-to: <[🔎] cc6d55f1-802b-62f3-e803-bc6af680b9a8@tiscali.it>
- References: <[🔎] cc6d55f1-802b-62f3-e803-bc6af680b9a8@tiscali.it>
Hi, On 10-04-2023 15:26, Fabio Fantoni wrote:unblock cinnamon/5.6.8-1Done. PaulAttachment: OpenPGP_signature
Description: OpenPGP digital signature
--- End Message ---