r369 - trunk

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Nov 20 23:29:36 EST 2007


Author: icculus
Date: 2007-11-20 23:29:33 -0500 (Tue, 20 Nov 2007)
New Revision: 369

Modified:
   trunk/gui_gtkplus2.c
Log:
Patches to make GTK+ ui suck significantly less (thanks, John Spray!).


Modified: trunk/gui_gtkplus2.c
===================================================================
--- trunk/gui_gtkplus2.c	2007-11-10 09:51:16 UTC (rev 368)
+++ trunk/gui_gtkplus2.c	2007-11-21 04:29:33 UTC (rev 369)
@@ -52,8 +52,6 @@
 static GtkWidget *progressbar = NULL;
 static GtkWidget *progresslabel = NULL;
 static GtkWidget *finallabel = NULL;
-static GtkWidget *componentlabel = NULL;
-static GtkWidget *dirselect = NULL;
 static GtkWidget *browse = NULL;
 
 static volatile enum
@@ -94,8 +92,8 @@
     if (click_value == CLICK_CANCEL)
     {
         // !!! FIXME: language.
-        char *title = entry->xstrdup(entry->_("Stop installation"));
-        char *text = entry->xstrdup(entry->_("Are you sure you want to stop installation?"));
+        char *title = entry->xstrdup(entry->_("Cancel installation"));
+        char *text = entry->xstrdup(entry->_("Are you sure you want to cancel installation?"));
         if (!MojoGui_gtkplus2_promptyn(title, text, false))
             click_value = CLICK_NONE;
         free(title);
@@ -155,26 +153,43 @@
 
 static void signal_browse_clicked(GtkButton *_button, gpointer data)
 {
-    gtk_widget_show(dirselect);
-}
+    GtkWidget *dialog = gtk_file_chooser_dialog_new (
+        entry->_("Installation location"),
+        NULL,
+        GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+        GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+        NULL);
 
-static void dirselect_ok_sel( GtkWidget *w, GtkFileSelection *fs )
-{
-    GtkComboBox *combo = GTK_COMBO_BOX(destination);
-    const char *path = gtk_file_selection_get_filename(GTK_FILE_SELECTION (fs));
-    gtk_combo_box_prepend_text(combo, path);
-    gtk_combo_box_set_active (combo, 0);
-    gtk_widget_hide(dirselect);
+    // !!! FIXME: should set the initial path to the existent portion
+    // !!! FIXME:  of the currently suggested path.
+
+    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
+        gchar *filename;
+        gchar *utfname;
+
+        filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+
+        utfname = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
+        gtk_combo_box_prepend_text(GTK_COMBO_BOX(destination), utfname);
+        gtk_combo_box_set_active(GTK_COMBO_BOX(destination), 0);
+
+        g_free(utfname);
+        g_free(filename);
+    }
+    
+    // !!! FIXME: should append the package name to the directory they chose?
+    // !!! FIXME:  This is annoying, they might have created the folder
+    // !!! FIXME:  themselves in the dialog.
+    // !!! FIXME: Could warn when the target directory already contains files?
+
+    gtk_widget_destroy(dialog);
 }
 
 
 static uint8 MojoGui_gtkplus2_priority(void)
 {
-    // !!! FIXME: This would disallow gtkfb, gtk+/mac, gtk+windows, etc...
-    if (getenv("DISPLAY") == NULL)
-        return MOJOGUI_PRIORITY_NEVER_TRY;
-
-    // !!! FIXME: I have no idea if this is a valid test.
+    // gnome-session exports this environment variable since 2002.
     if (getenv("GNOME_DESKTOP_SESSION_ID") != NULL)
         return MOJOGUI_PRIORITY_TRY_FIRST;
 
@@ -202,32 +217,43 @@
     // !!! FIXME:  atexit() function!
 } // MojoGui_gtkplus2_deinit
 
-
+/**
+ * 
+ * @param defbutton The response ID to use when enter is pressed, or 0
+ * to leave it up to GTK+.
+ */
 static gint do_msgbox(const char *title, const char *text,
                       GtkMessageType mtype, GtkButtonsType btype,
+                      GtkResponseType defbutton,
                       void (*addButtonCallback)(GtkWidget *_msgbox))
 {
     gint retval = 0;
-    if (msgbox != NULL)
-        gtk_widget_destroy(msgbox);  // oh well.
+    
+    // Modal dialog, this will never be called recursively.
+    assert(msgbox == NULL);
+
     msgbox = gtk_message_dialog_new(GTK_WINDOW(gtkwindow), GTK_DIALOG_MODAL,
                                     mtype, btype, "%s", title);
     gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msgbox),
                                              "%s", text);
 
+    if (defbutton)
+        gtk_dialog_set_default_response(GTK_DIALOG(msgbox), defbutton);
+
     if (addButtonCallback != NULL)
         addButtonCallback(msgbox);
 
     retval = gtk_dialog_run(GTK_DIALOG(msgbox));
     gtk_widget_destroy(msgbox);
     msgbox = NULL;
+
     return retval;
 } // do_msgbox
 
 
 static void MojoGui_gtkplus2_msgbox(const char *title, const char *text)
 {
-    do_msgbox(title, text, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, NULL);
+    do_msgbox(title, text, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, 0, NULL);
 } // MojoGui_gtkplus2_msgbox
 
 
@@ -236,15 +262,18 @@
 {
     // !!! FIXME: support defval.
     gint rc = do_msgbox(title, text, GTK_MESSAGE_QUESTION,
-                        GTK_BUTTONS_YES_NO, NULL);
+                        GTK_BUTTONS_YES_NO,
+                        defval ? GTK_RESPONSE_YES : GTK_RESPONSE_NO,
+                        NULL);
+
     return (rc == GTK_RESPONSE_YES);
 } // MojoGui_gtkplus2_promptyn
 
 
 static void promptynanButtonCallback(GtkWidget *_msgbox)
 {
-    char *always = entry->xstrdup(entry->_("Always"));
-    char *never = entry->xstrdup(entry->_("Never"));
+    char *always = entry->xstrdup(entry->_("_Always"));
+    char *never = entry->xstrdup(entry->_("N_ever"));
     gtk_dialog_add_buttons(GTK_DIALOG(_msgbox),
                            GTK_STOCK_YES, GTK_RESPONSE_YES,
                            GTK_STOCK_NO, GTK_RESPONSE_NO,
@@ -263,7 +292,9 @@
 {
     // !!! FIXME: support defval.
     const gint rc = do_msgbox(title, text, GTK_MESSAGE_QUESTION,
-                              GTK_BUTTONS_NONE, promptynanButtonCallback);
+                              GTK_BUTTONS_NONE,
+                              defval ? GTK_RESPONSE_YES : GTK_RESPONSE_NO,
+                              promptynanButtonCallback);
     switch (rc)
     {
         case GTK_RESPONSE_YES: return MOJOGUI_YES;
@@ -282,24 +313,13 @@
                                 void (*signal_callback)
                                     (GtkButton *button, gpointer data))
 {
-    // !!! FIXME: gtk_button_set_use_stock()?
-    GtkWidget *button = gtk_button_new();
-    GtkWidget *alignment = gtk_alignment_new (0.5, 0.5, 0, 0);
-    GtkWidget *hbox = gtk_hbox_new(FALSE, 2);
+    GtkWidget *button = gtk_button_new_with_mnemonic(text);
     GtkWidget *image = gtk_image_new_from_stock(iconname, GTK_ICON_SIZE_BUTTON);
-    GtkWidget *label = gtk_label_new_with_mnemonic(text);
+    gtk_button_set_image (GTK_BUTTON(button), image);
     gtk_widget_show(button);
-    gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
-    gtk_widget_show(alignment);
-    gtk_container_add(GTK_CONTAINER(button), alignment);
-    gtk_widget_show(hbox);
-    gtk_container_add(GTK_CONTAINER(alignment), hbox);
-    gtk_widget_show(image);
-    gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
-    gtk_widget_show (label);
-    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6);
     gtk_signal_connect(GTK_OBJECT(button), "clicked",
-                       GTK_SIGNAL_FUNC(signal_callback), NULL);
+                      GTK_SIGNAL_FUNC(signal_callback), NULL);
     return button;
 } // create_button
 
@@ -310,26 +330,29 @@
     GtkWidget *widget;
     GtkWidget *box;
     GtkWidget *alignment;
+    GtkWidget *hbox;
 
     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     gtk_window_set_title(GTK_WINDOW(window), title);
+    gtk_container_set_border_width(GTK_CONTAINER(window), 8);
 
-    box = gtk_vbox_new(FALSE, 0);
+    GdkPixbuf *icon = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+                                                "system-software-installer",
+                                                48, 0, NULL);
+    if (icon)
+        gtk_window_set_icon(GTK_WINDOW(window), icon);
+
+    box = gtk_vbox_new(FALSE, 6);
     gtk_widget_show(box);
     gtk_container_add(GTK_CONTAINER(window), box);
 
     pagetitle = gtk_label_new("");
     gtk_widget_show(pagetitle);
     gtk_box_pack_start(GTK_BOX(box), pagetitle, FALSE, TRUE, 16);
-    gtk_label_set_justify(GTK_LABEL(pagetitle), GTK_JUSTIFY_CENTER);
-    gtk_label_set_line_wrap(GTK_LABEL(pagetitle), FALSE);
-
-    widget = gtk_hseparator_new();
-    gtk_widget_show(widget);
-    gtk_box_pack_start(GTK_BOX(box), widget, FALSE, TRUE, 0);
-
+    
     notebook = gtk_notebook_new();
     gtk_widget_show(notebook);
+    gtk_container_set_border_width(GTK_CONTAINER(notebook), 0);
     gtk_box_pack_start(GTK_BOX(box), notebook, TRUE, TRUE, 0);
     gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
     gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
@@ -337,13 +360,12 @@
                                 (gint) (((float) gdk_screen_width()) * 0.3),
                                 (gint) (((float) gdk_screen_height()) * 0.3));
 
-    widget = gtk_hseparator_new();
+    widget = gtk_hbutton_box_new();
     gtk_widget_show(widget);
-    gtk_box_pack_start(GTK_BOX(box), widget, FALSE, TRUE, 0);
-
-    widget = gtk_hbox_new(TRUE, 0);
-    gtk_widget_show(widget);
     gtk_box_pack_start(GTK_BOX(box), widget, FALSE, FALSE, 0);
+    gtk_button_box_set_layout(GTK_BUTTON_BOX (widget), GTK_BUTTONBOX_END);
+    gtk_button_box_set_child_ipadding(GTK_BUTTON_BOX (widget), 6, 0);
+    gtk_button_box_set_spacing(GTK_BUTTON_BOX (widget), 6);
 
     box = widget;
     cancel = create_button(box, "gtk-cancel", entry->_("Cancel"), signal_clicked);
@@ -359,6 +381,12 @@
 
     // README/EULA page.
     widget = gtk_scrolled_window_new(NULL, NULL);
+    gtk_scrolled_window_set_policy(
+        GTK_SCROLLED_WINDOW(widget),
+        GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+    gtk_scrolled_window_set_shadow_type(
+        GTK_SCROLLED_WINDOW(widget),
+        GTK_SHADOW_IN);
     gtk_widget_show(widget);
     gtk_container_add(GTK_CONTAINER(notebook), widget);
 
@@ -368,55 +396,37 @@
     gtk_text_view_set_editable(GTK_TEXT_VIEW(readme), FALSE);
     gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(readme), GTK_WRAP_NONE);
     gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(readme), FALSE);
+    gtk_text_view_set_left_margin(GTK_TEXT_VIEW(readme), 4);
+    gtk_text_view_set_right_margin(GTK_TEXT_VIEW(readme), 4);
 
     // !!! FIXME: options page.
     box = gtk_vbox_new(FALSE, 0);
     gtk_widget_show(box);
     gtk_container_add(GTK_CONTAINER(notebook), box);
 
-    // !!! FIXME: destination page.
+    // Destination page
     box = gtk_vbox_new(FALSE, 0);
     gtk_widget_show(box);
-    widget = gtk_label_new("!!! FIXME: this GUI stage is a placeholder");
+
+    hbox = gtk_hbox_new (FALSE, 6);
+    widget = gtk_label_new("Folder:");
     gtk_widget_show(widget);
-    gtk_box_pack_start(GTK_BOX(box), widget, FALSE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
     gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
-    gtk_label_set_line_wrap(GTK_LABEL(widget), TRUE);
-    widget = gtk_label_new("Choose a path or enter your own.");
-    gtk_widget_show(widget);
-    gtk_box_pack_start(GTK_BOX(box), widget, FALSE, TRUE, 0);
-    gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
     gtk_label_set_line_wrap(GTK_LABEL(widget), FALSE);
     alignment = gtk_alignment_new(0.5, 0.5, 1, 0);
-    gtk_widget_show(alignment);
     destination = gtk_combo_box_entry_new_text();
-    gtk_widget_show(destination);
     gtk_container_add(GTK_CONTAINER(alignment), destination);
-    gtk_box_pack_start(GTK_BOX(box), alignment, FALSE, TRUE, 0);
-    browse = create_button(box, "fileopen", entry->_("Browse"), signal_browse_clicked);
-    gtk_container_add(GTK_CONTAINER(notebook), box);
+    gtk_box_pack_start(GTK_BOX(hbox), alignment, TRUE, TRUE, 0);
+    browse = create_button(hbox, "gtk-open",
+                           entry->_("B_rowse..."), signal_browse_clicked);
+    gtk_widget_show_all (hbox);
+    gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
+    gtk_container_add(GTK_CONTAINER(notebook), box);    
 
-    // Install Path selection
-    dirselect = gtk_file_selection_new("Install Path");
-    g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (dirselect)->ok_button),
-                      "clicked", G_CALLBACK (dirselect_ok_sel), (gpointer) dirselect);
-    g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION (dirselect)->cancel_button),
-                              "clicked", G_CALLBACK (gtk_widget_destroy),
-                              G_OBJECT (dirselect));
-
-    // !!! FIXME: progress page.
-    box = gtk_vbox_new(FALSE, 0);
+    // Progress page
+    box = gtk_vbox_new(FALSE, 6);
     gtk_widget_show(box);
-    widget = gtk_label_new("!!! FIXME: this GUI stage is a placeholder");
-    gtk_widget_show(widget);
-    gtk_box_pack_start(GTK_BOX(box), widget, FALSE, TRUE, 0);
-    gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
-    gtk_label_set_line_wrap(GTK_LABEL(widget), TRUE);
-    componentlabel = gtk_label_new("");
-    gtk_widget_show(componentlabel);
-    gtk_box_pack_start(GTK_BOX(box), componentlabel, FALSE, TRUE, 0);
-    gtk_label_set_justify(GTK_LABEL(componentlabel), GTK_JUSTIFY_LEFT);
-    gtk_label_set_line_wrap(GTK_LABEL(componentlabel), FALSE);
     alignment = gtk_alignment_new(0.5, 0.5, 1, 0);
     gtk_widget_show(alignment);
     progressbar = gtk_progress_bar_new();
@@ -464,7 +474,6 @@
 
     gtkwindow = NULL;
     pagetitle = NULL;
-    componentlabel = NULL;
     finallabel = NULL;
     progresslabel = NULL;
     progressbar = NULL;
@@ -627,10 +636,10 @@
     int i;
 
     for (i = 0; i < recnum; i++)
-        gtk_combo_box_append_text(combo, recommends[i]);
+        gtk_combo_box_prepend_text(combo, recommends[i]);
+    gtk_combo_box_set_active (combo, 0);
 
-    // !!! FIXME: better text.
-    *command = run_wizard(entry->_("Destination"), PAGE_DESTINATION,
+    *command = run_wizard(entry->_("Installation location"), PAGE_DESTINATION,
                           can_back, can_fwd);
 
     str = gtk_combo_box_get_active_text(combo);
@@ -661,7 +670,7 @@
     char *text = (char *) entry->xmalloc(len);
     snprintf(text, len, fmt, medianame);
     rc = do_msgbox(title, text, GTK_MESSAGE_WARNING,
-                   GTK_BUTTONS_OK_CANCEL, NULL);
+                   GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK, NULL);
     return (rc == GTK_RESPONSE_OK);
 } // MojoGui_gtkplus2_insertmedia
 
@@ -681,7 +690,7 @@
         else
             gtk_progress_bar_set_fraction(progress, ((gdouble) percent) / 100.0);
 
-        gtk_label_set_text(GTK_LABEL(componentlabel), component);
+        gtk_progress_bar_set_text(progress, component);
         gtk_label_set_text(GTK_LABEL(progresslabel), item);
         lastTicks = ticks;
     } // if




More information about the mojosetup-commits mailing list