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; }
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))); }
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; }