summaryrefslogtreecommitdiff
path: root/applets
diff options
context:
space:
mode:
authorVictor Kareh <[email protected]>2018-05-01 00:24:38 -0400
committerraveit65 <[email protected]>2018-05-12 21:15:34 +0200
commit10b2021f0a98f1575400aac2beffd8e3c47ecdd5 (patch)
treed625ff63f823fcb481f47fc7f11b502f4418ac2f /applets
parentf775e8987f8279ea2fb259126e61d0b26cf78817 (diff)
downloadmate-panel-10b2021f0a98f1575400aac2beffd8e3c47ecdd5.tar.bz2
mate-panel-10b2021f0a98f1575400aac2beffd8e3c47ecdd5.tar.xz
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
Diffstat (limited to 'applets')
-rw-r--r--applets/clock/clock-location-tile.c26
-rw-r--r--applets/clock/clock.c21
-rw-r--r--applets/wncklet/showdesktop.c49
3 files changed, 63 insertions, 33 deletions
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[] = {