From 10b2021f0a98f1575400aac2beffd8e3c47ecdd5 Mon Sep 17 00:00:00 2001 From: Victor Kareh Date: Tue, 1 May 2018 00:24:38 -0400 Subject: Convert launcher icons to cairo surfaces This improves support for HiDPI by loading properly scaled surfaces for launcher and drawer icons. It also Fixes the Show Desktop wncklet to show a surface icon. Other wncklets have their icons determined by libwnck, so they remain as pixbufs. Fixes mate-desktop/mate-desktop#314 --- applets/clock/clock-location-tile.c | 26 ++++++++++++-------- applets/clock/clock.c | 21 +++++++++++----- applets/wncklet/showdesktop.c | 49 ++++++++++++++++++++++++------------- 3 files changed, 63 insertions(+), 33 deletions(-) (limited to 'applets') diff --git a/applets/clock/clock-location-tile.c b/applets/clock/clock-location-tile.c index 03717403..33c529ec 100644 --- a/applets/clock/clock-location-tile.c +++ b/applets/clock/clock-location-tile.c @@ -584,11 +584,14 @@ weather_info_setup_tooltip (WeatherInfo *info, ClockLocation *location, GtkToolt const gchar *sys_timezone; time_t sunrise_time, sunset_time; gchar *sunrise_str, *sunset_str; + gint icon_scale; - icon_name = weather_info_get_icon_name (info); theme = gtk_icon_theme_get_default (); - pixbuf = gtk_icon_theme_load_icon (theme, icon_name, 48, - GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL); + icon_name = weather_info_get_icon_name (info); + icon_scale = gdk_window_get_scale_factor (gdk_get_default_root_window ()); + + pixbuf = gtk_icon_theme_load_icon_for_scale (theme, icon_name, 48, icon_scale, + GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL); if (pixbuf) gtk_tooltip_set_icon (tooltip, pixbuf); @@ -654,7 +657,7 @@ weather_info_setup_tooltip (WeatherInfo *info, ClockLocation *location, GtkToolt static gboolean weather_tooltip (GtkWidget *widget, gint x, - gint y, + gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer data) @@ -681,20 +684,23 @@ update_weather_icon (ClockLocation *loc, WeatherInfo *info, gpointer data) { ClockLocationTile *tile = data; ClockLocationTilePrivate *priv = PRIVATE (tile); - GdkPixbuf *pixbuf = NULL; + cairo_surface_t *surface = NULL; GtkIconTheme *theme = NULL; const gchar *icon_name; + gint icon_scale; if (!info || !weather_info_is_valid (info)) return; + theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (priv->weather_icon))); icon_name = weather_info_get_icon_name (info); - theme = gtk_icon_theme_get_default (); - pixbuf = gtk_icon_theme_load_icon (theme, icon_name, 16, - GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL); + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (priv->weather_icon)); + + surface = gtk_icon_theme_load_surface (theme, icon_name, 16, icon_scale, + NULL, GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL); - if (pixbuf) { - gtk_image_set_from_pixbuf (GTK_IMAGE (priv->weather_icon), pixbuf); + if (surface) { + gtk_image_set_from_surface (GTK_IMAGE (priv->weather_icon), surface); gtk_widget_set_margin_end (priv->weather_icon, 6); } } diff --git a/applets/clock/clock.c b/applets/clock/clock.c index ad659fe5..bfbc96bc 100644 --- a/applets/clock/clock.c +++ b/applets/clock/clock.c @@ -1975,7 +1975,8 @@ location_weather_updated_cb (ClockLocation *location, const gchar *icon_name; const gchar *temp; GtkIconTheme *theme; - GdkPixbuf *pixbuf; + cairo_surface_t *surface; + gint icon_size, icon_scale; if (!info || !weather_info_is_valid (info)) return; @@ -1984,15 +1985,23 @@ location_weather_updated_cb (ClockLocation *location, return; icon_name = weather_info_get_icon_name (info); - /* FIXME: mmh, screen please? Also, don't hardcode to 16 */ - theme = gtk_icon_theme_get_default (); - pixbuf = gtk_icon_theme_load_icon (theme, icon_name, 16, - GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL); + if (icon_name == NULL) + return; + + theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (cd->applet))); + + icon_size = mate_panel_applet_get_size (MATE_PANEL_APPLET (cd->applet)); + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (cd->applet)); + + surface = gtk_icon_theme_load_surface (theme, icon_name, icon_size, icon_scale, + NULL, GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL); temp = weather_info_get_temp_summary (info); - gtk_image_set_from_pixbuf (GTK_IMAGE (cd->panel_weather_icon), pixbuf); + gtk_image_set_from_surface (GTK_IMAGE (cd->panel_weather_icon), surface); gtk_label_set_text (GTK_LABEL (cd->panel_temperature_label), temp); + + cairo_surface_destroy (surface); } static void diff --git a/applets/wncklet/showdesktop.c b/applets/wncklet/showdesktop.c index 72b71763..1e682fab 100644 --- a/applets/wncklet/showdesktop.c +++ b/applets/wncklet/showdesktop.c @@ -134,9 +134,9 @@ static void update_icon(ShowDesktopData* sdd) GtkStateFlags state; GtkBorder padding; int width, height; - GdkPixbuf* icon; - GdkPixbuf* scaled; - int icon_size; + cairo_surface_t* icon; + cairo_surface_t* scaled; + int icon_size, icon_scale; GError* error; int thickness = 0; @@ -156,17 +156,24 @@ static void update_icon(ShowDesktopData* sdd) break; } - icon_size = sdd->size - thickness; + icon_scale = gtk_widget_get_scale_factor (sdd->button); + icon_size = sdd->size * icon_scale - thickness; if (icon_size < 22) icon_size = 16; - else if (icon_size < 32) + else if (icon_size < 24) icon_size = 22; + else if (icon_size < 32) + icon_size = 24; else if (icon_size < 48) icon_size = 32; + else if (icon_size < 64) + icon_size = 48; + else if (icon_size < 128) + icon_size = 64; error = NULL; - icon = gtk_icon_theme_load_icon (sdd->icon_theme, SHOW_DESKTOP_ICON, icon_size, 0, &error); + icon = gtk_icon_theme_load_surface (sdd->icon_theme, SHOW_DESKTOP_ICON, icon_size, icon_scale, NULL, 0, &error); if (icon == NULL) { @@ -182,8 +189,8 @@ static void update_icon(ShowDesktopData* sdd) return; } - width = gdk_pixbuf_get_width(icon); - height = gdk_pixbuf_get_height(icon); + width = cairo_image_surface_get_width (icon); + height = cairo_image_surface_get_height (icon); scaled = NULL; @@ -191,28 +198,36 @@ static void update_icon(ShowDesktopData* sdd) switch (sdd->orient) { case GTK_ORIENTATION_HORIZONTAL: - width = (icon_size * width) / height; - height = icon_size; + width = (icon_size / icon_scale * width) / height; + height = icon_size / icon_scale; break; case GTK_ORIENTATION_VERTICAL: - height = (icon_size * height) / width; - width = icon_size; + height = (icon_size / icon_scale * height) / width; + width = icon_size / icon_scale; break; } - scaled = gdk_pixbuf_scale_simple(icon, width, height, GDK_INTERP_BILINEAR); + scaled = cairo_surface_create_similar (icon, + cairo_surface_get_content (icon), + width, + height); if (scaled != NULL) { - gtk_image_set_from_pixbuf(GTK_IMAGE(sdd->image), scaled); - g_object_unref(scaled); + cairo_t *cr; + cr = cairo_create (scaled); + cairo_scale (cr, (double) width / icon_size, (double) height / icon_size); + cairo_set_source_surface (cr, icon, 0, 0); + cairo_paint (cr); + gtk_image_set_from_surface (GTK_IMAGE(sdd->image), scaled); + cairo_surface_destroy (scaled); } else { - gtk_image_set_from_pixbuf (GTK_IMAGE (sdd->image), icon); + gtk_image_set_from_surface (GTK_IMAGE (sdd->image), icon); } - g_object_unref (icon); + cairo_surface_destroy (icon); } static const GtkActionEntry show_desktop_menu_actions[] = { -- cgit v1.2.1