Initial original import from: fuse-2.4.2-2.fc4
[captive.git] / src / install / acquire / ui-gnome.c
index 32b2150..eb52c09 100644 (file)
 
 /* Config: */
 #define PROGRESS_UPDATE_USEC 200000
+/* Although proper GTK+ locking is provided below there are some
+ * bugs with compatibility of GTK+/Gnome-VFS/GConf.
+ * The main thread executes gtk_main()->g_main_loop_run()
+ * while the working thread initializes Gnome-VFS by GConf and
+ * executes also g_main_loop_run() while sharing some poll() fds.
+ */
+/* #define UI_GNOME_THREADS 1 */
 
 
 static GnomeApp *App;
@@ -171,15 +178,15 @@ static gboolean some_module_ntfs_sys_found=FALSE;
 
        gdk_threads_enter();
 
-       iter=DriversTreeStore_Iter_hash_get_iter(module_available->module->type);
+       iter=DriversTreeStore_Iter_hash_get_iter((const gchar *)module_available->module->type);
        gtk_tree_store_set(DriversTreeStore,iter,
                        DRIVERS_TREE_STORE_COLUMN_TYPE,module_available->module->type,
                        DRIVERS_TREE_STORE_COLUMN_ID  ,module_available->module->id,
                        -1);
 
-       if (!strcmp(module_available->module->type,"ntoskrnl.exe"))
+       if (!strcmp((const char *)module_available->module->type,"ntoskrnl.exe"))
                some_module_ntoskrnl_exe_found=TRUE;
-       if (!strcmp(module_available->module->type,"ntfs.sys"))
+       if (!strcmp((const char *)module_available->module->type,"ntfs.sys"))
                some_module_ntfs_sys_found=TRUE;
 
        some_modules_found=some_module_ntoskrnl_exe_found && some_module_ntfs_sys_found;
@@ -243,6 +250,8 @@ struct timeval diff_timeval;
 
 static gboolean ui_gnome_progress(GnomeVFSURI *uri)
 {
+gboolean want_gdk_flush=FALSE;
+
        /* 'uri' may be NULL */
 
        gdk_threads_enter();
@@ -260,13 +269,23 @@ static gchar *uri_text=NULL;
                        }
 
                if (uri_text) {
-                       if (want_progress_update(&ProgressEntry_updated_timeval))
+                       if (want_progress_update(&ProgressEntry_updated_timeval)) {
                                gtk_entry_set_text(ProgressEntry,
                                                uri_text+(strncmp(uri_text,"file://",strlen("file://")) ? 0 : strlen("file://")));
+                               want_gdk_flush=TRUE;
+                               }
                        }
                }
 
-       gdk_flush();
+#ifndef UI_GNOME_THREADS
+       while (g_main_context_pending(NULL))
+               g_main_context_iteration(
+                               NULL,   /* context */
+                               FALSE); /* may_block */
+#endif /* UI_GNOME_THREADS */
+
+       if (want_gdk_flush)
+               gdk_flush();
        gdk_threads_leave();
 
        /* Do not: g_thread_yield();
@@ -377,6 +396,7 @@ gchar *text;
 
 typedef void (*process_t)(void);
 
+#ifdef UI_GNOME_THREADS
 /* 'GThreadFunc' type. */
 gpointer execute_process_func(process_t process /* data */)
 {
@@ -391,13 +411,17 @@ gpointer execute_process_func(process_t process /* data */)
 
        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 */
@@ -411,6 +435,9 @@ GThread *gthread;
         * locked if the 'process' func did not finish yet.
         */
        g_thread_join(gthread);
+#else /* UI_GNOME_THREADS */
+       (*process)();
+#endif /* UI_GNOME_THREADS */
        progress_end();
 }
 
@@ -426,7 +453,7 @@ static GnomeVFSURI *process_scan_path_scan_path_uri;
 /* 'process_t' typed. */
 static void process_scan_path(void)
 {
-       mod_uri_load(process_scan_path_scan_path_uri);
+       mod_uri_load_base_reporting(process_scan_path_scan_path_uri);
 }
 
 /* 'process_t' typed. */
@@ -759,6 +786,7 @@ gboolean ui_gnome_init(void)
        ui_interactive=ui_gnome_interactive;
        captivemodid_module_best_priority_notify=ui_gnome_module_best_priority_notify;
 
+#ifdef UI_GNOME_THREADS
        /* gdk_threads_init() must be called before gtk_init()!
         * gtk_init() gets called by create_App() here.
         */
@@ -766,6 +794,7 @@ gboolean ui_gnome_init(void)
                g_thread_init(NULL);
        if (!gdk_threads_mutex)
                gdk_threads_init();
+#endif /* UI_GNOME_THREADS */
 
        /* Graphic widgets will all be hidden yet. */
        App_init();