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

Bug#1034162: marked as done (unblock: cinnamon/5.6.8-1)



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 ---
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 *

--- End Message ---
--- Begin Message ---
Hi,

On 10-04-2023 15:26, Fabio Fantoni wrote:
unblock cinnamon/5.6.8-1

Done.

Paul

Attachment: OpenPGP_signature
Description: OpenPGP digital signature


--- End Message ---

Reply to: