raveit65 aa4324b
From 53d505622e90805684260873d0fbadaec9e2d3ed Mon Sep 17 00:00:00 2001
raveit65 c3c18d6
From: Victor Kareh <vkareh@redhat.com>
raveit65 c3c18d6
Date: Mon, 20 Jan 2020 13:38:59 -0500
raveit65 c3c18d6
Subject: [PATCH 3/5] xutils: Change icons to being cairo surfaces
raveit65 c3c18d6
raveit65 c3c18d6
Since all icons are stored internally as cairo surfaces, we should be
raveit65 c3c18d6
returning icons as cairo surfaces from the private functions in xutils.
raveit65 c3c18d6
This simplifies the drawing codepath and makes us able to delete a bunch
raveit65 c3c18d6
of GdkPixbuf manipulation.
raveit65 c3c18d6
raveit65 c3c18d6
adapted from https://gitlab.gnome.org/GNOME/mutter/commit/af7f51b9
raveit65 c3c18d6
---
raveit65 c3c18d6
 libwnck/application.c             |  22 +--
raveit65 c3c18d6
 libwnck/class-group.c             |  17 +-
raveit65 c3c18d6
 libwnck/tasklist.c                |   9 +-
raveit65 c3c18d6
 libwnck/window.c                  |  22 +--
raveit65 c3c18d6
 libwnck/wnck-icon-cache-private.h |  15 +-
raveit65 aa4324b
 libwnck/wnck-icon-cache.c         | 299 +++++++++++++-----------------
raveit65 aa4324b
 libwnck/xutils.c                  |  42 ++---
raveit65 c3c18d6
 libwnck/xutils.h                  |  11 +-
raveit65 aa4324b
 8 files changed, 179 insertions(+), 258 deletions(-)
raveit65 c3c18d6
raveit65 c3c18d6
diff --git a/libwnck/application.c b/libwnck/application.c
raveit65 aa4324b
index d8283cc..b441eb6 100644
raveit65 c3c18d6
--- a/libwnck/application.c
raveit65 c3c18d6
+++ b/libwnck/application.c
raveit65 aa4324b
@@ -309,10 +309,11 @@ static void
raveit65 c3c18d6
 get_icons (WnckApplication *app)
raveit65 c3c18d6
 {
raveit65 aa4324b
   WnckHandle *handle;
raveit65 c3c18d6
-  GdkPixbuf *icon;
raveit65 c3c18d6
-  GdkPixbuf *mini_icon;
raveit65 c3c18d6
+  cairo_surface_t *icon;
raveit65 c3c18d6
+  cairo_surface_t *mini_icon;
raveit65 c3c18d6
   gsize normal_size;
raveit65 c3c18d6
   gsize mini_size;
raveit65 c3c18d6
+  int scaling_factor;
raveit65 c3c18d6
 
raveit65 aa4324b
   handle = wnck_screen_get_handle (app->priv->screen);
raveit65 aa4324b
 
raveit65 aa4324b
@@ -320,6 +321,7 @@ get_icons (WnckApplication *app)
raveit65 c3c18d6
   mini_icon = NULL;
raveit65 aa4324b
   normal_size = _wnck_handle_get_default_icon_size (handle);
raveit65 aa4324b
   mini_size = _wnck_handle_get_default_mini_icon_size (handle);
raveit65 c3c18d6
+  scaling_factor = _wnck_get_window_scaling_factor ();
raveit65 c3c18d6
 
raveit65 c3c18d6
   if (_wnck_read_icons (app->priv->screen,
raveit65 c3c18d6
                         app->priv->xwindow,
raveit65 aa4324b
@@ -327,24 +329,16 @@ get_icons (WnckApplication *app)
raveit65 c3c18d6
                         &icon,
raveit65 c3c18d6
                         normal_size,
raveit65 c3c18d6
                         &mini_icon,
raveit65 c3c18d6
-                        mini_size))
raveit65 c3c18d6
+                        mini_size,
raveit65 c3c18d6
+                        scaling_factor))
raveit65 c3c18d6
     {
raveit65 c3c18d6
       app->priv->need_emit_icon_changed = TRUE;
raveit65 aa4324b
 
raveit65 c3c18d6
       g_clear_pointer (&app->priv->icon, cairo_surface_destroy);
raveit65 c3c18d6
       g_clear_pointer (&app->priv->mini_icon, cairo_surface_destroy);
raveit65 c3c18d6
 
raveit65 c3c18d6
-      if (icon)
raveit65 c3c18d6
-        {
raveit65 c3c18d6
-          app->priv->icon = gdk_cairo_surface_create_from_pixbuf (icon, 0, NULL);
raveit65 c3c18d6
-          g_clear_object (&icon);
raveit65 c3c18d6
-        }
raveit65 c3c18d6
-
raveit65 c3c18d6
-      if (mini_icon)
raveit65 c3c18d6
-        {
raveit65 c3c18d6
-          app->priv->mini_icon = gdk_cairo_surface_create_from_pixbuf (mini_icon, 0, NULL);
raveit65 c3c18d6
-          g_clear_object (&mini_icon);
raveit65 c3c18d6
-        }
raveit65 c3c18d6
+      app->priv->icon = icon;
raveit65 c3c18d6
+      app->priv->mini_icon = mini_icon;
raveit65 c3c18d6
     }
raveit65 c3c18d6
 
raveit65 c3c18d6
   /* FIXME we should really fall back to using the icon
raveit65 c3c18d6
diff --git a/libwnck/class-group.c b/libwnck/class-group.c
raveit65 aa4324b
index e6c45d6..7899497 100644
raveit65 c3c18d6
--- a/libwnck/class-group.c
raveit65 c3c18d6
+++ b/libwnck/class-group.c
raveit65 aa4324b
@@ -441,23 +441,10 @@ set_icon (WnckClassGroup *class_group)
raveit65 aa4324b
 
raveit65 aa4324b
       handle = wnck_screen_get_handle (class_group->priv->screen);
raveit65 c3c18d6
 
raveit65 c3c18d6
-      GdkPixbuf *icon_pixbuf, *mini_icon_pixbuf;
raveit65 c3c18d6
-
raveit65 c3c18d6
-      _wnck_get_fallback_icons (&icon_pixbuf,
raveit65 c3c18d6
+      _wnck_get_fallback_icons (&icon,
raveit65 aa4324b
                                 _wnck_handle_get_default_icon_size (handle),
raveit65 c3c18d6
-                                &mini_icon_pixbuf,
raveit65 c3c18d6
+                                &mini_icon,
raveit65 aa4324b
                                 _wnck_handle_get_default_mini_icon_size (handle));
raveit65 c3c18d6
-      if (icon_pixbuf)
raveit65 c3c18d6
-        {
raveit65 c3c18d6
-          icon = gdk_cairo_surface_create_from_pixbuf (icon_pixbuf, 0, NULL);
raveit65 c3c18d6
-          g_clear_object (&icon_pixbuf);
raveit65 c3c18d6
-        }
raveit65 c3c18d6
-
raveit65 c3c18d6
-      if (mini_icon_pixbuf)
raveit65 c3c18d6
-        {
raveit65 c3c18d6
-          mini_icon = gdk_cairo_surface_create_from_pixbuf (mini_icon_pixbuf, 0, NULL);
raveit65 c3c18d6
-          g_clear_object (&mini_icon_pixbuf);
raveit65 c3c18d6
-        }
raveit65 c3c18d6
 
raveit65 c3c18d6
       icons_reffed = TRUE;
raveit65 c3c18d6
     }
raveit65 c3c18d6
diff --git a/libwnck/tasklist.c b/libwnck/tasklist.c
raveit65 aa4324b
index 10c6cc8..3e7b789 100644
raveit65 c3c18d6
--- a/libwnck/tasklist.c
raveit65 c3c18d6
+++ b/libwnck/tasklist.c
raveit65 aa4324b
@@ -3898,15 +3898,8 @@ wnck_task_get_icon (WnckTask *task)
raveit65 c3c18d6
 
raveit65 c3c18d6
       if (surface == NULL)
raveit65 c3c18d6
         {
raveit65 c3c18d6
-          GdkPixbuf *pixbuf;
raveit65 c3c18d6
           _wnck_get_fallback_icons (NULL, 0,
raveit65 aa4324b
-                                    &pixbuf, mini_icon_size);
raveit65 c3c18d6
-
raveit65 c3c18d6
-          if (pixbuf != NULL)
raveit65 c3c18d6
-            {
raveit65 c3c18d6
-              surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, 0, NULL);
raveit65 c3c18d6
-              g_object_unref (pixbuf);
raveit65 c3c18d6
-            }
raveit65 aa4324b
+                                    &surface, mini_icon_size);
raveit65 c3c18d6
         }
raveit65 c3c18d6
 #endif
raveit65 c3c18d6
       break;
raveit65 c3c18d6
diff --git a/libwnck/window.c b/libwnck/window.c
raveit65 aa4324b
index f01b4c2..5c97675 100644
raveit65 c3c18d6
--- a/libwnck/window.c
raveit65 c3c18d6
+++ b/libwnck/window.c
raveit65 aa4324b
@@ -2105,10 +2105,11 @@ static void
raveit65 c3c18d6
 get_icons (WnckWindow *window)
raveit65 c3c18d6
 {
raveit65 aa4324b
   WnckHandle *handle;
raveit65 c3c18d6
-  GdkPixbuf *icon;
raveit65 c3c18d6
-  GdkPixbuf *mini_icon;
raveit65 c3c18d6
+  cairo_surface_t *icon;
raveit65 c3c18d6
+  cairo_surface_t *mini_icon;
raveit65 c3c18d6
   gsize normal_size;
raveit65 c3c18d6
   gsize mini_size;
raveit65 c3c18d6
+  int scaling_factor;
raveit65 c3c18d6
 
raveit65 aa4324b
   handle = wnck_screen_get_handle (window->priv->screen);
raveit65 aa4324b
 
raveit65 aa4324b
@@ -2116,6 +2117,7 @@ get_icons (WnckWindow *window)
raveit65 c3c18d6
   mini_icon = NULL;
raveit65 aa4324b
   normal_size = _wnck_handle_get_default_icon_size (handle);
raveit65 aa4324b
   mini_size = _wnck_handle_get_default_mini_icon_size (handle);
raveit65 c3c18d6
+  scaling_factor = _wnck_get_window_scaling_factor ();
raveit65 c3c18d6
 
raveit65 c3c18d6
   if (_wnck_read_icons (window->priv->screen,
raveit65 c3c18d6
                         window->priv->xwindow,
raveit65 aa4324b
@@ -2123,24 +2125,16 @@ get_icons (WnckWindow *window)
raveit65 c3c18d6
                         &icon,
raveit65 c3c18d6
                         normal_size,
raveit65 c3c18d6
                         &mini_icon,
raveit65 c3c18d6
-                        mini_size))
raveit65 c3c18d6
+                        mini_size,
raveit65 c3c18d6
+                        scaling_factor))
raveit65 c3c18d6
     {
raveit65 c3c18d6
       window->priv->need_emit_icon_changed = TRUE;
raveit65 c3c18d6
 
raveit65 c3c18d6
       g_clear_pointer (&window->priv->icon, cairo_surface_destroy);
raveit65 c3c18d6
       g_clear_pointer (&window->priv->mini_icon, cairo_surface_destroy);
raveit65 c3c18d6
 
raveit65 c3c18d6
-      if (icon)
raveit65 c3c18d6
-        {
raveit65 c3c18d6
-          window->priv->icon = gdk_cairo_surface_create_from_pixbuf (icon, 0, NULL);
raveit65 c3c18d6
-          g_clear_object (&icon);
raveit65 c3c18d6
-        }
raveit65 c3c18d6
-
raveit65 c3c18d6
-      if (mini_icon)
raveit65 c3c18d6
-        {
raveit65 c3c18d6
-          window->priv->mini_icon = gdk_cairo_surface_create_from_pixbuf (mini_icon, 0, NULL);
raveit65 c3c18d6
-          g_clear_object (&mini_icon);
raveit65 c3c18d6
-        }
raveit65 c3c18d6
+      window->priv->icon = icon;
raveit65 c3c18d6
+      window->priv->mini_icon = mini_icon;
raveit65 c3c18d6
     }
raveit65 c3c18d6
 
raveit65 c3c18d6
   g_assert ((window->priv->icon && window->priv->mini_icon) ||
raveit65 c3c18d6
diff --git a/libwnck/wnck-icon-cache-private.h b/libwnck/wnck-icon-cache-private.h
raveit65 c3c18d6
index 6a3d5ec..d3c39e2 100644
raveit65 c3c18d6
--- a/libwnck/wnck-icon-cache-private.h
raveit65 c3c18d6
+++ b/libwnck/wnck-icon-cache-private.h
raveit65 c3c18d6
@@ -38,13 +38,14 @@ void           _wnck_icon_cache_set_want_fallback    (WnckIconCache  *icon_cache
raveit65 c3c18d6
                                                       gboolean        setting);
raveit65 c3c18d6
 gboolean       _wnck_icon_cache_get_is_fallback      (WnckIconCache  *icon_cache);
raveit65 c3c18d6
 
raveit65 c3c18d6
-gboolean       _wnck_read_icons                      (WnckScreen     *screen,
raveit65 c3c18d6
-                                                      Window          xwindow,
raveit65 c3c18d6
-                                                      WnckIconCache  *icon_cache,
raveit65 c3c18d6
-                                                      GdkPixbuf     **iconp,
raveit65 c3c18d6
-                                                      int             ideal_size,
raveit65 c3c18d6
-                                                      GdkPixbuf     **mini_iconp,
raveit65 c3c18d6
-                                                      int             ideal_mini_size);
raveit65 c3c18d6
+gboolean       _wnck_read_icons                      (WnckScreen       *screen,
raveit65 c3c18d6
+                                                      Window            xwindow,
raveit65 c3c18d6
+                                                      WnckIconCache    *icon_cache,
raveit65 c3c18d6
+                                                      cairo_surface_t **iconp,
raveit65 c3c18d6
+                                                      int               ideal_size,
raveit65 c3c18d6
+                                                      cairo_surface_t **mini_iconp,
raveit65 c3c18d6
+                                                      int               ideal_mini_size,
raveit65 c3c18d6
+                                                      int               scaling_factor);
raveit65 c3c18d6
 
raveit65 c3c18d6
 G_END_DECLS
raveit65 c3c18d6
 
raveit65 c3c18d6
diff --git a/libwnck/wnck-icon-cache.c b/libwnck/wnck-icon-cache.c
raveit65 aa4324b
index 9ff8d15..d9e67e8 100644
raveit65 c3c18d6
--- a/libwnck/wnck-icon-cache.c
raveit65 c3c18d6
+++ b/libwnck/wnck-icon-cache.c
raveit65 aa4324b
@@ -44,8 +44,8 @@ struct _WnckIconCache
raveit65 c3c18d6
   IconOrigin origin;
raveit65 c3c18d6
   Pixmap prev_pixmap;
raveit65 c3c18d6
   Pixmap prev_mask;
raveit65 c3c18d6
-  GdkPixbuf *icon;
raveit65 c3c18d6
-  GdkPixbuf *mini_icon;
raveit65 c3c18d6
+  cairo_surface_t *icon;
raveit65 c3c18d6
+  cairo_surface_t *mini_icon;
raveit65 c3c18d6
   int ideal_size;
raveit65 c3c18d6
   int ideal_mini_size;
raveit65 c3c18d6
   guint want_fallback : 1;
raveit65 aa4324b
@@ -139,49 +139,65 @@ find_best_size (gulong  *data,
raveit65 c3c18d6
     return FALSE;
raveit65 c3c18d6
 }
raveit65 c3c18d6
 
raveit65 c3c18d6
-static void
raveit65 c3c18d6
-argbdata_to_pixdata (gulong *argb_data, int len, guchar **pixdata)
raveit65 c3c18d6
+static cairo_surface_t *
raveit65 c3c18d6
+argbdata_to_surface (gulong *argb_data,
raveit65 c3c18d6
+                     int     w,
raveit65 c3c18d6
+                     int     h,
raveit65 c3c18d6
+                     int     ideal_w,
raveit65 c3c18d6
+                     int     ideal_h,
raveit65 c3c18d6
+                     int     scaling_factor)
raveit65 c3c18d6
 {
raveit65 c3c18d6
-  guchar *p;
raveit65 c3c18d6
-  int i;
raveit65 c3c18d6
+  cairo_surface_t *surface, *icon;
raveit65 c3c18d6
+  cairo_t *cr;
raveit65 c3c18d6
+  int y, x, stride;
raveit65 c3c18d6
+  uint32_t *data;
raveit65 c3c18d6
 
raveit65 c3c18d6
-  *pixdata = g_new (guchar, len * 4);
raveit65 c3c18d6
-  p = *pixdata;
raveit65 c3c18d6
+  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
raveit65 c3c18d6
+  cairo_surface_set_device_scale (surface, (double)scaling_factor, (double)scaling_factor);
raveit65 c3c18d6
+  stride = cairo_image_surface_get_stride (surface) / sizeof (uint32_t);
raveit65 c3c18d6
+  data = (uint32_t *) cairo_image_surface_get_data (surface);
raveit65 c3c18d6
 
raveit65 c3c18d6
   /* One could speed this up a lot. */
raveit65 c3c18d6
-  i = 0;
raveit65 c3c18d6
-  while (i < len)
raveit65 c3c18d6
+  for (y = 0; y < h; y++)
raveit65 c3c18d6
     {
raveit65 c3c18d6
-      guint argb;
raveit65 c3c18d6
-      guint rgba;
raveit65 c3c18d6
-
raveit65 c3c18d6
-      argb = argb_data[i];
raveit65 c3c18d6
-      rgba = (argb << 8) | (argb >> 24);
raveit65 c3c18d6
-
raveit65 c3c18d6
-      *p = rgba >> 24;
raveit65 c3c18d6
-      ++p;
raveit65 c3c18d6
-      *p = (rgba >> 16) & 0xff;
raveit65 c3c18d6
-      ++p;
raveit65 c3c18d6
-      *p = (rgba >> 8) & 0xff;
raveit65 c3c18d6
-      ++p;
raveit65 c3c18d6
-      *p = rgba & 0xff;
raveit65 c3c18d6
-      ++p;
raveit65 c3c18d6
-
raveit65 c3c18d6
-      ++i;
raveit65 c3c18d6
+      for (x = 0; x < w; x++)
raveit65 c3c18d6
+        {
raveit65 c3c18d6
+          uint32_t *p = &data[y * stride + x];
raveit65 c3c18d6
+          gulong *d = &argb_data[y * w + x];
raveit65 c3c18d6
+          *p = *d;
raveit65 c3c18d6
+        }
raveit65 c3c18d6
     }
raveit65 c3c18d6
+
raveit65 c3c18d6
+  cairo_surface_mark_dirty (surface);
raveit65 c3c18d6
+
raveit65 c3c18d6
+  icon = cairo_surface_create_similar_image (surface,
raveit65 c3c18d6
+                                             cairo_image_surface_get_format (surface),
raveit65 c3c18d6
+                                             ideal_w, ideal_h);
raveit65 c3c18d6
+
raveit65 c3c18d6
+  cairo_surface_set_device_scale (icon, (double)scaling_factor, (double)scaling_factor);
raveit65 c3c18d6
+
raveit65 c3c18d6
+  cr = cairo_create (icon);
raveit65 c3c18d6
+  cairo_scale (cr, ideal_w / (double)w, ideal_h / (double)h);
raveit65 c3c18d6
+  cairo_set_source_surface (cr, surface, 0, 0);
raveit65 c3c18d6
+  cairo_paint (cr);
raveit65 c3c18d6
+
raveit65 c3c18d6
+  cairo_set_operator (cr, CAIRO_OPERATOR_IN);
raveit65 c3c18d6
+  cairo_paint (cr);
raveit65 c3c18d6
+
raveit65 c3c18d6
+  cairo_destroy (cr);
raveit65 c3c18d6
+  cairo_surface_destroy (surface);
raveit65 c3c18d6
+
raveit65 c3c18d6
+  return icon;
raveit65 c3c18d6
 }
raveit65 c3c18d6
 
raveit65 c3c18d6
 static gboolean
raveit65 c3c18d6
-read_rgb_icon (Screen  *screen,
raveit65 c3c18d6
-               Window   xwindow,
raveit65 c3c18d6
-               int      ideal_size,
raveit65 c3c18d6
-               int      ideal_mini_size,
raveit65 c3c18d6
-               int     *width,
raveit65 c3c18d6
-               int     *height,
raveit65 c3c18d6
-               guchar **pixdata,
raveit65 c3c18d6
-               int     *mini_width,
raveit65 c3c18d6
-               int     *mini_height,
raveit65 c3c18d6
-               guchar **mini_pixdata)
raveit65 c3c18d6
+read_rgb_icon (Screen           *screen,
raveit65 c3c18d6
+               Window            xwindow,
raveit65 c3c18d6
+               int               ideal_size,
raveit65 c3c18d6
+               int               ideal_mini_size,
raveit65 c3c18d6
+               cairo_surface_t **iconp,
raveit65 c3c18d6
+               cairo_surface_t **mini_iconp,
raveit65 c3c18d6
+               int               scaling_factor)
raveit65 c3c18d6
 {
raveit65 c3c18d6
   Display *display;
raveit65 c3c18d6
   Atom type;
raveit65 aa4324b
@@ -219,7 +235,9 @@ read_rgb_icon (Screen  *screen,
raveit65 c3c18d6
       return FALSE;
raveit65 c3c18d6
     }
raveit65 c3c18d6
 
raveit65 c3c18d6
-  if (!find_best_size (data, nitems, ideal_size, &w, &h, &best))
raveit65 c3c18d6
+  if (!find_best_size (data, nitems,
raveit65 c3c18d6
+                       ideal_size,
raveit65 c3c18d6
+                       &w, &h, &best))
raveit65 c3c18d6
     {
raveit65 c3c18d6
       XFree (data);
raveit65 c3c18d6
       return FALSE;
raveit65 aa4324b
@@ -233,14 +251,8 @@ read_rgb_icon (Screen  *screen,
raveit65 c3c18d6
       return FALSE;
raveit65 c3c18d6
     }
raveit65 c3c18d6
 
raveit65 c3c18d6
-  *width = w;
raveit65 c3c18d6
-  *height = h;
raveit65 c3c18d6
-
raveit65 c3c18d6
-  *mini_width = mini_w;
raveit65 c3c18d6
-  *mini_height = mini_h;
raveit65 c3c18d6
-
raveit65 c3c18d6
-  argbdata_to_pixdata (best, w * h, pixdata);
raveit65 c3c18d6
-  argbdata_to_pixdata (best_mini, mini_w * mini_h, mini_pixdata);
raveit65 c3c18d6
+  *iconp = argbdata_to_surface (best, w, h, ideal_size, ideal_size, scaling_factor);
raveit65 c3c18d6
+  *mini_iconp = argbdata_to_surface (best_mini, mini_w, mini_h, ideal_mini_size, ideal_mini_size, scaling_factor);
raveit65 c3c18d6
 
raveit65 c3c18d6
   XFree (data);
raveit65 c3c18d6
 
raveit65 aa4324b
@@ -248,27 +260,27 @@ read_rgb_icon (Screen  *screen,
raveit65 c3c18d6
 }
raveit65 c3c18d6
 
raveit65 c3c18d6
 static gboolean
raveit65 c3c18d6
-try_pixmap_and_mask (Screen     *screen,
raveit65 c3c18d6
-                     Pixmap      src_pixmap,
raveit65 c3c18d6
-                     Pixmap      src_mask,
raveit65 c3c18d6
-                     GdkPixbuf **iconp,
raveit65 c3c18d6
-                     int         ideal_size,
raveit65 c3c18d6
-                     GdkPixbuf **mini_iconp,
raveit65 c3c18d6
-                     int         ideal_mini_size)
raveit65 c3c18d6
+try_pixmap_and_mask (Screen           *screen,
raveit65 c3c18d6
+                     Pixmap            src_pixmap,
raveit65 c3c18d6
+                     Pixmap            src_mask,
raveit65 c3c18d6
+                     cairo_surface_t **iconp,
raveit65 c3c18d6
+                     int               ideal_size,
raveit65 c3c18d6
+                     cairo_surface_t **mini_iconp,
raveit65 c3c18d6
+                     int               ideal_mini_size,
raveit65 c3c18d6
+                     int               scaling_factor)
raveit65 c3c18d6
 {
raveit65 c3c18d6
   cairo_surface_t *surface, *mask_surface, *image;
raveit65 c3c18d6
   GdkDisplay *gdk_display;
raveit65 c3c18d6
-  GdkPixbuf *unscaled;
raveit65 c3c18d6
   int width, height;
raveit65 c3c18d6
   cairo_t *cr;
raveit65 c3c18d6
 
raveit65 c3c18d6
   if (src_pixmap == None)
raveit65 c3c18d6
     return FALSE;
raveit65 c3c18d6
 
raveit65 c3c18d6
-  surface = _wnck_cairo_surface_get_from_pixmap (screen, src_pixmap);
raveit65 c3c18d6
+  surface = _wnck_cairo_surface_get_from_pixmap (screen, src_pixmap, scaling_factor);
raveit65 c3c18d6
 
raveit65 c3c18d6
   if (surface && src_mask != None)
raveit65 c3c18d6
-    mask_surface = _wnck_cairo_surface_get_from_pixmap (screen, src_mask);
raveit65 c3c18d6
+    mask_surface = _wnck_cairo_surface_get_from_pixmap (screen, src_mask, scaling_factor);
raveit65 c3c18d6
   else
raveit65 c3c18d6
     mask_surface = NULL;
raveit65 c3c18d6
 
raveit65 aa4324b
@@ -324,26 +336,41 @@ try_pixmap_and_mask (Screen     *screen,
raveit65 c3c18d6
       return FALSE;
raveit65 c3c18d6
     }
raveit65 c3c18d6
 
raveit65 c3c18d6
-  unscaled = gdk_pixbuf_get_from_surface (image,
raveit65 c3c18d6
-                                          0, 0,
raveit65 c3c18d6
-                                          width, height);
raveit65 c3c18d6
+  if (image)
raveit65 c3c18d6
+    {
raveit65 c3c18d6
+      int image_w, image_h;
raveit65 c3c18d6
 
raveit65 c3c18d6
-  cairo_surface_destroy (image);
raveit65 c3c18d6
+      image_w = cairo_image_surface_get_width (image);
raveit65 c3c18d6
+      image_h = cairo_image_surface_get_height (image);
raveit65 c3c18d6
+
raveit65 c3c18d6
+      *iconp = cairo_surface_create_similar (image,
raveit65 c3c18d6
+                                             cairo_surface_get_content (image),
raveit65 c3c18d6
+                                             ideal_size,
raveit65 c3c18d6
+                                             ideal_size);
raveit65 c3c18d6
+
raveit65 c3c18d6
+      cairo_surface_set_device_scale (*iconp, (double)scaling_factor, (double)scaling_factor);
raveit65 c3c18d6
+
raveit65 c3c18d6
+      cr = cairo_create (*iconp);
raveit65 c3c18d6
+      cairo_scale (cr, ideal_size / (double)image_w, ideal_size / (double)image_h);
raveit65 c3c18d6
+      cairo_set_source_surface (cr, image, 0, 0);
raveit65 c3c18d6
+      cairo_paint (cr);
raveit65 c3c18d6
+      cairo_destroy (cr);
raveit65 c3c18d6
+
raveit65 c3c18d6
+      *mini_iconp = cairo_surface_create_similar (image,
raveit65 c3c18d6
+                                                  cairo_surface_get_content (image),
raveit65 c3c18d6
+                                                  ideal_mini_size,
raveit65 c3c18d6
+                                                  ideal_mini_size);
raveit65 c3c18d6
+
raveit65 c3c18d6
+      cairo_surface_set_device_scale (*mini_iconp, (double)scaling_factor, (double)scaling_factor);
raveit65 c3c18d6
+
raveit65 c3c18d6
+      cr = cairo_create (*mini_iconp);
raveit65 c3c18d6
+      cairo_scale (cr, ideal_mini_size / (double)image_w, ideal_mini_size / (double)image_h);
raveit65 c3c18d6
+      cairo_set_source_surface (cr, image, 0, 0);
raveit65 c3c18d6
+      cairo_paint (cr);
raveit65 c3c18d6
+      cairo_destroy (cr);
raveit65 c3c18d6
+
raveit65 c3c18d6
+      cairo_surface_destroy (image);
raveit65 c3c18d6
 
raveit65 c3c18d6
-  if (unscaled)
raveit65 c3c18d6
-    {
raveit65 c3c18d6
-      *iconp =
raveit65 c3c18d6
-        gdk_pixbuf_scale_simple (unscaled,
raveit65 c3c18d6
-                                 ideal_size,
raveit65 c3c18d6
-                                 ideal_size,
raveit65 c3c18d6
-                                 GDK_INTERP_BILINEAR);
raveit65 c3c18d6
-      *mini_iconp =
raveit65 c3c18d6
-        gdk_pixbuf_scale_simple (unscaled,
raveit65 c3c18d6
-                                 ideal_mini_size,
raveit65 c3c18d6
-                                 ideal_mini_size,
raveit65 c3c18d6
-                                 GDK_INTERP_BILINEAR);
raveit65 c3c18d6
-
raveit65 c3c18d6
-      g_object_unref (G_OBJECT (unscaled));
raveit65 c3c18d6
       return TRUE;
raveit65 c3c18d6
     }
raveit65 c3c18d6
   else
raveit65 aa4324b
@@ -354,13 +381,8 @@ static void
raveit65 c3c18d6
 clear_icon_cache (WnckIconCache *icon_cache,
raveit65 c3c18d6
                   gboolean       dirty_all)
raveit65 c3c18d6
 {
raveit65 c3c18d6
-  if (icon_cache->icon)
raveit65 c3c18d6
-    g_object_unref (G_OBJECT (icon_cache->icon));
raveit65 c3c18d6
-  icon_cache->icon = NULL;
raveit65 c3c18d6
-
raveit65 c3c18d6
-  if (icon_cache->mini_icon)
raveit65 c3c18d6
-    g_object_unref (G_OBJECT (icon_cache->mini_icon));
raveit65 c3c18d6
-  icon_cache->mini_icon = NULL;
raveit65 c3c18d6
+  g_clear_pointer (&icon_cache->icon, cairo_surface_destroy);
raveit65 c3c18d6
+  g_clear_pointer (&icon_cache->mini_icon, cairo_surface_destroy);
raveit65 c3c18d6
 
raveit65 c3c18d6
   icon_cache->origin = USING_NO_ICON;
raveit65 c3c18d6
 
raveit65 aa4324b
@@ -372,89 +394,26 @@ clear_icon_cache (WnckIconCache *icon_cache,
raveit65 c3c18d6
 }
raveit65 c3c18d6
 
raveit65 c3c18d6
 static void
raveit65 c3c18d6
-replace_cache (WnckIconCache *icon_cache,
raveit65 c3c18d6
-               IconOrigin     origin,
raveit65 c3c18d6
-               GdkPixbuf     *new_icon,
raveit65 c3c18d6
-               GdkPixbuf     *new_mini_icon)
raveit65 c3c18d6
+replace_cache (WnckIconCache   *icon_cache,
raveit65 c3c18d6
+               IconOrigin       origin,
raveit65 c3c18d6
+               cairo_surface_t *new_icon,
raveit65 c3c18d6
+               cairo_surface_t *new_mini_icon)
raveit65 c3c18d6
 {
raveit65 c3c18d6
   clear_icon_cache (icon_cache, FALSE);
raveit65 c3c18d6
 
raveit65 c3c18d6
   icon_cache->origin = origin;
raveit65 c3c18d6
 
raveit65 c3c18d6
   if (new_icon)
raveit65 c3c18d6
-    g_object_ref (G_OBJECT (new_icon));
raveit65 c3c18d6
+    cairo_surface_reference (new_icon);
raveit65 c3c18d6
 
raveit65 c3c18d6
   icon_cache->icon = new_icon;
raveit65 c3c18d6
 
raveit65 c3c18d6
   if (new_mini_icon)
raveit65 c3c18d6
-    g_object_ref (G_OBJECT (new_mini_icon));
raveit65 c3c18d6
+    cairo_surface_reference (new_mini_icon);
raveit65 c3c18d6
 
raveit65 c3c18d6
   icon_cache->mini_icon = new_mini_icon;
raveit65 c3c18d6
 }
raveit65 c3c18d6
 
raveit65 c3c18d6
-static void
raveit65 c3c18d6
-free_pixels (guchar   *pixels,
raveit65 c3c18d6
-             gpointer  data)
raveit65 c3c18d6
-{
raveit65 c3c18d6
-  g_free (pixels);
raveit65 c3c18d6
-}
raveit65 c3c18d6
-
raveit65 c3c18d6
-static GdkPixbuf*
raveit65 c3c18d6
-scaled_from_pixdata (guchar *pixdata,
raveit65 c3c18d6
-                     int     w,
raveit65 c3c18d6
-                     int     h,
raveit65 c3c18d6
-                     int     new_w,
raveit65 c3c18d6
-                     int     new_h)
raveit65 c3c18d6
-{
raveit65 c3c18d6
-  GdkPixbuf *src;
raveit65 c3c18d6
-  GdkPixbuf *dest;
raveit65 c3c18d6
-
raveit65 c3c18d6
-  src = gdk_pixbuf_new_from_data (pixdata,
raveit65 c3c18d6
-                                  GDK_COLORSPACE_RGB,
raveit65 c3c18d6
-                                  TRUE,
raveit65 c3c18d6
-                                  8,
raveit65 c3c18d6
-                                  w, h, w * 4,
raveit65 c3c18d6
-                                  free_pixels,
raveit65 c3c18d6
-                                  NULL);
raveit65 c3c18d6
-
raveit65 c3c18d6
-  if (src == NULL)
raveit65 c3c18d6
-    return NULL;
raveit65 c3c18d6
-
raveit65 c3c18d6
-  if (w != h)
raveit65 c3c18d6
-    {
raveit65 c3c18d6
-      GdkPixbuf *tmp;
raveit65 c3c18d6
-      int size;
raveit65 c3c18d6
-
raveit65 c3c18d6
-      size = MAX (w, h);
raveit65 c3c18d6
-
raveit65 c3c18d6
-      tmp = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, size, size);
raveit65 c3c18d6
-
raveit65 c3c18d6
-      if (tmp != NULL)
raveit65 c3c18d6
-        {
raveit65 c3c18d6
-          gdk_pixbuf_fill (tmp, 0);
raveit65 c3c18d6
-          gdk_pixbuf_copy_area (src, 0, 0, w, h,
raveit65 c3c18d6
-                                tmp,
raveit65 c3c18d6
-                                (size - w) / 2, (size - h) / 2);
raveit65 c3c18d6
-
raveit65 c3c18d6
-          g_object_unref (src);
raveit65 c3c18d6
-          src = tmp;
raveit65 c3c18d6
-        }
raveit65 c3c18d6
-    }
raveit65 c3c18d6
-
raveit65 c3c18d6
-  if (w != new_w || h != new_h)
raveit65 c3c18d6
-    {
raveit65 c3c18d6
-      dest = gdk_pixbuf_scale_simple (src, new_w, new_h, GDK_INTERP_BILINEAR);
raveit65 c3c18d6
-
raveit65 c3c18d6
-      g_object_unref (G_OBJECT (src));
raveit65 c3c18d6
-    }
raveit65 c3c18d6
-  else
raveit65 c3c18d6
-    {
raveit65 c3c18d6
-      dest = src;
raveit65 c3c18d6
-    }
raveit65 c3c18d6
-
raveit65 c3c18d6
-  return dest;
raveit65 c3c18d6
-}
raveit65 c3c18d6
-
raveit65 c3c18d6
 WnckIconCache*
raveit65 c3c18d6
 _wnck_icon_cache_new (void)
raveit65 c3c18d6
 {
raveit65 aa4324b
@@ -528,22 +487,17 @@ _wnck_icon_cache_get_is_fallback (WnckIconCache *icon_cache)
raveit65 c3c18d6
 }
raveit65 c3c18d6
 
raveit65 c3c18d6
 gboolean
raveit65 c3c18d6
-_wnck_read_icons (WnckScreen     *screen,
raveit65 c3c18d6
-                  Window          xwindow,
raveit65 c3c18d6
-                  WnckIconCache  *icon_cache,
raveit65 c3c18d6
-                  GdkPixbuf     **iconp,
raveit65 c3c18d6
-                  int             ideal_size,
raveit65 c3c18d6
-                  GdkPixbuf     **mini_iconp,
raveit65 c3c18d6
-                  int             ideal_mini_size)
raveit65 c3c18d6
+_wnck_read_icons (WnckScreen       *screen,
raveit65 c3c18d6
+                  Window            xwindow,
raveit65 c3c18d6
+                  WnckIconCache    *icon_cache,
raveit65 c3c18d6
+                  cairo_surface_t **iconp,
raveit65 c3c18d6
+                  int               ideal_size,
raveit65 c3c18d6
+                  cairo_surface_t **mini_iconp,
raveit65 c3c18d6
+                  int               ideal_mini_size,
raveit65 c3c18d6
+                  int               scaling_factor)
raveit65 c3c18d6
 {
raveit65 c3c18d6
   Screen *xscreen;
raveit65 c3c18d6
   Display *display;
raveit65 c3c18d6
-  guchar *pixdata;
raveit65 c3c18d6
-  int w, h;
raveit65 c3c18d6
-  guchar *mini_pixdata;
raveit65 c3c18d6
-  int mini_w, mini_h;
raveit65 c3c18d6
-  Pixmap pixmap;
raveit65 c3c18d6
-  Pixmap mask;
raveit65 c3c18d6
   XWMHints *hints;
raveit65 c3c18d6
 
raveit65 c3c18d6
   /* Return value is whether the icon changed */
raveit65 aa4324b
@@ -556,6 +510,9 @@ _wnck_read_icons (WnckScreen     *screen,
raveit65 c3c18d6
   *iconp = NULL;
raveit65 c3c18d6
   *mini_iconp = NULL;
raveit65 c3c18d6
 
raveit65 c3c18d6
+  ideal_size *= scaling_factor;
raveit65 c3c18d6
+  ideal_mini_size *= scaling_factor;
raveit65 c3c18d6
+
raveit65 c3c18d6
   if (ideal_size != icon_cache->ideal_size ||
raveit65 c3c18d6
       ideal_mini_size != icon_cache->ideal_mini_size)
raveit65 c3c18d6
     clear_icon_cache (icon_cache, TRUE);
raveit65 aa4324b
@@ -566,8 +523,6 @@ _wnck_read_icons (WnckScreen     *screen,
raveit65 c3c18d6
   if (!_wnck_icon_cache_get_icon_invalidated (icon_cache))
raveit65 c3c18d6
     return FALSE; /* we have no new info to use */
raveit65 c3c18d6
 
raveit65 c3c18d6
-  pixdata = NULL;
raveit65 c3c18d6
-
raveit65 c3c18d6
   /* Our algorithm here assumes that we can't have for example origin
raveit65 c3c18d6
    * < USING_NET_WM_ICON and icon_cache->net_wm_icon_dirty == FALSE
raveit65 c3c18d6
    * unless we have tried to read NET_WM_ICON.
raveit65 aa4324b
@@ -579,21 +534,15 @@ _wnck_read_icons (WnckScreen     *screen,
raveit65 c3c18d6
 
raveit65 c3c18d6
   if (icon_cache->origin <= USING_NET_WM_ICON &&
raveit65 c3c18d6
       icon_cache->net_wm_icon_dirty)
raveit65 c3c18d6
-
raveit65 c3c18d6
     {
raveit65 c3c18d6
       icon_cache->net_wm_icon_dirty = FALSE;
raveit65 c3c18d6
 
raveit65 c3c18d6
       if (read_rgb_icon (xscreen, xwindow,
raveit65 c3c18d6
                          ideal_size,
raveit65 c3c18d6
                          ideal_mini_size,
raveit65 c3c18d6
-                         &w, &h, &pixdata,
raveit65 c3c18d6
-                         &mini_w, &mini_h, &mini_pixdata))
raveit65 c3c18d6
+                         iconp, mini_iconp,
raveit65 c3c18d6
+                         scaling_factor))
raveit65 c3c18d6
         {
raveit65 c3c18d6
-          *iconp = scaled_from_pixdata (pixdata, w, h, ideal_size, ideal_size);
raveit65 c3c18d6
-
raveit65 c3c18d6
-          *mini_iconp = scaled_from_pixdata (mini_pixdata, mini_w, mini_h,
raveit65 c3c18d6
-                                             ideal_mini_size, ideal_mini_size);
raveit65 c3c18d6
-
raveit65 c3c18d6
           replace_cache (icon_cache, USING_NET_WM_ICON,
raveit65 c3c18d6
                          *iconp, *mini_iconp);
raveit65 c3c18d6
 
raveit65 aa4324b
@@ -604,6 +553,9 @@ _wnck_read_icons (WnckScreen     *screen,
raveit65 c3c18d6
   if (icon_cache->origin <= USING_WM_HINTS &&
raveit65 c3c18d6
       icon_cache->wm_hints_dirty)
raveit65 c3c18d6
     {
raveit65 c3c18d6
+      Pixmap pixmap;
raveit65 c3c18d6
+      Pixmap mask;
raveit65 c3c18d6
+
raveit65 c3c18d6
       icon_cache->wm_hints_dirty = FALSE;
raveit65 c3c18d6
 
raveit65 c3c18d6
       _wnck_error_trap_push (display);
raveit65 aa4324b
@@ -632,7 +584,8 @@ _wnck_read_icons (WnckScreen     *screen,
raveit65 c3c18d6
         {
raveit65 c3c18d6
           if (try_pixmap_and_mask (xscreen, pixmap, mask,
raveit65 c3c18d6
                                    iconp, ideal_size,
raveit65 c3c18d6
-                                   mini_iconp, ideal_mini_size))
raveit65 c3c18d6
+                                   mini_iconp, ideal_mini_size,
raveit65 c3c18d6
+                                   scaling_factor))
raveit65 c3c18d6
             {
raveit65 c3c18d6
               icon_cache->prev_pixmap = pixmap;
raveit65 c3c18d6
               icon_cache->prev_mask = mask;
raveit65 c3c18d6
diff --git a/libwnck/xutils.c b/libwnck/xutils.c
raveit65 aa4324b
index 60ae7b2..476f027 100644
raveit65 c3c18d6
--- a/libwnck/xutils.c
raveit65 c3c18d6
+++ b/libwnck/xutils.c
raveit65 aa4324b
@@ -1389,7 +1389,8 @@ _wnck_select_input (Screen *screen,
raveit65 c3c18d6
 
raveit65 c3c18d6
 cairo_surface_t *
raveit65 c3c18d6
 _wnck_cairo_surface_get_from_pixmap (Screen *screen,
raveit65 c3c18d6
-                                     Pixmap  xpixmap)
raveit65 c3c18d6
+                                     Pixmap  xpixmap,
raveit65 c3c18d6
+                                     int     scaling_factor)
raveit65 c3c18d6
 {
raveit65 c3c18d6
   cairo_surface_t *surface;
raveit65 c3c18d6
   Display *display;
raveit65 aa4324b
@@ -1407,6 +1408,9 @@ _wnck_cairo_surface_get_from_pixmap (Screen *screen,
raveit65 c3c18d6
                      &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))
raveit65 c3c18d6
     goto TRAP_POP;
raveit65 c3c18d6
 
raveit65 c3c18d6
+  w_ret *= scaling_factor;
raveit65 c3c18d6
+  h_ret *= scaling_factor;
raveit65 c3c18d6
+
raveit65 c3c18d6
   if (depth_ret == 1)
raveit65 c3c18d6
     {
raveit65 c3c18d6
       surface = cairo_xlib_surface_create_for_bitmap (display,
raveit65 aa4324b
@@ -1463,7 +1467,7 @@ _wnck_gdk_pixbuf_get_from_pixmap (Screen *screen,
raveit65 c3c18d6
   cairo_surface_t *surface;
raveit65 c3c18d6
   GdkPixbuf *retval;
raveit65 c3c18d6
 
raveit65 c3c18d6
-  surface = _wnck_cairo_surface_get_from_pixmap (screen, xpixmap);
raveit65 c3c18d6
+  surface = _wnck_cairo_surface_get_from_pixmap (screen, xpixmap, 1);
raveit65 c3c18d6
 
raveit65 c3c18d6
   if (surface == NULL)
raveit65 c3c18d6
     return NULL;
raveit65 aa4324b
@@ -1478,36 +1482,30 @@ _wnck_gdk_pixbuf_get_from_pixmap (Screen *screen,
raveit65 c3c18d6
   return retval;
raveit65 c3c18d6
 }
raveit65 c3c18d6
 
raveit65 c3c18d6
-static GdkPixbuf*
raveit65 c3c18d6
+static cairo_surface_t*
raveit65 c3c18d6
 default_icon_at_size (int size)
raveit65 c3c18d6
 {
raveit65 c3c18d6
-  GdkPixbuf *base;
raveit65 c3c18d6
+  GdkPixbuf *pixbuf;
raveit65 c3c18d6
+  cairo_surface_t *surface;
raveit65 c3c18d6
 
raveit65 c3c18d6
-  base = gdk_pixbuf_new_from_resource ("/org/gnome/libwnck/default_icon.png", NULL);
raveit65 c3c18d6
+  pixbuf = gdk_pixbuf_new_from_resource_at_scale ("/org/gnome/libwnck/default_icon.png",
raveit65 c3c18d6
+                                                  size, size,
raveit65 c3c18d6
+                                                  TRUE, NULL);
raveit65 c3c18d6
 
raveit65 c3c18d6
-  g_assert (base);
raveit65 c3c18d6
+  g_assert (pixbuf);
raveit65 c3c18d6
 
raveit65 c3c18d6
-  if (gdk_pixbuf_get_width (base) == size &&
raveit65 c3c18d6
-      gdk_pixbuf_get_height (base) == size)
raveit65 c3c18d6
-    {
raveit65 c3c18d6
-      return base;
raveit65 c3c18d6
-    }
raveit65 c3c18d6
-  else
raveit65 c3c18d6
-    {
raveit65 c3c18d6
-      GdkPixbuf *scaled;
raveit65 c3c18d6
+  surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, 0, NULL);
raveit65 c3c18d6
 
raveit65 c3c18d6
-      scaled = gdk_pixbuf_scale_simple (base, size, size, GDK_INTERP_BILINEAR);
raveit65 c3c18d6
-      g_object_unref (G_OBJECT (base));
raveit65 c3c18d6
+  g_clear_object (&pixbuf);
raveit65 c3c18d6
 
raveit65 c3c18d6
-      return scaled;
raveit65 c3c18d6
-    }
raveit65 c3c18d6
+  return surface;
raveit65 c3c18d6
 }
raveit65 c3c18d6
 
raveit65 c3c18d6
 void
raveit65 c3c18d6
-_wnck_get_fallback_icons (GdkPixbuf **iconp,
raveit65 c3c18d6
-                          int         ideal_size,
raveit65 c3c18d6
-                          GdkPixbuf **mini_iconp,
raveit65 c3c18d6
-                          int         ideal_mini_size)
raveit65 c3c18d6
+_wnck_get_fallback_icons (cairo_surface_t **iconp,
raveit65 c3c18d6
+                          int               ideal_size,
raveit65 c3c18d6
+                          cairo_surface_t **mini_iconp,
raveit65 c3c18d6
+                          int               ideal_mini_size)
raveit65 c3c18d6
 {
raveit65 c3c18d6
   if (iconp)
raveit65 c3c18d6
     *iconp = default_icon_at_size (ideal_size);
raveit65 c3c18d6
diff --git a/libwnck/xutils.h b/libwnck/xutils.h
raveit65 aa4324b
index 4e5c620..51e8e55 100644
raveit65 c3c18d6
--- a/libwnck/xutils.h
raveit65 c3c18d6
+++ b/libwnck/xutils.h
raveit65 aa4324b
@@ -156,10 +156,10 @@ void _wnck_keyboard_size (WnckScreen *screen,
raveit65 c3c18d6
 void _wnck_toggle_showing_desktop (Screen  *screen,
raveit65 c3c18d6
                                    gboolean show);
raveit65 c3c18d6
 
raveit65 c3c18d6
-void _wnck_get_fallback_icons (GdkPixbuf **iconp,
raveit65 c3c18d6
-                               int         ideal_size,
raveit65 c3c18d6
-                               GdkPixbuf **mini_iconp,
raveit65 c3c18d6
-                               int         ideal_mini_size);
raveit65 c3c18d6
+void _wnck_get_fallback_icons (cairo_surface_t **iconp,
raveit65 c3c18d6
+                               int               ideal_size,
raveit65 c3c18d6
+                               cairo_surface_t **mini_iconp,
raveit65 c3c18d6
+                               int               ideal_mini_size);
raveit65 c3c18d6
 
raveit65 c3c18d6
 void _wnck_get_window_geometry (Screen *screen,
raveit65 c3c18d6
 				Window  xwindow,
raveit65 aa4324b
@@ -192,7 +192,8 @@ void _wnck_set_desktop_layout (Screen *xscreen,
raveit65 c3c18d6
                                int     columns);
raveit65 c3c18d6
 
raveit65 c3c18d6
 cairo_surface_t *_wnck_cairo_surface_get_from_pixmap (Screen *screen,
raveit65 c3c18d6
-                                                      Pixmap  xpixmap);
raveit65 c3c18d6
+                                                      Pixmap  xpixmap,
raveit65 c3c18d6
+                                                      int     scaling_factor);
raveit65 c3c18d6
 
raveit65 c3c18d6
 GdkPixbuf* _wnck_gdk_pixbuf_get_from_pixmap (Screen *screen,
raveit65 c3c18d6
                                              Pixmap  xpixmap);
raveit65 c3c18d6
-- 
raveit65 aa4324b
2.37.2
raveit65 c3c18d6