summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libnautilus-private/nautilus-search-directory.c14
-rw-r--r--libnautilus-private/nautilus-search-engine-model.c98
-rw-r--r--libnautilus-private/nautilus-search-engine-simple.c72
-rw-r--r--libnautilus-private/nautilus-search-engine-tracker.c77
-rw-r--r--libnautilus-private/nautilus-search-engine.c55
-rw-r--r--libnautilus-private/nautilus-search-provider.c65
-rw-r--r--libnautilus-private/nautilus-search-provider.h14
7 files changed, 328 insertions, 67 deletions
diff --git a/libnautilus-private/nautilus-search-directory.c b/libnautilus-private/nautilus-search-directory.c
index f861906dd..dcda82c70 100644
--- a/libnautilus-private/nautilus-search-directory.c
+++ b/libnautilus-private/nautilus-search-directory.c
@@ -65,6 +65,8 @@ struct NautilusSearchDirectoryDetails {
GList *callback_list;
GList *pending_callback_list;
+ GBinding *binding;
+
NautilusDirectory *base_model;
};
@@ -918,18 +920,26 @@ nautilus_search_directory_set_query (NautilusSearchDirectory *search,
old_query = search->details->query;
- if (g_set_object (&search->details->query, query)) {
+ if (search->details->query != query) {
+ search->details->query = query;
+
+ g_clear_pointer (&search->details->binding, g_binding_unbind);
+
/* Disconnect from the previous query changes */
if (old_query) {
g_signal_handlers_disconnect_by_func (old_query, search_force_reload, search);
}
if (query) {
+ search->details->binding = g_object_bind_property (search->details->engine, "running",
+ query, "searching",
+ G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
g_signal_connect_swapped (query, "notify", G_CALLBACK (search_force_reload), search);
}
-
g_object_notify_by_pspec (G_OBJECT (search), properties[PROP_QUERY]);
+
+ g_clear_object (&old_query);
}
file = nautilus_directory_get_existing_corresponding_file (NAUTILUS_DIRECTORY (search));
diff --git a/libnautilus-private/nautilus-search-engine-model.c b/libnautilus-private/nautilus-search-engine-model.c
index 4dfb5ebd0..a6542af9b 100644
--- a/libnautilus-private/nautilus-search-engine-model.c
+++ b/libnautilus-private/nautilus-search-engine-model.c
@@ -45,7 +45,13 @@ struct NautilusSearchEngineModelDetails {
guint finished_id;
};
-static void nautilus_search_provider_init (NautilusSearchProviderIface *iface);
+enum {
+ PROP_0,
+ PROP_RUNNING,
+ LAST_PROP
+};
+
+static void nautilus_search_provider_init (NautilusSearchProviderInterface *iface);
G_DEFINE_TYPE_WITH_CODE (NautilusSearchEngineModel,
nautilus_search_engine_model,
@@ -90,6 +96,9 @@ search_finished (NautilusSearchEngineModel *model)
}
model->details->query_pending = FALSE;
+
+ g_object_notify (G_OBJECT (model), "running");
+
DEBUG ("Model engine finished");
nautilus_search_provider_finished (NAUTILUS_SEARCH_PROVIDER (model),
NAUTILUS_SEARCH_PROVIDER_STATUS_NORMAL);
@@ -120,9 +129,11 @@ model_directory_ready_cb (NautilusDirectory *directory,
gdouble match;
gboolean found;
NautilusSearchHit *hit;
+ GDateTime *dt;
files = nautilus_directory_get_file_list (directory);
mime_types = nautilus_query_get_mime_types (model->details->query);
+ dt = nautilus_query_get_date (model->details->query);
hits = NULL;
for (l = files; l != NULL; l = l->next) {
@@ -143,9 +154,53 @@ model_directory_ready_cb (NautilusDirectory *directory,
}
}
+ if (found && dt != NULL) {
+ NautilusQuerySearchType type;
+ guint64 query_time, current_file_time;
+ const gchar *attrib;
+ GFileInfo *info;
+ GError *error;
+ GFile *location;
+
+ g_message ("searching for date %s", g_date_time_format (dt, "%X"));
+
+ type = nautilus_query_get_search_type (model->details->query);
+ location = nautilus_file_get_location (file);
+ error = NULL;
+
+ if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
+ attrib = G_FILE_ATTRIBUTE_TIME_ACCESS;
+ } else {
+ attrib = G_FILE_ATTRIBUTE_TIME_MODIFIED;
+ }
+
+ query_time = g_date_time_to_unix (dt);
+
+ /* Query current file's attribute */
+ info = g_file_query_info (location,
+ attrib,
+ G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+ NULL,
+ &error);
+
+ if (error) {
+ /* Silently ignore errors */
+ g_clear_error (&error);
+ found = FALSE;
+ } else {
+ current_file_time = g_file_info_get_attribute_uint64 (info, attrib);
+ found = (query_time <= current_file_time);
+ }
+
+ g_clear_object (&location);
+ }
+
if (found) {
uri = nautilus_file_get_uri (file);
hit = nautilus_search_hit_new (uri);
+
+ g_message ("found in model engine - %s", uri);
+
nautilus_search_hit_set_fts_rank (hit, match);
hits = g_list_prepend (hits, hit);
g_free (uri);
@@ -177,6 +232,8 @@ nautilus_search_engine_model_start (NautilusSearchProvider *provider)
g_object_ref (model);
model->details->query_pending = TRUE;
+ g_object_notify (G_OBJECT (provider), "running");
+
if (model->details->directory == NULL) {
search_finished_idle (model);
return;
@@ -218,12 +275,41 @@ nautilus_search_engine_model_set_query (NautilusSearchProvider *provider,
model->details->query = query;
}
+static gboolean
+nautilus_search_engine_model_is_running (NautilusSearchProvider *provider)
+{
+ NautilusSearchEngineModel *model;
+
+ model = NAUTILUS_SEARCH_ENGINE_MODEL (provider);
+
+ return model->details->query_pending;
+}
+
static void
-nautilus_search_provider_init (NautilusSearchProviderIface *iface)
+nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
{
iface->set_query = nautilus_search_engine_model_set_query;
iface->start = nautilus_search_engine_model_start;
iface->stop = nautilus_search_engine_model_stop;
+ iface->is_running = nautilus_search_engine_model_is_running;
+}
+
+static void
+nautilus_search_engine_model_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusSearchProvider *self = NAUTILUS_SEARCH_PROVIDER (object);
+
+ switch (prop_id) {
+ case PROP_RUNNING:
+ g_value_set_boolean (value, nautilus_search_engine_model_is_running (self));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
}
static void
@@ -233,6 +319,14 @@ nautilus_search_engine_model_class_init (NautilusSearchEngineModelClass *class)
gobject_class = G_OBJECT_CLASS (class);
gobject_class->finalize = finalize;
+ gobject_class->get_property = nautilus_search_engine_model_get_property;
+
+ /**
+ * NautilusSearchEngine::running:
+ *
+ * Whether the search engine is running a search.
+ */
+ g_object_class_override_property (gobject_class, PROP_RUNNING, "running");
g_type_class_add_private (class, sizeof (NautilusSearchEngineModelDetails));
}
diff --git a/libnautilus-private/nautilus-search-engine-simple.c b/libnautilus-private/nautilus-search-engine-simple.c
index f3557d6b1..35912ae55 100644
--- a/libnautilus-private/nautilus-search-engine-simple.c
+++ b/libnautilus-private/nautilus-search-engine-simple.c
@@ -36,6 +36,7 @@
enum {
PROP_RECURSIVE = 1,
+ PROP_RUNNING,
NUM_PROPERTIES
};
@@ -67,9 +68,7 @@ struct NautilusSearchEngineSimpleDetails {
gboolean query_finished;
};
-static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
-
-static void nautilus_search_provider_init (NautilusSearchProviderIface *iface);
+static void nautilus_search_provider_init (NautilusSearchProviderInterface *iface);
G_DEFINE_TYPE_WITH_CODE (NautilusSearchEngineSimple,
nautilus_search_engine_simple,
@@ -144,6 +143,8 @@ search_thread_done_idle (gpointer user_data)
nautilus_search_provider_finished (NAUTILUS_SEARCH_PROVIDER (engine),
NAUTILUS_SEARCH_PROVIDER_STATUS_NORMAL);
+ g_object_notify (G_OBJECT (engine), "running");
+
search_thread_data_free (data);
return FALSE;
@@ -195,6 +196,7 @@ send_batch (SearchThreadData *thread_data)
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "," \
G_FILE_ATTRIBUTE_STANDARD_TYPE "," \
G_FILE_ATTRIBUTE_TIME_MODIFIED "," \
+ G_FILE_ATTRIBUTE_TIME_ACCESS "," \
G_FILE_ATTRIBUTE_ID_FILE
static void
@@ -250,6 +252,27 @@ visit_directory (GFile *dir, SearchThreadData *data)
}
}
}
+
+ if (found && nautilus_query_get_date (data->query) != NULL) {
+ NautilusQuerySearchType type;
+ GDateTime *date;
+ guint64 current_file_time, query_time;
+ const gchar *attrib;
+
+ type = nautilus_query_get_search_type (data->query);
+
+ if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
+ attrib = G_FILE_ATTRIBUTE_TIME_ACCESS;
+ } else {
+ attrib = G_FILE_ATTRIBUTE_TIME_MODIFIED;
+ }
+
+ date = nautilus_query_get_date (data->query);
+ query_time = g_date_time_to_unix (date);
+ current_file_time = g_file_info_get_attribute_uint64 (info, attrib);
+
+ found = (query_time <= current_file_time);
+ }
if (found) {
NautilusSearchHit *hit;
@@ -356,6 +379,8 @@ nautilus_search_engine_simple_start (NautilusSearchProvider *provider)
thread = g_thread_new ("nautilus-search-simple", search_thread_func, data);
simple->details->active_search = data;
+ g_object_notify (G_OBJECT (provider), "running");
+
g_thread_unref (thread);
}
@@ -385,6 +410,16 @@ nautilus_search_engine_simple_set_query (NautilusSearchProvider *provider,
simple->details->query = query;
}
+static gboolean
+nautilus_search_engine_simple_is_running (NautilusSearchProvider *provider)
+{
+ NautilusSearchEngineSimple *simple;
+
+ simple = NAUTILUS_SEARCH_ENGINE_SIMPLE (provider);
+
+ return simple->details->active_search != NULL;
+}
+
static void
nautilus_search_engine_simple_set_property (GObject *object,
guint arg_id,
@@ -416,6 +451,9 @@ nautilus_search_engine_simple_get_property (GObject *object,
engine = NAUTILUS_SEARCH_ENGINE_SIMPLE (object);
switch (arg_id) {
+ case PROP_RUNNING:
+ g_value_set_boolean (value, nautilus_search_engine_simple_is_running (NAUTILUS_SEARCH_PROVIDER (engine)));
+ break;
case PROP_RECURSIVE:
g_value_set_boolean (value, engine->details->recursive);
break;
@@ -423,11 +461,12 @@ nautilus_search_engine_simple_get_property (GObject *object,
}
static void
-nautilus_search_provider_init (NautilusSearchProviderIface *iface)
+nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
{
iface->set_query = nautilus_search_engine_simple_set_query;
iface->start = nautilus_search_engine_simple_start;
iface->stop = nautilus_search_engine_simple_stop;
+ iface->is_running = nautilus_search_engine_simple_is_running;
}
static void
@@ -440,13 +479,26 @@ nautilus_search_engine_simple_class_init (NautilusSearchEngineSimpleClass *class
gobject_class->get_property = nautilus_search_engine_simple_get_property;
gobject_class->set_property = nautilus_search_engine_simple_set_property;
- properties[PROP_RECURSIVE] = g_param_spec_boolean ("recursive",
- "recursive",
- "recursive",
- FALSE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+ /**
+ * NautilusSearchEngineSimple::recursive:
+ *
+ * Whether the search is recursive or not.
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_RECURSIVE,
+ g_param_spec_boolean ("recursive",
+ "recursive",
+ "recursive",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NautilusSearchEngine::running:
+ *
+ * Whether the search engine is running a search.
+ */
+ g_object_class_override_property (gobject_class, PROP_RUNNING, "running");
- g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
g_type_class_add_private (class, sizeof (NautilusSearchEngineSimpleDetails));
}
diff --git a/libnautilus-private/nautilus-search-engine-tracker.c b/libnautilus-private/nautilus-search-engine-tracker.c
index e49a63130..ec5ebdf93 100644
--- a/libnautilus-private/nautilus-search-engine-tracker.c
+++ b/libnautilus-private/nautilus-search-engine-tracker.c
@@ -45,7 +45,13 @@ struct NautilusSearchEngineTrackerDetails {
GCancellable *cancellable;
};
-static void nautilus_search_provider_init (NautilusSearchProviderIface *iface);
+enum {
+ PROP_0,
+ PROP_RUNNING,
+ LAST_PROP
+};
+
+static void nautilus_search_provider_init (NautilusSearchProviderInterface *iface);
G_DEFINE_TYPE_WITH_CODE (NautilusSearchEngineTracker,
nautilus_search_engine_tracker,
@@ -111,6 +117,8 @@ search_finished (NautilusSearchEngineTracker *tracker,
tracker->details->query_pending = FALSE;
+ g_object_notify (G_OBJECT (tracker), "running");
+
if (error && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
DEBUG ("Tracker engine error %s", error->message);
nautilus_search_provider_error (NAUTILUS_SEARCH_PROVIDER (tracker), error->message);
@@ -255,6 +263,7 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
GList *mimetypes, *l;
gint mime_count;
gboolean recursive;
+ GDateTime *dt;
tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (provider);
@@ -266,6 +275,8 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
g_object_ref (tracker);
tracker->details->query_pending = TRUE;
+ g_object_notify (G_OBJECT (provider), "running");
+
if (tracker->details->connection == NULL) {
g_idle_add (search_finished_idle, provider);
return;
@@ -283,10 +294,11 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
location = nautilus_query_get_location (tracker->details->query);
location_uri = location ? g_file_get_uri (location) : NULL;
mimetypes = nautilus_query_get_mime_types (tracker->details->query);
+ dt = nautilus_query_get_date (tracker->details->query);
mime_count = g_list_length (mimetypes);
- sparql = g_string_new ("SELECT DISTINCT nie:url(?urn) fts:rank(?urn) tracker:coalesce(nfo:fileLastModified(?urn), nie:contentLastModified(?urn)) tracker:coalesce(nfo:fileLastAccessed(?urn), nie:contentAccessed(?urn)) "
+ sparql = g_string_new ("SELECT DISTINCT nie:url(?urn) fts:rank(?urn) tracker:coalesce(nfo:fileLastModified(?urn), nie:contentLastModified(?urn)) AS ?mtime tracker:coalesce(nfo:fileLastAccessed(?urn), nie:contentAccessed(?urn)) AS ?atime \n"
"WHERE {"
" ?urn a nfo:FileDataObject ;"
" tracker:available true ; ");
@@ -305,6 +317,24 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
g_string_append_printf (sparql, "fn:contains(fn:lower-case(nfo:fileName(?urn)), '%s')", search_text);
+ if (dt != NULL) {
+ NautilusQuerySearchType type;
+ gchar *dt_format;
+
+ type = nautilus_query_get_search_type (tracker->details->query);
+ dt_format = g_date_time_format (dt, "%Y-%m-%dT%H:%M:%S");
+
+ g_string_append (sparql, " && ");
+
+ if (type == NAUTILUS_QUERY_SEARCH_TYPE_LAST_ACCESS) {
+ g_string_append_printf (sparql, "?atime <= \"%s\"^^xsd:dateTime", dt_format);
+ } else {
+ g_string_append_printf (sparql, "?mtime <= \"%s\"^^xsd:dateTime", dt_format);
+ }
+
+ g_free (dt_format);
+ }
+
if (mime_count > 0) {
g_string_append (sparql, " && (");
@@ -316,7 +346,7 @@ nautilus_search_engine_tracker_start (NautilusSearchProvider *provider)
g_string_append_printf (sparql, "fn:contains(?mime, '%s')",
(gchar *) l->data);
}
- g_string_append (sparql, ")");
+ g_string_append (sparql, ")\n");
}
g_string_append (sparql, ")} ORDER BY DESC (fts:rank(?urn))");
@@ -347,6 +377,8 @@ nautilus_search_engine_tracker_stop (NautilusSearchProvider *provider)
g_cancellable_cancel (tracker->details->cancellable);
g_clear_object (&tracker->details->cancellable);
tracker->details->query_pending = FALSE;
+
+ g_object_notify (G_OBJECT (provider), "running");
}
}
@@ -363,12 +395,41 @@ nautilus_search_engine_tracker_set_query (NautilusSearchProvider *provider,
tracker->details->query = query;
}
+static gboolean
+nautilus_search_engine_tracker_is_running (NautilusSearchProvider *provider)
+{
+ NautilusSearchEngineTracker *tracker;
+
+ tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (provider);
+
+ return tracker->details->query_pending;
+}
+
static void
-nautilus_search_provider_init (NautilusSearchProviderIface *iface)
+nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
{
iface->set_query = nautilus_search_engine_tracker_set_query;
iface->start = nautilus_search_engine_tracker_start;
iface->stop = nautilus_search_engine_tracker_stop;
+ iface->is_running = nautilus_search_engine_tracker_is_running;
+}
+
+static void
+nautilus_search_engine_tracker_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusSearchProvider *self = NAUTILUS_SEARCH_PROVIDER (object);
+
+ switch (prop_id) {
+ case PROP_RUNNING:
+ g_value_set_boolean (value, nautilus_search_engine_tracker_is_running (self));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
}
static void
@@ -378,6 +439,14 @@ nautilus_search_engine_tracker_class_init (NautilusSearchEngineTrackerClass *cla
gobject_class = G_OBJECT_CLASS (class);
gobject_class->finalize = finalize;
+ gobject_class->get_property = nautilus_search_engine_tracker_get_property;
+
+ /**
+ * NautilusSearchEngine::running:
+ *
+ * Whether the search engine is running a search.
+ */
+ g_object_class_override_property (gobject_class, PROP_RUNNING, "running");
g_type_class_add_private (class, sizeof (NautilusSearchEngineTrackerDetails));
}
diff --git a/libnautilus-private/nautilus-search-engine.c b/libnautilus-private/nautilus-search-engine.c
index 0ae369a96..1526b8636 100644
--- a/libnautilus-private/nautilus-search-engine.c
+++ b/libnautilus-private/nautilus-search-engine.c
@@ -51,7 +51,15 @@ struct NautilusSearchEngineDetails
gboolean restart;
};
-static void nautilus_search_provider_init (NautilusSearchProviderIface *iface);
+enum {
+ PROP_0,
+ PROP_RUNNING,
+ LAST_PROP
+};
+
+static void nautilus_search_provider_init (NautilusSearchProviderInterface *iface);
+
+static gboolean nautilus_search_engine_is_running (NautilusSearchProvider *provider);
G_DEFINE_TYPE_WITH_CODE (NautilusSearchEngine,
nautilus_search_engine,
@@ -118,6 +126,8 @@ nautilus_search_engine_start (NautilusSearchProvider *provider)
engine->details->running = TRUE;
+ g_object_notify (G_OBJECT (provider), "running");
+
if (num_finished < engine->details->providers_running) {
engine->details->restart = TRUE;
} else {
@@ -140,6 +150,8 @@ nautilus_search_engine_stop (NautilusSearchProvider *provider)
engine->details->running = FALSE;
engine->details->restart = FALSE;
+
+ g_object_notify (G_OBJECT (provider), "running");
}
static void
@@ -199,6 +211,8 @@ check_providers_status (NautilusSearchEngine *engine)
}
engine->details->running = FALSE;
+ g_object_notify (G_OBJECT (engine), "running");
+
g_hash_table_remove_all (engine->details->uris);
if (engine->details->restart) {
@@ -247,12 +261,23 @@ connect_provider_signals (NautilusSearchEngine *engine,
engine);
}
+static gboolean
+nautilus_search_engine_is_running (NautilusSearchProvider *provider)
+{
+ NautilusSearchEngine *engine;
+
+ engine = NAUTILUS_SEARCH_ENGINE (provider);
+
+ return engine->details->running;
+}
+
static void
-nautilus_search_provider_init (NautilusSearchProviderIface *iface)
+nautilus_search_provider_init (NautilusSearchProviderInterface *iface)
{
iface->set_query = nautilus_search_engine_set_query;
iface->start = nautilus_search_engine_start;
iface->stop = nautilus_search_engine_stop;
+ iface->is_running = nautilus_search_engine_is_running;
}
static void
@@ -272,6 +297,24 @@ nautilus_search_engine_finalize (GObject *object)
}
static void
+nautilus_search_engine_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NautilusSearchProvider *self = NAUTILUS_SEARCH_PROVIDER (object);
+
+ switch (prop_id) {
+ case PROP_RUNNING:
+ g_value_set_boolean (value, nautilus_search_engine_is_running (self));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
nautilus_search_engine_class_init (NautilusSearchEngineClass *class)
{
GObjectClass *object_class;
@@ -279,6 +322,14 @@ nautilus_search_engine_class_init (NautilusSearchEngineClass *class)
object_class = (GObjectClass *) class;
object_class->finalize = nautilus_search_engine_finalize;
+ object_class->get_property = nautilus_search_engine_get_property;
+
+ /**
+ * NautilusSearchEngine::running:
+ *
+ * Whether the search engine is running a search.
+ */
+ g_object_class_override_property (object_class, PROP_RUNNING, "running");
g_type_class_add_private (class, sizeof (NautilusSearchEngineDetails));
}
diff --git a/libnautilus-private/nautilus-search-provider.c b/libnautilus-private/nautilus-search-provider.c
index 10aca2020..67404fb07 100644
--- a/libnautilus-private/nautilus-search-provider.c
+++ b/libnautilus-private/nautilus-search-provider.c
@@ -32,50 +32,28 @@ enum {
static guint signals[LAST_SIGNAL];
-static void nautilus_search_provider_base_init (gpointer g_iface);
-
-GType
-nautilus_search_provider_get_type (void)
-{
- static GType search_provider_type = 0;
-
- if (!search_provider_type) {
- const GTypeInfo search_provider_info = {
- sizeof (NautilusSearchProviderIface), /* class_size */
- nautilus_search_provider_base_init, /* base_init */
- NULL, /* base_finalize */
- NULL,
- NULL, /* class_finalize */
- NULL, /* class_data */
- 0,
- 0, /* n_preallocs */
- NULL
- };
-
- search_provider_type = g_type_register_static (G_TYPE_INTERFACE,
- "NautilusSearchProvider",
- &search_provider_info,
- 0);
-
- g_type_interface_add_prerequisite (search_provider_type, G_TYPE_OBJECT);
- }
-
- return search_provider_type;
-}
+G_DEFINE_INTERFACE (NautilusSearchProvider, nautilus_search_provider, G_TYPE_OBJECT)
static void
-nautilus_search_provider_base_init (gpointer g_iface)
+nautilus_search_provider_default_init (NautilusSearchProviderInterface *iface)
{
- static gboolean initialized = FALSE;
- if (initialized) {
- return;
- }
+ /**
+ * NautilusSearchProvider::running:
+ *
+ * Whether the provider is running a search.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_boolean ("running",
+ "Whether the provider is running",
+ "Whether the provider is running a search",
+ FALSE,
+ G_PARAM_READABLE));
signals[HITS_ADDED] = g_signal_new ("hits-added",
NAUTILUS_TYPE_SEARCH_PROVIDER,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (NautilusSearchProviderIface, hits_added),
+ G_STRUCT_OFFSET (NautilusSearchProviderInterface, hits_added),
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
@@ -84,7 +62,7 @@ nautilus_search_provider_base_init (gpointer g_iface)
signals[FINISHED] = g_signal_new ("finished",
NAUTILUS_TYPE_SEARCH_PROVIDER,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (NautilusSearchProviderIface, finished),
+ G_STRUCT_OFFSET (NautilusSearchProviderInterface, finished),
NULL, NULL,
g_cclosure_marshal_VOID__ENUM,
G_TYPE_NONE, 1,
@@ -93,13 +71,11 @@ nautilus_search_provider_base_init (gpointer g_iface)
signals[ERROR] = g_signal_new ("error",
NAUTILUS_TYPE_SEARCH_PROVIDER,
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (NautilusSearchProviderIface, error),
+ G_STRUCT_OFFSET (NautilusSearchProviderInterface, error),
NULL, NULL,
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE, 1,
G_TYPE_STRING);
-
- initialized = TRUE;
}
void
@@ -156,3 +132,12 @@ nautilus_search_provider_error (NautilusSearchProvider *provider, const char *er
G_OBJECT_TYPE_NAME (provider), error_message);
g_signal_emit (provider, signals[ERROR], 0, error_message);
}
+
+gboolean
+nautilus_search_provider_is_running (NautilusSearchProvider *provider)
+{
+ g_return_val_if_fail (NAUTILUS_IS_SEARCH_PROVIDER (provider), FALSE);
+ g_return_val_if_fail (NAUTILUS_SEARCH_PROVIDER_GET_IFACE (provider)->is_running, FALSE);
+
+ return NAUTILUS_SEARCH_PROVIDER_GET_IFACE (provider)->is_running (provider);
+}
diff --git a/libnautilus-private/nautilus-search-provider.h b/libnautilus-private/nautilus-search-provider.h
index b3be651b4..96b4cf40d 100644
--- a/libnautilus-private/nautilus-search-provider.h
+++ b/libnautilus-private/nautilus-search-provider.h
@@ -29,15 +29,12 @@ typedef enum {
NAUTILUS_SEARCH_PROVIDER_STATUS_RESTARTING
} NautilusSearchProviderStatus;
-#define NAUTILUS_TYPE_SEARCH_PROVIDER (nautilus_search_provider_get_type ())
-#define NAUTILUS_SEARCH_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_SEARCH_PROVIDER, NautilusSearchProvider))
-#define NAUTILUS_IS_SEARCH_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_SEARCH_PROVIDER))
-#define NAUTILUS_SEARCH_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NAUTILUS_TYPE_SEARCH_PROVIDER, NautilusSearchProviderIface))
-typedef struct _NautilusSearchProvider NautilusSearchProvider;
-typedef struct _NautilusSearchProviderIface NautilusSearchProviderIface;
+#define NAUTILUS_TYPE_SEARCH_PROVIDER (nautilus_search_provider_get_type ())
-struct _NautilusSearchProviderIface {
+G_DECLARE_INTERFACE (NautilusSearchProvider, nautilus_search_provider, NAUTILUS, SEARCH_PROVIDER, GObject)
+
+struct _NautilusSearchProviderInterface {
GTypeInterface g_iface;
/* VTable */
@@ -75,6 +72,7 @@ struct _NautilusSearchProviderIface {
void (*finished) (NautilusSearchProvider *provider,
NautilusSearchProviderStatus status);
void (*error) (NautilusSearchProvider *provider, const char *error_message);
+ gboolean (*is_running) (NautilusSearchProvider *provider);
};
GType nautilus_search_provider_get_type (void) G_GNUC_CONST;
@@ -92,6 +90,8 @@ void nautilus_search_provider_finished (NautilusSearchProvider
void nautilus_search_provider_error (NautilusSearchProvider *provider,
const char *error_message);
+gboolean nautilus_search_provider_is_running (NautilusSearchProvider *provider);
+
G_END_DECLS
#endif