--- a/pidgin/gtkrequest.c Sat Feb 25 22:45:53 2023 -0600
+++ b/pidgin/gtkrequest.c Sat Feb 25 23:09:23 2023 -0600
@@ -178,25 +178,20 @@
-choice_response_cb(G_GNUC_UNUSED GtkDialog *dialog, G_GNUC_UNUSED gint id, G_GNUC_UNUSED PidginRequestData *data)
-#warning please rewrite me
- GtkWidget *radio = g_object_get_data(G_OBJECT(dialog), "radio");
- GSList *group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio));
+choice_response_cb(GtkDialog *dialog, gint id, PidginRequestData *data) { + GtkDropDown *dropdown = g_object_get_data(G_OBJECT(dialog), "dropdown"); generic_response_start(data);
- if (id >= 0 && (gsize)id < data->cb_count && data->cbs[id] != NULL)
- if (gtk_check_button_get_active(GTK_CHECK_BUTTON(group->data))) {
- ((PurpleRequestChoiceCb)data->cbs[id])(data->user_data, g_object_get_data(G_OBJECT(group->data), "choice_value"));
+ if(0 <= id && (gsize)id < data->cb_count && data->cbs[id] != NULL) { + GObject *item = gtk_drop_down_get_selected_item(dropdown); + if(G_IS_OBJECT(item)) { + gpointer value = g_object_get_data(item, "choice_value"); + ((PurpleRequestChoiceCb)data->cbs[id])(data->user_data, value); purple_request_close(PURPLE_REQUEST_INPUT, data);
@@ -270,38 +265,17 @@
-field_choice_menu_cb(GtkComboBox *menu, PurpleRequestField *field)
- int active = gtk_combo_box_get_active(menu);
- gpointer *values = g_object_get_data(G_OBJECT(menu), "values");
- g_return_if_fail(values != NULL);
- g_return_if_fail(active >= 0);
- purple_request_field_choice_set_value(field, values[active]);
-field_choice_option_cb(G_GNUC_UNUSED GtkCheckButton *button, G_GNUC_UNUSED PurpleRequestField *field)
+field_choice_option_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec, -#warning please rewrite me
- gpointer *values = g_object_get_data(G_OBJECT(g_object_get_data(
- G_OBJECT(button), "box")), "values");
- if (!gtk_check_button_get_active(GTK_CHECK_BUTTON(button))) {
+ PurpleRequestField *field = data; + GtkDropDown *dropdown = GTK_DROP_DOWN(obj); + GObject *item = gtk_drop_down_get_selected_item(dropdown); + if(G_IS_OBJECT(item)) { + gpointer value = g_object_get_data(item, "choice_value"); + purple_request_field_choice_set_value(field, value);
- active = (g_slist_length(gtk_radio_button_get_group(button)) -
- g_slist_index(gtk_radio_button_get_group(button), button)) - 1;
- g_return_if_fail(values != NULL);
- g_return_if_fail(active >= 0);
- purple_request_field_choice_set_value(field, values[active]);
@@ -692,15 +666,17 @@
- GtkWidget *vbox, *vbox2;
- GtkWidget *first_radio = NULL;
+ const char *radio_text; char *primary_esc, *secondary_esc;
data = g_new0(PidginRequestData, 1);
data->type = PURPLE_REQUEST_ACTION;
@@ -780,30 +756,31 @@
- vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
- gtk_box_append(GTK_BOX(vbox), vbox2);
- while ((radio_text = va_arg(args, char*))) {
- GtkWidget *radio = NULL;
+ dropdown = gtk_drop_down_new_from_strings(NULL); + gtk_box_append(GTK_BOX(vbox), dropdown); + g_object_set_data(G_OBJECT(dialog), "dropdown", dropdown); + selected = GTK_INVALID_LIST_POSITION; + model = gtk_drop_down_get_model(GTK_DROP_DOWN(dropdown)); + while((radio_text = va_arg(args, const char *))) { gpointer resp = va_arg(args, gpointer);
- radio = gtk_check_button_new_with_label(radio_text);
- if(first_radio == NULL) {
- gtk_check_button_set_group(GTK_CHECK_BUTTON(radio),
- GTK_CHECK_BUTTON(first_radio));
+ gtk_string_list_append(GTK_STRING_LIST(model), radio_text); + item = g_list_model_get_item(model, index); + g_object_set_data(item, "choice_value", resp); + if (resp == default_value) { - gtk_box_append(GTK_BOX(vbox2), radio);
- g_object_set_data(G_OBJECT(radio), "choice_value", resp);
- if (resp == default_value) {
- gtk_check_button_set_active(GTK_CHECK_BUTTON(radio), TRUE);
- g_object_set_data(G_OBJECT(dialog), "radio", first_radio);
+ if(selected != GTK_INVALID_LIST_POSITION) { + gtk_drop_down_set_selected(GTK_DROP_DOWN(dropdown), selected); pidgin_auto_parent_window(dialog);
@@ -1268,104 +1245,50 @@
-create_choice_field(PurpleRequestField *field,
- PurpleRequestCommonParameters *cpar)
+create_choice_field(PurpleRequestField *field) { - GList *elements = purple_request_field_choice_get_elements(field);
- guint num_labels = g_list_length(elements);
- gpointer *values = g_new(gpointer, num_labels);
+ GListModel *model = NULL; + GList *elements = NULL; + guint default_index = GTK_INVALID_LIST_POSITION; - gboolean default_found = FALSE;
default_value = purple_request_field_choice_get_value(field);
- if (num_labels > 5 || purple_request_cpar_is_compact(cpar))
- widget = gtk_combo_box_text_new();
- for (GList *l = elements; l != NULL; l = g_list_next(l))
- PurpleKeyValuePair *choice = l->data;
- gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget), choice->key);
- if (choice->value == default_value) {
- values[i++] = choice->value;
- gtk_combo_box_set_active(GTK_COMBO_BOX(widget), default_index);
- gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
- g_signal_connect(G_OBJECT(widget), "changed",
- G_CALLBACK(field_choice_menu_cb), field);
- GtkWidget *first_radio = NULL;
- GtkOrientation orientation = GTK_ORIENTATION_HORIZONTAL;
- orientation = GTK_ORIENTATION_HORIZONTAL;
- box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
- orientation = GTK_ORIENTATION_VERTICAL;
- box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ widget = gtk_drop_down_new_from_strings(NULL); + model = gtk_drop_down_get_model(GTK_DROP_DOWN(widget)); + elements = purple_request_field_choice_get_elements(field); + for(GList *l = elements; l != NULL; l = g_list_next(l)) { + PurpleKeyValuePair *choice = l->data; + gtk_string_list_append(GTK_STRING_LIST(model), choice->key); + item = g_list_model_get_item(model, index); + g_object_set_data(item, "choice_value", choice->value); + if(choice->value == default_value) {
- gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
- for (GList *l = elements; l != NULL; l = g_list_next(l))
- PurpleKeyValuePair *choice = l->data;
- radio = gtk_check_button_new_with_label(choice->key);
- g_object_set_data(G_OBJECT(radio), "box", box);
- if(first_radio == NULL) {
- gtk_check_button_set_group(GTK_CHECK_BUTTON(radio),
- GTK_CHECK_BUTTON(first_radio));
- if (choice->value == default_value) {
- gtk_check_button_set_active(GTK_CHECK_BUTTON(radio), TRUE);
- values[i++] = choice->value;
- if(orientation == GTK_ORIENTATION_VERTICAL) {
- gtk_widget_set_vexpand(radio, TRUE);
- } else if(orientation == GTK_ORIENTATION_HORIZONTAL) {
- 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);
- if (!default_found && i > 0)
- purple_request_field_choice_set_value(field, values[0]);
- g_object_set_data_full(G_OBJECT(widget), "values", values, g_free);
+ gtk_drop_down_set_selected(GTK_DROP_DOWN(widget), default_index); + gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); + g_signal_connect(G_OBJECT(widget), "notify::selected", + G_CALLBACK(field_choice_option_cb), field); + if(default_index == GTK_INVALID_LIST_POSITION && index > 0) { + GObject *item = g_list_model_get_item(model, 0); + gpointer value = g_object_get_data(item, "choice_value"); + purple_request_field_choice_set_value(field, value);
@@ -2192,7 +2115,7 @@
else if (type == PURPLE_REQUEST_FIELD_BOOLEAN)
widget = create_bool_field(field, cpar);
else if (type == PURPLE_REQUEST_FIELD_CHOICE)
- widget = create_choice_field(field, cpar);
+ widget = create_choice_field(field); else if (type == PURPLE_REQUEST_FIELD_LIST)
widget = create_list_field(field);
else if (type == PURPLE_REQUEST_FIELD_IMAGE)