X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkrecentaction.c;h=211ab97ed01f1d4cc7fc7ea2115a7358856af55f;hb=6767541ead7cc150d1dd066d3b84d85559500c28;hp=2644459eeff8055e8dd7e76ecd8d9edd8b5e5ab8;hpb=8fb6c039bbfee62cadc25238091711f2f7058985;p=~andy%2Fgtk diff --git a/gtk/gtkrecentaction.c b/gtk/gtkrecentaction.c index 2644459ee..211ab97ed 100644 --- a/gtk/gtkrecentaction.c +++ b/gtk/gtkrecentaction.c @@ -14,12 +14,10 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ -#include +#include "config.h" #include "gtkintl.h" #include "gtkrecentaction.h" @@ -30,19 +28,29 @@ #include "gtkrecentchooserutils.h" #include "gtkrecentchooserprivate.h" #include "gtkprivate.h" -#include "gtkalias.h" + +/** + * SECTION:gtkrecentaction + * @Short_description: An action of which represents a list of recently used files + * @Title: GtkRecentAction + * + * A #GtkRecentAction represents a list of recently used files, which + * can be shown by widgets such as #GtkRecentChooserDialog or + * #GtkRecentChooserMenu. + * + * To construct a submenu showing recently used files, use a #GtkRecentAction + * as the action for a <menuitem>. To construct a menu toolbutton showing + * the recently used files in the popup menu, use a #GtkRecentAction as the + * action for a <toolitem> element. + */ + #define FALLBACK_ITEM_LIMIT 10 -#define GTK_RECENT_ACTION_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \ - GTK_TYPE_RECENT_ACTION, \ - GtkRecentActionPrivate)) struct _GtkRecentActionPrivate { GtkRecentManager *manager; - guint manager_changed_id; guint show_numbers : 1; @@ -57,8 +65,8 @@ struct _GtkRecentActionPrivate GtkRecentSortType sort_type; GtkRecentSortFunc sort_func; - gpointer sort_data; - GDestroyNotify data_destroy; + gpointer sort_data; + GDestroyNotify data_destroy; GtkRecentFilter *current_filter; @@ -152,16 +160,16 @@ gtk_recent_action_unselect_uri (GtkRecentChooser *chooser, static void gtk_recent_action_select_all (GtkRecentChooser *chooser) { - g_warning (_("This function is not implemented for " - "widgets of class '%s'"), + g_warning ("This function is not implemented for " + "widgets of class '%s'", g_type_name (G_OBJECT_TYPE (chooser))); } static void gtk_recent_action_unselect_all (GtkRecentChooser *chooser) { - g_warning (_("This function is not implemented for " - "widgets of class '%s'"), + g_warning ("This function is not implemented for " + "widgets of class '%s'", g_type_name (G_OBJECT_TYPE (chooser))); } @@ -181,7 +189,7 @@ gtk_recent_action_get_items (GtkRecentChooser *chooser) static GtkRecentManager * gtk_recent_action_get_recent_manager (GtkRecentChooser *chooser) { - return GTK_RECENT_ACTION_GET_PRIVATE (chooser)->manager; + return GTK_RECENT_ACTION (chooser)->priv->manager; } static void @@ -192,6 +200,7 @@ gtk_recent_action_set_sort_func (GtkRecentChooser *chooser, { GtkRecentAction *action = GTK_RECENT_ACTION (chooser); GtkRecentActionPrivate *priv = action->priv; + GSList *l; if (priv->data_destroy) { @@ -208,6 +217,15 @@ gtk_recent_action_set_sort_func (GtkRecentChooser *chooser, priv->sort_data = sort_data; priv->data_destroy = data_destroy; } + + for (l = priv->choosers; l; l = l->next) + { + GtkRecentChooser *chooser_menu = l->data; + + gtk_recent_chooser_set_sort_func (chooser_menu, priv->sort_func, + priv->sort_data, + priv->data_destroy); + } } static void @@ -235,7 +253,8 @@ static void gtk_recent_action_add_filter (GtkRecentChooser *chooser, GtkRecentFilter *filter) { - GtkRecentActionPrivate *priv = GTK_RECENT_ACTION_GET_PRIVATE (chooser); + GtkRecentAction *action = GTK_RECENT_ACTION (chooser); + GtkRecentActionPrivate *priv = action->priv; if (priv->current_filter != filter) set_current_filter (GTK_RECENT_ACTION (chooser), filter); @@ -245,7 +264,8 @@ static void gtk_recent_action_remove_filter (GtkRecentChooser *chooser, GtkRecentFilter *filter) { - GtkRecentActionPrivate *priv = GTK_RECENT_ACTION_GET_PRIVATE (chooser); + GtkRecentAction *action = GTK_RECENT_ACTION (chooser); + GtkRecentActionPrivate *priv = action->priv; if (priv->current_filter == filter) set_current_filter (GTK_RECENT_ACTION (chooser), NULL); @@ -254,10 +274,12 @@ gtk_recent_action_remove_filter (GtkRecentChooser *chooser, static GSList * gtk_recent_action_list_filters (GtkRecentChooser *chooser) { + GtkRecentAction *action = GTK_RECENT_ACTION (chooser); + GtkRecentActionPrivate *priv = action->priv; GSList *retval = NULL; GtkRecentFilter *current_filter; - current_filter = GTK_RECENT_ACTION_GET_PRIVATE (chooser)->current_filter; + current_filter = priv->current_filter; retval = g_slist_prepend (retval, current_filter); return retval; @@ -284,11 +306,14 @@ gtk_recent_chooser_iface_init (GtkRecentChooserIface *iface) static void gtk_recent_action_activate (GtkAction *action) { + GtkRecentAction *recent_action = GTK_RECENT_ACTION (action); + GtkRecentActionPrivate *priv = recent_action->priv; + /* we have probably been invoked by a menu tool button or by a * direct call of gtk_action_activate(); since no item has been * selected, we must unset the current recent chooser pointer */ - GTK_RECENT_ACTION_GET_PRIVATE (action)->current_chooser = NULL; + priv->current_chooser = NULL; } static void @@ -320,19 +345,10 @@ gtk_recent_action_connect_proxy (GtkAction *action, GtkRecentAction *recent_action = GTK_RECENT_ACTION (action); GtkRecentActionPrivate *priv = recent_action->priv; + /* it can only be a recent chooser implementor anyway... */ if (GTK_IS_RECENT_CHOOSER (widget) && !g_slist_find (priv->choosers, widget)) { - g_object_set (G_OBJECT (widget), - "show-private", priv->show_private, - "show-not-found", priv->show_not_found, - "show-tips", priv->show_tips, - "show-icons", priv->show_icons, - "show-numbers", priv->show_numbers, - "limit", priv->limit, - "sort-type", priv->sort_type, - NULL); - if (priv->sort_func) { gtk_recent_chooser_set_sort_func (GTK_RECENT_CHOOSER (widget), @@ -349,7 +365,8 @@ gtk_recent_action_connect_proxy (GtkAction *action, action); } - GTK_ACTION_CLASS (gtk_recent_action_parent_class)->connect_proxy (action, widget); + if (GTK_ACTION_CLASS (gtk_recent_action_parent_class)->connect_proxy) + GTK_ACTION_CLASS (gtk_recent_action_parent_class)->connect_proxy (action, widget); } static void @@ -365,7 +382,8 @@ gtk_recent_action_disconnect_proxy (GtkAction *action, if (g_slist_find (priv->choosers, widget)) priv->choosers = g_slist_remove (priv->choosers, widget); - GTK_ACTION_CLASS (gtk_recent_action_parent_class)->disconnect_proxy (action, widget); + if (GTK_ACTION_CLASS (gtk_recent_action_parent_class)->disconnect_proxy) + GTK_ACTION_CLASS (gtk_recent_action_parent_class)->disconnect_proxy (action, widget); } static GtkWidget * @@ -384,6 +402,8 @@ gtk_recent_action_create_menu (GtkAction *action) "limit", priv->limit, "sort-type", priv->sort_type, "recent-manager", priv->manager, + "filter", priv->current_filter, + "local-only", priv->local_only, NULL); if (priv->sort_func) @@ -435,39 +455,16 @@ gtk_recent_action_create_tool_item (GtkAction *action) return toolitem; } -static void -manager_changed_cb (GtkRecentManager *manager, - gpointer user_data) -{ - /* do we need to propagate the signal to all the proxies? guess not */ -} - static void set_recent_manager (GtkRecentAction *action, GtkRecentManager *manager) { GtkRecentActionPrivate *priv = action->priv; - if (priv->manager) - { - if (priv->manager_changed_id) - { - g_signal_handler_disconnect (priv->manager, priv->manager_changed_id); - priv->manager_changed_id = 0; - } - - priv->manager = NULL; - } - if (manager) priv->manager = NULL; else priv->manager = gtk_recent_manager_get_default (); - - if (priv->manager) - priv->manager_changed_id = g_signal_connect (priv->manager, "changed", - G_CALLBACK (manager_changed_cb), - action); } static void @@ -498,14 +495,6 @@ gtk_recent_action_dispose (GObject *gobject) GtkRecentAction *action = GTK_RECENT_ACTION (gobject); GtkRecentActionPrivate *priv = action->priv; - if (priv->manager_changed_id) - { - if (priv->manager) - g_signal_handler_disconnect (priv->manager, priv->manager_changed_id); - - priv->manager_changed_id = 0; - } - if (priv->current_filter) { g_object_unref (priv->current_filter); @@ -523,7 +512,6 @@ gtk_recent_action_set_property (GObject *gobject, { GtkRecentAction *action = GTK_RECENT_ACTION (gobject); GtkRecentActionPrivate *priv = action->priv; - GSList *l; switch (prop_id) { @@ -558,7 +546,7 @@ gtk_recent_action_set_property (GObject *gobject, g_warning ("%s: Choosers of type `%s' do not support selecting multiple items.", G_STRFUNC, G_OBJECT_TYPE_NAME (gobject)); - break; + return; case GTK_RECENT_CHOOSER_PROP_RECENT_MANAGER: set_recent_manager (action, g_value_get_object (value)); break; @@ -566,14 +554,6 @@ gtk_recent_action_set_property (GObject *gobject, G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); return; } - - /* propagate the properties to the proxies we have created */ - for (l = priv->choosers; l != NULL; l = l->next) - { - GObject *proxy = l->data; - - g_object_set_property (proxy, pspec->name, value); - } } static void @@ -582,7 +562,8 @@ gtk_recent_action_get_property (GObject *gobject, GValue *value, GParamSpec *pspec) { - GtkRecentActionPrivate *priv = GTK_RECENT_ACTION_GET_PRIVATE (gobject); + GtkRecentAction *action = GTK_RECENT_ACTION (gobject); + GtkRecentActionPrivate *priv = action->priv; switch (prop_id) { @@ -614,9 +595,7 @@ gtk_recent_action_get_property (GObject *gobject, g_value_set_object (value, priv->current_filter); break; case GTK_RECENT_CHOOSER_PROP_SELECT_MULTIPLE: - g_warning ("%s: Choosers of type `%s' do not support selecting multiple items.", - G_STRFUNC, - G_OBJECT_TYPE_NAME (gobject)); + g_value_set_boolean (value, FALSE); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); @@ -663,7 +642,9 @@ gtk_recent_action_init (GtkRecentAction *action) { GtkRecentActionPrivate *priv; - action->priv = priv = GTK_RECENT_ACTION_GET_PRIVATE (action); + action->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE (action, + GTK_TYPE_RECENT_ACTION, + GtkRecentActionPrivate); priv->show_numbers = FALSE; priv->show_icons = TRUE; @@ -682,16 +663,16 @@ gtk_recent_action_init (GtkRecentAction *action) priv->current_filter = NULL; priv->manager = NULL; - priv->manager_changed_id = 0; } /** * gtk_recent_action_new: * @name: a unique name for the action - * @label: the label displayed in menu items and on buttons, or %NULL - * @tooltip: a tooltip for the action, or %NULL - * @stock_id: the stock icon to display in widgets representing the - * action, or %NULL + * @label: (allow-none): the label displayed in menu items and on buttons, + * or %NULL + * @tooltip: (allow-none): a tooltip for the action, or %NULL + * @stock_id: (allow-none): the stock icon to display in widgets representing + * the action, or %NULL * * Creates a new #GtkRecentAction object. To add the action to * a #GtkActionGroup and set the accelerator for the action, @@ -720,11 +701,12 @@ gtk_recent_action_new (const gchar *name, /** * gtk_recent_action_new_for_manager: * @name: a unique name for the action - * @label: the label displayed in menu items and on buttons, or %NULL - * @tooltip: a tooltip for the action, or %NULL - * @stock_id: the stock icon to display in widgets representing the - * action, or %NULL - * @manager: a #GtkRecentManager, or %NULL for using the default + * @label: (allow-none): the label displayed in menu items and on buttons, + * or %NULL + * @tooltip: (allow-none): a tooltip for the action, or %NULL + * @stock_id: (allow-none): the stock icon to display in widgets representing + * the action, or %NULL + * @manager: (allow-none): a #GtkRecentManager, or %NULL for using the default * #GtkRecentManager * * Creates a new #GtkRecentAction object. To add the action to @@ -804,6 +786,3 @@ gtk_recent_action_set_show_numbers (GtkRecentAction *action, g_object_unref (action); } } - -#define __GTK_RECENT_ACTION_C__ -#include "gtkaliasdef.c"