Bug#1034162: unblock: cinnamon/5.6.8-1
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-1
diff --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 *
Reply to: