Pre-size GnomeDialog to prevent its later next-page resizes.
[captive.git] / src / install / acquire / ui-gnome.c
index 1fa0dba..32b2150 100644 (file)
@@ -586,6 +586,9 @@ gint reply;
                        (GnomeReplyCallback)on_DruidButtonOK_clicked_dialog_callback,
                        &reply);        /* data */
        g_signal_connect((gpointer)dialog,"close",G_CALLBACK(gtk_main_quit),NULL);
+       /* Never call gtk_main() from other thread than the initial one.
+        * We would have to switch GTK+ context (g_main_context()?).
+        */
        gtk_main();
        /* 'dialog' gets destroyed automatically */
        if (reply==0)   /* 0 for 'OK', 1 for 'Cancel', left -1 for dialog close. */
@@ -605,6 +608,18 @@ static void button_stock_set_label(GtkWidget *widget,const gchar *label_text_new
                gtk_label_set_text_with_mnemonic(GTK_LABEL(widget),label_text_new);
 }
 
+static void PageFinish_set_label_attr(GtkWidget *widget,gpointer callback_data /* unused */)
+{
+       g_return_if_fail(GTK_IS_WIDGET(widget));
+
+       /**/ if (GTK_IS_CONTAINER(widget))
+               gtk_container_foreach(GTK_CONTAINER(widget),
+                               (GtkCallback)PageFinish_set_label_attr, /* callback */
+                               callback_data); /* callback_data; unused */
+       else if (GTK_IS_LABEL(widget) && gtk_label_get_line_wrap(GTK_LABEL(widget)))
+               gtk_label_set_selectable(GTK_LABEL(widget),TRUE);
+}
+
 /* of "ui-gnome-interface.h": */
 GtkWidget *create_App(void);
 /* of "ui-gnome-support.h": */
@@ -616,6 +631,8 @@ GtkTreeViewColumn *column;
 GtkCellRenderer *cell;
 GtkBox *druid_button_box;
 
+       gdk_threads_enter();
+
        App=GNOME_APP(create_App());
 
        DriversTreeView=GTK_TREE_VIEW(lookup_widget(GTK_WIDGET(App),"DriversTreeView"));
@@ -661,9 +678,9 @@ GtkBox *druid_button_box;
        gtk_widget_hide(GTK_WIDGET(Druid->finish));
 
        DruidButtonSkip=GTK_BUTTON(gtk_button_new_from_stock(GTK_STOCK_REDO));
-       gtk_container_foreach(GTK_CONTAINER(DruidButtonSkip),
-                       (GtkCallback)button_stock_set_label,    /* callback */
-                       _("_Skip"));    /* callback_data */
+       button_stock_set_label(
+                       GTK_WIDGET(DruidButtonSkip),    /* widget */
+                       _("_Skip"));    /* label_text_new */
        gtk_box_pack_end(druid_button_box,GTK_WIDGET(DruidButtonSkip),FALSE,TRUE,0);
        gtk_widget_show(GTK_WIDGET(DruidButtonSkip));
        g_signal_connect((gpointer)DruidButtonSkip,"clicked",G_CALLBACK(on_DruidButtonSkip_clicked),NULL);
@@ -673,7 +690,13 @@ GtkBox *druid_button_box;
        gtk_widget_show(GTK_WIDGET(DruidButtonOK));
        g_signal_connect((gpointer)DruidButtonOK,"clicked",G_CALLBACK(on_DruidButtonOK_clicked),NULL);
 
+       PageFinish_set_label_attr(
+                       GTK_WIDGET(PageFinish), /* widget */
+                       NULL);  /* callback_data; unused */
+
        state_changed();
+
+       gdk_threads_leave();
 }
 
 static void ui_gnome_g_log_handler(const gchar *log_domain,GLogLevelFlags log_level,const gchar *message,gpointer user_data)
@@ -704,16 +727,26 @@ GtkWidget *dialog;
 
 static void ui_gnome_interactive(void)
 {
-       gtk_widget_show_all(GTK_WIDGET(App));
+       gdk_threads_enter();
 
-       if (!g_thread_supported())
-               g_thread_init(NULL);
-       if (!gdk_threads_mutex)
-               gdk_threads_init();
+       /* Postpone gtk_widget_show_all() from App_init() here
+        * to have already passed all ui_gnome_module_available_notify().
+        */
+       gnome_druid_set_page(Druid,MicrosoftComPage);
+       gtk_widget_show_all(GTK_WIDGET(App));
+#if 0
+       /* gnome_druid_set_page(Druid,PageStart); */
+       gnome_druid_set_page(Druid,ScanDiskPage);
+       gnome_druid_set_page(Druid,ScanPathPage);
+       /* gnome_druid_set_page(Druid,MicrosoftComPage); */
+       gnome_druid_set_page(Druid,PageFinish);
+#endif
+       gnome_druid_set_page(Druid,PageStart);
 
-       gdk_threads_enter();
        gtk_main();
+
        gdk_threads_leave();
+
        exit(EXIT_SUCCESS);
 }
 
@@ -726,6 +759,14 @@ gboolean ui_gnome_init(void)
        ui_interactive=ui_gnome_interactive;
        captivemodid_module_best_priority_notify=ui_gnome_module_best_priority_notify;
 
+       /* gdk_threads_init() must be called before gtk_init()!
+        * gtk_init() gets called by create_App() here.
+        */
+       if (!g_thread_supported())
+               g_thread_init(NULL);
+       if (!gdk_threads_mutex)
+               gdk_threads_init();
+
        /* Graphic widgets will all be hidden yet. */
        App_init();
        /* ui_gnome_g_log_handler() needs 'App'. */