[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: