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