diff options
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | matchbox-panel/mb-panel-scaling-image.c | 156 | ||||
-rw-r--r-- | matchbox-panel/mb-panel-scaling-image.h | 19 |
3 files changed, 179 insertions, 14 deletions
@@ -1,3 +1,21 @@ +2007-06-12 Jorn Baayen <jorn@openedhand.com> + + * matchbox-panel/mb-panel-scaling-image.c: + (mb_panel_scaling_image_init), + (mb_panel_scaling_image_set_property), + (mb_panel_scaling_image_get_property), + (mb_panel_scaling_image_dispose), + (mb_panel_scaling_image_finalize), (reload_icon), + (icon_theme_changed_cb), (mb_panel_scaling_image_realize), + (mb_panel_scaling_image_unrealize), + (mb_panel_scaling_image_screen_changed), + (mb_panel_scaling_image_class_init), (mb_panel_scaling_image_new), + (mb_panel_scaling_image_set_icon), + (mb_panel_scaling_image_get_icon): + * matchbox-panel/mb-panel-scaling-image.h: + + Added 'caching' property for caching undisplayed pixbufs. + 2007-04-17 Jorn Baayen <jorn@openedhand.com> * applets/windowselector/windowselector.c: (screen_changed_cb): diff --git a/matchbox-panel/mb-panel-scaling-image.c b/matchbox-panel/mb-panel-scaling-image.c index daab65b..c455af2 100644 --- a/matchbox-panel/mb-panel-scaling-image.c +++ b/matchbox-panel/mb-panel-scaling-image.c @@ -1,5 +1,5 @@ /* - * (C) 2006 OpenedHand Ltd. + * (C) 2006, 2007 OpenedHand Ltd. * * Author: Jorn Baayen <jorn@openedhand.com> * @@ -16,6 +16,10 @@ struct _MBPanelScalingImagePrivate { char *icon; + gboolean caching; + + GHashTable *cache; + GtkIconTheme *icon_theme; guint icon_theme_changed_id; }; @@ -23,7 +27,8 @@ struct _MBPanelScalingImagePrivate { enum { PROP_0, PROP_ORIENTATION, - PROP_ICON + PROP_ICON, + PROP_CACHING }; G_DEFINE_TYPE (MBPanelScalingImage, @@ -40,6 +45,10 @@ mb_panel_scaling_image_init (MBPanelScalingImage *image) image->priv->orientation = GTK_ORIENTATION_HORIZONTAL; image->priv->icon = NULL; + + image->priv->caching = FALSE; + + image->priv->cache = NULL; } static void @@ -60,6 +69,10 @@ mb_panel_scaling_image_set_property (GObject *object, mb_panel_scaling_image_set_icon (image, g_value_get_string (value)); break; + case PROP_CACHING: + mb_panel_scaling_image_set_caching + (image, g_value_get_boolean (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -83,6 +96,9 @@ mb_panel_scaling_image_get_property (GObject *object, case PROP_ICON: g_value_set_string (value, image->priv->icon); break; + case PROP_CACHING: + g_value_set_boolean (value, image->priv->caching); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -104,6 +120,9 @@ mb_panel_scaling_image_dispose (GObject *object) image->priv->icon_theme_changed_id = 0; } + if (image->priv->cache) + g_hash_table_destroy (image->priv->cache); + object_class = G_OBJECT_CLASS (mb_panel_scaling_image_parent_class); object_class->dispose (object); } @@ -122,6 +141,26 @@ mb_panel_scaling_image_finalize (GObject *object) object_class->finalize (object); } +static gboolean +return_true (gpointer a, + gpointer b, + gpointer c) +{ + return TRUE; +} + +/* Clear the pixbuf cache */ +static void +clear_cache (MBPanelScalingImage *image) +{ + if (!image->priv->caching) + return; + + g_hash_table_foreach_remove (image->priv->cache, + return_true, + NULL); +} + /* Strips extension off filename */ static char * strip_extension (const char *file) @@ -225,7 +264,12 @@ reload_icon (MBPanelScalingImage *image) if (pixbuf) { gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf); - g_object_unref (pixbuf); + if (image->priv->caching) { + g_hash_table_insert (image->priv->cache, + image->priv->icon, + pixbuf); + } else + g_object_unref (pixbuf); } else { g_warning (error->message); @@ -238,8 +282,12 @@ static void icon_theme_changed_cb (GtkIconTheme *icon_theme, MBPanelScalingImage *image) { - if (GTK_WIDGET_REALIZED (image)) - reload_icon (image); + if (!GTK_WIDGET_REALIZED (image)) + return; + + clear_cache (image); + + reload_icon (image); } static void @@ -254,6 +302,17 @@ mb_panel_scaling_image_realize (GtkWidget *widget) } static void +mb_panel_scaling_image_unrealize (GtkWidget *widget) +{ + GtkWidgetClass *widget_class; + + clear_cache (MB_PANEL_SCALING_IMAGE (widget)); + + widget_class = GTK_WIDGET_CLASS (mb_panel_scaling_image_parent_class); + widget_class->unrealize (widget); +} + +static void mb_panel_scaling_image_screen_changed (GtkWidget *widget, GdkScreen *old_screen) { @@ -286,8 +345,11 @@ mb_panel_scaling_image_screen_changed (GtkWidget *widget, image); /* Reload icon if we are realized */ - if (GTK_WIDGET_REALIZED (widget)) + if (GTK_WIDGET_REALIZED (widget)) { + clear_cache (image); + reload_icon (MB_PANEL_SCALING_IMAGE (widget)); + } widget_class = GTK_WIDGET_CLASS (mb_panel_scaling_image_parent_class); widget_class->screen_changed (widget, old_screen); @@ -309,6 +371,7 @@ mb_panel_scaling_image_class_init (MBPanelScalingImageClass *klass) widget_class = GTK_WIDGET_CLASS (klass); widget_class->realize = mb_panel_scaling_image_realize; + widget_class->unrealize = mb_panel_scaling_image_unrealize; widget_class->screen_changed = mb_panel_scaling_image_screen_changed; g_type_class_add_private (klass, sizeof (MBPanelScalingImagePrivate)); @@ -337,6 +400,18 @@ mb_panel_scaling_image_class_init (MBPanelScalingImageClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + + g_object_class_install_property + (object_class, + PROP_CACHING, + g_param_spec_boolean + ("caching", + "Caching.", + "TRUE if icons should be cached.", + FALSE, + G_PARAM_READWRITE | + G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | + G_PARAM_STATIC_BLURB)); } /** @@ -375,8 +450,24 @@ mb_panel_scaling_image_set_icon (MBPanelScalingImage *image, if (icon) image->priv->icon = g_strdup (icon); - if (GTK_WIDGET_REALIZED (image)) - reload_icon (image); + if (!GTK_WIDGET_REALIZED (image)) + return; + + if (image->priv->caching) { + /* Check cache first */ + GdkPixbuf *pixbuf; + + pixbuf = g_hash_table_lookup (image->priv->cache, + icon); + + if (pixbuf != NULL) { + gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf); + + return; + } + } + + reload_icon (image); } /** @@ -392,3 +483,52 @@ mb_panel_scaling_image_get_icon (MBPanelScalingImage *image) return image->priv->icon; } + +/** + * mb_panel_scaling_image_set_caching + * @image: A #MBPanelScalingImage + * @caching: TRUE if image caching is desired + * + * Sets the caching mode to @caching. If @caching is TRUE, + * #GdkPixbuf objects previously loaded by @image will be kept around. + * Use this if you want to quickly alternate between a fixed set of images. + * + * Setting @caching to FALSE causes the cache to be purged. + **/ +void +mb_panel_scaling_image_set_caching (MBPanelScalingImage *image, + gboolean caching) +{ + g_return_if_fail (MB_PANEL_IS_SCALING_IMAGE (image)); + + if (image->priv->caching == caching) + return; + + image->priv->caching = caching; + + if (caching) { + /* Create cache */ + image->priv->cache = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + g_object_unref); + } else { + /* Destroy cache */ + g_hash_table_destroy (image->priv->cache); + image->priv->cache = NULL; + } +} + +/** + * mb_panel_scaling_image_get_caching + * @image: A #MBPanelScalingImage + * + * Return value: TRUE if image caching is enabled. + **/ +gboolean +mb_panel_scaling_image_get_caching (MBPanelScalingImage *image) +{ + g_return_val_if_fail (MB_PANEL_IS_SCALING_IMAGE (image), FALSE); + + return image->priv->caching; +} diff --git a/matchbox-panel/mb-panel-scaling-image.h b/matchbox-panel/mb-panel-scaling-image.h index 0c4be96..50016c6 100644 --- a/matchbox-panel/mb-panel-scaling-image.h +++ b/matchbox-panel/mb-panel-scaling-image.h @@ -1,5 +1,5 @@ /* - * (C) 2006 OpenedHand Ltd. + * (C) 2006, 2007 OpenedHand Ltd. * * Author: Jorn Baayen <jorn@openedhand.com> * @@ -56,15 +56,22 @@ GType mb_panel_scaling_image_get_type (void) G_GNUC_CONST; GtkWidget * -mb_panel_scaling_image_new (GtkOrientation orientation, - const char *icon); +mb_panel_scaling_image_new (GtkOrientation orientation, + const char *icon); void -mb_panel_scaling_image_set_icon (MBPanelScalingImage *image, - const char *icon); +mb_panel_scaling_image_set_icon (MBPanelScalingImage *image, + const char *icon); const char * -mb_panel_scaling_image_get_icon (MBPanelScalingImage *image); +mb_panel_scaling_image_get_icon (MBPanelScalingImage *image); + +void +mb_panel_scaling_image_set_caching (MBPanelScalingImage *image, + gboolean cached); + +gboolean +mb_panel_scaling_image_get_caching (MBPanelScalingImage *image); G_END_DECLS |