Hi

Here is a cleaner patch for this bug: don't feel impressed/scared by the number of changed lines, it's mostly due to re-indentation of code after removing a couple of if()s.
This patch was tested by me during the whole past week and worked well.
Most important, this handler no longer erroneously updates the question database like the current one does when the user checks/unchecks the checkbox.

cheers

Attilio
Index: gtk.c
===================================================================
--- gtk.c	(revisione 42389)
+++ gtk.c	(copia locale)
@@ -374,16 +374,6 @@
     gtk_main_quit();
 }
 
-void check_toggled_callback (GtkWidget *toggle, gpointer data)
-{
-    struct question *q = (struct question*)data;
-    gboolean value;
-
-    /* INFO(INFO_DEBUG, "GTK_DI - check_toggled_callback() called"); */
-    value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(toggle));
-    bool_setter (toggle, q);
-}
-
 void boolean_single_callback(GtkWidget *button, struct frontend_question_data* data )
 {
     struct frontend *obj = data->obj;
@@ -612,23 +602,21 @@
         gtk_widget_modify_base(GTK_WIDGET(ext_description_view), GTK_STATE_NORMAL, bg_color);
     }
 
-    /* here is created the question's description, unless question is BOOLEAN */
-    if( strcmp(q->template->type, "boolean") != 0 ) {
-        description_view = gtk_text_view_new ();
-        description_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (description_view));
-        gtk_text_buffer_set_text (description_buffer, q_get_description(q), -1);
-        gtk_text_view_set_editable (GTK_TEXT_VIEW(description_view), FALSE);
-        gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW(description_view), FALSE);
-        gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(description_view), GTK_WRAP_WORD);
-        gtk_text_view_set_left_margin (GTK_TEXT_VIEW(description_view), 4);
-        gtk_text_view_set_right_margin (GTK_TEXT_VIEW(description_view), 4);
-        gtk_text_buffer_create_tag (description_buffer, "italic", "style", PANGO_STYLE_ITALIC, NULL);
-        g_object_set_data (G_OBJECT (description_view), "tag", "italic");
-        gtk_text_buffer_get_start_iter  (description_buffer, &start);
-        gtk_text_buffer_get_end_iter  (description_buffer, &end);
-        gtk_text_buffer_apply_tag_by_name (description_buffer, "italic", &start, &end);
-        gtk_widget_modify_base(GTK_WIDGET(description_view), GTK_STATE_NORMAL, bg_color);
-    }
+    /* here is created the question's description */
+    description_view = gtk_text_view_new ();
+    description_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (description_view));
+    gtk_text_buffer_set_text (description_buffer, q_get_description(q), -1);
+    gtk_text_view_set_editable (GTK_TEXT_VIEW(description_view), FALSE);
+    gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW(description_view), FALSE);
+    gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(description_view), GTK_WRAP_WORD);
+    gtk_text_view_set_left_margin (GTK_TEXT_VIEW(description_view), 4);
+    gtk_text_view_set_right_margin (GTK_TEXT_VIEW(description_view), 4);
+    gtk_text_buffer_create_tag (description_buffer, "italic", "style", PANGO_STYLE_ITALIC, NULL);
+    g_object_set_data (G_OBJECT (description_view), "tag", "italic");
+    gtk_text_buffer_get_start_iter  (description_buffer, &start);
+    gtk_text_buffer_get_end_iter  (description_buffer, &end);
+    gtk_text_buffer_apply_tag_by_name (description_buffer, "italic", &start, &end);
+    gtk_widget_modify_base(GTK_WIDGET(description_view), GTK_STATE_NORMAL, bg_color);
 
     gtk_container_set_focus_chain(GTK_CONTAINER(description_box), NULL);
 
@@ -642,8 +630,7 @@
     {
         if (strlen (q_get_extended_description(q)) > 0)
             gtk_box_pack_start(GTK_BOX (description_box), ext_description_view, FALSE, FALSE, 2);
-        if( strcmp(q->template->type, "boolean") != 0 )
-            gtk_box_pack_start(GTK_BOX (description_box), description_view, FALSE, FALSE, 3);
+        gtk_box_pack_start(GTK_BOX (description_box), description_view, FALSE, FALSE, 3);
     }
 
     if ( strcmp(q->template->type,"note") == 0 )
@@ -665,7 +652,7 @@
 
 static int gtkhandler_boolean(struct frontend *obj, struct question *q, GtkWidget *qbox)
 {
-    GtkWidget *description_box, *check, *hpadbox, *vpadbox;
+    GtkWidget *description_box, *radio_false, *radio_true, *hpadbox, *vpadbox;
     struct frontend_question_data *data;
     const char *defval = question_getvalue(q, "");
 
@@ -675,30 +662,38 @@
     data->obj = obj;
     data->q = q;
 
-    check = gtk_check_button_new_with_label(q_get_description(q));
-    if (strcmp(defval, "true") == 0)
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
-    else
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), FALSE);
+   radio_false = gtk_radio_button_new_with_label (NULL, question_get_text(obj, "debconf/no", "No"));
+   radio_true = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_false), question_get_text(obj, "debconf/yes", "Yes"));
 
-    if (q->next == NULL && q->prev == NULL)
-        g_signal_connect (G_OBJECT(check), "toggled", G_CALLBACK(check_toggled_callback), q);
-    else
-        register_setter(bool_setter, check, q, obj);
+    if (strcmp(defval, "true") == 0) {
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio_false), FALSE);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio_true), TRUE);
+    }
+    else {
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio_false), TRUE);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio_true), FALSE);
+    }
 
-    g_signal_connect (G_OBJECT(check), "destroy", G_CALLBACK (free_description_data), data);
+    register_setter(bool_setter, radio_true, q, obj);
 
+    g_signal_connect (G_OBJECT(radio_true), "destroy", G_CALLBACK (free_description_data), data);
+
     description_box = display_descriptions(q, obj);
 
     vpadbox = gtk_vbox_new (FALSE, DEFAULT_PADDING);
     gtk_box_pack_start (GTK_BOX(vpadbox), description_box, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX(vpadbox), check, FALSE, FALSE, 0);
+    gtk_box_pack_start (GTK_BOX(vpadbox), radio_false, FALSE, FALSE, 0);
+    gtk_box_pack_start (GTK_BOX(vpadbox), radio_true, FALSE, FALSE, 0);
     hpadbox = gtk_hbox_new (FALSE, DEFAULT_PADDING);
     gtk_box_pack_start (GTK_BOX(hpadbox), vpadbox, TRUE, TRUE, QUESTIONBOX_HPADDING);
     gtk_box_pack_start(GTK_BOX(qbox), hpadbox, FALSE, FALSE, QUESTIONBOX_VPADDING);
 
-    if (is_first_question(q))
-        gtk_widget_grab_focus(check);
+    if (is_first_question(q)) {
+        if (strcmp(defval, "true") == 0)
+            gtk_widget_grab_focus(radio_false);
+        else
+            gtk_widget_grab_focus(radio_true);
+    }
 
     return DC_OK;
 }

Reply via email to