Blame gtk/gtkrecentchooserutils.c

Packit Service fb6fa5
/* gtkrecentchooserutils.h - Private utility functions for implementing a
Packit Service fb6fa5
 *                           GtkRecentChooser interface
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Copyright (C) 2006 Emmanuele Bassi
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * All rights reserved
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Library General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Library General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Library General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Based on gtkfilechooserutils.c:
Packit Service fb6fa5
 *	Copyright (C) 2003 Red Hat, Inc.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkrecentchooserutils.h"
Packit Service fb6fa5
#include "gtkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
/* Methods */
Packit Service fb6fa5
static void      delegate_set_sort_func              (GtkRecentChooser  *chooser,
Packit Service fb6fa5
						      GtkRecentSortFunc  sort_func,
Packit Service fb6fa5
						      gpointer           sort_data,
Packit Service fb6fa5
						      GDestroyNotify     data_destroy);
Packit Service fb6fa5
static void      delegate_add_filter                 (GtkRecentChooser  *chooser,
Packit Service fb6fa5
						      GtkRecentFilter   *filter);
Packit Service fb6fa5
static void      delegate_remove_filter              (GtkRecentChooser  *chooser,
Packit Service fb6fa5
						      GtkRecentFilter   *filter);
Packit Service fb6fa5
static GSList   *delegate_list_filters               (GtkRecentChooser  *chooser);
Packit Service fb6fa5
static gboolean  delegate_select_uri                 (GtkRecentChooser  *chooser,
Packit Service fb6fa5
						      const gchar       *uri,
Packit Service fb6fa5
						      GError           **error);
Packit Service fb6fa5
static void      delegate_unselect_uri               (GtkRecentChooser  *chooser,
Packit Service fb6fa5
						      const gchar       *uri);
Packit Service fb6fa5
static GList    *delegate_get_items                  (GtkRecentChooser  *chooser);
Packit Service fb6fa5
static GtkRecentManager *delegate_get_recent_manager (GtkRecentChooser  *chooser);
Packit Service fb6fa5
static void      delegate_select_all                 (GtkRecentChooser  *chooser);
Packit Service fb6fa5
static void      delegate_unselect_all               (GtkRecentChooser  *chooser);
Packit Service fb6fa5
static gboolean  delegate_set_current_uri            (GtkRecentChooser  *chooser,
Packit Service fb6fa5
						      const gchar       *uri,
Packit Service fb6fa5
						      GError           **error);
Packit Service fb6fa5
static gchar *   delegate_get_current_uri            (GtkRecentChooser  *chooser);
Packit Service fb6fa5
Packit Service fb6fa5
/* Signals */
Packit Service fb6fa5
static void      delegate_notify            (GObject          *object,
Packit Service fb6fa5
					     GParamSpec       *pspec,
Packit Service fb6fa5
					     gpointer          user_data);
Packit Service fb6fa5
static void      delegate_selection_changed (GtkRecentChooser *receiver,
Packit Service fb6fa5
					     gpointer          user_data);
Packit Service fb6fa5
static void      delegate_item_activated    (GtkRecentChooser *receiver,
Packit Service fb6fa5
					     gpointer          user_data);
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * _gtk_recent_chooser_install_properties:
Packit Service fb6fa5
 * @klass: the class structure for a type deriving from #GObject
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Installs the necessary properties for a class implementing
Packit Service fb6fa5
 * #GtkRecentChooser. A #GtkParamSpecOverride property is installed
Packit Service fb6fa5
 * for each property, using the values from the #GtkRecentChooserProp
Packit Service fb6fa5
 * enumeration. The caller must make sure itself that the enumeration
Packit Service fb6fa5
 * values don't collide with some other property values they
Packit Service fb6fa5
 * are using.
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_recent_chooser_install_properties (GObjectClass *klass)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_object_class_override_property (klass,
Packit Service fb6fa5
  				    GTK_RECENT_CHOOSER_PROP_RECENT_MANAGER,
Packit Service fb6fa5
  				    "recent-manager");  				    
Packit Service fb6fa5
  g_object_class_override_property (klass,
Packit Service fb6fa5
  				    GTK_RECENT_CHOOSER_PROP_SHOW_PRIVATE,
Packit Service fb6fa5
  				    "show-private");
Packit Service fb6fa5
  g_object_class_override_property (klass,
Packit Service fb6fa5
  				    GTK_RECENT_CHOOSER_PROP_SHOW_TIPS,
Packit Service fb6fa5
  				    "show-tips");
Packit Service fb6fa5
  g_object_class_override_property (klass,
Packit Service fb6fa5
  				    GTK_RECENT_CHOOSER_PROP_SHOW_ICONS,
Packit Service fb6fa5
  				    "show-icons");
Packit Service fb6fa5
  g_object_class_override_property (klass,
Packit Service fb6fa5
  				    GTK_RECENT_CHOOSER_PROP_SHOW_NOT_FOUND,
Packit Service fb6fa5
  				    "show-not-found");
Packit Service fb6fa5
  g_object_class_override_property (klass,
Packit Service fb6fa5
  				    GTK_RECENT_CHOOSER_PROP_SELECT_MULTIPLE,
Packit Service fb6fa5
  				    "select-multiple");
Packit Service fb6fa5
  g_object_class_override_property (klass,
Packit Service fb6fa5
  				    GTK_RECENT_CHOOSER_PROP_LIMIT,
Packit Service fb6fa5
  				    "limit");
Packit Service fb6fa5
  g_object_class_override_property (klass,
Packit Service fb6fa5
		  		    GTK_RECENT_CHOOSER_PROP_LOCAL_ONLY,
Packit Service fb6fa5
				    "local-only");
Packit Service fb6fa5
  g_object_class_override_property (klass,
Packit Service fb6fa5
		  		    GTK_RECENT_CHOOSER_PROP_SORT_TYPE,
Packit Service fb6fa5
				    "sort-type");
Packit Service fb6fa5
  g_object_class_override_property (klass,
Packit Service fb6fa5
  				    GTK_RECENT_CHOOSER_PROP_FILTER,
Packit Service fb6fa5
  				    "filter");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * _gtk_recent_chooser_delegate_iface_init:
Packit Service fb6fa5
 * @iface: a #GtkRecentChooserIface
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * An interface-initialization function for use in cases where
Packit Service fb6fa5
 * an object is simply delegating the methods, signals of
Packit Service fb6fa5
 * the #GtkRecentChooser interface to another object.
Packit Service fb6fa5
 * _gtk_recent_chooser_set_delegate() must be called on each
Packit Service fb6fa5
 * instance of the object so that the delegate object can
Packit Service fb6fa5
 * be found.
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_recent_chooser_delegate_iface_init (GtkRecentChooserIface *iface)
Packit Service fb6fa5
{
Packit Service fb6fa5
  iface->set_current_uri = delegate_set_current_uri;
Packit Service fb6fa5
  iface->get_current_uri = delegate_get_current_uri;
Packit Service fb6fa5
  iface->select_uri = delegate_select_uri;
Packit Service fb6fa5
  iface->unselect_uri = delegate_unselect_uri;
Packit Service fb6fa5
  iface->select_all = delegate_select_all;
Packit Service fb6fa5
  iface->unselect_all = delegate_unselect_all;
Packit Service fb6fa5
  iface->get_items = delegate_get_items;
Packit Service fb6fa5
  iface->get_recent_manager = delegate_get_recent_manager;
Packit Service fb6fa5
  iface->set_sort_func = delegate_set_sort_func;
Packit Service fb6fa5
  iface->add_filter = delegate_add_filter;
Packit Service fb6fa5
  iface->remove_filter = delegate_remove_filter;
Packit Service fb6fa5
  iface->list_filters = delegate_list_filters;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * _gtk_recent_chooser_set_delegate:
Packit Service fb6fa5
 * @receiver: a #GObject implementing #GtkRecentChooser
Packit Service fb6fa5
 * @delegate: another #GObject implementing #GtkRecentChooser
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Establishes that calls on @receiver for #GtkRecentChooser
Packit Service fb6fa5
 * methods should be delegated to @delegate, and that
Packit Service fb6fa5
 * #GtkRecentChooser signals emitted on @delegate should be
Packit Service fb6fa5
 * forwarded to @receiver. Must be used in conjunction with
Packit Service fb6fa5
 * _gtk_recent_chooser_delegate_iface_init().
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_recent_chooser_set_delegate (GtkRecentChooser *receiver,
Packit Service fb6fa5
				  GtkRecentChooser *delegate)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_RECENT_CHOOSER (receiver));
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_RECENT_CHOOSER (delegate));
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_set_data (G_OBJECT (receiver),
Packit Service fb6fa5
  		    "gtk-recent-chooser-delegate", delegate);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_signal_connect (delegate, "notify",
Packit Service fb6fa5
  		    G_CALLBACK (delegate_notify), receiver);
Packit Service fb6fa5
  g_signal_connect (delegate, "selection-changed",
Packit Service fb6fa5
  		    G_CALLBACK (delegate_selection_changed), receiver);
Packit Service fb6fa5
  g_signal_connect (delegate, "item-activated",
Packit Service fb6fa5
  		    G_CALLBACK (delegate_item_activated), receiver);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GQuark
Packit Service fb6fa5
_gtk_recent_chooser_delegate_get_quark (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static GQuark quark = 0;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (G_UNLIKELY (quark == 0))
Packit Service fb6fa5
    quark = g_quark_from_static_string ("gtk-recent-chooser-delegate");
Packit Service fb6fa5
  
Packit Service fb6fa5
  return quark;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GtkRecentChooser *
Packit Service fb6fa5
get_delegate (GtkRecentChooser *receiver)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_object_get_qdata (G_OBJECT (receiver),
Packit Service fb6fa5
  			     GTK_RECENT_CHOOSER_DELEGATE_QUARK);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
delegate_set_sort_func (GtkRecentChooser  *chooser,
Packit Service fb6fa5
			GtkRecentSortFunc  sort_func,
Packit Service fb6fa5
			gpointer           sort_data,
Packit Service fb6fa5
			GDestroyNotify     data_destroy)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_recent_chooser_set_sort_func (get_delegate (chooser),
Packit Service fb6fa5
		  		    sort_func,
Packit Service fb6fa5
				    sort_data,
Packit Service fb6fa5
				    data_destroy);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
delegate_add_filter (GtkRecentChooser *chooser,
Packit Service fb6fa5
		     GtkRecentFilter  *filter)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_recent_chooser_add_filter (get_delegate (chooser), filter);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
delegate_remove_filter (GtkRecentChooser *chooser,
Packit Service fb6fa5
			GtkRecentFilter  *filter)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_recent_chooser_remove_filter (get_delegate (chooser), filter);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GSList *
Packit Service fb6fa5
delegate_list_filters (GtkRecentChooser *chooser)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gtk_recent_chooser_list_filters (get_delegate (chooser));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
delegate_select_uri (GtkRecentChooser  *chooser,
Packit Service fb6fa5
		     const gchar       *uri,
Packit Service fb6fa5
		     GError           **error)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gtk_recent_chooser_select_uri (get_delegate (chooser), uri, error);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
delegate_unselect_uri (GtkRecentChooser *chooser,
Packit Service fb6fa5
		       const gchar      *uri)
Packit Service fb6fa5
{
Packit Service fb6fa5
 gtk_recent_chooser_unselect_uri (get_delegate (chooser), uri);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GList *
Packit Service fb6fa5
delegate_get_items (GtkRecentChooser *chooser)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gtk_recent_chooser_get_items (get_delegate (chooser));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GtkRecentManager *
Packit Service fb6fa5
delegate_get_recent_manager (GtkRecentChooser *chooser)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return _gtk_recent_chooser_get_recent_manager (get_delegate (chooser));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
delegate_select_all (GtkRecentChooser *chooser)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_recent_chooser_select_all (get_delegate (chooser));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
delegate_unselect_all (GtkRecentChooser *chooser)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_recent_chooser_unselect_all (get_delegate (chooser));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
delegate_set_current_uri (GtkRecentChooser  *chooser,
Packit Service fb6fa5
			  const gchar       *uri,
Packit Service fb6fa5
			  GError           **error)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gtk_recent_chooser_set_current_uri (get_delegate (chooser), uri, error);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gchar *
Packit Service fb6fa5
delegate_get_current_uri (GtkRecentChooser *chooser)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gtk_recent_chooser_get_current_uri (get_delegate (chooser));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
delegate_notify (GObject    *object,
Packit Service fb6fa5
		 GParamSpec *pspec,
Packit Service fb6fa5
		 gpointer    user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gpointer iface;
Packit Service fb6fa5
Packit Service fb6fa5
  iface = g_type_interface_peek (g_type_class_peek (G_OBJECT_TYPE (object)),
Packit Service fb6fa5
				 gtk_recent_chooser_get_type ());
Packit Service fb6fa5
  if (g_object_interface_find_property (iface, pspec->name))
Packit Service fb6fa5
    g_object_notify (user_data, pspec->name);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
delegate_selection_changed (GtkRecentChooser *receiver,
Packit Service fb6fa5
			    gpointer          user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  _gtk_recent_chooser_selection_changed (GTK_RECENT_CHOOSER (user_data));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
delegate_item_activated (GtkRecentChooser *receiver,
Packit Service fb6fa5
			 gpointer          user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  _gtk_recent_chooser_item_activated (GTK_RECENT_CHOOSER (user_data));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
sort_recent_items_mru (GtkRecentInfo *a,
Packit Service fb6fa5
		       GtkRecentInfo *b,
Packit Service fb6fa5
		       gpointer       unused)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_assert (a != NULL && b != NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return gtk_recent_info_get_modified (b) - gtk_recent_info_get_modified (a);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
sort_recent_items_lru (GtkRecentInfo *a,
Packit Service fb6fa5
		       GtkRecentInfo *b,
Packit Service fb6fa5
		       gpointer       unused)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_assert (a != NULL && b != NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return -1 * (gtk_recent_info_get_modified (b) - gtk_recent_info_get_modified (a));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkRecentSortFunc func;
Packit Service fb6fa5
  gpointer data;
Packit Service fb6fa5
} SortRecentData;
Packit Service fb6fa5
Packit Service fb6fa5
/* our proxy sorting function */
Packit Service fb6fa5
static gint
Packit Service fb6fa5
sort_recent_items_proxy (gpointer *a,
Packit Service fb6fa5
                         gpointer *b,
Packit Service fb6fa5
                         gpointer  user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkRecentInfo *info_a = (GtkRecentInfo *) a;
Packit Service fb6fa5
  GtkRecentInfo *info_b = (GtkRecentInfo *) b;
Packit Service fb6fa5
  SortRecentData *sort_recent = user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  if (sort_recent->func)
Packit Service fb6fa5
    return (* sort_recent->func) (info_a, info_b, sort_recent->data);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* fallback */
Packit Service fb6fa5
  return 0;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
get_is_recent_filtered (GtkRecentFilter *filter,
Packit Service fb6fa5
			GtkRecentInfo   *info)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkRecentFilterInfo filter_info;
Packit Service fb6fa5
  GtkRecentFilterFlags needed;
Packit Service fb6fa5
  gboolean retval;
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (info != NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  needed = gtk_recent_filter_get_needed (filter);
Packit Service fb6fa5
  
Packit Service fb6fa5
  filter_info.contains = GTK_RECENT_FILTER_URI | GTK_RECENT_FILTER_MIME_TYPE;
Packit Service fb6fa5
  
Packit Service fb6fa5
  filter_info.uri = gtk_recent_info_get_uri (info);
Packit Service fb6fa5
  filter_info.mime_type = gtk_recent_info_get_mime_type (info);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (needed & GTK_RECENT_FILTER_DISPLAY_NAME)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      filter_info.display_name = gtk_recent_info_get_display_name (info);
Packit Service fb6fa5
      filter_info.contains |= GTK_RECENT_FILTER_DISPLAY_NAME;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    filter_info.uri = NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (needed & GTK_RECENT_FILTER_APPLICATION)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      filter_info.applications = (const gchar **) gtk_recent_info_get_applications (info, NULL);
Packit Service fb6fa5
      filter_info.contains |= GTK_RECENT_FILTER_APPLICATION;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    filter_info.applications = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  if (needed & GTK_RECENT_FILTER_GROUP)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      filter_info.groups = (const gchar **) gtk_recent_info_get_groups (info, NULL);
Packit Service fb6fa5
      filter_info.contains |= GTK_RECENT_FILTER_GROUP;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    filter_info.groups = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  if (needed & GTK_RECENT_FILTER_AGE)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      filter_info.age = gtk_recent_info_get_age (info);
Packit Service fb6fa5
      filter_info.contains |= GTK_RECENT_FILTER_AGE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    filter_info.age = -1;
Packit Service fb6fa5
  
Packit Service fb6fa5
  retval = gtk_recent_filter_filter (filter, &filter_info);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* these we own */
Packit Service fb6fa5
  if (filter_info.applications)
Packit Service fb6fa5
    g_strfreev ((gchar **) filter_info.applications);
Packit Service fb6fa5
  if (filter_info.groups)
Packit Service fb6fa5
    g_strfreev ((gchar **) filter_info.groups);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return !retval;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * _gtk_recent_chooser_get_items:
Packit Service fb6fa5
 * @chooser: a #GtkRecentChooser
Packit Service fb6fa5
 * @filter: a #GtkRecentFilter
Packit Service fb6fa5
 * @sort_func: (allow-none): sorting function, or %NULL
Packit Service fb6fa5
 * @sort_data: (allow-none): sorting function data, or %NULL
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Default implementation for getting the filtered, sorted and
Packit Service fb6fa5
 * clamped list of recently used resources from a #GtkRecentChooser.
Packit Service fb6fa5
 * This function should be used by implementations of the
Packit Service fb6fa5
 * #GtkRecentChooser interface inside the GtkRecentChooser::get_items
Packit Service fb6fa5
 * vfunc.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: a list of #GtkRecentInfo objects
Packit Service fb6fa5
 */
Packit Service fb6fa5
GList *
Packit Service fb6fa5
_gtk_recent_chooser_get_items (GtkRecentChooser  *chooser,
Packit Service fb6fa5
                               GtkRecentFilter   *filter,
Packit Service fb6fa5
                               GtkRecentSortFunc  sort_func,
Packit Service fb6fa5
                               gpointer           sort_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkRecentManager *manager;
Packit Service fb6fa5
  gint limit;
Packit Service fb6fa5
  GtkRecentSortType sort_type;
Packit Service fb6fa5
  GList *items;
Packit Service fb6fa5
  GCompareDataFunc compare_func;
Packit Service fb6fa5
  gint length;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_RECENT_CHOOSER (chooser), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  manager = _gtk_recent_chooser_get_recent_manager (chooser);
Packit Service fb6fa5
  if (!manager)
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  items = gtk_recent_manager_get_items (manager);
Packit Service fb6fa5
  if (!items)
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  limit = gtk_recent_chooser_get_limit (chooser);
Packit Service fb6fa5
  if (limit == 0)
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  if (filter)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GList *filter_items, *l;
Packit Service fb6fa5
      gboolean local_only = FALSE;
Packit Service fb6fa5
      gboolean show_private = FALSE;
Packit Service fb6fa5
      gboolean show_not_found = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_get (G_OBJECT (chooser),
Packit Service fb6fa5
                    "local-only", &local_only,
Packit Service fb6fa5
                    "show-private", &show_private,
Packit Service fb6fa5
                    "show-not-found", &show_not_found,
Packit Service fb6fa5
                    NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      filter_items = NULL;
Packit Service fb6fa5
      for (l = items; l != NULL; l = l->next)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          GtkRecentInfo *info = l->data;
Packit Service fb6fa5
          gboolean remove_item = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
          if (get_is_recent_filtered (filter, info))
Packit Service fb6fa5
            remove_item = TRUE;
Packit Service fb6fa5
          
Packit Service fb6fa5
          if (local_only && !gtk_recent_info_is_local (info))
Packit Service fb6fa5
            remove_item = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
          if (!show_private && gtk_recent_info_get_private_hint (info))
Packit Service fb6fa5
            remove_item = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
          if (!show_not_found && !gtk_recent_info_exists (info))
Packit Service fb6fa5
            remove_item = TRUE;
Packit Service fb6fa5
          
Packit Service fb6fa5
          if (!remove_item)
Packit Service fb6fa5
            filter_items = g_list_prepend (filter_items, info);
Packit Service fb6fa5
          else
Packit Service fb6fa5
            gtk_recent_info_unref (info);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_list_free (items);
Packit Service fb6fa5
      items = filter_items;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!items)
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  sort_type = gtk_recent_chooser_get_sort_type (chooser);
Packit Service fb6fa5
  switch (sort_type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case GTK_RECENT_SORT_NONE:
Packit Service fb6fa5
      compare_func = NULL;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case GTK_RECENT_SORT_MRU:
Packit Service fb6fa5
      compare_func = (GCompareDataFunc) sort_recent_items_mru;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case GTK_RECENT_SORT_LRU:
Packit Service fb6fa5
      compare_func = (GCompareDataFunc) sort_recent_items_lru;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case GTK_RECENT_SORT_CUSTOM:
Packit Service fb6fa5
      compare_func = (GCompareDataFunc) sort_recent_items_proxy;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      g_assert_not_reached ();
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (compare_func)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      SortRecentData sort_recent;
Packit Service fb6fa5
Packit Service fb6fa5
      sort_recent.func = sort_func;
Packit Service fb6fa5
      sort_recent.data = sort_data;
Packit Service fb6fa5
Packit Service fb6fa5
      items = g_list_sort_with_data (items, compare_func, &sort_recent);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  length = g_list_length (items);
Packit Service fb6fa5
  if ((limit != -1) && (length > limit))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GList *clamp, *l;
Packit Service fb6fa5
      
Packit Service fb6fa5
      clamp = g_list_nth (items, limit - 1);
Packit Service fb6fa5
      if (!clamp)
Packit Service fb6fa5
        return items;
Packit Service fb6fa5
      
Packit Service fb6fa5
      l = clamp->next;
Packit Service fb6fa5
      clamp->next = NULL;
Packit Service fb6fa5
    
Packit Service fb6fa5
      g_list_foreach (l, (GFunc) gtk_recent_info_unref, NULL);
Packit Service fb6fa5
      g_list_free (l);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return items;
Packit Service fb6fa5
}