X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtksearchenginesimple.c;h=8d0e07f44e6afbca06b0b6683cc22d9193d88cea;hb=45ad8a06ad511ad95a74172172b9fe459bc666ad;hp=4d27957d41b19db9d2738b864067dfd92a8ca55e;hpb=910fc607cd3636c3e1cf9c81ce385aba0fac1f43;p=~andy%2Fgtk diff --git a/gtk/gtksearchenginesimple.c b/gtk/gtksearchenginesimple.c index 4d27957d4..8d0e07f44 100644 --- a/gtk/gtksearchenginesimple.c +++ b/gtk/gtksearchenginesimple.c @@ -12,35 +12,34 @@ * 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, + * License along with this library. If not, see . * * Author: Alexander Larsson * * Based on nautilus-search-engine-simple.c */ -#include +#include "config.h" /* these must be defined even when HAVE_GNU_FTW is not defined * because (really) old versions of GNU libc have ftw.h but do * export ftw() and friends only if _XOPEN_SOURCE and _GNU_SOURCE * are defined. see bug #444097. */ -#define _XOPEN_SOURCE 500 -#define _GNU_SOURCE +#define _XOPEN_SOURCE 600 +#define _GNU_SOURCE #ifdef HAVE_FTW_H #include #endif +#include + #include "gtksearchenginesimple.h" #include "gtkprivate.h" #include -#include - #define BATCH_SIZE 500 typedef struct @@ -72,19 +71,27 @@ struct _GtkSearchEngineSimplePrivate G_DEFINE_TYPE (GtkSearchEngineSimple, _gtk_search_engine_simple, GTK_TYPE_SEARCH_ENGINE); static void -finalize (GObject *object) +gtk_search_engine_simple_dispose (GObject *object) { GtkSearchEngineSimple *simple; + GtkSearchEngineSimplePrivate *priv; simple = GTK_SEARCH_ENGINE_SIMPLE (object); + priv = simple->priv; - if (simple->priv->query) + if (priv->query) { - g_object_unref (simple->priv->query); - simple->priv->query = NULL; + g_object_unref (priv->query); + priv->query = NULL; + } + + if (priv->active_search) + { + priv->active_search->cancelled = TRUE; + priv->active_search = NULL; } - G_OBJECT_CLASS (_gtk_search_engine_simple_parent_class)->finalize (object); + G_OBJECT_CLASS (_gtk_search_engine_simple_parent_class)->dispose (object); } static SearchThreadData * @@ -131,12 +138,10 @@ search_thread_done_idle (gpointer user_data) data = user_data; - if (!data->cancelled) - { - _gtk_search_engine_finished (GTK_SEARCH_ENGINE (data->engine)); - data->engine->priv->active_search = NULL; - } - + if (!data->cancelled) + _gtk_search_engine_finished (GTK_SEARCH_ENGINE (data->engine)); + + data->engine->priv->active_search = NULL; search_thread_data_free (data); return FALSE; @@ -162,8 +167,7 @@ search_thread_add_hits_idle (gpointer user_data) hits->uris); } - g_list_foreach (hits->uris, (GFunc)g_free, NULL); - g_list_free (hits->uris); + g_list_free_full (hits->uris, g_free); g_free (hits); return FALSE; @@ -181,12 +185,14 @@ send_batch (SearchThreadData *data) hits = g_new (SearchHits, 1); hits->uris = data->uri_hits; hits->thread_data = data; + gdk_threads_add_idle (search_thread_add_hits_idle, hits); } + data->uri_hits = NULL; } -static GStaticPrivate search_thread_data = G_STATIC_PRIVATE_INIT; +static GPrivate search_thread_data; #ifdef HAVE_FTW_H static int @@ -197,13 +203,13 @@ search_visit_func (const char *fpath, { SearchThreadData *data; gint i; - const gchar *name; + const gchar *name; gchar *lower_name; gchar *uri; gboolean hit; gboolean is_hidden; - - data = (SearchThreadData*)g_static_private_get (&search_thread_data); + + data = (SearchThreadData*)g_private_get (&search_thread_data); if (data->cancelled) #ifdef HAVE_GNU_FTW @@ -268,7 +274,7 @@ search_thread_func (gpointer user_data) data = user_data; - g_static_private_set (&search_thread_data, data, NULL); + g_private_set (&search_thread_data, data); nftw (data->path, search_visit_func, 20, #ifdef HAVE_GNU_FTW @@ -300,7 +306,7 @@ gtk_search_engine_simple_start (GtkSearchEngine *engine) data = search_thread_data_new (simple, simple->priv->query); - g_thread_create (search_thread_func, data, FALSE, NULL); + g_thread_unref (g_thread_new ("file-search", search_thread_func, data)); simple->priv->active_search = data; } @@ -349,7 +355,7 @@ _gtk_search_engine_simple_class_init (GtkSearchEngineSimpleClass *class) GtkSearchEngineClass *engine_class; gobject_class = G_OBJECT_CLASS (class); - gobject_class->finalize = finalize; + gobject_class->dispose = gtk_search_engine_simple_dispose; engine_class = GTK_SEARCH_ENGINE_CLASS (class); engine_class->set_query = gtk_search_engine_simple_set_query;