static gboolean
get_is_recent_filtered (GtkRecentFilter *filter,
			GtkRecentInfo   *info)
{
  GtkRecentFilterInfo filter_info;
  GtkRecentFilterFlags needed;
  gboolean retval;

  g_assert (info != NULL);
  
  needed = gtk_recent_filter_get_needed (filter);
  
  filter_info.contains = GTK_RECENT_FILTER_URI | GTK_RECENT_FILTER_MIME_TYPE;
  
  filter_info.uri = gtk_recent_info_get_uri (info);
  filter_info.mime_type = gtk_recent_info_get_mime_type (info);
  
  if (needed & GTK_RECENT_FILTER_DISPLAY_NAME)
    {
      filter_info.display_name = gtk_recent_info_get_display_name (info);
      filter_info.contains |= GTK_RECENT_FILTER_DISPLAY_NAME;
    }
  else
    filter_info.uri = NULL;
  
  if (needed & GTK_RECENT_FILTER_APPLICATION)
    {
      filter_info.applications = (const gchar **) gtk_recent_info_get_applications (info, NULL);
      filter_info.contains |= GTK_RECENT_FILTER_APPLICATION;
    }
  else
    filter_info.applications = NULL;

  if (needed & GTK_RECENT_FILTER_GROUP)
    {
      filter_info.groups = (const gchar **) gtk_recent_info_get_groups (info, NULL);
      filter_info.contains |= GTK_RECENT_FILTER_GROUP;
    }
  else
    filter_info.groups = NULL;

  if (needed & GTK_RECENT_FILTER_AGE)
    {
      filter_info.age = gtk_recent_info_get_age (info);
      filter_info.contains |= GTK_RECENT_FILTER_AGE;
    }
  else
    filter_info.age = -1;
  
  retval = gtk_recent_filter_filter (filter, &filter_info);
  
  /* these we own */
  if (filter_info.applications)
    g_strfreev ((gchar **) filter_info.applications);
  if (filter_info.groups)
    g_strfreev ((gchar **) filter_info.groups);
  
  return !retval;
}
Beispiel #2
0
static VALUE
rg_filter(VALUE self, VALUE filter_info)
{
    return CBOOL2RVAL(gtk_recent_filter_filter(_SELF(self),
                                               (GtkRecentFilterInfo*)RVAL2BOXED(filter_info, GTK_TYPE_RECENT_FILTER_INFO)));
}
Beispiel #3
0
GList *
gedit_recent_get_items (GeditRecentConfiguration *config)
{
    GtkRecentFilterFlags needed;
    GList *items;
    GList *retitems = NULL;
    gint length;
    gboolean has_substring_filter;

    if (config->limit == 0)
    {
        return NULL;
    }

    items = gtk_recent_manager_get_items (config->manager);

    if (!items)
    {
        return NULL;
    }

    needed = gtk_recent_filter_get_needed (config->filter);
    has_substring_filter = (config->substring_filter && *config->substring_filter != '\0');

    while (items)
    {
        GtkRecentInfo *info;
        GtkRecentFilterInfo filter_info;
        gboolean is_filtered;

        info = items->data;
        is_filtered = FALSE;

        if (config->local_only && !gtk_recent_info_is_local (info))
        {
            is_filtered = TRUE;
        }
        else if (!config->show_private && gtk_recent_info_get_private_hint (info))
        {
            is_filtered = TRUE;
        }
        else if (!config->show_not_found && !gtk_recent_info_exists (info))
        {
            is_filtered = TRUE;
        }
        else
        {
            if (has_substring_filter)
            {
                gchar *uri_lower;

                uri_lower = g_utf8_strdown (gtk_recent_info_get_uri (info), -1);

                if (strstr (uri_lower, config->substring_filter) == NULL)
                {
                    is_filtered = TRUE;
                }

                g_free (uri_lower);
            }

            if (!is_filtered)
            {
                populate_filter_info (info, &filter_info, needed);
                is_filtered = !gtk_recent_filter_filter (config->filter, &filter_info);

                /* these we own */
                if (filter_info.applications)
                {
                    g_strfreev ((gchar **) filter_info.applications);
                }

                if (filter_info.groups)
                {
                    g_strfreev ((gchar **) filter_info.groups);
                }
            }
        }

        if (!is_filtered)
        {
            retitems = g_list_prepend (retitems, info);
        }
        else
        {
            gtk_recent_info_unref (info);
        }

        items = g_list_delete_link (items, items);
    }

    if (!retitems)
    {
        return NULL;
    }

    retitems = g_list_sort_with_data (retitems, (GCompareDataFunc) sort_recent_items_mru, NULL);
    length = g_list_length (retitems);

    if ((config->limit != -1) && (length > config->limit))
    {
        GList *clamp, *l;

        clamp = g_list_nth (retitems, config->limit - 1);

        if (!clamp)
        {
            return retitems;
        }

        l = clamp->next;
        clamp->next = NULL;

        g_list_free_full (l, (GDestroyNotify) gtk_recent_info_unref);
    }

    return retitems;
}