diff options
author | Debarshi Ray <debarshir@gnome.org> | 2014-06-16 14:38:36 +0200 |
---|---|---|
committer | Debarshi Ray <debarshir@gnome.org> | 2014-06-17 18:50:28 +0200 |
commit | a3247e73a4dc5a558416cbb325462dbaae10734e (patch) | |
tree | f1bb0e3f809169b38be45a84558070f7dec4d7c6 | |
parent | b950a69f3be3d29a560a74f699d90265532b9dcc (diff) | |
download | gnome-control-center-a3247e73a4dc5a558416cbb325462dbaae10734e.tar.gz |
background: Use higher resolution thumbnails on HiDpi displays
https://bugzilla.gnome.org/show_bug.cgi?id=731713
-rw-r--r-- | panels/background/bg-colors-source.c | 22 | ||||
-rw-r--r-- | panels/background/bg-colors-source.h | 2 | ||||
-rw-r--r-- | panels/background/bg-pictures-source.c | 10 | ||||
-rw-r--r-- | panels/background/bg-pictures-source.h | 2 | ||||
-rw-r--r-- | panels/background/bg-source.c | 67 | ||||
-rw-r--r-- | panels/background/bg-source.h | 7 | ||||
-rw-r--r-- | panels/background/bg-wallpapers-source.c | 35 | ||||
-rw-r--r-- | panels/background/bg-wallpapers-source.h | 2 | ||||
-rw-r--r-- | panels/background/cc-background-chooser-dialog.c | 6 |
9 files changed, 126 insertions, 27 deletions
diff --git a/panels/background/bg-colors-source.c b/panels/background/bg-colors-source.c index 2a67c53ce..740fa7537 100644 --- a/panels/background/bg-colors-source.c +++ b/panels/background/bg-colors-source.c @@ -54,15 +54,22 @@ struct { }; static void -bg_colors_source_init (BgColorsSource *self) +bg_colors_source_constructed (GObject *object) { + BgColorsSource *self = BG_COLORS_SOURCE (object); GnomeDesktopThumbnailFactory *thumb_factory; guint i; GtkListStore *store; + gint thumbnail_height; + gint thumbnail_width; + + G_OBJECT_CLASS (bg_colors_source_parent_class)->constructed (object); store = bg_source_get_liststore (BG_SOURCE (self)); thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE); + thumbnail_height = bg_source_get_thumbnail_height (BG_SOURCE (self)); + thumbnail_width = bg_source_get_thumbnail_width (BG_SOURCE (self)); for (i = 0; i < G_N_ELEMENTS (items); i++) { @@ -91,7 +98,7 @@ bg_colors_source_init (BgColorsSource *self) /* insert the item into the liststore */ pixbuf = cc_background_item_get_thumbnail (item, thumb_factory, - THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT); + thumbnail_width, thumbnail_height); gtk_list_store_insert_with_values (store, NULL, 0, 0, pixbuf, 1, item, @@ -104,14 +111,21 @@ bg_colors_source_init (BgColorsSource *self) g_object_unref (thumb_factory); } +bg_colors_source_init (BgColorsSource *self) +{ +} + static void bg_colors_source_class_init (BgColorsSourceClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = bg_colors_source_constructed; } BgColorsSource * -bg_colors_source_new (void) +bg_colors_source_new (GtkWindow *window) { - return g_object_new (BG_TYPE_COLORS_SOURCE, NULL); + return g_object_new (BG_TYPE_COLORS_SOURCE, "window", window, NULL); } diff --git a/panels/background/bg-colors-source.h b/panels/background/bg-colors-source.h index 283f86b81..839e40b4d 100644 --- a/panels/background/bg-colors-source.h +++ b/panels/background/bg-colors-source.h @@ -64,7 +64,7 @@ struct _BgColorsSourceClass GType bg_colors_source_get_type (void) G_GNUC_CONST; -BgColorsSource *bg_colors_source_new (void); +BgColorsSource *bg_colors_source_new (GtkWindow *window); G_END_DECLS diff --git a/panels/background/bg-pictures-source.c b/panels/background/bg-pictures-source.c index d10e012c4..0c5c6c001 100644 --- a/panels/background/bg-pictures-source.c +++ b/panels/background/bg-pictures-source.c @@ -224,6 +224,8 @@ picture_opened_for_read (GObject *source_object, CcBackgroundItem *item; GFileInputStream *stream; GError *error = NULL; + gint thumbnail_height; + gint thumbnail_width; item = g_object_get_data (source_object, "item"); stream = g_file_read_finish (G_FILE (source_object), res, &error); @@ -246,9 +248,11 @@ picture_opened_for_read (GObject *source_object, */ bg_source = BG_PICTURES_SOURCE (user_data); + thumbnail_height = bg_source_get_thumbnail_height (BG_SOURCE (bg_source)); + thumbnail_width = bg_source_get_thumbnail_width (BG_SOURCE (bg_source)); g_object_set_data_full (G_OBJECT (stream), "item", g_object_ref (item), g_object_unref); gdk_pixbuf_new_from_stream_at_scale_async (G_INPUT_STREAM (stream), - THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, + thumbnail_width, thumbnail_height, TRUE, bg_source->priv->cancellable, picture_scaled, bg_source); @@ -914,9 +918,9 @@ bg_pictures_source_init (BgPicturesSource *self) } BgPicturesSource * -bg_pictures_source_new (void) +bg_pictures_source_new (GtkWindow *window) { - return g_object_new (BG_TYPE_PICTURES_SOURCE, NULL); + return g_object_new (BG_TYPE_PICTURES_SOURCE, "window", window, NULL); } const char * const * diff --git a/panels/background/bg-pictures-source.h b/panels/background/bg-pictures-source.h index 9b854f505..eab00506c 100644 --- a/panels/background/bg-pictures-source.h +++ b/panels/background/bg-pictures-source.h @@ -69,7 +69,7 @@ struct _BgPicturesSourceClass GType bg_pictures_source_get_type (void) G_GNUC_CONST; -BgPicturesSource *bg_pictures_source_new (void); +BgPicturesSource *bg_pictures_source_new (GtkWindow *window); char *bg_pictures_source_get_cache_path (void); char *bg_pictures_source_get_unique_path(const char *uri); gboolean bg_pictures_source_add (BgPicturesSource *bg_source, diff --git a/panels/background/bg-source.c b/panels/background/bg-source.c index ae689b5ba..dee3ab217 100644 --- a/panels/background/bg-source.c +++ b/panels/background/bg-source.c @@ -21,6 +21,9 @@ #include "bg-source.h" #include "cc-background-item.h" +#define THUMBNAIL_WIDTH 256 +#define THUMBNAIL_HEIGHT (THUMBNAIL_WIDTH * 3 / 4) + G_DEFINE_ABSTRACT_TYPE (BgSource, bg_source, G_TYPE_OBJECT) #define SOURCE_PRIVATE(o) \ @@ -29,15 +32,47 @@ G_DEFINE_ABSTRACT_TYPE (BgSource, bg_source, G_TYPE_OBJECT) struct _BgSourcePrivate { GtkListStore *store; + GtkWidget *window; + gint thumbnail_height; + gint thumbnail_width; }; enum { - PROP_LISTSTORE = 1 + PROP_LISTSTORE = 1, + PROP_WINDOW }; static void +bg_source_calculate_thumbnail_dimensions (BgSource *source) +{ + BgSourcePrivate *priv = source->priv; + gint scale_factor; + + priv->thumbnail_height = THUMBNAIL_HEIGHT; + priv->thumbnail_width = THUMBNAIL_WIDTH; + + if (priv->window == NULL) + return; + + scale_factor = gtk_widget_get_scale_factor (priv->window); + if (scale_factor > 1) + { + priv->thumbnail_height *= scale_factor; + priv->thumbnail_width *= scale_factor; + } +} + +static void +bg_source_constructed (GObject *object) +{ + G_OBJECT_CLASS (bg_source_parent_class)->constructed (object); + + bg_source_calculate_thumbnail_dimensions (BG_SOURCE (object)); +} + +static void bg_source_get_property (GObject *object, guint property_id, GValue *value, @@ -62,8 +97,14 @@ bg_source_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { + BgSourcePrivate *priv = BG_SOURCE (object)->priv; + switch (property_id) { + case PROP_WINDOW: + priv->window = GTK_WIDGET (g_value_get_object (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } @@ -87,6 +128,7 @@ bg_source_class_init (BgSourceClass *klass) g_type_class_add_private (klass, sizeof (BgSourcePrivate)); + object_class->constructed = bg_source_constructed; object_class->get_property = bg_source_get_property; object_class->set_property = bg_source_set_property; object_class->dispose = bg_source_dispose; @@ -97,6 +139,13 @@ bg_source_class_init (BgSourceClass *klass) GTK_TYPE_LIST_STORE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); g_object_class_install_property (object_class, PROP_LISTSTORE, pspec); + + pspec = g_param_spec_object ("window", + "Window", + "Toplevel window used to view the source", + GTK_TYPE_WINDOW, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_WINDOW, pspec); } static void @@ -116,3 +165,19 @@ bg_source_get_liststore (BgSource *source) return source->priv->store; } + +gint +bg_source_get_thumbnail_height (BgSource *source) +{ + g_return_val_if_fail (BG_IS_SOURCE (source), THUMBNAIL_HEIGHT); + + return source->priv->thumbnail_height; +} + +gint +bg_source_get_thumbnail_width (BgSource *source) +{ + g_return_val_if_fail (BG_IS_SOURCE (source), THUMBNAIL_WIDTH); + + return source->priv->thumbnail_width; +} diff --git a/panels/background/bg-source.h b/panels/background/bg-source.h index edc7fda64..bb6f9d44d 100644 --- a/panels/background/bg-source.h +++ b/panels/background/bg-source.h @@ -25,9 +25,6 @@ G_BEGIN_DECLS -#define THUMBNAIL_WIDTH 256 -#define THUMBNAIL_HEIGHT (THUMBNAIL_WIDTH * 3 / 4) - #define BG_TYPE_SOURCE bg_source_get_type() #define BG_SOURCE(obj) \ @@ -70,6 +67,10 @@ GType bg_source_get_type (void) G_GNUC_CONST; GtkListStore* bg_source_get_liststore (BgSource *source); +gint bg_source_get_thumbnail_height (BgSource *source); + +gint bg_source_get_thumbnail_width (BgSource *source); + G_END_DECLS #endif /* _BG_SOURCE_H */ diff --git a/panels/background/bg-wallpapers-source.c b/panels/background/bg-wallpapers-source.c index 16bef34f7..d817ba088 100644 --- a/panels/background/bg-wallpapers-source.c +++ b/panels/background/bg-wallpapers-source.c @@ -50,6 +50,8 @@ load_wallpapers (gchar *key, GIcon *pixbuf; GtkListStore *store = bg_source_get_liststore (BG_SOURCE (source)); gboolean deleted; + gint thumbnail_height; + gint thumbnail_width; g_object_get (G_OBJECT (item), "is-deleted", &deleted, NULL); @@ -58,8 +60,10 @@ load_wallpapers (gchar *key, gtk_list_store_append (store, &iter); + thumbnail_height = bg_source_get_thumbnail_height (BG_SOURCE (source)); + thumbnail_width = bg_source_get_thumbnail_width (BG_SOURCE (source)); pixbuf = cc_background_item_get_thumbnail (item, priv->thumb_factory, - THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT); + thumbnail_width, thumbnail_height); gtk_list_store_set (store, &iter, 0, pixbuf, @@ -111,6 +115,23 @@ load_default_bg (BgWallpapersSource *self) } static void +bg_wallpapers_source_constructed (GObject *object) +{ + BgWallpapersSource *self = BG_WALLPAPERS_SOURCE (object); + BgWallpapersSourcePrivate *priv = self->priv; + + G_OBJECT_CLASS (bg_wallpapers_source_parent_class)->constructed (object); + + g_signal_connect (G_OBJECT (priv->xml), "added", + G_CALLBACK (item_added), self); + + /* Try adding the default background first */ + load_default_bg (self); + + cc_background_xml_load_list_async (priv->xml, NULL, list_load_cb, self); +} + +static void bg_wallpapers_source_dispose (GObject *object) { BgWallpapersSourcePrivate *priv = BG_WALLPAPERS_SOURCE (object)->priv; @@ -131,13 +152,6 @@ bg_wallpapers_source_init (BgWallpapersSource *self) priv->thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE); priv->xml = cc_background_xml_new (); - g_signal_connect (G_OBJECT (priv->xml), "added", - G_CALLBACK (item_added), self); - - /* Try adding the default background first */ - load_default_bg (self); - - cc_background_xml_load_list_async (priv->xml, NULL, list_load_cb, self); } static void @@ -147,12 +161,13 @@ bg_wallpapers_source_class_init (BgWallpapersSourceClass *klass) g_type_class_add_private (klass, sizeof (BgWallpapersSourcePrivate)); + object_class->constructed = bg_wallpapers_source_constructed; object_class->dispose = bg_wallpapers_source_dispose; } BgWallpapersSource * -bg_wallpapers_source_new (void) +bg_wallpapers_source_new (GtkWindow *window) { - return g_object_new (BG_TYPE_WALLPAPERS_SOURCE, NULL); + return g_object_new (BG_TYPE_WALLPAPERS_SOURCE, "window", window, NULL); } diff --git a/panels/background/bg-wallpapers-source.h b/panels/background/bg-wallpapers-source.h index e52bce4dc..b27c6776a 100644 --- a/panels/background/bg-wallpapers-source.h +++ b/panels/background/bg-wallpapers-source.h @@ -68,7 +68,7 @@ struct _BgWallpapersSourceClass GType bg_wallpapers_source_get_type (void) G_GNUC_CONST; -BgWallpapersSource *bg_wallpapers_source_new (void); +BgWallpapersSource *bg_wallpapers_source_new (GtkWindow *window); G_END_DECLS diff --git a/panels/background/cc-background-chooser-dialog.c b/panels/background/cc-background-chooser-dialog.c index 711629590..c667faa57 100644 --- a/panels/background/cc-background-chooser-dialog.c +++ b/panels/background/cc-background-chooser-dialog.c @@ -275,9 +275,9 @@ cc_background_chooser_dialog_init (CcBackgroundChooserDialog *chooser) chooser->priv = CC_CHOOSER_DIALOG_GET_PRIVATE (chooser); priv = chooser->priv; - priv->wallpapers_source = bg_wallpapers_source_new (); - priv->pictures_source = bg_pictures_source_new (); - priv->colors_source = bg_colors_source_new (); + priv->wallpapers_source = bg_wallpapers_source_new (GTK_WINDOW (chooser)); + priv->pictures_source = bg_pictures_source_new (GTK_WINDOW (chooser)); + priv->colors_source = bg_colors_source_new (GTK_WINDOW (chooser)); priv->row_inserted_id = 0; priv->row_deleted_id = 0; |