summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2017-04-07 12:46:09 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2017-04-10 10:57:45 +0100
commitf1e8aebf219b470e163aa1b4a48dd42c97fcb012 (patch)
tree738b10dc0da941affe9a9610cae5ffdf87c7ef0d
parentb892a02c7467788b209de3f30d3e7f3ba70743a1 (diff)
downloadgnome-control-center-f1e8aebf219b470e163aa1b4a48dd42c97fcb012.tar.gz
display: Load appropriate assets for the night light panel
We hard-code a 16x16 asset for sunrise and sunset icons, which makes them look blurry at higher scaling factors. Let's look in the icon theme to see if there's an icon for sunrise and sunset; if not, we can still use the assets we ship, but we also attempt to load them from different resource paths, depending on the scale factor. We will need to update the assets to include a 32x32 rendering of the sunrise and sunset icons. https://bugzilla.gnome.org/show_bug.cgi?id=781029
-rw-r--r--panels/display/Makefile.am6
-rw-r--r--panels/display/cc-night-light-widget.c93
-rw-r--r--panels/display/display.gresource.xml4
3 files changed, 75 insertions, 28 deletions
diff --git a/panels/display/Makefile.am b/panels/display/Makefile.am
index e1a8cda77..3168f77bc 100644
--- a/panels/display/Makefile.am
+++ b/panels/display/Makefile.am
@@ -20,11 +20,11 @@ libdisplay_la_SOURCES = \
libdisplay_la_LIBADD = $(PANEL_LIBS) $(DISPLAY_PANEL_LIBS) $(LIBM)
-resource_files = $(shell glib-compile-resources --sourcedir=$(srcdir) --sourcedir=$(srcdir)/icons/16x16 --generate-dependencies $(srcdir)/display.gresource.xml)
+resource_files = $(shell glib-compile-resources --sourcedir=$(srcdir) --sourcedir=$(srcdir)/icons --generate-dependencies $(srcdir)/display.gresource.xml)
cc-display-resources.c: display.gresource.xml $(resource_files)
- $(AM_V_GEN) glib-compile-resources --target=$@ --sourcedir=$(srcdir) --sourcedir=$(srcdir)/icons/16x16 --generate-source --c-name cc_display $<
+ $(AM_V_GEN) glib-compile-resources --target=$@ --sourcedir=$(srcdir) --sourcedir=$(srcdir)/icons --generate-source --c-name cc_display $<
cc-display-resources.h: display.gresource.xml $(resource_files)
- $(AM_V_GEN) glib-compile-resources --target=$@ --sourcedir=$(srcdir) --sourcedir=$(srcdir)/icons/16x16 --generate-header --c-name cc_display $<
+ $(AM_V_GEN) glib-compile-resources --target=$@ --sourcedir=$(srcdir) --sourcedir=$(srcdir)/icons --generate-header --c-name cc_display $<
# You will need a recent intltool or the patch from this bug
# http://bugzilla.gnome.org/show_bug.cgi?id=462312
diff --git a/panels/display/cc-night-light-widget.c b/panels/display/cc-night-light-widget.c
index 524344494..8b5d60024 100644
--- a/panels/display/cc-night-light-widget.c
+++ b/panels/display/cc-night-light-widget.c
@@ -69,26 +69,6 @@ cc_night_light_widget_set_mode (CcNightLightWidget *self,
gtk_widget_queue_draw (GTK_WIDGET (self));
}
-static void
-cc_night_light_widget_finalize (GObject *object)
-{
- CcNightLightWidget *self = CC_NIGHT_LIGHT_WIDGET (object);
-
- g_clear_pointer (&self->surface_sunrise, (GDestroyNotify) cairo_surface_destroy);
- g_clear_pointer (&self->surface_sunset, (GDestroyNotify) cairo_surface_destroy);
-
- G_OBJECT_CLASS (cc_night_light_widget_parent_class)->finalize (object);
-}
-
-static void
-cc_night_light_widget_class_init (CcNightLightWidgetClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
- object_class->finalize = cc_night_light_widget_finalize;
- widget_class->draw = cc_night_light_widget_draw;
-}
-
static cairo_status_t
_png_read_func (void *closure, unsigned char *data, unsigned int length)
{
@@ -104,11 +84,23 @@ _png_read_func (void *closure, unsigned char *data, unsigned int length)
return CAIRO_STATUS_SUCCESS;
}
+static const char *scaled_sizes[] = {
+ NULL,
+ "16x16",
+};
+
static cairo_surface_t *
-read_surface_from_resource (const gchar *path)
+read_surface_from_resource (const gchar *dirname,
+ int scale_factor,
+ const gchar *basename)
{
+ /* Always ensure that we have a resource for the scale factor */
+ scale_factor = CLAMP (scale_factor, 1, G_N_ELEMENTS (scaled_sizes) - 1);
+
g_autoptr(GError) error = NULL;
g_autoptr(GInputStream) stream = NULL;
+ g_autofree char *path = g_build_filename (dirname, scaled_sizes[scale_factor], basename, NULL);
+
stream = g_resource_open_stream (cc_display_get_resource (), path,
G_RESOURCE_LOOKUP_FLAGS_NONE, &error);
if (stream == NULL)
@@ -120,13 +112,68 @@ read_surface_from_resource (const gchar *path)
}
static void
+cc_night_light_widget_style_updated (GtkWidget *widget)
+{
+ GTK_WIDGET_CLASS (cc_night_light_widget_parent_class)->style_updated (widget);
+
+ CcNightLightWidget *self = CC_NIGHT_LIGHT_WIDGET (widget);
+ GtkIconTheme *icon_theme = gtk_icon_theme_get_default ();
+
+ g_clear_pointer (&self->surface_sunrise, (GDestroyNotify) cairo_surface_destroy);
+ g_clear_pointer (&self->surface_sunset, (GDestroyNotify) cairo_surface_destroy);
+
+ self->surface_sunrise =
+ gtk_icon_theme_load_surface (icon_theme, "daytime-sunrise-symbolic",
+ 16,
+ gtk_widget_get_scale_factor (widget),
+ gtk_widget_get_window (widget),
+ 0,
+ NULL);
+ if (self->surface_sunrise == NULL)
+ self->surface_sunrise = read_surface_from_resource ("/org/gnome/control-center/display",
+ gtk_widget_get_scale_factor (widget),
+ "sunrise.png");
+
+ self->surface_sunset =
+ gtk_icon_theme_load_surface (icon_theme, "daytime-sunset-symbolic",
+ 16,
+ gtk_widget_get_scale_factor (widget),
+ gtk_widget_get_window (widget),
+ 0,
+ NULL);
+ if (self->surface_sunset == NULL)
+ self->surface_sunset = read_surface_from_resource ("/org/gnome/control-center/display",
+ gtk_widget_get_scale_factor (widget),
+ "sunset.png");
+}
+
+static void
+cc_night_light_widget_finalize (GObject *object)
+{
+ CcNightLightWidget *self = CC_NIGHT_LIGHT_WIDGET (object);
+
+ g_clear_pointer (&self->surface_sunrise, (GDestroyNotify) cairo_surface_destroy);
+ g_clear_pointer (&self->surface_sunset, (GDestroyNotify) cairo_surface_destroy);
+
+ G_OBJECT_CLASS (cc_night_light_widget_parent_class)->finalize (object);
+}
+
+static void
+cc_night_light_widget_class_init (CcNightLightWidgetClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ object_class->finalize = cc_night_light_widget_finalize;
+ widget_class->draw = cc_night_light_widget_draw;
+ widget_class->style_updated = cc_night_light_widget_style_updated;
+}
+
+static void
cc_night_light_widget_init (CcNightLightWidget *self)
{
self->to = 8;
self->from = 16;
self->now = 11;
- self->surface_sunrise = read_surface_from_resource ("/org/gnome/control-center/display/sunrise.png");
- self->surface_sunset = read_surface_from_resource ("/org/gnome/control-center/display/sunset.png");
}
static gboolean
diff --git a/panels/display/display.gresource.xml b/panels/display/display.gresource.xml
index 342ed1e9d..571267305 100644
--- a/panels/display/display.gresource.xml
+++ b/panels/display/display.gresource.xml
@@ -2,7 +2,7 @@
<gresources>
<gresource prefix="/org/gnome/control-center/display">
<file preprocess="xml-stripblanks">display.ui</file>
- <file>sunrise.png</file>
- <file>sunset.png</file>
+ <file>16x16/sunrise.png</file>
+ <file>16x16/sunset.png</file>
</gresource>
</gresources>