- g_timeout_add_full (G_PRIORITY_HIGH_IDLE,
- registry->exit_notify_timeout,
- registry_timeout_flush_queue, registry,
- NULL);
- registry->is_queueing = 1;
+#ifdef SPI_QUEUE_DEBUG
+ struct timeval tp;
+ gettimeofday (&tp, NULL);
+ fprintf (stderr, "start queueing at %i.%.6i\n", tp.tv_sec, tp.tv_usec);
+#endif
+ if (registry->queue_handler_id != 0)
+ g_source_remove (registry->queue_handler_id);
+
+ if (registry->focus_object)
+ {
+#ifdef SPI_QUEUE_DEBUG
+ fprintf (stderr, "registry_start_queue: release focus_object %p\n", registry->focus_object);
+#endif
+ bonobo_object_release_unref (registry->focus_object, NULL);
+ registry->focus_object = NULL;
+ }
+ registry->queue_handler_id = g_timeout_add_full (G_PRIORITY_HIGH_IDLE,
+ registry->exit_notify_timeout,
+ registry_timeout_flush_queue, registry,
+ NULL);
+ registry->is_queueing = TRUE;
+}
+
+static gboolean
+registry_discard_event (SpiRegistry *registry, NotifyContext *ctx)
+{
+ gboolean ret = FALSE;
+
+ if (ctx->etype.type_cat == ETYPE_FOCUS)
+ {
+ if (registry->focus_object)
+ {
+ if (CORBA_Object_is_equivalent (registry->focus_object, ctx->source, NULL))
+ {
+ ret = TRUE;
+ }
+#ifdef SPI_QUEUE_DEBUG
+ fprintf (stderr, "registry_discard_event: release focus_object %p\n", registry->focus_object);
+#endif
+ bonobo_object_release_unref (registry->focus_object, NULL);
+ registry->focus_object = NULL;
+ }
+ }
+ return ret;