summaryrefslogtreecommitdiff
path: root/gtk/deprecated
diff options
context:
space:
mode:
authorVictor Kareh <vkareh@redhat.com>2019-10-16 14:40:44 -0400
committerVictor Kareh <vkareh@redhat.com>2019-11-13 07:47:50 -0500
commit1c09104dc6426201931ad35d265466882fb511ad (patch)
treea7c8c602532092dcae55837588832a6a1d552eb7 /gtk/deprecated
parent9e72ec1c8a0ad7c9101c5301235d559cd47e44ab (diff)
downloadgtk+-1c09104dc6426201931ad35d265466882fb511ad.tar.gz
statusicon: Render as cairo surface
On HiDPI displays, rendering Status Icons as pixbufs results in blurry icons. By loading them at scale and rendering as a surface, we preserve both their size and sharpness.
Diffstat (limited to 'gtk/deprecated')
-rw-r--r--gtk/deprecated/gtkstatusicon.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/gtk/deprecated/gtkstatusicon.c b/gtk/deprecated/gtkstatusicon.c
index c9923d5261..fd6797d0dd 100644
--- a/gtk/deprecated/gtkstatusicon.c
+++ b/gtk/deprecated/gtkstatusicon.c
@@ -1398,13 +1398,16 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon)
GtkIconHelper *icon_helper;
cairo_surface_t *surface;
GtkWidget *widget;
- GdkPixbuf *pixbuf;
+ GdkPixbuf *pixbuf = NULL;
gint round_size;
+ gint scale;
#ifdef GDK_WINDOWING_X11
widget = priv->image;
+ scale = gtk_widget_get_scale_factor (widget);
#else
widget = priv->dummy_widget;
+ scale = 1;
#endif
if (widget == NULL)
@@ -1417,23 +1420,28 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon)
_gtk_icon_helper_set_definition (icon_helper, priv->image_def);
_gtk_icon_helper_set_icon_size (icon_helper, GTK_ICON_SIZE_SMALL_TOOLBAR);
_gtk_icon_helper_set_pixel_size (icon_helper, round_size);
- surface = gtk_icon_helper_load_surface (icon_helper, 1);
+ surface = gtk_icon_helper_load_surface (icon_helper, scale);
if (surface)
{
+#ifdef GDK_WINDOWING_X11
+ gtk_image_set_from_surface (GTK_IMAGE (priv->image), surface);
+#else
pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0,
cairo_image_surface_get_width (surface),
cairo_image_surface_get_height (surface));
+#endif
cairo_surface_destroy (surface);
}
else
- pixbuf = NULL;
+ {
+#ifdef GDK_WINDOWING_X11
+ gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), NULL);
+#endif
+ }
g_object_unref (icon_helper);
if (pixbuf != NULL)
{
-#ifdef GDK_WINDOWING_X11
- gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), pixbuf);
-#endif
#ifdef GDK_WINDOWING_WIN32
prev_hicon = priv->nid.hIcon;
priv->nid.hIcon = gdk_win32_pixbuf_to_hicon_libgtk_only (pixbuf);
@@ -1452,9 +1460,6 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon)
}
else
{
-#ifdef GDK_WINDOWING_X11
- gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), NULL);
-#endif
#ifdef GDK_WINDOWING_WIN32
priv->nid.uFlags &= ~NIF_ICON;
if (priv->nid.hWnd != NULL && priv->visible)