diff options
author | Victor Kareh <vkareh@redhat.com> | 2019-10-16 14:40:44 -0400 |
---|---|---|
committer | Victor Kareh <vkareh@redhat.com> | 2019-11-13 07:47:50 -0500 |
commit | 1c09104dc6426201931ad35d265466882fb511ad (patch) | |
tree | a7c8c602532092dcae55837588832a6a1d552eb7 /gtk/deprecated | |
parent | 9e72ec1c8a0ad7c9101c5301235d559cd47e44ab (diff) | |
download | gtk+-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.c | 23 |
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) |