diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2007-06-19 10:29:55 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@src.gnome.org> | 2007-06-19 10:29:55 +0000 |
commit | 232e79a6d79b90d99deb11e126373d493f3045f6 (patch) | |
tree | 601105767d80e90704b65aab8416fe5c3946df66 /gtk/gtkrecentmanager.c | |
parent | d49e7facdb710e49c46d1470337ab121b1d6680f (diff) | |
download | gtk+-232e79a6d79b90d99deb11e126373d493f3045f6.tar.gz |
Use a static variable to hold the singleton and remove the code that binds
2007-06-19 Emmanuele Bassi <ebassi@gnome.org>
* gtk/gtkrecentmanager.c: Use a static variable to hold the
singleton and remove the code that binds a recent manager to
a GdkScreen.
(gtk_recent_manager_set_screen): Make it a NOOP.
(gtk_recent_manager_get_for_screen): Proxy for
gtk_recent_manager_get_default().
* gtk/gtk.symbols:
* gtk/gtkrecentmanager.h: Deprecate gtk_recent_manager_set_screen()
and gtk_recent_manager_get_for_screen().
* gtk/gtkmain.c: Force a synchronisation of the GtkRecentManager
singleton (if any) when reaching main loop depth of 0.
* gtk/gtkrecentchooserdefault.c:
(gtk_recent_chooser_default_dispose): Disconnect the changed
signal only if we have a manager and we are connected to it.
(set_recent_manager): Ditto.
* README.in: Document the deprecations.
svn path=/trunk/; revision=18184
Diffstat (limited to 'gtk/gtkrecentmanager.c')
-rw-r--r-- | gtk/gtkrecentmanager.c | 130 |
1 files changed, 37 insertions, 93 deletions
diff --git a/gtk/gtkrecentmanager.c b/gtk/gtkrecentmanager.c index 663e5fb4b0..8c0269947a 100644 --- a/gtk/gtkrecentmanager.c +++ b/gtk/gtkrecentmanager.c @@ -96,7 +96,6 @@ struct _GtkRecentManagerPrivate { gchar *filename; - guint is_screen_singleton : 1; guint is_dirty : 1; guint write_in_progress : 1; guint read_in_progress : 1; @@ -104,8 +103,6 @@ struct _GtkRecentManagerPrivate gint limit; gint size; - GdkScreen *screen; - GBookmarkFile *recent_items; time_t last_mtime; @@ -150,6 +147,8 @@ static void gtk_recent_info_free (GtkRecentInfo *re static guint signal_changed = 0; +static GtkRecentManager *recent_manager_singleton = NULL; + G_DEFINE_TYPE (GtkRecentManager, gtk_recent_manager, G_TYPE_OBJECT) static void @@ -286,13 +285,10 @@ gtk_recent_manager_init (GtkRecentManager *manager) priv->limit = DEFAULT_LIMIT; priv->size = 0; - priv->is_screen_singleton = FALSE; priv->is_dirty = FALSE; priv->write_in_progress = FALSE; priv->read_in_progress = FALSE; - priv->screen = NULL; - priv->filename = g_build_filename (g_get_home_dir (), GTK_RECENTLY_USED_FILE, NULL); @@ -364,7 +360,7 @@ gtk_recent_manager_finalize (GObject *object) if (priv->recent_items) g_bookmark_file_free (priv->recent_items); - + /* chain up parent's finalize method */ G_OBJECT_CLASS (gtk_recent_manager_parent_class)->finalize (object); } @@ -614,8 +610,7 @@ build_recent_items_list (GtkRecentManager *manager) * each time something inside the list changes. * * #GtkRecentManager objects are expensive: be sure to create them only when - * needed. You should use the gtk_recent_manager_new_for_screen() or the - * gtk_recent_manager_get_default() functions instead. + * needed. You should use gtk_recent_manager_get_default() instead. * * Return value: A newly created #GtkRecentManager object. * @@ -630,20 +625,21 @@ gtk_recent_manager_new (void) /** * gtk_recent_manager_get_default: * - * Gets the recent manager for the default screen. See - * gtk_recent_manager_get_for_screen(). + * Gets a unique instance of #GtkRecentManager, that you can share + * in your application without caring about memory management. The + * returned instance will be freed when you application terminates. * - * Return value: A unique #GtkRecentManager associated with the - * default screen. This recent manager is associated with the - * screen and can be used as long as the screen is open. - * Do not ref or unref it. + * Return value: A unique #GtkRecentManager. Do not ref or unref it. * * Since: 2.10 */ GtkRecentManager * gtk_recent_manager_get_default (void) { - return gtk_recent_manager_get_for_screen (gdk_screen_get_default ()); + if (G_UNLIKELY (!recent_manager_singleton)) + recent_manager_singleton = gtk_recent_manager_new (); + + return recent_manager_singleton; } /** @@ -664,70 +660,16 @@ gtk_recent_manager_get_default (void) * and can be used as long as the screen is open. Do not ref or * unref it. * + * @Deprecated: 2.12: This function has been deprecated and should + * not be used in newly written code. Calling this function is + * equivalent to calling gtk_recent_manager_get_default(). + * * Since: 2.10 */ GtkRecentManager * gtk_recent_manager_get_for_screen (GdkScreen *screen) { - GtkRecentManager *manager; - - g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); - g_return_val_if_fail (!screen->closed, NULL); - - manager = g_object_get_data (G_OBJECT (screen), "gtk-recent-manager-default"); - if (!manager) - { - GtkRecentManagerPrivate *priv; - - manager = gtk_recent_manager_new (); - gtk_recent_manager_set_screen (manager, screen); - - priv = manager->priv; - priv->is_screen_singleton = TRUE; - - g_object_set_data (G_OBJECT (screen), I_("gtk-recent-manager-default"), manager); - } - - return manager; -} - -static void -display_closed (GdkDisplay *display, - gboolean is_error, - GtkRecentManager *manager) -{ - GtkRecentManagerPrivate *priv = manager->priv; - GdkScreen *screen = priv->screen; - gboolean was_screen_singleton = priv->is_screen_singleton; - - if (was_screen_singleton) - { - g_object_set_data (G_OBJECT (screen), I_("gtk-recent-manager-default"), NULL); - priv->is_screen_singleton = FALSE; - } - - gtk_recent_manager_set_screen (manager, NULL); - - if (was_screen_singleton) - g_object_unref (manager); -} - -static void -unset_screen (GtkRecentManager *manager) -{ - GtkRecentManagerPrivate *priv = manager->priv; - GdkDisplay *display; - - if (priv->screen) - { - display = gdk_screen_get_display (priv->screen); - - g_signal_handlers_disconnect_by_func (display, - (gpointer) display_closed, - manager); - - priv->screen = NULL; - } + return gtk_recent_manager_get_default (); } /** @@ -740,30 +682,16 @@ unset_screen (GtkRecentManager *manager) * storage. * * Since: 2.10 + * + * @Deprecated: 2.12: This function has been deprecated and should + * not be used in newly written code. Calling this function has + * no effect. */ void gtk_recent_manager_set_screen (GtkRecentManager *manager, GdkScreen *screen) { - GtkRecentManagerPrivate *priv; - GdkDisplay *display; - - g_return_if_fail (GTK_IS_RECENT_MANAGER (manager)); - g_return_if_fail (screen == NULL || GDK_IS_SCREEN (screen)); - - priv = manager->priv; - unset_screen (manager); - - if (screen) - { - display = gdk_screen_get_display (screen); - - priv->screen = screen; - - g_signal_connect (display, "closed", - G_CALLBACK (display_closed), manager); - } } /** @@ -2448,5 +2376,21 @@ gtk_recent_info_has_group (GtkRecentInfo *info, return FALSE; } +/* + * _gtk_recent_manager_sync: + * + * Private function for synchronising the recent manager singleton. + */ +void +_gtk_recent_manager_sync (void) +{ + if (recent_manager_singleton) + { + /* force a dump of the contents of the recent manager singleton */ + recent_manager_singleton->priv->is_dirty = TRUE; + gtk_recent_manager_real_changed (recent_manager_singleton); + } +} + #define __GTK_RECENT_MANAGER_C__ #include "gtkaliasdef.c" |