Update the GTK request implementation for GTK4 gtk4

Mon, 23 May 2022 22:05:35 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 23 May 2022 22:05:35 -0500
branch
gtk4
changeset 41547
a6a75a9d8a09
parent 41546
f9c9174d3747
child 41548
3353c766c6cf

Update the GTK request implementation for GTK4

I had to `#if 0` a fair amount of code as it needs rewriting and there's no point in doing that now when we can't test the rewrite.

Testing Done:
Compiled

Reviewed at https://reviews.imfreedom.org/r/1414/

pidgin/gtkrequest.c file | annotate | diff | comparison | revisions
--- a/pidgin/gtkrequest.c	Sun May 15 02:29:09 2022 -0500
+++ b/pidgin/gtkrequest.c	Mon May 23 22:05:35 2022 -0500
@@ -109,9 +109,8 @@
 	if (GTK_IS_BOX(cont)) {
 		gtk_widget_set_halign(image, GTK_ALIGN_START);
 		gtk_widget_set_valign(image, GTK_ALIGN_START);
-		gtk_box_pack_end(GTK_BOX(cont), image, FALSE, TRUE, 0);
+		gtk_box_append(GTK_BOX(cont), image);
 	}
-	gtk_widget_show(image);
 }
 
 static void
@@ -181,6 +180,8 @@
 static void
 choice_response_cb(GtkDialog *dialog, gint id, PidginRequestData *data)
 {
+#warning please rewrite me
+#if 0
 	GtkWidget *radio = g_object_get_data(G_OBJECT(dialog), "radio");
 	GSList *group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio));
 
@@ -195,12 +196,14 @@
 			group = group->next;
 		}
 	purple_request_close(PURPLE_REQUEST_INPUT, data);
+#endif
 }
 
 static gboolean
-field_string_focus_out_cb(GtkWidget *entry, GdkEventFocus *event,
-						  PurpleRequestField *field)
+field_string_focus_out_cb(GtkEventControllerFocus *controller,
+                          PurpleRequestField *field)
 {
+	GtkWidget *entry = gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(controller));
 	const char *value;
 
 	if (purple_request_field_string_is_multiline(field))
@@ -244,8 +247,10 @@
 }
 
 static void
-field_choice_option_cb(GtkRadioButton *button, PurpleRequestField *field)
+field_choice_option_cb(GtkCheckButton *button, PurpleRequestField *field)
 {
+#warning please rewrite me
+#if 0
 	int active;
 	gpointer *values = g_object_get_data(G_OBJECT(g_object_get_data(
 		G_OBJECT(button), "box")), "values");
@@ -260,6 +265,7 @@
 	g_return_if_fail(active >= 0);
 
 	purple_request_field_choice_set_value(field, values[active]);
+#endif
 }
 
 static void
@@ -432,13 +438,14 @@
 		}
 	}
 
-	img = gtk_image_new_from_icon_name(icon_name, GTK_ICON_SIZE_DIALOG);
-
-	if (img || icon_type == PURPLE_REQUEST_ICON_REQUEST)
-		return img;
-
-	return gtk_image_new_from_icon_name("dialog-question",
-			GTK_ICON_SIZE_DIALOG);
+	if(icon_name == NULL) {
+		icon_name = "dialog-question";
+	}
+
+	img = gtk_image_new_from_icon_name(icon_name);
+	gtk_image_set_icon_size(GTK_IMAGE(img), GTK_ICON_SIZE_LARGE);
+
+	return img;
 }
 
 static void
@@ -489,6 +496,7 @@
 	GtkWidget *hbox;
 	GtkLabel *label;
 	GtkWidget *img;
+	GtkWidget *content;
 	char *label_text;
 	char *primary_esc, *secondary_esc;
 
@@ -514,9 +522,17 @@
 					 G_CALLBACK(input_response_cb), data);
 
 	/* Setup the dialog */
-	gtk_container_set_border_width(GTK_CONTAINER(dialog), 6);
-	gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
-	                               6);
+	gtk_widget_set_margin_top(dialog, 6);
+	gtk_widget_set_margin_bottom(dialog, 6);
+	gtk_widget_set_margin_start(dialog, 6);
+	gtk_widget_set_margin_end(dialog, 6);
+
+	content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+	gtk_widget_set_margin_top(content, 6);
+	gtk_widget_set_margin_bottom(content, 6);
+	gtk_widget_set_margin_start(content, 6);
+	gtk_widget_set_margin_end(content, 6);
+
 	if (!multiline)
 		gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
 	gtk_dialog_set_default_response(GTK_DIALOG(dialog), 0);
@@ -525,21 +541,21 @@
 
 	/* Setup the main horizontal box */
 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
-	gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
-	                  hbox);
+	gtk_box_append(GTK_BOX(content), hbox);
 
 	/* Dialog icon. */
 	img = pidgin_request_dialog_icon(PURPLE_REQUEST_INPUT, cpar);
 	gtk_widget_set_halign(img, GTK_ALIGN_START);
 	gtk_widget_set_valign(img, GTK_ALIGN_START);
-	gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
+	gtk_box_append(GTK_BOX(hbox), img);
 
 	pidgin_request_add_help(GTK_DIALOG(dialog), cpar);
 
 	/* Vertical box */
 	vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
-
-	gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+	gtk_widget_set_halign(vbox, GTK_ALIGN_FILL);
+	gtk_widget_set_hexpand(vbox, TRUE);
+	gtk_box_append(GTK_BOX(hbox), vbox);
 
 	pidgin_widget_decorate_account(hbox, purple_request_cpar_get_account(cpar));
 
@@ -557,10 +573,10 @@
 	label = GTK_LABEL(gtk_label_new(NULL));
 
 	gtk_label_set_markup(label, label_text);
-	gtk_label_set_line_wrap(label, TRUE);
+	gtk_label_set_wrap(label, TRUE);
 	gtk_label_set_xalign(label, 0);
 	gtk_label_set_yalign(label, 0);
-	gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(label), FALSE, FALSE, 0);
+	gtk_box_append(GTK_BOX(vbox), GTK_WIDGET(label));
 
 	g_free(label_text);
 
@@ -568,8 +584,6 @@
 	data->u.input.multiline = multiline;
 	data->u.input.hint = g_strdup(hint);
 
-	gtk_widget_show_all(hbox);
-
 	if(multiline || purple_strequal(data->u.input.hint, "html")) {
 		GtkWidget *editor = talkatu_editor_new();
 		GtkWidget *input = talkatu_editor_get_input(TALKATU_EDITOR(editor));
@@ -577,8 +591,9 @@
 
 		gtk_widget_set_size_request(input, 320, 130);
 		gtk_widget_set_name(input, "pidgin_request_input");
-		gtk_box_pack_start(GTK_BOX(vbox), editor, TRUE, TRUE, 0);
-		gtk_widget_show(editor);
+		gtk_widget_set_valign(editor, GTK_ALIGN_FILL);
+		gtk_widget_set_vexpand(editor, TRUE);
+		gtk_box_append(GTK_BOX(vbox), editor);
 
 		if (purple_strequal(data->u.input.hint, "html")) {
 			buffer = talkatu_html_buffer_new();
@@ -601,7 +616,7 @@
 		GtkWidget *entry = gtk_entry_new();
 
 		gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
-		gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0);
+		gtk_box_append(GTK_BOX(vbox), entry);
 
 		if(default_value != NULL) {
 			gtk_editable_set_text(GTK_EDITABLE(entry), default_value);
@@ -614,8 +629,6 @@
 		data->u.input.entry = entry;
 	}
 
-	gtk_widget_show_all(vbox);
-
 	pidgin_set_accessible_label(data->u.input.entry, label);
 
 	pidgin_auto_parent_window(dialog);
@@ -638,7 +651,8 @@
 	GtkWidget *hbox;
 	GtkWidget *label;
 	GtkWidget *img;
-	GtkWidget *radio = NULL;
+	GtkWidget *first_radio = NULL;
+	GtkWidget *content;
 	char *label_text;
 	char *radio_text;
 	char *primary_esc, *secondary_esc;
@@ -668,23 +682,28 @@
 			 G_CALLBACK(choice_response_cb), data);
 
 	/* Setup the dialog */
-	gtk_container_set_border_width(GTK_CONTAINER(dialog), 6);
-	gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
-	                               6);
+	gtk_widget_set_margin_top(dialog, 6);
+	gtk_widget_set_margin_bottom(dialog, 6);
+	gtk_widget_set_margin_start(dialog, 6);
+	gtk_widget_set_margin_end(dialog, 6);
 	gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
-	gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
-	                    12);
+
+	content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+	gtk_widget_set_margin_top(content, 6);
+	gtk_widget_set_margin_bottom(content, 6);
+	gtk_widget_set_margin_start(content, 6);
+	gtk_widget_set_margin_end(content, 6);
+	gtk_box_set_spacing(GTK_BOX(content), 12);
 
 	/* Setup the main horizontal box */
 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
-	gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
-	                  hbox);
+	gtk_box_append(GTK_BOX(content), hbox);
 
 	/* Dialog icon. */
 	img = pidgin_request_dialog_icon(PURPLE_REQUEST_CHOICE, cpar);
 	gtk_widget_set_halign(img, GTK_ALIGN_START);
 	gtk_widget_set_valign(img, GTK_ALIGN_START);
-	gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
+	gtk_box_append(GTK_BOX(hbox), img);
 
 	pidgin_widget_decorate_account(hbox, purple_request_cpar_get_account(cpar));
 
@@ -692,7 +711,7 @@
 
 	/* Vertical box */
 	vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
-	gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
+	gtk_box_append(GTK_BOX(hbox), vbox);
 
 	/* Descriptive label */
 	primary_esc = pidgin_request_escape(cpar, primary);
@@ -708,30 +727,43 @@
 	label = gtk_label_new(NULL);
 
 	gtk_label_set_markup(GTK_LABEL(label), label_text);
-	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+	gtk_label_set_wrap(GTK_LABEL(label), TRUE);
 	gtk_label_set_xalign(GTK_LABEL(label), 0);
 	gtk_label_set_yalign(GTK_LABEL(label), 0);
-	gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
+	gtk_widget_set_valign(label, GTK_ALIGN_FILL);
+	gtk_widget_set_vexpand(label, TRUE);
+	gtk_box_append(GTK_BOX(vbox), label);
 
 	g_free(label_text);
 
 	vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
-	gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0);
+	gtk_box_append(GTK_BOX(vbox), vbox2);
 	while ((radio_text = va_arg(args, char*))) {
-		       gpointer resp = va_arg(args, gpointer);
-		       radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), radio_text);
-		       gtk_box_pack_start(GTK_BOX(vbox2), radio, FALSE, FALSE, 0);
-		       g_object_set_data(G_OBJECT(radio), "choice_value", resp);
-		       if (resp == default_value)
-			       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE);
+		GtkWidget *radio = NULL;
+		gpointer resp = va_arg(args, gpointer);
+
+		radio = gtk_check_button_new_with_label(radio_text);
+
+		if(first_radio == NULL) {
+			first_radio = radio;
+		} else {
+			gtk_check_button_set_group(GTK_CHECK_BUTTON(radio),
+			                           GTK_CHECK_BUTTON(first_radio));
+		}
+
+		gtk_box_append(GTK_BOX(vbox2), radio);
+
+		g_object_set_data(G_OBJECT(radio), "choice_value", resp);
+		if (resp == default_value)
+		   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE);
 	}
 
-	g_object_set_data(G_OBJECT(dialog), "radio", radio);
+	g_object_set_data(G_OBJECT(dialog), "radio", first_radio);
 
 	/* Show everything. */
 	pidgin_auto_parent_window(dialog);
 
-	gtk_widget_show_all(dialog);
+	gtk_widget_show(dialog);
 
 	return data;
 }
@@ -748,6 +780,7 @@
 	GtkWidget *hbox;
 	GtkWidget *label;
 	GtkWidget *img = NULL;
+	GtkWidget *content;
 	void **buttons;
 	char *label_text;
 	char *primary_esc, *secondary_esc;
@@ -792,26 +825,31 @@
 					 G_CALLBACK(action_response_cb), data);
 
 	/* Setup the dialog */
-	gtk_container_set_border_width(GTK_CONTAINER(dialog), 6);
-	gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
-	                               6);
+	gtk_widget_set_margin_top(dialog, 6);
+	gtk_widget_set_margin_bottom(dialog, 6);
+	gtk_widget_set_margin_start(dialog, 6);
+	gtk_widget_set_margin_end(dialog, 6);
 	gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
-	gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
-	                    12);
+
+	content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+	gtk_widget_set_margin_top(content, 6);
+	gtk_widget_set_margin_bottom(content, 6);
+	gtk_widget_set_margin_start(content, 6);
+	gtk_widget_set_margin_end(content, 6);
+	gtk_box_set_spacing(GTK_BOX(content), 12);
 
 	/* Setup the main horizontal box */
 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
-	gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
-	                  hbox);
+	gtk_box_append(GTK_BOX(content), hbox);
 
 	img = pidgin_request_dialog_icon(PURPLE_REQUEST_ACTION, cpar);
 	gtk_widget_set_halign(img, GTK_ALIGN_START);
 	gtk_widget_set_valign(img, GTK_ALIGN_START);
-	gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
+	gtk_box_append(GTK_BOX(hbox), img);
 
 	/* Vertical box */
 	vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
-	gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
+	gtk_box_append(GTK_BOX(hbox), vbox);
 
 	pidgin_widget_decorate_account(hbox,
 		purple_request_cpar_get_account(cpar));
@@ -832,31 +870,29 @@
 	label = gtk_label_new(NULL);
 
 	gtk_label_set_markup(GTK_LABEL(label), label_text);
-	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+	gtk_label_set_wrap(GTK_LABEL(label), TRUE);
 	gtk_label_set_xalign(GTK_LABEL(label), 0);
 	gtk_label_set_yalign(GTK_LABEL(label), 0);
 	gtk_label_set_selectable(GTK_LABEL(label), TRUE);
-	gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
+	gtk_widget_set_valign(label, GTK_ALIGN_FILL);
+	gtk_widget_set_vexpand(label, TRUE);
+	gtk_box_append(GTK_BOX(vbox), label);
 
 	g_free(label_text);
 
 
-	if (default_action == PURPLE_DEFAULT_ACTION_NONE) {
-		gtk_widget_set_can_default(img, TRUE);
-		gtk_widget_set_can_focus(img, TRUE);
-		gtk_widget_grab_focus(img);
-		gtk_widget_grab_default(img);
-	} else
+	if (default_action != PURPLE_DEFAULT_ACTION_NONE) {
 		/*
 		 * Need to invert the default_action number because the
 		 * buttons are added to the dialog in reverse order.
 		 */
 		gtk_dialog_set_default_response(GTK_DIALOG(dialog), action_count - 1 - default_action);
+	}
 
 	/* Show everything. */
 	pidgin_auto_parent_window(dialog);
 
-	gtk_widget_show_all(dialog);
+	gtk_widget_show(dialog);
 
 	return data;
 }
@@ -879,7 +915,7 @@
 	void *user_data)
 {
 	PidginRequestData *data;
-	GtkWidget *dialog;
+	GtkWidget *dialog, *content;
 	GtkWidget *hbox, *vbox, *img, *label, *button;
 	gchar *primary_esc, *secondary_esc, *label_text;
 
@@ -901,32 +937,36 @@
 		gtk_window_set_title(GTK_WINDOW(dialog), _("Please wait"));
 
 	/* Setup the dialog */
-	gtk_container_set_border_width(GTK_CONTAINER(dialog), 6);
-	gtk_container_set_border_width(GTK_CONTAINER(
-		gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 6);
+	gtk_widget_set_margin_top(dialog, 6);
+	gtk_widget_set_margin_bottom(dialog, 6);
+	gtk_widget_set_margin_start(dialog, 6);
+	gtk_widget_set_margin_end(dialog, 6);
 	gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
-	gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(
-		GTK_DIALOG(dialog))), 12);
+
+	content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+	gtk_widget_set_margin_top(content, 6);
+	gtk_widget_set_margin_bottom(content, 6);
+	gtk_widget_set_margin_start(content, 6);
+	gtk_widget_set_margin_end(content, 6);
+	gtk_box_set_spacing(GTK_BOX(content), 12);
 
 	/* Setup the main horizontal box */
 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
-	gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(
-		GTK_DIALOG(dialog))), hbox);
+	gtk_box_append(GTK_BOX(content), hbox);
 
 	img = pidgin_request_dialog_icon(PURPLE_REQUEST_WAIT, cpar);
 	gtk_widget_set_halign(img, GTK_ALIGN_START);
 	gtk_widget_set_valign(img, GTK_ALIGN_START);
-	gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
+	gtk_box_append(GTK_BOX(hbox), img);
 
 	/* Cancel button */
 	button = gtk_dialog_add_button(GTK_DIALOG(dialog), _("Cancel"), GTK_RESPONSE_CANCEL);
 	g_signal_connect(G_OBJECT(button), "clicked",
 		G_CALLBACK(wait_cancel_cb), data);
-	gtk_widget_set_can_default(button, FALSE);
 
 	/* Vertical box */
 	vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
-	gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
+	gtk_box_append(GTK_BOX(hbox), vbox);
 
 	pidgin_widget_decorate_account(hbox,
 		purple_request_cpar_get_account(cpar));
@@ -947,11 +987,13 @@
 	label = gtk_label_new(NULL);
 
 	gtk_label_set_markup(GTK_LABEL(label), label_text);
-	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+	gtk_label_set_wrap(GTK_LABEL(label), TRUE);
 	gtk_label_set_xalign(GTK_LABEL(label), 0);
 	gtk_label_set_yalign(GTK_LABEL(label), 0);
 	gtk_label_set_selectable(GTK_LABEL(label), FALSE);
-	gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
+	gtk_widget_set_valign(label, GTK_ALIGN_FILL);
+	gtk_widget_set_vexpand(label, TRUE);
+	gtk_box_append(GTK_BOX(vbox), label);
 
 	g_free(label_text);
 
@@ -961,20 +1003,13 @@
 		bar = data->u.wait.progress_bar =
 			GTK_PROGRESS_BAR(gtk_progress_bar_new());
 		gtk_progress_bar_set_fraction(bar, 0);
-		gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(bar),
-			FALSE, FALSE, 0);
+		gtk_box_append(GTK_BOX(vbox), GTK_WIDGET(bar));
 	}
 
-	/* Move focus out of cancel button. */
-	gtk_widget_set_can_default(img, TRUE);
-	gtk_widget_set_can_focus(img, TRUE);
-	gtk_widget_grab_focus(img);
-	gtk_widget_grab_default(img);
-
 	/* Show everything. */
 	pidgin_auto_parent_window(dialog);
 
-	gtk_widget_show_all(dialog);
+	gtk_widget_show(dialog);
 
 	return data;
 }
@@ -1113,6 +1148,7 @@
 	if (purple_request_field_string_is_multiline(field))
 	{
 		GtkWidget *textview;
+		GtkEventController *controller;
 
 		textview = gtk_text_view_new();
 		gtk_text_view_set_editable(GTK_TEXT_VIEW(textview),
@@ -1120,8 +1156,6 @@
 		gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview),
 									GTK_WRAP_WORD_CHAR);
 
-		gtk_widget_show(textview);
-
 		if (value != NULL)
 		{
 			GtkTextBuffer *buffer;
@@ -1135,7 +1169,9 @@
 
 		gtk_text_view_set_editable(GTK_TEXT_VIEW(textview), is_editable);
 
-		g_signal_connect(G_OBJECT(textview), "focus-out-event",
+		controller = gtk_event_controller_focus_new();
+		gtk_widget_add_controller(textview, controller);
+		g_signal_connect(controller, "leave",
 						 G_CALLBACK(field_string_focus_out_cb), field);
 
 	    if (purple_request_field_is_required(field))
@@ -1149,6 +1185,8 @@
 	}
 	else
 	{
+		GtkEventController *controller = NULL;
+
 		widget = gtk_entry_new();
 
 		setup_entry_field(widget, field);
@@ -1166,7 +1204,9 @@
 
 		gtk_editable_set_editable(GTK_EDITABLE(widget), is_editable);
 
-		g_signal_connect(G_OBJECT(widget), "focus-out-event",
+		controller = gtk_event_controller_focus_new();
+		gtk_widget_add_controller(widget, controller);
+		g_signal_connect(controller, "leave",
 						 G_CALLBACK(field_string_focus_out_cb), field);
 	}
 
@@ -1222,6 +1262,8 @@
 create_choice_field(PurpleRequestField *field,
 	PurpleRequestCommonParameters *cpar)
 {
+#warning please rewrite me
+#if 0
 	GtkWidget *widget;
 	GList *elements = purple_request_field_choice_get_elements(field);
 	guint num_labels = g_list_length(elements);
@@ -1261,11 +1303,15 @@
 		GtkWidget *box;
 		GtkWidget *first_radio = NULL;
 		GtkWidget *radio;
-
-		if (num_labels == 2)
+		GtkOrientation orientation = GTK_ORIENTATION_HORIZONTAL;
+
+		if(num_labels == 2) {
+			orientation = GTK_ORIENTATION_HORIZONTAL;
 			box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
-		else
+		} else {
+			orientation = GTK_ORIENTATION_VERTICAL;
 			box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+		}
 
 		widget = box;
 
@@ -1276,12 +1322,15 @@
 		{
 			PurpleKeyValuePair *choice = l->data;
 
-			radio = gtk_radio_button_new_with_label_from_widget(
-				GTK_RADIO_BUTTON(first_radio), choice->key);
+			radio = gtk_check_button_new_with_label(choice->key);
 			g_object_set_data(G_OBJECT(radio), "box", box);
 
-			if (first_radio == NULL)
+			if(first_radio == NULL) {
 				first_radio = radio;
+			} else {
+				gtk_check_button_set_group(GTK_CHECK_BUTTON(radio),
+				                           GTK_CHECK_BUTTON(first_radio));
+			}
 
 			if (choice->value == default_value) {
 				gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE);
@@ -1289,8 +1338,15 @@
 			}
 			values[i++] = choice->value;
 
-			gtk_box_pack_start(GTK_BOX(box), radio, TRUE, TRUE, 0);
-			gtk_widget_show(radio);
+			if(orientation == GTK_ORIENTATION_VERTICAL) {
+				gtk_widget_set_valign(radio, GTK_ALIGN_FILL);
+				gtk_widget_set_vexpand(radio, TRUE);
+			} else if(orientation == GTK_ORIENTATION_HORIZONTAL) {
+				gtk_widget_set_halign(radio, GTK_ALIGN_FILL);
+				gtk_widget_set_hexpand(radio, TRUE);
+			}
+
+			gtk_box_append(GTK_BOX(box), radio);
 
 			g_signal_connect(G_OBJECT(radio), "toggled",
 							 G_CALLBACK(field_choice_option_cb), field);
@@ -1303,6 +1359,9 @@
 	g_object_set_data_full(G_OBJECT(widget), "values", values, g_free);
 
 	return widget;
+#endif
+
+	return NULL;
 }
 
 static GtkWidget *
@@ -1367,7 +1426,6 @@
 	gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
 	g_signal_connect(widget, "changed",
 		G_CALLBACK(req_field_changed_cb), field);
-	gtk_widget_show(widget);
 
 	return widget;
 }
@@ -1482,8 +1540,6 @@
 	g_signal_connect(G_OBJECT(sel), "changed",
 					 G_CALLBACK(list_field_select_changed_cb), field);
 
-	gtk_widget_show(treeview);
-
 	return pidgin_make_scrollable(treeview, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, -1, -1);
 }
 
@@ -1600,6 +1656,7 @@
 static void
 datasheet_selection_changed(GtkWidget *sheet_widget)
 {
+#if 0
 	gpointer buttons_box;
 
 	g_return_if_fail(sheet_widget != NULL);
@@ -1607,6 +1664,7 @@
 	buttons_box = g_object_get_data(G_OBJECT(sheet_widget), "buttons");
 	gtk_container_foreach(GTK_CONTAINER(buttons_box),
 		datasheet_button_check_sens, sheet_widget);
+#endif
 }
 
 static void
@@ -1826,18 +1884,18 @@
 
 	gtk_widget_set_size_request(GTK_WIDGET(view), 400, 250);
 
-	scrollable = pidgin_make_scrollable(GTK_WIDGET(view),
-		GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS, -1, -1);
-	gtk_widget_show(GTK_WIDGET(view));
+	scrollable = gtk_scrolled_window_new();
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollable),
+	                               GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+	gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scrollable),
+	                              GTK_WIDGET(view));
+	gtk_widget_set_halign(scrollable, GTK_ALIGN_FILL);
+	gtk_widget_set_hexpand(scrollable, TRUE);
+	gtk_box_append(GTK_BOX(main_box), scrollable);
 
 	buttons_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
 	gtk_size_group_add_widget(buttons_sg, buttons_box);
-
-	gtk_box_pack_start(GTK_BOX(main_box), scrollable, TRUE, TRUE, 0);
-	gtk_box_pack_start(GTK_BOX(main_box), buttons_box,
-		FALSE, FALSE, 0);
-	gtk_widget_show(scrollable);
-	gtk_widget_show(buttons_box);
+	gtk_box_append(GTK_BOX(main_box), buttons_box);
 
 	it = purple_request_datasheet_get_actions(sheet);
 	for (; it != NULL; it = g_list_next(it)) {
@@ -1854,9 +1912,7 @@
 		g_signal_connect(G_OBJECT(btn), "clicked",
 			G_CALLBACK(datasheet_action_clicked), act);
 
-		gtk_box_pack_start(GTK_BOX(buttons_box), GTK_WIDGET(btn),
-			FALSE, FALSE, 0);
-		gtk_widget_show(GTK_WIDGET(btn));
+		gtk_box_append(GTK_BOX(buttons_box), GTK_WIDGET(btn));
 	}
 
 	g_object_set_data(G_OBJECT(main_box), "view", view);
@@ -1883,14 +1939,13 @@
 {
 	PidginRequestData *data;
 	GtkWidget *win;
-	GtkNotebook *notebook;
-	GtkWidget **pages;
 	GtkWidget *hbox, *vbox;
 	GtkWidget *frame;
 	GtkWidget *label;
 	GtkWidget *grid;
 	GtkWidget *button;
 	GtkWidget *img;
+	GtkWidget *content;
 	GtkSizeGroup *sg, *datasheet_buttons_sg;
 	GList *gl, *fl;
 	PurpleRequestFieldGroup *group;
@@ -1900,8 +1955,6 @@
 	const gboolean compact = purple_request_cpar_is_compact(cpar);
 	GSList *extra_actions;
 	size_t i;
-	const gchar **tab_names;
-	guint tab_count;
 	gboolean ok_btn = (ok_text != NULL);
 
 	data            = g_new0(PidginRequestData, 1);
@@ -1925,17 +1978,15 @@
 					 G_CALLBACK(destroy_multifield_cb), data);
 
 	/* Setup the main horizontal box */
+	content = gtk_dialog_get_content_area(GTK_DIALOG(win));
 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
-	gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(win))),
-	                  hbox);
-	gtk_widget_show(hbox);
+	gtk_box_append(GTK_BOX(content), hbox);
 
 	/* Dialog icon. */
 	img = pidgin_request_dialog_icon(PURPLE_REQUEST_FIELDS, cpar);
 	gtk_widget_set_halign(img, GTK_ALIGN_START);
 	gtk_widget_set_valign(img, GTK_ALIGN_START);
-	gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
-	gtk_widget_show(img);
+	gtk_box_append(GTK_BOX(hbox), img);
 
 	pidgin_request_add_help(GTK_DIALOG(win), cpar);
 
@@ -1953,18 +2004,16 @@
 	button = gtk_dialog_add_button(GTK_DIALOG(win), cancel_text, GTK_RESPONSE_CANCEL);
 	g_signal_connect(G_OBJECT(button), "clicked",
 			G_CALLBACK(multifield_cancel_cb), data);
-	gtk_widget_set_can_default(button, TRUE);
 
 	/* OK button */
 	if (!ok_btn) {
-		gtk_window_set_default(GTK_WINDOW(win), button);
+		gtk_window_set_default_widget(GTK_WINDOW(win), button);
 	} else {
 		button = gtk_dialog_add_button(GTK_DIALOG(win), ok_text, GTK_RESPONSE_OK);
 		g_signal_connect(G_OBJECT(button), "clicked",
 				G_CALLBACK(multifield_ok_cb), data);
 		data->ok_button = button;
-		gtk_widget_set_can_default(button, TRUE);
-		gtk_window_set_default(GTK_WINDOW(win), button);
+		gtk_window_set_default_widget(GTK_WINDOW(win), button);
 	}
 
 	pidgin_widget_decorate_account(hbox,
@@ -1972,8 +2021,9 @@
 
 	/* Setup the vbox */
 	vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
-	gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
-	gtk_widget_show(vbox);
+	gtk_widget_set_halign(vbox, GTK_ALIGN_FILL);
+	gtk_widget_set_hexpand(vbox, TRUE);
+	gtk_box_append(GTK_BOX(hbox), vbox);
 
 	sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 	datasheet_buttons_sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
@@ -1986,99 +2036,23 @@
 		label = gtk_label_new(NULL);
 
 		gtk_label_set_markup(GTK_LABEL(label), label_text);
-		gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+		gtk_label_set_wrap(GTK_LABEL(label), TRUE);
 		gtk_label_set_xalign(GTK_LABEL(label), 0);
 		gtk_label_set_yalign(GTK_LABEL(label), 0);
-		gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-		gtk_widget_show(label);
+		gtk_box_append(GTK_BOX(vbox), label);
 		g_free(label_text);
 	}
 
-	/* Setup tabs */
-	tab_names = purple_request_fields_get_tab_names(fields);
-	if (tab_names == NULL) {
-		notebook = NULL;
-		tab_count = 1;
-
-		pages = g_new0(GtkWidget*, 1);
-		pages[0] = vbox;
-	} else {
-		tab_count = g_strv_length((gchar **)tab_names);
-		notebook = GTK_NOTEBOOK(gtk_notebook_new());
-
-		pages = g_new0(GtkWidget*, tab_count);
-
-		for (i = 0; i < tab_count; i++) {
-			pages[i] = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
-			gtk_container_set_border_width(GTK_CONTAINER(pages[i]), 12);
-			gtk_notebook_append_page(notebook, pages[i], NULL);
-			gtk_notebook_set_tab_label_text(notebook, pages[i], tab_names[i]);
-			gtk_widget_show(pages[i]);
-		}
-	}
-
-	for (i = 0; i < tab_count; i++) {
-		guint total_fields = 0;
-		GList *it;
-
-		it = purple_request_fields_get_groups(fields);
-		for (; it != NULL; it = g_list_next(it)) {
-			group = it->data;
-			if (purple_request_field_group_get_tab(group) != i)
-				continue;
-			total_fields += g_list_length(
-				purple_request_field_group_get_fields(group));
-		}
-
-		if(total_fields > 9) {
-			GtkWidget *hbox_for_spacing, *vbox_for_spacing;
-
-			gtk_container_set_border_width(
-				GTK_CONTAINER(pages[i]), 0);
-
-			hbox_for_spacing =
-				gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
-			gtk_box_pack_start(GTK_BOX(pages[i]),
-				pidgin_make_scrollable(hbox_for_spacing,
-					GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC,
-					-1, 200),
-				TRUE, TRUE, 0);
-			gtk_widget_show(hbox_for_spacing);
-
-			vbox_for_spacing =
-				gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
-			gtk_box_pack_start(GTK_BOX(hbox_for_spacing),
-				vbox_for_spacing, TRUE, TRUE,
-				6);
-			gtk_widget_show(vbox_for_spacing);
-
-			pages[i] = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
-			gtk_box_pack_start(GTK_BOX(vbox_for_spacing),
-				pages[i], TRUE, TRUE, 6);
-			gtk_widget_show(pages[i]);
-		}
-
-		if (notebook == NULL)
-			vbox = pages[0];
-	}
-
 	if (secondary) {
 		secondary_esc = pidgin_request_escape(cpar, secondary);
 		label = gtk_label_new(NULL);
 
 		gtk_label_set_markup(GTK_LABEL(label), secondary_esc);
 		g_free(secondary_esc);
-		gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+		gtk_label_set_wrap(GTK_LABEL(label), TRUE);
 		gtk_label_set_xalign(GTK_LABEL(label), 0);
 		gtk_label_set_yalign(GTK_LABEL(label), 0);
-		gtk_box_pack_start(GTK_BOX(vbox), label, (notebook == NULL),
-			(notebook == NULL), 0);
-		gtk_widget_show(label);
-	}
-
-	if (notebook != NULL) {
-		gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(notebook), TRUE, TRUE, 0);
-		gtk_widget_show(GTK_WIDGET(notebook));
+		gtk_box_append(GTK_BOX(vbox), label);
 	}
 
 	for (gl = purple_request_fields_get_groups(fields);
@@ -2089,44 +2063,21 @@
 		size_t field_count = 0;
 		size_t cols = 1;
 		size_t rows;
-#if 0
-		size_t col_num;
-#endif
 		size_t row_num = 0;
-		guint tab_no;
-		gboolean contains_resizable = FALSE, frame_fill;
+		gboolean contains_resizable = FALSE;
 
 		group      = gl->data;
 		field_list = purple_request_field_group_get_fields(group);
-		tab_no = purple_request_field_group_get_tab(group);
-		if (tab_no >= tab_count) {
-			purple_debug_warning("gtkrequest",
-				"Invalid tab number: %d", tab_no);
-			tab_no = 0;
+
+		if(purple_request_field_group_get_title(group) != NULL) {
+			frame = pidgin_make_frame(vbox,
+				purple_request_field_group_get_title(group));
+		} else {
+			frame = vbox;
 		}
 
-		if (purple_request_field_group_get_title(group) != NULL)
-		{
-			frame = pidgin_make_frame(pages[tab_no],
-				purple_request_field_group_get_title(group));
-		}
-		else
-			frame = pages[tab_no];
-
 		field_count = g_list_length(field_list);
-#if 0
-		if (field_count > 9)
-		{
-			rows = field_count / 2;
-			cols++;
-		}
-		else
-#endif
-			rows = field_count;
-
-#if 0
-		col_num = 0;
-#endif
+		rows = field_count;
 
 		for (fl = field_list; fl != NULL; fl = fl->next)
 		{
@@ -2141,61 +2092,47 @@
 
 			if (type == PURPLE_REQUEST_FIELD_LABEL)
 			{
-#if 0
-				if (col_num > 0)
-					rows++;
-#endif
-
 				rows++;
 			}
 			else if ((type == PURPLE_REQUEST_FIELD_LIST) ||
 				 (type == PURPLE_REQUEST_FIELD_STRING &&
 				  purple_request_field_string_is_multiline(field)))
 			{
-#if 0
-				if (col_num > 0)
-					rows++;
-#endif
-
 				rows += 2;
 			} else if (compact && type != PURPLE_REQUEST_FIELD_BOOLEAN)
 				rows++;
-
-#if 0
-			col_num++;
-
-			if (col_num >= cols)
-				col_num = 0;
-#endif
 		}
 
 		grid = gtk_grid_new();
 		gtk_grid_set_row_spacing(GTK_GRID(grid), 6);
 		gtk_grid_set_column_spacing(GTK_GRID(grid), 6);
 
-		frame_fill = (notebook == NULL || contains_resizable);
-		gtk_box_pack_start(GTK_BOX(frame), grid, frame_fill, frame_fill, 0);
-		gtk_widget_show(grid);
+		/* This box could be setup in a number of ways, so just set all of the
+		 * fill and expand properties instead of only setting the
+		 * minimums.
+		 */
+		g_object_set(G_OBJECT(grid),
+		             "hexpand", contains_resizable,
+		             "vexpand", contains_resizable,
+		             NULL);
+
+		if(contains_resizable) {
+			g_object_set(G_OBJECT(grid),
+			             "halign", GTK_ALIGN_FILL,
+			             "valign", GTK_ALIGN_FILL,
+			             NULL);
+		}
+		gtk_box_append(GTK_BOX(frame), grid);
 
 		for (row_num = 0, fl = field_list;
 			 row_num < rows && fl != NULL;
 			 row_num++)
 		{
-#if 0
-			for (col_num = 0;
-				 col_num < cols && fl != NULL;
-				 col_num++, fl = fl->next)
-#else
 			gboolean dummy_counter = TRUE;
 			/* it's the same as loop above */
 			for (; dummy_counter && fl != NULL; dummy_counter = FALSE, fl = fl->next)
-#endif
 			{
-#if 0
-				size_t col_offset = col_num * 2;
-#else
 				size_t col_offset = 0;
-#endif
 				PurpleRequestFieldType type;
 				GtkWidget *widget = NULL;
 				gchar *field_label;
@@ -2204,9 +2141,6 @@
 				field = fl->data;
 
 				if (!purple_request_field_is_visible(field)) {
-#if 0
-					col_num--;
-#endif
 					continue;
 				}
 
@@ -2240,18 +2174,10 @@
 						(type == PURPLE_REQUEST_FIELD_STRING &&
 						 purple_request_field_string_is_multiline(field)))
 					{
-#if 0
-						if(col_num > 0)
-							row_num++;
-#endif
-
 						gtk_grid_attach(GTK_GRID(grid), label,
 							0, row_num, 2 * cols, 1);
 
 						row_num++;
-#if 0
-						col_num=cols;
-#endif
 					}
 					else
 					{
@@ -2259,7 +2185,6 @@
 							col_offset, row_num, 1, 1);
 					}
 
-					gtk_widget_show(label);
 					g_free(field_label);
 				}
 
@@ -2322,8 +2247,6 @@
 						1, row_num, 2 * cols - 1, 1);
 				}
 
-				gtk_widget_show(widget);
-
 				purple_request_field_set_ui_data(field, widget);
 			}
 		}
@@ -2338,8 +2261,6 @@
 	if (!purple_request_fields_all_valid(fields))
 		gtk_widget_set_sensitive(data->ok_button, FALSE);
 
-	g_free(pages);
-
 	pidgin_auto_parent_window(win);
 
 	gtk_widget_show(win);
@@ -2350,7 +2271,7 @@
 static void
 file_ok_check_if_exists_cb(GtkWidget *widget, gint response, PidginRequestData *data)
 {
-	gchar *current_folder;
+	GFile *current_path;
 
 	if (response != GTK_RESPONSE_ACCEPT) {
 		if (data->cbs[0] != NULL)
@@ -2359,9 +2280,10 @@
 		return;
 	}
 
-	data->u.file.name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data->dialog));
-	current_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(data->dialog));
-	if (current_folder != NULL) {
+	data->u.file.name = gtk_file_chooser_get_current_name(GTK_FILE_CHOOSER(data->dialog));
+	current_path = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(data->dialog));
+	if (current_path != NULL) {
+		gchar *current_folder = g_file_get_path(current_path);
 		if (data->u.file.savedialog) {
 			purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_save_folder", current_folder);
 		} else {
@@ -2373,6 +2295,8 @@
 		((PurpleRequestFileCb)data->cbs[1])(data->user_data, data->u.file.name);
 	}
 	purple_request_close(data->type, data);
+
+	g_clear_object(&current_path);
 }
 
 static void *
@@ -2403,14 +2327,17 @@
 	        savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE
 	                   : GTK_FILE_CHOOSER_ACTION_OPEN,
 	        savedialog ? _("_Save") : _("_Open"), _("_Cancel"));
-	gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(filesel),
-	                                               TRUE);
 
 	if ((filename != NULL) && (*filename != '\0')) {
-		if (savedialog)
-			gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(filesel), filename);
-		else if (g_file_test(filename, G_FILE_TEST_EXISTS))
-			gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(filesel), filename);
+		GFile *path = g_file_new_for_path(filename);
+
+		if(savedialog) {
+			gtk_file_chooser_set_file(GTK_FILE_CHOOSER(filesel), path, NULL);
+		} else if (g_file_test(filename, G_FILE_TEST_EXISTS)) {
+			gtk_file_chooser_set_file(GTK_FILE_CHOOSER(filesel), path, NULL);
+		}
+
+		g_object_unref(path);
 	}
 
 #ifdef _WIN32
@@ -2472,8 +2399,14 @@
 	        title ? title : _("Select Folder..."), NULL,
 	        GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, _("_OK"), _("_Cancel"));
 
-	if ((dirname != NULL) && (*dirname != '\0'))
-		gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname);
+	if ((dirname != NULL) && (*dirname != '\0')) {
+		GFile *path = g_file_new_for_path(dirname);
+
+		gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), path,
+		                                    NULL);
+
+		g_object_unref(path);
+	}
 
 	g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response",
 						G_CALLBACK(file_ok_check_if_exists_cb), data);
@@ -2530,7 +2463,7 @@
 	} else {
 		pidgin_window_detach_children(GTK_WINDOW(data->dialog));
 
-		gtk_widget_destroy(data->dialog);
+		gtk_window_destroy(GTK_WINDOW(data->dialog));
 	}
 
 	if (type == PURPLE_REQUEST_FIELDS)

mercurial