+typedef void (*process_t)(void);
+
+#ifdef UI_GNOME_THREADS
+/* 'GThreadFunc' type. */
+gpointer execute_process_func(process_t process /* data */)
+{
+ (*process)();
+
+ gdk_threads_enter();
+
+ gtk_main_quit(); /* Abort gtk_main() of execute_process(). */
+
+ gdk_flush();
+ gdk_threads_leave();
+
+ return NULL;
+}
+#endif /* UI_GNOME_THREADS */
+
+/* We are called inside gdk_threads_enter(). */
+static void execute_process(process_t process)
+{
+#ifdef UI_GNOME_THREADS
+GThread *gthread;
+#endif /* UI_GNOME_THREADS */
+
+ progress_start();
+#ifdef UI_GNOME_THREADS
+ gthread=g_thread_create_full(
+ (GThreadFunc)execute_process_func, /* func */
+ process, /* data */
+ 0, /* stack_size; 0 means the default size */
+ TRUE, /* joinable */
+ TRUE, /* bound; use system thread */
+ G_THREAD_PRIORITY_LOW, /* priority; G_THREAD_PRIORITY_LOW is the lowest one */
+ NULL); /* error */
+ gtk_main(); /* We are already called inside gdk_threads_enter(). */
+ /* I hope some other gtk_main_quit() did not occur as we would
+ * locked if the 'process' func did not finish yet.
+ */
+ g_thread_join(gthread);
+#else /* UI_GNOME_THREADS */
+ (*process)();
+#endif /* UI_GNOME_THREADS */
+ progress_end();
+}
+
+/* 'process_t' typed. */
+static void process_scan_disk(void)
+{
+ scan_disks_quick();
+ scan_disks();
+}
+
+static GnomeVFSURI *process_scan_path_scan_path_uri;
+
+/* 'process_t' typed. */
+static void process_scan_path(void)
+{
+ mod_uri_load_base_reporting(process_scan_path_scan_path_uri);
+}
+
+/* 'process_t' typed. */
+static void process_microsoft_com(void)
+{
+ microsoft_com();
+}
+