--- a/pidgin/gtkaccount.c Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/gtkaccount.c Sun Aug 28 22:18:46 2022 -0500
@@ -173,7 +173,9 @@
/* Show a placeholder icon */
gtk_image_set_from_icon_name(GTK_IMAGE(dialog->icon_entry),
- "select-avatar", GTK_ICON_SIZE_LARGE_TOOLBAR);
+ gtk_image_set_icon_size(GTK_IMAGE(dialog->icon_entry), gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->icon_entry), pixbuf);
g_object_unref(G_OBJECT(pixbuf));
@@ -208,14 +210,14 @@
!PURPLE_PROTOCOL_IMPLEMENTS(dialog->protocol, SERVER, register_user))
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->register_button), FALSE);
+ gtk_check_button_set_active(GTK_CHECK_BUTTON(dialog->register_button), FALSE); gtk_widget_hide(dialog->register_button);
if (purple_protocol_get_options(dialog->protocol) &
OPT_PROTO_REGISTER_NOSCREENNAME) {
gtk_widget_set_sensitive(dialog->register_button, TRUE);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
+ gtk_check_button_set_active(GTK_CHECK_BUTTON( dialog->register_button), FALSE);
gtk_widget_set_sensitive(dialog->register_button, FALSE);
@@ -229,12 +231,12 @@
gboolean opt_noscreenname = (dialog->protocol != NULL &&
(purple_protocol_get_options(dialog->protocol) & OPT_PROTO_REGISTER_NOSCREENNAME));
gboolean username_valid = purple_validate(dialog->protocol,
- gtk_entry_get_text(entry));
+ gtk_editable_get_text(GTK_EDITABLE(entry))); if (opt_noscreenname && dialog->register_button &&
- gtk_toggle_button_get_active(
- GTK_TOGGLE_BUTTON(dialog->register_button)))
+ gtk_check_button_get_active( + GTK_CHECK_BUTTON(dialog->register_button))) gtk_widget_set_sensitive(dialog->ok_button, TRUE);
gtk_widget_set_sensitive(dialog->ok_button,
@@ -253,21 +255,21 @@
register_button_cb(GtkWidget *checkbox, AccountPrefsDialog *dialog)
- int register_checked = gtk_toggle_button_get_active(
- GTK_TOGGLE_BUTTON(dialog->register_button));
+ int register_checked = gtk_check_button_get_active( + GTK_CHECK_BUTTON(dialog->register_button)); int opt_noscreenname = (dialog->protocol != NULL &&
(purple_protocol_get_options(dialog->protocol) & OPT_PROTO_REGISTER_NOSCREENNAME));
int register_noscreenname = (opt_noscreenname && register_checked);
if (register_noscreenname) {
- gtk_entry_set_text(GTK_ENTRY(dialog->username_entry), "");
+ gtk_editable_set_text(GTK_EDITABLE(dialog->username_entry), ""); gtk_widget_set_sensitive(dialog->username_entry, !register_noscreenname);
gtk_widget_set_sensitive(dialog->ok_button,
(opt_noscreenname && register_checked) ||
- *gtk_entry_get_text(GTK_ENTRY(dialog->username_entry))
+ *gtk_editable_get_text(GTK_EDITABLE(dialog->username_entry)) @@ -278,13 +280,19 @@
AccountPrefsDialog *dialog = data;
if (response == GTK_RESPONSE_ACCEPT) {
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
+ file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(widget)); + filename = g_file_get_path(file); data = pidgin_convert_buddy_icon(dialog->protocol, filename, &len);
set_dialog_icon(dialog, data, len, filename);
g_clear_object(&dialog->icon_filesel);
@@ -374,11 +382,12 @@
g_object_ref(G_OBJECT(dialog->protocol_menu));
hbox = g_object_get_data(G_OBJECT(dialog->protocol_menu), "container");
- gtk_container_remove(GTK_CONTAINER(hbox), dialog->protocol_menu);
+ gtk_box_remove(GTK_BOX(hbox), dialog->protocol_menu); - if (dialog->login_frame != NULL)
- gtk_widget_destroy(dialog->login_frame);
+ if (dialog->login_frame != NULL) { + gtk_widget_unparent(dialog->login_frame); /* Build the login options frame. */
frame = pidgin_make_frame(parent, _("Login Options"));
@@ -386,13 +395,11 @@
dialog->login_frame = gtk_widget_get_parent(gtk_widget_get_parent(frame));
- gtk_box_reorder_child(GTK_BOX(parent), dialog->login_frame, 0);
- gtk_widget_show(dialog->login_frame);
+ gtk_box_reorder_child_after(GTK_BOX(parent), dialog->login_frame, NULL); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_box_append(GTK_BOX(frame), vbox); if(dialog->protocol_menu == NULL) {
@@ -401,7 +408,6 @@
g_signal_connect(G_OBJECT(dialog->protocol_menu), "changed",
G_CALLBACK(set_account_protocol_cb), dialog);
- gtk_widget_show(dialog->protocol_menu);
g_object_ref(G_OBJECT(dialog->protocol_menu));
@@ -498,15 +504,17 @@
value = purple_account_user_split_get_default_value(split);
- if (value != NULL && entry != NULL)
- gtk_entry_set_text(GTK_ENTRY(entry), value);
+ if (value != NULL && entry != NULL) { + gtk_editable_set_text(GTK_EDITABLE(entry), value); g_list_free_full(user_splits,
(GDestroyNotify)purple_account_user_split_destroy);
- gtk_entry_set_text(GTK_ENTRY(dialog->username_entry), username);
+ if (username != NULL) { + gtk_editable_set_text(GTK_EDITABLE(dialog->username_entry), username); @@ -523,7 +531,7 @@
icon_check_cb(GtkWidget *checkbox, AccountPrefsDialog *dialog)
- gtk_widget_set_sensitive(dialog->icon_hbox, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check)));
+ gtk_widget_set_sensitive(dialog->icon_hbox, gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->icon_check))); @@ -537,20 +545,20 @@
- if (dialog->user_frame != NULL)
- gtk_widget_destroy(dialog->user_frame);
+ if (dialog->user_frame != NULL) { + gtk_widget_unparent(dialog->user_frame); /* Build the user options frame. */
frame = pidgin_make_frame(parent, _("User Options"));
dialog->user_frame = gtk_widget_get_parent(gtk_widget_get_parent(frame));
- gtk_box_reorder_child(GTK_BOX(parent), dialog->user_frame, 1);
- gtk_widget_show(dialog->user_frame);
+ gtk_box_reorder_child_after(GTK_BOX(parent), dialog->user_frame, + gtk_widget_get_first_child(parent)); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
- gtk_container_add(GTK_CONTAINER(frame), vbox);
+ gtk_box_append(GTK_BOX(frame), vbox); dialog->alias_entry = gtk_entry_new();
@@ -559,27 +567,22 @@
dialog->icon_check = gtk_check_button_new_with_mnemonic(_("Use this buddy _icon for this account:"));
g_signal_connect(G_OBJECT(dialog->icon_check), "toggled", G_CALLBACK(icon_check_cb), dialog);
- gtk_widget_show(dialog->icon_check);
- gtk_box_pack_start(GTK_BOX(vbox), dialog->icon_check, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(vbox), dialog->icon_check); dialog->icon_hbox = hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
- gtk_widget_set_sensitive(hbox, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check)));
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+ gtk_widget_set_sensitive(hbox, gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->icon_check))); + gtk_box_append(GTK_BOX(vbox), hbox); label = gtk_label_new(" ");
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
- gtk_widget_show(label);
+ gtk_box_append(GTK_BOX(hbox), label); button = gtk_button_new();
- gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
+ gtk_box_append(GTK_BOX(hbox), button); g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(icon_select_cb), dialog);
dialog->icon_entry = gtk_image_new();
- gtk_container_add(GTK_CONTAINER(button), dialog->icon_entry);
- gtk_widget_show(dialog->icon_entry);
+ gtk_button_set_child(GTK_BUTTON(button), dialog->icon_entry); /* TODO: Uh, isn't this next line pretty useless? */
pidgin_set_accessible_label(dialog->icon_entry, GTK_LABEL(label));
@@ -588,18 +591,19 @@
vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
- gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0);
- gtk_widget_show(vbox2);
+ gtk_widget_set_hexpand(vbox2, TRUE); + gtk_widget_set_halign(vbox2, GTK_ALIGN_FILL); + gtk_box_append(GTK_BOX(hbox), vbox2); hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
- gtk_box_pack_start(GTK_BOX(vbox2), hbox2, FALSE, FALSE, 12);
- gtk_widget_show(hbox2);
+ gtk_widget_set_margin_top(hbox2, 12); + gtk_widget_set_margin_bottom(hbox2, 12); + gtk_box_append(GTK_BOX(vbox2), hbox2); button = gtk_button_new_with_mnemonic(_("_Remove"));
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(icon_reset_cb), dialog);
- gtk_box_pack_start(GTK_BOX(hbox2), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
+ gtk_box_append(GTK_BOX(hbox2), button); if (dialog->protocol != NULL) {
PurpleBuddyIconSpec *icon_spec = purple_protocol_get_icon_spec(dialog->protocol);
@@ -617,11 +621,12 @@
- if (purple_account_get_private_alias(dialog->account))
- gtk_entry_set_text(GTK_ENTRY(dialog->alias_entry),
- purple_account_get_private_alias(dialog->account));
+ if (purple_account_get_private_alias(dialog->account)) { + gtk_editable_set_text(GTK_EDITABLE(dialog->alias_entry), + purple_account_get_private_alias(dialog->account)); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->icon_check),
+ gtk_check_button_set_active(GTK_CHECK_BUTTON(dialog->icon_check), !purple_account_get_bool(dialog->account, "use-global-buddyicon",
@@ -698,10 +703,8 @@
dialog->protocol_frame = vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
gtk_notebook_insert_page(GTK_NOTEBOOK(dialog->notebook), vbox,
gtk_label_new_with_mnemonic(_("Ad_vanced")), 1);
for (l = opts; l != NULL; l = l->next)
@@ -731,11 +734,10 @@
opt_entry->widget = check = gtk_check_button_new_with_mnemonic(tmp);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
+ gtk_check_button_set_active(GTK_CHECK_BUTTON(check), - gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
- gtk_widget_show(check);
+ gtk_box_append(GTK_BOX(vbox), check); @@ -755,7 +757,7 @@
g_snprintf(buf, sizeof(buf), "%d", int_value);
opt_entry->widget = entry = gtk_entry_new();
- gtk_entry_set_text(GTK_ENTRY(entry), buf);
+ gtk_editable_set_text(GTK_EDITABLE(entry), buf); title = g_strdup_printf("_%s:",
purple_account_option_get_text(option));
@@ -789,10 +791,18 @@
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(entry),
+ if (str_value != NULL) { + GtkWidget *real_entry = NULL; + real_entry = gtk_combo_box_get_child(GTK_COMBO_BOX(entry)); + gtk_editable_set_text(GTK_EDITABLE(real_entry), + entry = gtk_entry_new(); + gtk_editable_set_text(GTK_EDITABLE(entry), + str_value ? str_value : "");
- entry = gtk_entry_new();
opt_entry->widget = entry;
if (purple_account_option_string_get_masked(option) && str_hints)
@@ -801,12 +811,6 @@
gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
- if (str_value != NULL && str_hints)
- gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry))),
- gtk_entry_set_text(GTK_ENTRY(entry), str_value ? str_value : "");
title = g_strdup_printf("_%s:",
purple_account_option_get_text(option));
add_pref_box(dialog, vbox, title, entry);
@@ -888,7 +892,7 @@
if (!dialog->protocol || !PURPLE_PROTOCOL_IMPLEMENTS(dialog->protocol, MEDIA, initiate_session)) {
if (dialog->voice_frame) {
- gtk_widget_destroy(dialog->voice_frame);
+ gtk_widget_unparent(dialog->voice_frame); dialog->voice_frame = NULL;
dialog->suppression_check = NULL;
@@ -897,31 +901,27 @@
if (!dialog->voice_frame) {
dialog->voice_frame = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
- gtk_container_set_border_width(GTK_CONTAINER(dialog->voice_frame), 12);
dialog->suppression_check =
gtk_check_button_new_with_mnemonic(_("Use _silence suppression"));
- gtk_box_pack_start(GTK_BOX(dialog->voice_frame), dialog->suppression_check,
+ gtk_box_append(GTK_BOX(dialog->voice_frame), dialog->suppression_check); gtk_notebook_append_page(GTK_NOTEBOOK(dialog->notebook),
dialog->voice_frame, gtk_label_new_with_mnemonic(_("_Voice and Video")));
- gtk_widget_show_all(dialog->voice_frame);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->suppression_check),
- purple_account_get_silence_suppression(dialog->account));
+ gtk_check_button_set_active(GTK_CHECK_BUTTON(dialog->suppression_check), + purple_account_get_silence_suppression(dialog->account)); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->suppression_check), FALSE);
+ gtk_check_button_set_active(GTK_CHECK_BUTTON(dialog->suppression_check), FALSE);
-account_win_destroy_cb(GtkWidget *w, GdkEvent *event,
- AccountPrefsDialog *dialog)
+account_win_destroy_cb(AccountPrefsDialog *dialog) - gtk_widget_destroy(dialog->window);
+ gtk_window_destroy(GTK_WINDOW(dialog->window)); g_list_free(dialog->user_split_entries);
g_list_free_full(dialog->protocol_opt_entries, (GDestroyNotify)protocol_opt_entry_free);
@@ -936,7 +936,6 @@
purple_signals_disconnect_by_handle(dialog);
@@ -971,7 +970,7 @@
manager = purple_account_manager_get_default();
/* Build the username string. */
- username = g_strdup(gtk_entry_get_text(GTK_ENTRY(dialog->username_entry)));
+ username = g_strdup(gtk_editable_get_text(GTK_EDITABLE(dialog->username_entry))); if (dialog->protocol != NULL)
@@ -984,7 +983,7 @@
GtkEntry *entry = l2->data;
- value = entry ? gtk_entry_get_text(entry) : "";
+ value = entry ? gtk_editable_get_text(GTK_EDITABLE(entry)) : ""; @@ -1031,7 +1030,7 @@
- value = gtk_entry_get_text(GTK_ENTRY(dialog->alias_entry));
+ value = gtk_editable_get_text(GTK_EDITABLE(dialog->alias_entry)); purple_account_set_private_alias(account, value);
@@ -1047,13 +1046,13 @@
if (new_acct || purple_account_get_bool(account, "use-global-buddyicon", TRUE) ==
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check)))
+ gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->icon_check))) - purple_account_set_bool(account, "use-global-buddyicon", !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check)));
+ purple_account_set_bool(account, "use-global-buddyicon", !gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->icon_check))); - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->icon_check)))
+ if (gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->icon_check))) @@ -1100,18 +1099,18 @@
if (GTK_IS_COMBO_BOX(opt_entry->widget))
value = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(opt_entry->widget));
- value = gtk_entry_get_text(GTK_ENTRY(opt_entry->widget));
+ value = gtk_editable_get_text(GTK_EDITABLE(opt_entry->widget)); purple_account_set_string(account, opt_entry->setting, value);
- int_value = atoi(gtk_entry_get_text(GTK_ENTRY(opt_entry->widget)));
+ int_value = atoi(gtk_editable_get_text(GTK_EDITABLE(opt_entry->widget))); purple_account_set_int(account, opt_entry->setting, int_value);
case PURPLE_PREF_BOOLEAN:
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opt_entry->widget));
+ gtk_check_button_get_active(GTK_CHECK_BUTTON(opt_entry->widget)); purple_account_set_bool(account, opt_entry->setting, bool_value);
@@ -1134,7 +1133,7 @@
/* Voice and Video settings */
if (dialog->voice_frame) {
purple_account_set_silence_suppression(account,
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->suppression_check)));
+ gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->suppression_check))); /* If this is a new account, add it to our list */
@@ -1145,7 +1144,7 @@
/* If this is a new account, then sign on! */
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->register_button))) {
+ if (gtk_check_button_get_active(GTK_CHECK_BUTTON(dialog->register_button))) { purple_account_set_register_callback(account, account_register_cb, NULL);
purple_account_register(account);
@@ -1159,7 +1158,7 @@
/* We no longer need the data from the dialog window */
- account_win_destroy_cb(NULL, NULL, dialog);
+ account_win_destroy_cb(dialog); @@ -1171,7 +1170,8 @@
account_prefs_save(window);
- account_win_destroy_cb(NULL, NULL, window);
+ case GTK_RESPONSE_DELETE_EVENT: + account_win_destroy_cb(window); @@ -1209,8 +1209,6 @@
dialog->window = win = pidgin_dialog_new((type == PIDGIN_ADD_ACCOUNT_DIALOG) ? _("Add Account") : _("Modify Account"),
- g_signal_connect(win, "delete_event", G_CALLBACK(account_win_destroy_cb),
g_signal_connect(win, "response", G_CALLBACK(account_prefs_response_cb),
@@ -1219,15 +1217,12 @@
gtk_box_set_spacing(GTK_BOX(main_vbox), 6);
dialog->notebook = notebook = gtk_notebook_new();
- gtk_box_pack_start(GTK_BOX(main_vbox), notebook, FALSE, FALSE, 0);
- gtk_widget_show(GTK_WIDGET(notebook));
+ gtk_box_append(GTK_BOX(main_vbox), notebook); /* Setup the inner vbox */
dialog->top_vbox = vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
- gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox,
gtk_label_new_with_mnemonic(_("_Basic")));
/* Setup the top frames. */
add_login_options(dialog, vbox);
@@ -1235,8 +1230,7 @@
button = gtk_check_button_new_with_mnemonic(
_("Create _this new account on the server"));
- gtk_box_pack_start(GTK_BOX(main_vbox), button, FALSE, FALSE, 0);
- gtk_widget_show(button);
+ gtk_box_append(GTK_BOX(main_vbox), button); dialog->register_button = button;
g_signal_connect(G_OBJECT(dialog->register_button), "toggled", G_CALLBACK(register_button_cb), dialog);
if (dialog->account == NULL)
@@ -1256,7 +1250,6 @@
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dialog->proxy_options,
gtk_label_new_with_mnemonic(_("Proxy")));
- gtk_widget_show(dialog->proxy_options);
add_voice_options(dialog);
@@ -1279,7 +1272,6 @@
/**************************************************************************
**************************************************************************/
/* This still exists because gtkprivacy calls it to add the privacy ui ops */
static PurpleAccountUiOps ui_ops = {};
--- a/pidgin/gtkblist.c Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/gtkblist.c Sun Aug 28 22:18:46 2022 -0500
@@ -44,9 +44,9 @@
#include "pidgin/pidgincontactlistwindow.h"
#include "pidgin/pidgincore.h"
#include "pidgin/pidgindebug.h"
+#include "pidgin/pidginiconname.h" #include "pidgin/pidginmooddialog.h"
#include "pidgin/pidginplugininfo.h"
-#include "pidgin/pidginstylecontext.h"
#include <gdk/gdkkeysyms.h>
@@ -90,7 +90,7 @@
+ PROTOCOL_ICON_NAME_COLUMN, @@ -134,11 +134,14 @@
if (response == GTK_RESPONSE_ACCEPT) {
PurpleBlistNode *node = (PurpleBlistNode*)data;
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
+ file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(widget)); + filename = g_file_get_path(file); purple_buddy_icons_node_set_custom_icon_from_file(node, filename);
g_object_set_data(G_OBJECT(data), "buddy-icon-chooser", NULL);
@@ -666,10 +669,10 @@
- if (GTK_IS_ENTRY (editable)) {
- GtkEntry *entry = GTK_ENTRY (editable);
- gtk_entry_set_text(entry, text);
+ if(GTK_IS_EDITABLE(editable)) { + gtk_editable_set_text(GTK_EDITABLE(editable), text); @@ -866,7 +869,7 @@
g_hash_table_replace(components,
g_strdup(g_object_get_data(tmp->data, "identifier")),
- g_strdup(gtk_entry_get_text(tmp->data)));
+ g_strdup(gtk_editable_get_text(GTK_EDITABLE(tmp->data)))); @@ -892,7 +895,7 @@
- gtk_widget_destroy(GTK_WIDGET(dialog));
+ gtk_window_destroy(GTK_WINDOW(dialog)); g_list_free(info->entries);
@@ -919,7 +922,7 @@
if (!g_object_get_data(tmp->data, "is_spin"))
required = GPOINTER_TO_INT(g_object_get_data(tmp->data, "required"));
- text = gtk_entry_get_text(tmp->data);
+ text = gtk_editable_get_text(GTK_EDITABLE(tmp->data)); if (required && (*text == '\0'))
@@ -990,8 +993,8 @@
- img = gtk_image_new_from_icon_name("dialog-question",
+ img = gtk_image_new_from_icon_name("dialog-question"); + gtk_image_set_icon_size(GTK_IMAGE(img), GTK_ICON_SIZE_LARGE); gtkblist = PIDGIN_BUDDY_LIST(purple_blist_get_default());
blist_window = gtkblist ? GTK_WINDOW(gtkblist->window) : NULL;
@@ -1000,31 +1003,25 @@
gtk_window_set_title(GTK_WINDOW(data->window), title);
gtk_window_set_transient_for(GTK_WINDOW(data->window), blist_window);
gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK);
- gtk_container_set_border_width(GTK_CONTAINER(data->window), 6);
gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE);
gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(data->window))),
- gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(data->window))),
- gtk_window_set_role(GTK_WINDOW(data->window), window_role);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
- gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(data->window))),
- gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(hbox), img); gtk_widget_set_halign(img, GTK_ALIGN_START);
gtk_widget_set_valign(img, GTK_ALIGN_START);
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
- gtk_container_add(GTK_CONTAINER(hbox), vbox);
+ gtk_box_append(GTK_BOX(hbox), vbox); label = gtk_label_new(label_text);
gtk_widget_set_size_request(label, 400, -1);
- 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_box_append(GTK_BOX(vbox), label); data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
@@ -1048,8 +1045,7 @@
G_CALLBACK(callback_func), data);
data->vbox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 5));
- gtk_container_set_border_width(GTK_CONTAINER(data->vbox), 0);
- gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(data->vbox), FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(vbox), GTK_WIDGET(data->vbox)); g_signal_connect(G_OBJECT(data->window), "response", response_cb, data);
@@ -1063,6 +1059,7 @@
PurpleProtocol *protocol;
+ GtkWidget *child = NULL; GList *list = NULL, *tmp;
GHashTable *defaults = NULL;
PurpleProtocolChatEntry *pce;
@@ -1073,7 +1070,11 @@
gc = purple_account_get_connection(data->rq_data.account);
protocol = purple_connection_get_protocol(gc);
- gtk_container_foreach(GTK_CONTAINER(data->rq_data.vbox), (GtkCallback)gtk_widget_destroy, NULL);
+ child = gtk_widget_get_first_child(GTK_WIDGET(data->rq_data.vbox)); + while (child != NULL) { + gtk_widget_unparent(child); + child = gtk_widget_get_first_child(GTK_WIDGET(data->rq_data.vbox)); g_list_free(data->entries);
@@ -1104,8 +1105,9 @@
gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE);
value = g_hash_table_lookup(defaults, pce->identifier);
- gtk_entry_set_text(GTK_ENTRY(input), value);
+ gtk_editable_set_text(GTK_EDITABLE(input), value); gtk_entry_set_visibility(GTK_ENTRY(input), FALSE);
@@ -1134,8 +1136,6 @@
/* Set whether the "OK" button should be clickable initially */
set_sensitive_if_input_chat_cb(NULL, data);
- gtk_widget_show_all(GTK_WIDGET(data->rq_data.vbox));
@@ -1186,7 +1186,7 @@
rebuild_chat_entries(data, NULL);
- gtk_widget_show_all(data->rq_data.window);
+ gtk_widget_show(data->rq_data.window); static void gtk_blist_row_expanded_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
@@ -1450,7 +1450,8 @@
-pidgin_blist_show_context_menu(GtkWidget *tv, PurpleBlistNode *node, GdkEventButton *event)
+pidgin_blist_show_context_menu(GtkWidget *tv, PurpleBlistNode *node, PidginBlistNode *gtknode = g_object_get_data(G_OBJECT(node), UI_DATA);
@@ -1462,7 +1463,7 @@
gtk_application = GTK_APPLICATION(g_application_get_default());
- action_map = G_ACTION_MAP(gtk_widget_get_action_group(tv, "menu"));
+ action_map = G_ACTION_MAP(gtkblist->action_group); /* Create a menu based on the thing we right-clicked on */
if (PURPLE_IS_GROUP(node)) {
@@ -1566,15 +1567,14 @@
g_simple_action_set_enabled(G_SIMPLE_ACTION(action), enabled);
/* Now display the menu */
- if (menu != NULL && event != NULL) {
- GtkWidget *popover_menu = gtk_popover_menu_new();
- gtk_popover_bind_model(GTK_POPOVER(popover_menu), G_MENU_MODEL(menu),
- gtk_popover_set_relative_to(GTK_POPOVER(popover_menu), tv);
+ if (menu != NULL && x >= 0 && y >= 0) { + GtkWidget *popover_menu = NULL; + popover_menu = gtk_popover_menu_new_from_model(G_MENU_MODEL(menu)); + gtk_widget_set_parent(popover_menu, tv); gtk_popover_set_position(GTK_POPOVER(popover_menu), GTK_POS_BOTTOM);
gtk_popover_set_pointing_to(GTK_POPOVER(popover_menu),
- &(const GdkRectangle){(int)event->x, (int)event->y, 1, 1});
+ &(const GdkRectangle){(gint)x, (gint)y, 1, 1}); gtk_popover_popup(GTK_POPOVER(popover_menu));
@@ -1585,8 +1585,14 @@
-gtk_blist_button_press_cb(GtkWidget *tv, GdkEventButton *event, gpointer user_data)
+gtk_blist_button_press_cb(GtkGestureClick *click, gint n_press, gdouble x, + gdouble y, gpointer data) + PidginBuddyList *gtkblist = data; + GdkEvent *event = NULL; @@ -1595,20 +1601,27 @@
PidginBlistNode *gtknode;
gboolean handled = FALSE;
+ tv = gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(click)); + event = gtk_event_controller_get_current_event(GTK_EVENT_CONTROLLER(click)); + button = gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(click)); + state = gtk_event_controller_get_current_event_state(GTK_EVENT_CONTROLLER(click)); /* Here we figure out which node was clicked */
- if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL))
+ if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), x, y, &path, NULL, gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
gtknode = g_object_get_data(G_OBJECT(node), UI_DATA);
/* Right click draws a context menu */
- if (gdk_event_triggers_context_menu((GdkEvent *)event)) {
- handled = pidgin_blist_show_context_menu(tv, node, event);
+ if (gdk_event_triggers_context_menu(event)) { + handled = pidgin_blist_show_context_menu(tv, node, x, y); /* CTRL+middle click expands or collapse a contact */
- } else if ((event->button == GDK_BUTTON_MIDDLE) && (event->type == GDK_BUTTON_PRESS) &&
- (event->state & GDK_CONTROL_MASK) && (PURPLE_IS_CONTACT(node))) {
+ } else if ((button == GDK_BUTTON_MIDDLE) && (n_press == 1) && + (state & GDK_CONTROL_MASK) && PURPLE_IS_CONTACT(node)) { if (gtknode->contact_expanded)
pidgin_blist_collapse_contact_cb(NULL, node);
@@ -1616,8 +1629,8 @@
/* Double middle click gets info */
- } else if ((event->button == GDK_BUTTON_MIDDLE) && (event->type == GDK_2BUTTON_PRESS) &&
- ((PURPLE_IS_CONTACT(node)) || (PURPLE_IS_BUDDY(node)))) {
+ } else if ((button == GDK_BUTTON_MIDDLE) && (n_press == 2) && + (PURPLE_IS_CONTACT(node) || PURPLE_IS_BUDDY(node))) { if(PURPLE_IS_CONTACT(node))
@@ -1651,26 +1664,6 @@
gtk_tree_path_free(path);
-pidgin_blist_popup_menu_cb(GtkWidget *tv, void *user_data)
- gboolean handled = FALSE;
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv));
- if (!gtk_tree_selection_get_selected(sel, NULL, &iter))
- gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
- /* Shift+F10 draws a context menu */
- handled = pidgin_blist_show_context_menu(tv, node, NULL);
@@ -1897,37 +1890,93 @@
add_tip_for_account(GtkWidget *grid, gint row, PurpleAccount *account)
- GdkPixbuf *protocol_icon = NULL;
+ PurpleProtocol *protocol = NULL;
- protocol_icon = pidgin_create_protocol_icon(account, PIDGIN_PROTOCOL_ICON_SMALL);
- if (purple_account_is_disconnected(account)) {
- gdk_pixbuf_saturate_and_pixelate(protocol_icon, protocol_icon, 0.0, FALSE);
- image = gtk_image_new_from_pixbuf(protocol_icon);
+ const gchar *icon_name = NULL; + protocol = purple_account_get_protocol(account); + icon_name = purple_protocol_get_icon_name(protocol); + image = gtk_image_new_from_icon_name(icon_name); gtk_image_set_pixel_size(GTK_IMAGE(image), STATUS_SIZE);
gtk_grid_attach(GTK_GRID(grid), image, 0, row, 1, 1);
- g_clear_object(&protocol_icon);
name = gtk_label_new(purple_account_get_username(account));
gtk_label_set_xalign(GTK_LABEL(name), 0);
gtk_label_set_yalign(GTK_LABEL(name), 0);
- gtk_label_set_line_wrap(GTK_LABEL(name), TRUE);
+ gtk_label_set_wrap(GTK_LABEL(name), TRUE); gtk_label_set_max_width_chars(GTK_LABEL(name), 36);
gtk_grid_attach(GTK_GRID(grid), name, 1, row, 1, 1);
+pidgin_blist_get_status_icon_name(PurpleBlistNode *node) { + const char *icon = NULL; + PidginBlistNode *gtknode = g_object_get_data(G_OBJECT(node), UI_DATA); + PidginBlistNode *gtkbuddynode = NULL; + PurpleBuddy *buddy = NULL; + PurpleChat *chat = NULL; + if(PURPLE_IS_CONTACT(node)) { + if(!gtknode->contact_expanded) { + buddy = purple_contact_get_priority_buddy((PurpleContact*)node); + gtkbuddynode = g_object_get_data(G_OBJECT(buddy), UI_DATA); + } else if(PURPLE_IS_BUDDY(node)) { + buddy = (PurpleBuddy*)node; + gtkbuddynode = g_object_get_data(G_OBJECT(node), UI_DATA); + } else if(PURPLE_IS_CHAT(node)) { + chat = (PurpleChat*)node; + PurpleAccount *account; + PurpleProtocol *protocol; + account = purple_buddy_get_account(buddy); + account = purple_chat_get_account(chat); + protocol = purple_account_get_protocol(account); + PurplePresence *p = purple_buddy_get_presence(buddy); + if (PURPLE_BUDDY_IS_ONLINE(buddy) && gtkbuddynode && gtkbuddynode->recent_signonoff) { + } else if (gtkbuddynode && gtkbuddynode->recent_signonoff) { + icon = pidgin_icon_name_from_presence(p, "pidgin-user-available"); add_tip_for_node(GtkWidget *grid, gint row, PurpleBlistNode *node, gboolean full)
- GdkPixbuf *status_icon = NULL;
GdkPixbuf *avatar = NULL;
GtkWidget *avatar_image = NULL;
PurpleAccount *account = NULL;
char *tmp = NULL, *node_name = NULL, *tooltip_text = NULL;
+ const gchar *status_icon = NULL; if (PURPLE_IS_BUDDY(node)) {
account = purple_buddy_get_account(PURPLE_BUDDY(node));
@@ -1935,11 +1984,10 @@
account = purple_chat_get_account(PURPLE_CHAT(node));
- status_icon = pidgin_blist_get_status_icon(node, PIDGIN_STATUS_ICON_LARGE);
- image = gtk_image_new_from_pixbuf(status_icon);
+ status_icon = pidgin_blist_get_status_icon_name(node); + image = gtk_image_new_from_icon_name(status_icon); gtk_image_set_pixel_size(GTK_IMAGE(image), STATUS_SIZE);
gtk_grid_attach(GTK_GRID(grid), image, 0, row, 1, 1);
- g_clear_object(&status_icon);
if (PURPLE_IS_BUDDY(node)) {
tmp = g_markup_escape_text(purple_buddy_get_name(PURPLE_BUDDY(node)), -1);
@@ -1965,13 +2013,13 @@
gtk_grid_attach(GTK_GRID(grid), name, 1, row, 1, 1);
- GdkPixbuf *protocol_icon = pidgin_create_protocol_icon(
- account, PIDGIN_PROTOCOL_ICON_SMALL);
- image = gtk_image_new_from_pixbuf(protocol_icon);
+ PurpleProtocol *protocol = purple_account_get_protocol(account); + const gchar *icon_name = purple_protocol_get_icon_name(protocol); + image = gtk_image_new_from_icon_name(icon_name); gtk_image_set_pixel_size(GTK_IMAGE(image), STATUS_SIZE);
gtk_widget_set_halign(image, GTK_ALIGN_END);
gtk_grid_attach(GTK_GRID(grid), image, 2, row, 1, 1);
- g_clear_object(&protocol_icon);
tooltip_text = pidgin_get_tooltip_text(node, full);
@@ -1980,18 +2028,12 @@
gtk_label_set_xalign(GTK_LABEL(contents), 0);
gtk_label_set_yalign(GTK_LABEL(contents), 0);
gtk_label_set_markup(GTK_LABEL(contents), tooltip_text);
- gtk_label_set_line_wrap(GTK_LABEL(contents), TRUE);
+ gtk_label_set_wrap(GTK_LABEL(contents), TRUE); gtk_label_set_max_width_chars(GTK_LABEL(contents), 36);
gtk_grid_attach(GTK_GRID(grid), contents, 1, row+1, 2, 1);
avatar = pidgin_blist_get_buddy_icon(node, !full, FALSE);
-#if 0 /* Protocol Icon as avatar */
- avatar = pidgin_create_protocol_icon(account, PIDGIN_PROTOCOL_ICON_LARGE);
avatar_image = gtk_image_new_from_pixbuf(avatar);
gtk_widget_set_halign(avatar_image, GTK_ALIGN_END);
@@ -2049,7 +2091,6 @@
- gtk_widget_show_all(grid);
gtk_tooltip_set_custom(tooltip, grid);
@@ -2544,86 +2585,6 @@
-pidgin_blist_get_status_icon(PurpleBlistNode *node, PidginStatusIconSize size)
- const char *icon = NULL;
- gboolean trans = FALSE;
- PidginBlistNode *gtknode = g_object_get_data(G_OBJECT(node), UI_DATA);
- PidginBlistNode *gtkbuddynode = NULL;
- PurpleBuddy *buddy = NULL;
- PurpleChat *chat = NULL;
- gint icon_size = (size == PIDGIN_STATUS_ICON_LARGE) ? 16 : 11;
- if(PURPLE_IS_CONTACT(node)) {
- if(!gtknode->contact_expanded) {
- buddy = purple_contact_get_priority_buddy((PurpleContact*)node);
- gtkbuddynode = g_object_get_data(G_OBJECT(buddy), UI_DATA);
- } else if(PURPLE_IS_BUDDY(node)) {
- buddy = (PurpleBuddy*)node;
- gtkbuddynode = g_object_get_data(G_OBJECT(node), UI_DATA);
- } else if(PURPLE_IS_CHAT(node)) {
- chat = (PurpleChat*)node;
- PurpleAccount *account;
- PurpleProtocol *protocol;
- account = purple_buddy_get_account(buddy);
- account = purple_chat_get_account(chat);
- protocol = purple_account_get_protocol(account);
- PurplePresence *p = purple_buddy_get_presence(buddy);
- trans = purple_presence_is_idle(p);
- if (PURPLE_BUDDY_IS_ONLINE(buddy) && gtkbuddynode && gtkbuddynode->recent_signonoff) {
- } else if (gtkbuddynode && gtkbuddynode->recent_signonoff) {
- } else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_UNAVAILABLE)) {
- icon = "pidgin-user-busy";
- } else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_AWAY)) {
- icon = "pidgin-user-away";
- } else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_EXTENDED_AWAY)) {
- icon = "pidgin-user-extended-away";
- } else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_OFFLINE)) {
- icon = "pidgin-user-offline";
- } else if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_INVISIBLE)) {
- icon = "pidgin-user-invisible";
- icon = "pidgin-user-available";
- ret = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(), icon, icon_size, 0, NULL);
- GdkPixbuf *copy = gdk_pixbuf_copy(ret);
- do_alphashift(copy, 77);
pidgin_blist_get_name_markup(PurpleBuddy *b, gboolean selected, gboolean aliased)
@@ -2707,7 +2668,7 @@
- dim_grey = pidgin_style_context_is_dark() ? "light slate grey" : "dim grey";
/* choose the colors of the text */
@@ -2917,11 +2878,10 @@
* I'm sure other things in this code assumes that also.
-treeview_style_set(GtkWidget *widget,
+icon_theme_changed_cb(G_GNUC_UNUSED GtkIconTheme *self, gpointer data) { PurpleBuddyList *list = data;
PurpleBlistNode *node = purple_blist_get_root(list);
pidgin_blist_update_group(list, node);
@@ -2947,7 +2907,7 @@
rend = gtk_cell_renderer_pixbuf_new();
gtk_tree_view_column_pack_start(column, rend, FALSE);
gtk_tree_view_column_set_attributes(column, rend,
- "pixbuf", STATUS_ICON_COLUMN,
+ "icon-name", STATUS_ICON_COLUMN, "visible", STATUS_ICON_VISIBLE_COLUMN,
g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL);
@@ -2980,7 +2940,7 @@
rend = gtk_cell_renderer_pixbuf_new();
gtk_tree_view_column_pack_start(column, rend, FALSE);
gtk_tree_view_column_set_attributes(column, rend,
- "pixbuf", PROTOCOL_ICON_COLUMN,
+ "icon-name", PROTOCOL_ICON_NAME_COLUMN, g_object_set(rend, "xalign", 0.0, "xpad", 3, "ypad", 0, NULL);
@@ -3073,10 +3033,11 @@
static void pidgin_blist_show(PurpleBuddyList *list)
- GSimpleActionGroup *action_group = NULL;
GtkEventController *key_controller = NULL;
+ GtkGesture *click = NULL; + GtkIconTheme *icon_theme; GtkTreeSelection *selection;
gtkblist = PIDGIN_BUDDY_LIST(list);
@@ -3090,24 +3051,23 @@
/****************************** GtkTreeView **********************************/
gtkblist->treemodel = gtk_tree_store_new(BLIST_COLUMNS,
- GDK_TYPE_PIXBUF, /* Status icon */
+ G_TYPE_STRING, /* Status icon */ G_TYPE_BOOLEAN, /* Status icon visible */
G_TYPE_STRING, /* Name */
GDK_TYPE_PIXBUF, /* Buddy icon */
G_TYPE_POINTER, /* Node */
GDK_TYPE_PIXBUF, /* Emblem */
G_TYPE_BOOLEAN, /* Emblem visible */
- GDK_TYPE_PIXBUF /* Protocol icon */
+ G_TYPE_STRING /* Protocol icon */ gtkblist->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtkblist->treemodel));
- gtk_widget_show(gtkblist->treeview);
gtk_widget_set_name(gtkblist->treeview, "pidgin_blist_treeview");
- g_signal_connect(gtkblist->treeview,
- G_CALLBACK(treeview_style_set), list);
+ icon_theme = gtk_icon_theme_get_for_display(gdk_display_get_default()); + g_signal_connect(icon_theme, "changed", + G_CALLBACK(icon_theme_changed_cb), list); /* Set up selection stuff */
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview));
g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(pidgin_blist_selection_changed), NULL);
@@ -3130,32 +3090,41 @@
G_CALLBACK(gtk_blist_row_expanded_cb), gtkblist);
g_signal_connect(G_OBJECT(gtkblist->treeview), "row-collapsed",
G_CALLBACK(gtk_blist_row_collapsed_cb), gtkblist);
- g_signal_connect(G_OBJECT(gtkblist->treeview), "button-press-event", G_CALLBACK(gtk_blist_button_press_cb), NULL);
- key_controller = gtk_event_controller_key_new(gtkblist->treeview);
+ click = gtk_gesture_click_new(); + gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(click), 0); + g_signal_connect(click, "pressed", G_CALLBACK(gtk_blist_button_press_cb), + gtk_widget_add_controller(gtkblist->treeview, GTK_EVENT_CONTROLLER(click)); + key_controller = gtk_event_controller_key_new(); g_signal_connect(G_OBJECT(key_controller), "key-pressed",
G_CALLBACK(pidgin_blist_key_press_cb), gtkblist);
- g_object_set_data_full(G_OBJECT(gtkblist->treeview), "key-controller",
- key_controller, g_object_unref);
- g_signal_connect(G_OBJECT(gtkblist->treeview), "popup-menu", G_CALLBACK(pidgin_blist_popup_menu_cb), NULL);
+ gtk_widget_add_controller(gtkblist->treeview, key_controller); /* Enable CTRL+F searching */
gtk_tree_view_set_search_column(GTK_TREE_VIEW(gtkblist->treeview), NAME_COLUMN);
gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(gtkblist->treeview),
pidgin_blist_search_equal_func, NULL, NULL);
- gtk_box_pack_start(GTK_BOX(gtkblist->vbox),
- pidgin_make_scrollable(gtkblist->treeview, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, GTK_SHADOW_NONE, -1, -1),
+ sw = gtk_scrolled_window_new(); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), gtkblist->treeview); + gtk_widget_set_vexpand(sw, TRUE); + gtk_widget_set_valign(sw, GTK_ALIGN_FILL); + gtk_box_append(GTK_BOX(gtkblist->vbox), sw); sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(gtkblist->vbox), sep, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(gtkblist->vbox), sep); /* Update some dynamic things */
pidgin_blist_update_sort_methods();
/* OK... let's show this bad boy. */
pidgin_blist_refresh(list);
- gtk_widget_show_all(GTK_WIDGET(gtkblist->vbox));
purple_blist_set_visible(TRUE);
handle = pidgin_blist_get_handle();
@@ -3184,11 +3153,12 @@
handle = pidgin_blist_get_handle();
purple_signal_emit(handle, "gtkblist-created", list);
- action_group = g_simple_action_group_new();
- g_action_map_add_action_entries(G_ACTION_MAP(action_group), menu_actions,
- G_N_ELEMENTS(menu_actions), gtkblist);
+ gtkblist->action_group = G_ACTION_GROUP(g_simple_action_group_new()); + g_action_map_add_action_entries(G_ACTION_MAP(gtkblist->action_group), + menu_actions, G_N_ELEMENTS(menu_actions), gtk_widget_insert_action_group(gtkblist->treeview, "menu",
- G_ACTION_GROUP(action_group));
+ G_ACTION_GROUP(gtkblist->action_group)); pidgin_blist_populate_menus();
@@ -3463,17 +3433,18 @@
static void buddy_node(PurpleBuddy *buddy, GtkTreeIter *iter, PurpleBlistNode *node)
PurplePresence *presence = purple_buddy_get_presence(buddy);
- GdkPixbuf *status, *avatar, *emblem, *protocol_icon;
+ PurpleProtocol *protocol = NULL; + GdkPixbuf *avatar, *emblem; gboolean selected = (gtkblist->selected_node == node);
+ const gchar *protocol_icon_name = NULL, *status_icon_name = NULL; - status = pidgin_blist_get_status_icon(PURPLE_BLIST_NODE(buddy),
- PIDGIN_STATUS_ICON_LARGE);
+ status_icon_name = pidgin_blist_get_status_icon_name(PURPLE_BLIST_NODE(buddy)); avatar = pidgin_blist_get_buddy_icon(PURPLE_BLIST_NODE(buddy), TRUE, TRUE);
@@ -3485,28 +3456,25 @@
emblem = pidgin_blist_get_emblem(PURPLE_BLIST_NODE(buddy));
mark = pidgin_blist_get_name_markup(buddy, selected, TRUE);
- protocol_icon = pidgin_create_protocol_icon(purple_buddy_get_account(buddy), PIDGIN_PROTOCOL_ICON_SMALL);
+ protocol = purple_account_get_protocol(purple_buddy_get_account(buddy)); + protocol_icon_name = purple_protocol_get_icon_name(protocol); gtk_tree_store_set(gtkblist->treemodel, iter,
- STATUS_ICON_COLUMN, status,
+ STATUS_ICON_COLUMN, status_icon_name, STATUS_ICON_VISIBLE_COLUMN, TRUE,
BUDDY_ICON_COLUMN, avatar,
EMBLEM_VISIBLE_COLUMN, (emblem != NULL),
- PROTOCOL_ICON_COLUMN, protocol_icon,
+ PROTOCOL_ICON_NAME_COLUMN, protocol_icon_name,
- g_object_unref(status);
- g_object_unref(protocol_icon);
/* This is a variation on the original gtk_blist_update_contact. Here we
@@ -3547,23 +3515,20 @@
gtknode = g_object_get_data(G_OBJECT(cnode), UI_DATA);
if(gtknode->contact_expanded) {
+ const gchar *icon_name = NULL; mark = g_markup_escape_text(purple_contact_get_alias(contact), -1);
- status = pidgin_blist_get_status_icon(cnode,
- PIDGIN_STATUS_ICON_LARGE);
+ icon_name = pidgin_blist_get_status_icon_name(cnode); gtk_tree_store_set(gtkblist->treemodel, &iter,
- STATUS_ICON_COLUMN, status,
+ STATUS_ICON_COLUMN, icon_name, STATUS_ICON_VISIBLE_COLUMN, TRUE,
- g_object_unref(status);
buddy_node(buddy, &iter, cnode);
@@ -3621,17 +3586,19 @@
chat = (PurpleChat*)node;
if(purple_account_is_connected(purple_chat_get_account(chat))) {
+ PurpleProtocol *protocol = NULL; - GdkPixbuf *status, *avatar, *emblem, *protocol_icon;
+ GdkPixbuf *avatar, *emblem; const gchar *color = NULL;
gboolean selected = (gtkblist->selected_node == node);
gboolean nick_said = FALSE;
+ const gchar *protocol_icon_name = NULL, *status_icon_name = NULL; if (!insert_node(list, node, &iter))
- status = pidgin_blist_get_status_icon(node, PIDGIN_STATUS_ICON_LARGE);
+ status_icon_name = pidgin_blist_get_status_icon_name(node); emblem = pidgin_blist_get_emblem(node);
avatar = pidgin_blist_get_buddy_icon(node, TRUE, FALSE);
@@ -3648,28 +3615,24 @@
- protocol_icon = pidgin_create_protocol_icon(purple_chat_get_account(chat), PIDGIN_PROTOCOL_ICON_SMALL);
+ protocol = purple_account_get_protocol(purple_chat_get_account(chat)); + protocol_icon_name = purple_protocol_get_icon_name(protocol); gtk_tree_store_set(gtkblist->treemodel, &iter,
- STATUS_ICON_COLUMN, status,
+ STATUS_ICON_COLUMN, status_icon_name, STATUS_ICON_VISIBLE_COLUMN, TRUE,
BUDDY_ICON_COLUMN, avatar,
EMBLEM_VISIBLE_COLUMN, emblem != NULL,
- PROTOCOL_ICON_COLUMN, protocol_icon,
+ PROTOCOL_ICON_NAME_COLUMN, protocol_icon_name,
- g_object_unref(status);
- g_object_unref(protocol_icon);
pidgin_blist_hide_node(list, node, TRUE);
@@ -3709,7 +3672,7 @@
if (!gtk_widget_get_visible(gtkblist->window))
gtk_widget_show(gtkblist->window);
- gtk_window_iconify(GTK_WINDOW(gtkblist->window));
+ /* gtk_window_iconify(GTK_WINDOW(gtkblist->window)); */ @@ -3907,7 +3870,7 @@
purple_signals_disconnect_by_handle(gtkblist);
- gtk_widget_destroy(gtkblist->window);
+ gtk_window_destroy(GTK_WINDOW(gtkblist->window)); gtkblist->window = gtkblist->vbox = gtkblist->treeview = NULL;
g_clear_object(>kblist->treemodel);
--- a/pidgin/gtkconv.c Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/gtkconv.c Sun Aug 28 22:18:46 2022 -0500
@@ -52,7 +52,6 @@
#include "pidgininvitedialog.h"
#include "pidginmessage.h"
#include "pidginpresenceicon.h"
-#include "pidginstylecontext.h"
#define ADD_MESSAGE_HISTORY_AT_ONCE 100
@@ -554,50 +553,11 @@
-gtkconv_chat_popup_menu_cb(GtkWidget *widget, PidginConversation *gtkconv)
+right_click_chat_cb(GtkGestureClick *click, gint n_press, gdouble x, gdouble y, - PurpleConversation *conv = gtkconv->active_conv;
- PurpleAccount *account;
- GtkWidget *popover_menu = NULL;
- gtkconv = PIDGIN_CONVERSATION(conv);
- account = purple_conversation_get_account(conv);
- gc = purple_account_get_connection(account);
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkconv->list));
- sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkconv->list));
- if(!gtk_tree_selection_get_selected(sel, NULL, &iter))
- gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1);
- menu = create_chat_menu(PURPLE_CHAT_CONVERSATION(conv), who, gc, gtkconv);
- popover_menu = gtk_popover_menu_new();
- gtk_popover_bind_model(GTK_POPOVER(popover_menu), G_MENU_MODEL(menu),
- gtk_popover_set_relative_to(GTK_POPOVER(popover_menu), gtkconv->list);
- gtk_popover_popup(GTK_POPOVER(popover_menu));
-right_click_chat_cb(GtkWidget *widget, GdkEventButton *event,
- PidginConversation *gtkconv)
+ PidginConversation *gtkconv = data; PurpleConversation *conv = gtkconv->active_conv;
@@ -606,15 +566,18 @@
GtkTreeViewColumn *column;
+ GdkEvent *event = NULL; account = purple_conversation_get_account(conv);
gc = purple_account_get_connection(account);
+ event = gtk_event_controller_get_current_event(GTK_EVENT_CONTROLLER(click)); + button = gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(click)); model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkconv->list));
- gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(gtkconv->list),
- event->x, event->y, &path, &column, &x, &y);
+ gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(gtkconv->list), x, y, + &path, &column, NULL, NULL); @@ -629,27 +592,26 @@
gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1);
/* emit chat-nick-clicked signal */
- if (event->type == GDK_BUTTON_PRESS) {
gint plugin_return = GPOINTER_TO_INT(purple_signal_emit_return_1(
pidgin_conversations_get_handle(), "chat-nick-clicked",
- conv, who, event->button));
- if (event->button == GDK_BUTTON_PRIMARY && event->type == GDK_2BUTTON_PRESS) {
+ if (button == GDK_BUTTON_PRIMARY && n_press == 2) { chat_do_im(gtkconv, who);
- } else if (gdk_event_triggers_context_menu((GdkEvent *)event)) {
- GtkWidget *popover_menu = gtk_popover_menu_new();
+ } else if (gdk_event_triggers_context_menu(event)) { + GtkWidget *popover_menu = NULL; GMenu *menu = create_chat_menu(PURPLE_CHAT_CONVERSATION(conv), who, gc,
- gtk_popover_bind_model(GTK_POPOVER(popover_menu), G_MENU_MODEL(menu),
- gtk_popover_set_relative_to(GTK_POPOVER(popover_menu), gtkconv->list);
+ popover_menu = gtk_popover_menu_new_from_model(G_MENU_MODEL(menu)); + gtk_widget_set_parent(popover_menu, gtkconv->list); gtk_popover_set_position(GTK_POPOVER(popover_menu), GTK_POS_BOTTOM);
gtk_popover_set_pointing_to(GTK_POPOVER(popover_menu),
- &(const GdkRectangle){(int)event->x, (int)event->y, 1, 1});
+ &(const GdkRectangle){(int)x, (int)y, 1, 1}); gtk_popover_popup(GTK_POPOVER(popover_menu));
@@ -763,30 +725,47 @@
-conv_keypress_common(PidginConversation *gtkconv, GdkEventKey *event)
+conv_keypress_common(PidginConversation *gtkconv, guint keyval, /* If CTRL was held down... */
- if (event->state & GDK_CONTROL_MASK) {
- switch (event->keyval) {
+ if (state & GDK_CONTROL_MASK) { - if (gtkconv_cycle_focus(gtkconv, event->state & GDK_SHIFT_MASK ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD))
+ if (gtkconv_cycle_focus(gtkconv, + state & GDK_SHIFT_MASK ?
/* If ALT (or whatever) was held down... */
- else if (event->state & GDK_MOD1_MASK)
+ } else if (state & GDK_ALT_MASK) { /* If neither CTRL nor ALT were held down... */
- switch (event->keyval) {
- if (gtkconv_cycle_focus(gtkconv, event->state & GDK_SHIFT_MASK ? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD))
+ if (gtkconv_cycle_focus(gtkconv, + state & GDK_SHIFT_MASK ? + case GDK_KEY_KP_Page_Up: + talkatu_auto_scroller_decrement(TALKATU_AUTO_SCROLLER(gtkconv->vadjustment)); + case GDK_KEY_Page_Down: + case GDK_KEY_KP_Page_Down: + talkatu_auto_scroller_increment(TALKATU_AUTO_SCROLLER(gtkconv->vadjustment)); @@ -794,53 +773,46 @@
-entry_key_press_cb(GtkWidget *entry, GdkEventKey *event, gpointer data)
+entry_key_press_cb(GtkEventControllerKey *controller, guint keyval, + G_GNUC_UNUSED guint keycode, GdkModifierType state, + GtkWidget *entry = NULL; PurpleConversation *conv;
PidginConversation *gtkconv;
- gtkconv = (PidginConversation *)data;
- conv = gtkconv->active_conv;
- if (conv_keypress_common(gtkconv, event))
+ entry = gtk_event_controller_get_widget(GTK_EVENT_CONTROLLER(controller)); + gtkconv = (PidginConversation *)data; + conv = gtkconv->active_conv; + if (conv_keypress_common(gtkconv, keyval, state)) { /* If CTRL was held down... */
- if (event->state & GDK_CONTROL_MASK) {
+ if (state & GDK_CONTROL_MASK) { /* If ALT (or whatever) was held down... */
- else if (event->state & GDK_MOD1_MASK) {
+ } else if (state & GDK_ALT_MASK) { /* If neither CTRL nor ALT were held down... */
- switch (event->keyval) {
case GDK_KEY_ISO_Left_Tab:
- if (gtkconv->entry != entry)
+ if (gtkconv->entry != entry) { plugin_return = GPOINTER_TO_INT(purple_signal_emit_return_1(
pidgin_conversations_get_handle(), "chat-nick-autocomplete",
- conv, event->state & GDK_SHIFT_MASK));
+ conv, state & GDK_SHIFT_MASK));
- case GDK_KEY_KP_Page_Up:
- talkatu_scrolled_window_page_up(TALKATU_SCROLLED_WINDOW(gtkconv->history_sw));
- case GDK_KEY_Page_Down:
- case GDK_KEY_KP_Page_Down:
- talkatu_scrolled_window_page_down(TALKATU_SCROLLED_WINDOW(gtkconv->history_sw));
@@ -853,7 +825,7 @@
if (PURPLE_IS_IM_CONVERSATION(conv) &&
purple_prefs_get_bool("/purple/conversations/im/send_typing")) {
- switch (event->keyval) {
@@ -867,6 +839,41 @@
+is_valid_conversation_key(guint keyval, GdkModifierType state) + if (state & GDK_CONTROL_MASK) { + case GDK_KEY_Control_L: + case GDK_KEY_Control_R: + case GDK_KEY_KP_Page_Up: + case GDK_KEY_Page_Down: + case GDK_KEY_KP_Page_Down: + case GDK_KEY_ISO_Left_Tab: * If someone tries to type into the conversation backlog of a
* conversation window then we yank focus from the conversation backlog
@@ -874,43 +881,26 @@
* all the live long day and it will get entered into the entry box.
-refocus_entry_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+refocus_entry_cb(GtkEventControllerKey *controller, guint keyval, + G_GNUC_UNUSED guint keycode, GdkModifierType state, + PidginConversation *gtkconv = data; - PidginConversation *gtkconv = data;
+ GdkEvent *event = NULL; /* If we have a valid key for the conversation display, then exit */
- if ((event->state & GDK_CONTROL_MASK) ||
- (event->keyval == GDK_KEY_F6) ||
- (event->keyval == GDK_KEY_F10) ||
- (event->keyval == GDK_KEY_Menu) ||
- (event->keyval == GDK_KEY_Shift_L) ||
- (event->keyval == GDK_KEY_Shift_R) ||
- (event->keyval == GDK_KEY_Control_L) ||
- (event->keyval == GDK_KEY_Control_R) ||
- (event->keyval == GDK_KEY_Escape) ||
- (event->keyval == GDK_KEY_Up) ||
- (event->keyval == GDK_KEY_Down) ||
- (event->keyval == GDK_KEY_Left) ||
- (event->keyval == GDK_KEY_Right) ||
- (event->keyval == GDK_KEY_Page_Up) ||
- (event->keyval == GDK_KEY_KP_Page_Up) ||
- (event->keyval == GDK_KEY_Page_Down) ||
- (event->keyval == GDK_KEY_KP_Page_Down) ||
- (event->keyval == GDK_KEY_Home) ||
- (event->keyval == GDK_KEY_End) ||
- (event->keyval == GDK_KEY_Tab) ||
- (event->keyval == GDK_KEY_KP_Tab) ||
- (event->keyval == GDK_KEY_ISO_Left_Tab))
- if (event->type == GDK_KEY_PRESS)
- return conv_keypress_common(gtkconv, event);
+ event = gtk_event_controller_get_current_event(GTK_EVENT_CONTROLLER(controller)); + if (is_valid_conversation_key(keyval, state)) { + if (gdk_event_get_event_type(event) == GDK_KEY_PRESS) { + return conv_keypress_common(gtkconv, keyval, state); input = talkatu_editor_get_input(TALKATU_EDITOR(gtkconv->editor));
gtk_widget_grab_focus(input);
- gtk_widget_event(input, (GdkEvent *)event);
+ gtk_event_controller_key_forward(controller, input); @@ -1100,7 +1090,7 @@
gtkconv = PIDGIN_CONVERSATION(conv);
- new_topic = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtkconv->topic_text)));
+ new_topic = g_strdup(gtk_editable_get_text(GTK_EDITABLE(gtkconv->topic_text))); current_topic = purple_chat_conversation_get_topic(PURPLE_CHAT_CONVERSATION(conv));
if(current_topic && !g_utf8_collate(new_topic, current_topic)){
@@ -1108,10 +1098,11 @@
- gtk_entry_set_text(GTK_ENTRY(gtkconv->topic_text), current_topic);
- gtk_entry_set_text(GTK_ENTRY(gtkconv->topic_text), "");
+ gtk_editable_set_text(GTK_EDITABLE(gtkconv->topic_text), current_topic); + gtk_editable_set_text(GTK_EDITABLE(gtkconv->topic_text), ""); purple_protocol_chat_set_topic(PURPLE_PROTOCOL_CHAT(protocol), gc, purple_chat_conversation_get_id(PURPLE_CHAT_CONVERSATION(conv)),
@@ -1340,12 +1331,13 @@
if (purple_protocol_get_options(protocol) & OPT_PROTO_CHAT_TOPIC)
+ GtkEventController *key = NULL; hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(vbox), hbox); label = gtk_label_new(_("Topic:"));
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(hbox), label); gtkconv->topic_text = gtk_entry_new();
gtk_widget_set_size_request(gtkconv->topic_text, -1, BUDDYICON_SIZE_MIN);
@@ -1357,9 +1349,14 @@
G_CALLBACK(topic_callback), gtkconv);
- gtk_box_pack_start(GTK_BOX(hbox), gtkconv->topic_text, TRUE, TRUE, 0);
- g_signal_connect(G_OBJECT(gtkconv->topic_text), "key_press_event",
- G_CALLBACK(entry_key_press_cb), gtkconv);
+ gtk_widget_set_hexpand(gtkconv->topic_text, TRUE); + gtk_widget_set_halign(gtkconv->topic_text, GTK_ALIGN_FILL); + gtk_box_append(GTK_BOX(hbox), gtkconv->topic_text); + key = gtk_event_controller_key_new(); + g_signal_connect(key, "key-pressed", G_CALLBACK(entry_key_press_cb), + gtk_widget_add_controller(gtkconv->topic_text, key); @@ -1432,7 +1429,8 @@
setup_chat_userlist(PidginConversation *gtkconv, GtkWidget *hpaned)
- GtkWidget *lbox, *list;
+ GtkWidget *lbox, *list, *sw; + GtkGesture *click = NULL; @@ -1441,14 +1439,14 @@
/* Build the right pane. */
lbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
- gtk_paned_pack2(GTK_PANED(hpaned), lbox, FALSE, TRUE);
+ gtk_paned_set_end_child(GTK_PANED(hpaned), lbox); + gtk_paned_set_resize_end_child(GTK_PANED(hpaned), FALSE); + gtk_paned_set_shrink_end_child(GTK_PANED(hpaned), TRUE); /* Setup the label telling how many people are in the room. */
gtkconv->count = gtk_label_new(_("0 people in room"));
gtk_label_set_ellipsize(GTK_LABEL(gtkconv->count), PANGO_ELLIPSIZE_END);
- gtk_box_pack_start(GTK_BOX(lbox), gtkconv->count, FALSE, FALSE, 0);
- gtk_widget_show(gtkconv->count);
+ gtk_box_append(GTK_BOX(lbox), gtkconv->count); /* Setup the list of users. */
@@ -1469,12 +1467,13 @@
gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
gtk_tree_view_append_column(GTK_TREE_VIEW(list), col);
- g_signal_connect(G_OBJECT(list), "button_press_event",
- G_CALLBACK(right_click_chat_cb), gtkconv);
+ click = gtk_gesture_click_new(); + gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(click), 0); + g_signal_connect(click, "pressed", G_CALLBACK(right_click_chat_cb), gtkconv); + gtk_widget_add_controller(list, GTK_EVENT_CONTROLLER(click)); g_signal_connect(G_OBJECT(list), "row-activated",
G_CALLBACK(activate_list_cb), gtkconv);
- g_signal_connect(G_OBJECT(list), "popup-menu",
- G_CALLBACK(gtkconv_chat_popup_menu_cb), gtkconv);
gtk_widget_set_has_tooltip(list, TRUE);
g_signal_connect(list, "query-tooltip",
@@ -1507,69 +1506,73 @@
gtk_tree_view_append_column(GTK_TREE_VIEW(list), col);
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE);
- gtk_box_pack_start(GTK_BOX(lbox),
- pidgin_make_scrollable(list, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, GTK_SHADOW_IN, -1, -1),
+ sw = gtk_scrolled_window_new(); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), list); + gtk_widget_set_vexpand(sw, TRUE); + gtk_widget_set_valign(sw, GTK_ALIGN_FILL); + gtk_box_append(GTK_BOX(lbox), sw); setup_common_pane(PidginConversation *gtkconv)
- GtkWidget *vbox, *input, *hpaned;
+ GtkWidget *vbox, *input, *hpaned, *sw; + GtkEventController *key = NULL; PurpleConversation *conv = gtkconv->active_conv;
/* Setup the top part of the pane */
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
/* Setup the info pane */
gtkconv->infopane = pidgin_info_pane_new(conv);
- gtk_box_pack_start(GTK_BOX(vbox), gtkconv->infopane, FALSE, FALSE, 0);
- gtk_widget_show(gtkconv->infopane);
+ gtk_widget_set_vexpand(gtkconv->infopane, FALSE); + gtk_box_append(GTK_BOX(vbox), gtkconv->infopane); /* Setup the history widget */
- gtkconv->history_sw = talkatu_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_shadow_type(
- GTK_SCROLLED_WINDOW(gtkconv->history_sw),
- gtk_scrolled_window_set_policy(
- GTK_SCROLLED_WINDOW(gtkconv->history_sw),
+ sw = gtk_scrolled_window_new(); + gtkconv->vadjustment = talkatu_auto_scroller_new(); + gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(sw), + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, gtkconv->history = talkatu_history_new();
- gtk_container_add(GTK_CONTAINER(gtkconv->history_sw), gtkconv->history);
+ gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), gtkconv->history); setup_chat_topic(gtkconv, vbox);
/* Add the talkatu history */
hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0);
- gtk_widget_show(hpaned);
- gtk_paned_pack1(GTK_PANED(hpaned), gtkconv->history_sw, TRUE, TRUE);
+ gtk_widget_set_vexpand(hpaned, TRUE); + gtk_widget_set_valign(hpaned, GTK_ALIGN_FILL); + gtk_box_append(GTK_BOX(vbox), hpaned); + gtk_paned_set_start_child(GTK_PANED(hpaned), sw); + gtk_paned_set_resize_start_child(GTK_PANED(hpaned), TRUE); + gtk_paned_set_shrink_start_child(GTK_PANED(hpaned), TRUE); /* Now add the userlist */
setup_chat_userlist(gtkconv, hpaned);
- gtk_widget_show_all(gtkconv->history_sw);
g_object_set_data(G_OBJECT(gtkconv->history), "gtkconv", gtkconv);
- g_signal_connect(G_OBJECT(gtkconv->history), "key_press_event",
- G_CALLBACK(refocus_entry_cb), gtkconv);
- g_signal_connect(G_OBJECT(gtkconv->history), "key_release_event",
- G_CALLBACK(refocus_entry_cb), gtkconv);
+ key = gtk_event_controller_key_new(); + g_signal_connect(key, "key-pressed", G_CALLBACK(refocus_entry_cb), + g_signal_connect(key, "key-released", G_CALLBACK(refocus_entry_cb), + gtk_widget_add_controller(gtkconv->history, key); /* Setup the entry widget and all signals */
gtkconv->editor = talkatu_editor_new();
talkatu_editor_set_buffer(TALKATU_EDITOR(gtkconv->editor), talkatu_html_buffer_new());
- gtk_box_pack_start(GTK_BOX(vbox), gtkconv->editor, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(vbox), gtkconv->editor); input = talkatu_editor_get_input(TALKATU_EDITOR(gtkconv->editor));
gtk_widget_set_name(input, "pidgin_conv_entry");
@@ -1617,14 +1620,17 @@
-ignore_middle_click(GtkWidget *widget, GdkEventButton *e, gpointer null)
+ignore_middle_click(G_GNUC_UNUSED GtkGestureClick *click, + gint n_press, G_GNUC_UNUSED gdouble x, + G_GNUC_UNUSED gdouble y, G_GNUC_UNUSED gpointer data) /* A click on the pane is propagated to the notebook containing the pane.
* So if Stu accidentally aims high and middle clicks on the pane-handle,
* it causes a conversation tab to close. Let's stop that from happening.
- if (e->button == GDK_BUTTON_MIDDLE && e->type == GDK_BUTTON_PRESS)
@@ -1636,6 +1642,7 @@
PidginConversation *gtkconv;
GtkWidget *tab_cont, *pane;
+ GtkGesture *click = NULL; if (PURPLE_IS_IM_CONVERSATION(conv) && (gtkconv = pidgin_conv_find_gtkconv(conv))) {
purple_debug_misc("gtkconv", "found existing gtkconv %p", gtkconv);
@@ -1661,25 +1668,23 @@
- g_signal_connect(G_OBJECT(pane), "button_press_event",
- G_CALLBACK(ignore_middle_click), NULL);
+ click = gtk_gesture_click_new(); + gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(click), GDK_BUTTON_MIDDLE); + g_signal_connect(click, "pressed", G_CALLBACK(ignore_middle_click), NULL); + gtk_widget_add_controller(pane, GTK_EVENT_CONTROLLER(click)); /* Setup the container for the tab. */
gtkconv->tab_cont = tab_cont = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
g_object_set_data(G_OBJECT(tab_cont), "PidginConversation", gtkconv);
- gtk_container_set_border_width(GTK_CONTAINER(tab_cont), 6);
- gtk_box_pack_start(GTK_BOX(tab_cont), pane, TRUE, TRUE, 0);
+ gtk_widget_set_vexpand(pane, TRUE); + gtk_widget_set_valign(pane, GTK_ALIGN_FILL); + gtk_box_append(GTK_BOX(tab_cont), pane); talkatu_editor_set_toolbar_visible(
TALKATU_EDITOR(gtkconv->editor),
purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/show_formatting_toolbar")
- g_signal_connect_swapped(G_OBJECT(pane), "focus",
- G_CALLBACK(gtk_widget_grab_focus),
pidgin_conv_placement_place(gtkconv);
@@ -1730,7 +1735,7 @@
pidgin_conv_destroy(PurpleConversation *conv)
PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv);
gtkconv->convs = g_list_remove(gtkconv->convs, conv);
/* Don't destroy ourselves until all our convos are gone */
@@ -1743,14 +1748,14 @@
- win = gtk_widget_get_toplevel(gtkconv->tab_cont);
+ win = gtk_widget_get_root(gtkconv->tab_cont); pidgin_conversation_window_remove(PIDGIN_CONVERSATION_WINDOW(win), conv);
/* If the "Save Conversation" or "Save Icon" dialogs are open then close them */
purple_request_close_with_handle(gtkconv);
purple_notify_close_with_handle(gtkconv);
- gtk_widget_destroy(gtkconv->tab_cont);
+ gtk_widget_unparent(gtkconv->tab_cont); if (PURPLE_IS_IM_CONVERSATION(conv)) {
if (gtkconv->typing_timer != 0)
@@ -1759,6 +1764,8 @@
purple_signals_disconnect_by_handle(gtkconv);
+ g_clear_object(>kconv->vadjustment); gtkconv->send_history = g_list_first(gtkconv->send_history);
g_list_free_full(gtkconv->send_history, g_free);
@@ -2005,10 +2012,10 @@
pidgin_conv_has_focus(PurpleConversation *conv)
PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv);
- win = gtk_widget_get_toplevel(gtkconv->tab_cont);
- if(gtk_window_has_toplevel_focus(GTK_WINDOW(win))) {
+ win = gtk_widget_get_root(gtkconv->tab_cont); + if(gtk_window_is_active(GTK_WINDOW(win))) { PidginConversationWindow *convwin = PIDGIN_CONVERSATION_WINDOW(win);
if(pidgin_conversation_window_conversation_is_selected(convwin, conv)) {
@@ -2024,13 +2031,13 @@
PidginConversation *gtkconv;
PidginConversationWindow *convwin;
gtkconv = PIDGIN_CONVERSATION(conv);
- win = gtk_widget_get_toplevel(gtkconv->tab_cont);
+ win = gtk_widget_get_root(gtkconv->tab_cont); convwin = PIDGIN_CONVERSATION_WINDOW(win);
if (fields & PIDGIN_CONV_SET_TITLE)
@@ -2047,7 +2054,7 @@
topic = purple_chat_conversation_get_topic(PURPLE_CHAT_CONVERSATION(conv));
- gtk_entry_set_text(GTK_ENTRY(gtkconv->topic_text), topic ? topic : "");
+ gtk_editable_set_text(GTK_EDITABLE(gtkconv->topic_text), topic ? topic : ""); gtk_widget_set_tooltip_text(gtkconv->topic_text,
@@ -2079,7 +2086,7 @@
} else if (PURPLE_IS_CHAT_CONVERSATION(conv)) {
const char *topic = gtkconv->topic_text
- ? gtk_entry_get_text(GTK_ENTRY(gtkconv->topic_text))
+ ? gtk_editable_get_text(GTK_EDITABLE(gtkconv->topic_text)) const char *title = purple_conversation_get_title(conv);
const char *name = purple_conversation_get_name(conv);
--- a/pidgin/gtkmedia.c Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/gtkmedia.c Sun Aug 28 22:18:46 2022 -0500
@@ -116,12 +116,14 @@
-pidgin_media_delete_event_cb(GtkWidget *widget,
- GdkEvent *event, PidginMedia *media)
- if (media->priv->media)
+pidgin_media_close_request_cb(GtkWindow *window, gpointer data) { + PidginMedia *media = data; + if(media->priv->media) { g_action_group_activate_action(G_ACTION_GROUP(media),
@@ -160,7 +162,7 @@
gtk_widget_class_bind_template_callback(widget_class,
- pidgin_media_delete_event_cb);
+ pidgin_media_close_request_cb); @@ -291,7 +293,6 @@
PurpleMediaSessionType type =
purple_media_get_session_type(gtkmedia->priv->media, session_id);
gchar *key = create_key(session_id, participant);
if (type & PURPLE_MEDIA_AUDIO) {
g_hash_table_remove(gtkmedia->priv->recv_progressbars, key);
@@ -299,10 +300,10 @@
if (g_hash_table_size(gtkmedia->priv->recv_progressbars) == 0 &&
gtkmedia->priv->send_progress) {
- gtk_widget_destroy(gtkmedia->priv->send_progress);
+ gtk_widget_unparent(gtkmedia->priv->send_progress); gtkmedia->priv->send_progress = NULL;
- gtk_widget_destroy(gtkmedia->priv->mute);
+ gtk_widget_unparent(gtkmedia->priv->mute); gtkmedia->priv->mute = NULL;
} else if (type & PURPLE_MEDIA_VIDEO) {
@@ -311,20 +312,17 @@
if (g_hash_table_size(gtkmedia->priv->remote_videos) == 0 &&
gtkmedia->priv->local_video) {
- gtk_widget_destroy(gtkmedia->priv->local_video);
+ gtk_widget_unparent(gtkmedia->priv->local_video); gtkmedia->priv->local_video = NULL;
- gtk_widget_destroy(gtkmedia->priv->pause);
+ gtk_widget_unparent(gtkmedia->priv->pause); gtkmedia->priv->pause = NULL;
- gtk_widget_destroy(widget);
- gtk_widget_get_preferred_size(GTK_WIDGET(gtkmedia), NULL, &req);
- gtk_window_resize(GTK_WINDOW(gtkmedia), req.width, req.height);
+ gtk_widget_unparent(widget); @@ -529,7 +527,7 @@
g_return_if_fail(GTK_IS_WIDGET(parent));
- gtk_widget_destroy(parent);
+ gtk_widget_unparent(parent); @@ -559,19 +557,20 @@
/* Setup widget structure */
volume_widget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
progress_parent = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
- gtk_box_pack_start(GTK_BOX(volume_widget),
- progress_parent, TRUE, TRUE, 0);
+ gtk_widget_set_hexpand(progress_parent, TRUE); + gtk_widget_set_halign(progress_parent, GTK_ALIGN_FILL); + gtk_box_append(GTK_BOX(volume_widget), progress_parent); volume = gtk_volume_button_new();
gtk_scale_button_set_value(GTK_SCALE_BUTTON(volume), value/100.0);
- gtk_box_pack_end(GTK_BOX(volume_widget),
- volume, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(volume_widget), volume); /* Volume level indicator */
progress = gtk_progress_bar_new();
gtk_widget_set_size_request(progress, 250, 10);
- gtk_box_pack_end(GTK_BOX(progress_parent), progress, TRUE, FALSE, 0);
+ gtk_widget_set_vexpand(progress, TRUE); + gtk_box_append(GTK_BOX(progress_parent), progress); if (type & PURPLE_MEDIA_SEND_AUDIO) {
g_signal_connect (G_OBJECT(volume), "value-changed",
@@ -593,8 +592,6 @@
G_CALLBACK(destroy_parent_widget_cb),
- gtk_widget_show_all(volume_widget);
@@ -625,8 +622,6 @@
g_object_set_data_full(G_OBJECT(win), "session-id",
- gtk_widget_show_all(keypad);
@@ -641,9 +636,11 @@
&& type & (PURPLE_MEDIA_RECV_VIDEO |
PURPLE_MEDIA_RECV_AUDIO)) {
recv_widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
- gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display),
- recv_widget, TRUE, TRUE, 0);
- gtk_widget_show(recv_widget);
+ gtk_widget_set_hexpand(recv_widget, TRUE); + gtk_widget_set_halign(recv_widget, GTK_ALIGN_FILL); + gtk_widget_set_vexpand(recv_widget, TRUE); + gtk_widget_set_valign(recv_widget, GTK_ALIGN_FILL); + gtk_box_append(GTK_BOX(gtkmedia->priv->display), recv_widget); recv_widget = gtkmedia->priv->recv_widget;
@@ -651,19 +648,18 @@
&& type & (PURPLE_MEDIA_SEND_VIDEO |
PURPLE_MEDIA_SEND_AUDIO)) {
send_widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
- gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display),
- send_widget, FALSE, TRUE, 0);
+ gtk_widget_set_halign(send_widget, GTK_ALIGN_FILL); + gtk_widget_set_valign(send_widget, GTK_ALIGN_FILL); + gtk_box_prepend(GTK_BOX(gtkmedia->priv->display), send_widget); button_widget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
- gtk_box_pack_end(GTK_BOX(recv_widget), button_widget,
- gtk_widget_show(send_widget);
+ gtk_widget_set_valign(button_widget, GTK_ALIGN_FILL); + gtk_box_append(GTK_BOX(send_widget), button_widget); gtk_toggle_button_new_with_mnemonic(_("_Hold"));
- gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->hold,
- gtk_widget_show(gtkmedia->priv->hold);
+ gtk_box_prepend(GTK_BOX(button_widget), gtkmedia->priv->hold); gtk_actionable_set_action_name(
GTK_ACTIONABLE(gtkmedia->priv->hold),
@@ -688,7 +684,9 @@
g_object_get(G_OBJECT(sink), "widget", &remote_video, NULL);
gtk_widget_show(remote_video);
- gtk_box_pack_start(GTK_BOX(recv_widget), remote_video, TRUE, TRUE, 0);
+ gtk_widget_set_valign(remote_video, GTK_ALIGN_FILL); + gtk_widget_set_vexpand(remote_video, TRUE); + gtk_box_append(GTK_BOX(recv_widget), remote_video); pidgin_media_insert_widget(gtkmedia, remote_video, sid, priv->screenname);
@@ -709,13 +707,13 @@
g_object_get(G_OBJECT(sink), "widget", &local_video, NULL);
gtk_widget_show(local_video);
- gtk_box_pack_start(GTK_BOX(send_widget), local_video, TRUE, TRUE, 0);
+ gtk_widget_set_valign(local_video, GTK_ALIGN_FILL); + gtk_widget_set_vexpand(local_video, TRUE); + gtk_box_append(GTK_BOX(send_widget), local_video); gtk_toggle_button_new_with_mnemonic(_("_Pause"));
- gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->pause,
- gtk_widget_show(gtkmedia->priv->pause);
+ gtk_box_prepend(GTK_BOX(button_widget), gtkmedia->priv->pause); gtk_actionable_set_action_name(
GTK_ACTIONABLE(gtkmedia->priv->pause),
@@ -723,28 +721,28 @@
gtkmedia->priv->local_video = local_video;
if (type & PURPLE_MEDIA_RECV_AUDIO) {
- gtk_box_pack_end(GTK_BOX(recv_widget),
- pidgin_media_add_audio_widget(gtkmedia,
- PURPLE_MEDIA_RECV_AUDIO, sid), FALSE, FALSE, 0);
+ GtkWidget *audio = NULL; + audio = pidgin_media_add_audio_widget(gtkmedia, PURPLE_MEDIA_RECV_AUDIO, + gtk_box_prepend(GTK_BOX(recv_widget), audio); if (type & PURPLE_MEDIA_SEND_AUDIO) {
gtk_toggle_button_new_with_mnemonic(_("_Mute"));
- gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->mute,
- gtk_widget_show(gtkmedia->priv->mute);
+ gtk_box_prepend(GTK_BOX(button_widget), gtkmedia->priv->mute); gtk_actionable_set_action_name(
GTK_ACTIONABLE(gtkmedia->priv->mute),
- gtk_box_pack_end(GTK_BOX(recv_widget),
+ gtk_box_prepend(GTK_BOX(recv_widget), pidgin_media_add_audio_widget(gtkmedia,
- PURPLE_MEDIA_SEND_AUDIO, sid), FALSE, FALSE, 0);
+ PURPLE_MEDIA_SEND_AUDIO, sid)); - gtk_box_pack_end(GTK_BOX(recv_widget),
+ gtk_box_prepend(GTK_BOX(recv_widget), pidgin_media_add_dtmf_widget(gtkmedia,
- PURPLE_MEDIA_SEND_AUDIO, sid), FALSE, FALSE, 0);
+ PURPLE_MEDIA_SEND_AUDIO, sid)); if (type & PURPLE_MEDIA_AUDIO &&
@@ -754,13 +752,14 @@
- if (send_widget != NULL)
+ if (send_widget != NULL) { gtkmedia->priv->send_widget = send_widget;
- if (recv_widget != NULL)
+ if (recv_widget != NULL) { gtkmedia->priv->recv_widget = recv_widget;
if (button_widget != NULL) {
gtkmedia->priv->button_widget = button_widget;
- gtk_widget_show(GTK_WIDGET(button_widget));
if (purple_media_is_initiator(media, sid, NULL) == FALSE) {
@@ -778,8 +777,6 @@
} else if (type & PURPLE_MEDIA_AUDIO) {
gtk_window_set_icon_name(GTK_WINDOW(gtkmedia), "audio-call");
- gtk_widget_show(gtkmedia->priv->display);
@@ -794,7 +791,7 @@
} else if (sid == NULL && name == NULL) {
pidgin_media_emit_message(gtkmedia,
_("The call has been terminated."));
- gtk_widget_destroy(GTK_WIDGET(gtkmedia));
+ gtk_window_destroy(GTK_WINDOW(gtkmedia)); } else if (state == PURPLE_MEDIA_STATE_NEW &&
sid != NULL && name != NULL) {
@@ -910,8 +907,8 @@
purple_buddy_get_contact_alias(buddy) : screenname;
gtk_window_set_title(GTK_WINDOW(gtkmedia), alias);
- if (purple_media_is_initiator(media, NULL, NULL) == TRUE)
- gtk_widget_show(GTK_WIDGET(gtkmedia));
+ gtk_widget_set_visible(GTK_WIDGET(gtkmedia), + purple_media_is_initiator(media, NULL, NULL)); --- a/pidgin/gtknotify.c Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/gtknotify.c Sun Aug 28 22:18:46 2022 -0500
@@ -111,15 +111,17 @@
pidgin_widget_decorate_account(GtkWidget *cont, PurpleAccount *account)
+ PurpleProtocol *protocol = NULL;
+ const gchar *icon_name = NULL; - pixbuf = pidgin_create_protocol_icon(account, PIDGIN_PROTOCOL_ICON_SMALL);
- image = gtk_image_new_from_pixbuf(pixbuf);
- g_object_unref(G_OBJECT(pixbuf));
+ protocol = purple_account_get_protocol(account); + icon_name = purple_protocol_get_icon_name(protocol); + image = gtk_image_new_from_icon_name(icon_name); gtk_widget_set_tooltip_text(image,
purple_account_get_username(account));
@@ -127,9 +129,9 @@
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_widget_set_hexpand(image, TRUE); + gtk_box_append(GTK_BOX(cont), image); - gtk_widget_show(image);
@@ -166,8 +168,8 @@
- img = gtk_image_new_from_icon_name(icon_name,
+ img = gtk_image_new_from_icon_name(icon_name); + gtk_image_set_pixel_size(GTK_IMAGE(img), 48); gtk_widget_set_halign(img, GTK_ALIGN_START);
gtk_widget_set_valign(img, GTK_ALIGN_START);
@@ -176,27 +178,20 @@
GTK_RESPONSE_CLOSE, NULL);
- gtk_window_set_role(GTK_WINDOW(dialog), "notify_dialog");
g_signal_connect(G_OBJECT(dialog), "response",
G_CALLBACK(message_response_cb), dialog);
- gtk_container_set_border_width(GTK_CONTAINER(dialog), 12);
gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
- gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
- gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
+ gtk_box_append(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
- gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
- pidgin_widget_decorate_account(hbox,
- purple_request_cpar_get_account(cpar));
+ gtk_box_append(GTK_BOX(hbox), img); primary_esc = g_markup_escape_text(primary, -1);
secondary_esc = (secondary != NULL) ? g_markup_escape_text(secondary, -1) : NULL;
@@ -210,26 +205,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_selectable(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(hbox), label, FALSE, FALSE, 0);
+ gtk_box_append(GTK_BOX(hbox), label); + pidgin_widget_decorate_account(hbox, + purple_request_cpar_get_account(cpar)); g_object_set_data(G_OBJECT(dialog), "pidgin-parent-from",
purple_request_cpar_get_parent_from(cpar));
pidgin_auto_parent_window(dialog);
- gtk_widget_show_all(dialog);
+ gtk_widget_show(dialog); -formatted_input_cb(GtkWidget *win, GdkEventKey *event, gpointer data)
+formatted_input_cb(GtkWidget *win, guint keyval, G_GNUC_UNUSED guint keycode, + G_GNUC_UNUSED GdkModifierType state, gpointer data) - if (event->keyval == GDK_KEY_Escape)
+ if (keyval == GDK_KEY_Escape) { purple_notify_close(PURPLE_NOTIFY_FORMATTED, win);
@@ -246,6 +244,7 @@
+ GtkEventController *event = NULL; @@ -276,32 +275,34 @@
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_selectable(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); - sw = gtk_scrolled_window_new(NULL, NULL);
- gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
+ sw = gtk_scrolled_window_new(); + gtk_box_append(GTK_BOX(vbox), sw); + gtk_widget_set_valign(sw, GTK_ALIGN_FILL); + gtk_widget_set_vexpand(sw, TRUE); buffer = talkatu_html_buffer_new();
view = talkatu_view_new_with_buffer(buffer);
- gtk_container_add(GTK_CONTAINER(sw), view);
+ gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), view); gtk_widget_set_name(view, "pidgin_notify_view");
gtk_widget_set_size_request(view, 300, 250);
- gtk_widget_show_all(sw);
/* Add the Close button. */
button = gtk_dialog_add_button(GTK_DIALOG(window), _("Close"), GTK_RESPONSE_CLOSE);
gtk_widget_grab_focus(button);
g_signal_connect_swapped(G_OBJECT(button), "clicked",
- G_CALLBACK(formatted_close_cb), window);
- g_signal_connect(G_OBJECT(window), "key_press_event",
- G_CALLBACK(formatted_input_cb), NULL);
+ G_CALLBACK(formatted_close_cb), window); + event = gtk_event_controller_key_new(); + gtk_widget_add_controller(window, event); + g_signal_connect(G_OBJECT(event), "key-pressed", + G_CALLBACK(formatted_input_cb), NULL); /* Make sure URLs are clickable */
linked_text = purple_markup_linkify(text);
@@ -323,20 +324,22 @@
PidginNotifySearchResultsData *data = data_;
+ PurpleProtocol *protocol = NULL; GtkListStore *model = data->model;
+ const gchar *icon_name = NULL; gtk_list_store_clear(data->model);
- pixbuf = pidgin_create_protocol_icon(purple_connection_get_account(gc), PIDGIN_PROTOCOL_ICON_SMALL);
+ protocol = purple_account_get_protocol(purple_connection_get_account(gc)); + icon_name = purple_protocol_get_icon_name(protocol); for (row = results->rows; row != NULL; row = row->next) {
gtk_list_store_append(model, &iter);
- gtk_list_store_set(model, &iter, 0, pixbuf, -1);
+ gtk_list_store_set(model, &iter, 0, icon_name, -1); for (column = row->data; column != NULL; column = column->next) {
@@ -349,9 +352,6 @@
- g_object_unref(pixbuf);
@@ -371,6 +371,7 @@
PidginNotifySearchResultsData *data;
@@ -386,7 +387,6 @@
window = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(window), title ? title :_("Search Results"));
- gtk_container_set_border_width(GTK_CONTAINER(window), 12);
gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
g_signal_connect_swapped(G_OBJECT(window), "delete_event",
@@ -407,11 +407,10 @@
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); /* +1 is for the automagically created Status column. */
@@ -435,14 +434,17 @@
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
- gtk_box_pack_start(GTK_BOX(vbox),
- pidgin_make_scrollable(treeview, GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, -1),
- gtk_widget_show(treeview);
+ sw = gtk_scrolled_window_new(); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), treeview); + gtk_widget_set_valign(sw, GTK_ALIGN_FILL); + gtk_widget_set_vexpand(sw, TRUE); + gtk_box_append(GTK_BOX(vbox), sw); renderer = gtk_cell_renderer_pixbuf_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview),
- -1, "", renderer, "pixbuf", 0, NULL);
+ -1, "", renderer, "icon-name", 0, NULL); for (columniter = results->columns; columniter != NULL; columniter = columniter->next) {
@@ -591,22 +593,22 @@
pidgin_close_notify(PurpleNotifyType type, void *ui_handle)
- if (type == PURPLE_NOTIFY_SEARCHRESULTS)
+ if (type == PURPLE_NOTIFY_SEARCHRESULTS) { PidginNotifySearchResultsData *data = (PidginNotifySearchResultsData *)ui_handle;
- gtk_widget_destroy(data->window);
+ gtk_window_destroy(GTK_WINDOW(data->window)); purple_notify_searchresults_free(data->results);
+ } else if (ui_handle != NULL) { + gtk_window_destroy(GTK_WINDOW(ui_handle)); - else if (ui_handle != NULL)
- gtk_widget_destroy(GTK_WIDGET(ui_handle));
pidgin_notify_uri(const char *uri) {
- gtk_show_uri_on_window(NULL, uri, GDK_CURRENT_TIME, NULL);
+ gtk_show_uri(NULL, uri, GDK_CURRENT_TIME); --- a/pidgin/gtkrequest.c Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/gtkrequest.c Sun Aug 28 22:18:46 2022 -0500
@@ -89,29 +89,26 @@
pidgin_widget_decorate_account(GtkWidget *cont, PurpleAccount *account)
+ PurpleProtocol *protocol = NULL;
+ const gchar *icon_name = NULL; if(!PURPLE_IS_ACCOUNT(account)) {
- pixbuf = pidgin_create_protocol_icon(account, PIDGIN_PROTOCOL_ICON_SMALL);
- if(!GDK_IS_PIXBUF(pixbuf)) {
- image = gtk_image_new_from_pixbuf(pixbuf);
- g_object_unref(G_OBJECT(pixbuf));
+ protocol = purple_account_get_protocol(account); + icon_name = purple_protocol_get_icon_name(protocol); + image = gtk_image_new_from_icon_name(icon_name); gtk_widget_set_tooltip_text(image, purple_account_get_username(account));
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);
@@ -151,7 +148,7 @@
- value = gtk_entry_get_text(GTK_ENTRY(data->u.input.entry));
+ value = gtk_editable_get_text(GTK_EDITABLE(data->u.input.entry)); if (id >= 0 && (gsize)id < data->cb_count && data->cbs[id] != NULL)
@@ -181,6 +178,8 @@
choice_response_cb(GtkDialog *dialog, gint id, 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));
@@ -188,19 +187,21 @@
if (id >= 0 && (gsize)id < data->cb_count && data->cbs[id] != NULL)
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group->data))) {
+ 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"));
purple_request_close(PURPLE_REQUEST_INPUT, data);
-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)); if (purple_request_field_string_is_multiline(field))
@@ -216,7 +217,7 @@
value = gtk_text_buffer_get_text(buffer, &start_iter, &end_iter, FALSE);
- value = gtk_entry_get_text(GTK_ENTRY(entry));
+ value = gtk_editable_get_text(GTK_EDITABLE(entry)); purple_request_field_string_set_value(field,
(*value == '\0' ? NULL : value));
@@ -225,10 +226,10 @@
-field_bool_cb(GtkToggleButton *button, PurpleRequestField *field)
+field_bool_cb(GtkCheckButton *button, PurpleRequestField *field) purple_request_field_bool_set_value(field,
- gtk_toggle_button_get_active(button));
+ gtk_check_button_get_active(button)); @@ -244,14 +245,17 @@
-field_choice_option_cb(GtkRadioButton *button, PurpleRequestField *field)
+field_choice_option_cb(GtkCheckButton *button, PurpleRequestField *field) +#warning please rewrite me gpointer *values = g_object_get_data(G_OBJECT(g_object_get_data(
G_OBJECT(button), "box")), "values");
- if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
+ if (!gtk_check_button_get_active(GTK_CHECK_BUTTON(button))) { active = (g_slist_length(gtk_radio_button_get_group(button)) -
g_slist_index(gtk_radio_button_get_group(button), button)) - 1;
@@ -260,6 +264,7 @@
g_return_if_fail(active >= 0);
purple_request_field_choice_set_value(field, values[active]);
@@ -314,8 +319,7 @@
-destroy_multifield_cb(GtkWidget *dialog, GdkEvent *event,
- PidginRequestData *data)
+destroy_multifield_cb(GtkWidget *self, PidginRequestData *data) multifield_cancel_cb(NULL, data);
@@ -432,13 +436,14 @@
- img = gtk_image_new_from_icon_name(icon_name, GTK_ICON_SIZE_DIALOG);
- if (img || icon_type == PURPLE_REQUEST_ICON_REQUEST)
- return gtk_image_new_from_icon_name("dialog-question",
+ 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); @@ -489,6 +494,7 @@
char *primary_esc, *secondary_esc;
@@ -514,9 +520,17 @@
G_CALLBACK(input_response_cb), data);
- gtk_container_set_border_width(GTK_CONTAINER(dialog), 6);
- gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
+ 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); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
gtk_dialog_set_default_response(GTK_DIALOG(dialog), 0);
@@ -525,21 +539,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))),
+ gtk_box_append(GTK_BOX(content), hbox); 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);
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 +571,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)); @@ -568,8 +582,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 +589,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();
@@ -598,24 +611,26 @@
data->u.input.entry = input;
- 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);
+ GtkWidget *entry = NULL; + entry = gtk_password_entry_new(); + g_object_set(entry, "activates-default", TRUE, + "show-peek-icon", TRUE, NULL); + entry = gtk_entry_new(); + gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE); + gtk_box_append(GTK_BOX(vbox), entry); if(default_value != NULL) {
- gtk_entry_set_text(GTK_ENTRY(entry), default_value);
- gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
+ gtk_editable_set_text(GTK_EDITABLE(entry), default_value); 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 +653,8 @@
- GtkWidget *radio = NULL;
+ GtkWidget *first_radio = NULL; char *primary_esc, *secondary_esc;
@@ -668,23 +684,28 @@
G_CALLBACK(choice_response_cb), data);
- gtk_container_set_border_width(GTK_CONTAINER(dialog), 6);
- gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
+ 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))),
+ 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))),
+ gtk_box_append(GTK_BOX(content), hbox); 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 +713,7 @@
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); primary_esc = pidgin_request_escape(cpar, primary);
@@ -708,30 +729,44 @@
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); 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) { + 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_check_button_set_active(GTK_CHECK_BUTTON(radio), TRUE); - g_object_set_data(G_OBJECT(dialog), "radio", radio);
+ g_object_set_data(G_OBJECT(dialog), "radio", first_radio); pidgin_auto_parent_window(dialog);
- gtk_widget_show_all(dialog);
+ gtk_widget_show(dialog); @@ -748,6 +783,7 @@
char *primary_esc, *secondary_esc;
@@ -792,26 +828,31 @@
G_CALLBACK(action_response_cb), data);
- gtk_container_set_border_width(GTK_CONTAINER(dialog), 6);
- gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
+ 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))),
+ 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))),
+ 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); 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 +873,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); - 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);
+ 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);
pidgin_auto_parent_window(dialog);
- gtk_widget_show_all(dialog);
+ gtk_widget_show(dialog); @@ -879,7 +918,7 @@
+ GtkWidget *dialog, *content; GtkWidget *hbox, *vbox, *img, *label, *button;
gchar *primary_esc, *secondary_esc, *label_text;
@@ -901,32 +940,36 @@
gtk_window_set_title(GTK_WINDOW(dialog), _("Please wait"));
- 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); 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);
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 +990,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); @@ -961,20 +1006,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),
+ 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);
pidgin_auto_parent_window(dialog);
- gtk_widget_show_all(dialog);
+ gtk_widget_show(dialog); @@ -1018,7 +1056,7 @@
- text = gtk_entry_get_text(GTK_ENTRY(entry));
+ text = gtk_editable_get_text(GTK_EDITABLE(entry)); purple_request_field_string_set_value(field, (*text == '\0') ? NULL : text);
@@ -1059,7 +1097,7 @@
- gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
+ g_object_set(entry, "activates-default", TRUE, NULL); g_signal_connect(G_OBJECT(entry), "changed",
G_CALLBACK(req_entry_field_changed_cb), field);
@@ -1113,6 +1151,7 @@
if (purple_request_field_string_is_multiline(field))
+ GtkEventController *controller; textview = gtk_text_view_new();
gtk_text_view_set_editable(GTK_TEXT_VIEW(textview),
@@ -1120,8 +1159,6 @@
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview),
- gtk_widget_show(textview);
@@ -1135,7 +1172,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))
@@ -1145,27 +1184,37 @@
G_CALLBACK(req_entry_field_changed_cb), field);
- widget = pidgin_make_scrollable(textview, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -1, 75);
+ widget = gtk_scrolled_window_new(); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), + GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); + gtk_widget_set_size_request(widget, -1, 75); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(widget), textview); - widget = gtk_entry_new();
+ GtkEventController *controller = NULL; + if (purple_request_field_string_is_masked(field)) { + widget = gtk_password_entry_new(); + gtk_password_entry_set_show_peek_icon(GTK_PASSWORD_ENTRY(widget), + widget = gtk_entry_new(); setup_entry_field(widget, field);
- gtk_entry_set_text(GTK_ENTRY(widget), value);
+ gtk_editable_set_text(GTK_EDITABLE(widget), value); gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
- if (purple_request_field_string_is_masked(field))
- gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
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);
@@ -1206,7 +1255,7 @@
gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
+ gtk_check_button_set_active(GTK_CHECK_BUTTON(widget), purple_request_field_bool_get_default_value(field));
g_signal_connect(G_OBJECT(widget), "toggled",
@@ -1219,7 +1268,7 @@
create_choice_field(PurpleRequestField *field,
- PurpleRequestCommonParameters *cpar)
+ PurpleRequestCommonParameters *cpar) GList *elements = purple_request_field_choice_get_elements(field);
@@ -1260,11 +1309,15 @@
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);
@@ -1275,21 +1328,31 @@
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) { + 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);
+ gtk_check_button_set_active(GTK_CHECK_BUTTON(radio), TRUE); 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);
@@ -1302,6 +1365,8 @@
g_object_set_data_full(G_OBJECT(widget), "values", values, g_free);
@@ -1366,7 +1431,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);
@@ -1395,6 +1459,7 @@
create_list_field(PurpleRequestField *field)
GtkCellRenderer *renderer;
@@ -1481,16 +1546,18 @@
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, GTK_SHADOW_IN, -1, -1);
+ sw = gtk_scrolled_window_new(); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), treeview); _pidgin_datasheet_stock_icon_get(const gchar *stock_name)
@@ -1505,46 +1572,9 @@
- domain = g_strdup(stock_name);
- id = strchr(domain, '/');
- if (purple_strequal(domain, "protocol")) {
- PurpleAccount *account;
- PurpleAccountManager *manager = NULL;
- gchar *protocol_id, *accountname;
- accountname = strchr(id, ':');
- manager = purple_account_manager_get_default();
- account = purple_account_manager_find(manager, accountname,
- image = pidgin_create_protocol_icon(account,
- PIDGIN_PROTOCOL_ICON_SMALL);
- purple_debug_error("gtkrequest", "Unknown domain: %s", domain);
- g_hash_table_insert(datasheet_stock, g_strdup(stock_name), image);
+ purple_debug_error("gtkrequest", "Unknown icon: %s", stock_name); static PurpleRequestDatasheetRecord*
@@ -1599,6 +1629,7 @@
datasheet_selection_changed(GtkWidget *sheet_widget)
g_return_if_fail(sheet_widget != NULL);
@@ -1606,6 +1637,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);
@@ -1825,18 +1857,18 @@
gtk_widget_set_size_request(GTK_WIDGET(view), 400, 250);
- scrollable = pidgin_make_scrollable(GTK_WIDGET(view),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS, GTK_SHADOW_IN, -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_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,
- 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)) {
@@ -1853,9 +1885,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),
- 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);
@@ -1882,14 +1912,13 @@
GtkSizeGroup *sg, *datasheet_buttons_sg;
PurpleRequestFieldGroup *group;
@@ -1899,8 +1928,6 @@
const gboolean compact = purple_request_cpar_is_compact(cpar);
- const gchar **tab_names;
gboolean ok_btn = (ok_text != NULL);
data = g_new0(PidginRequestData, 1);
@@ -1920,21 +1947,19 @@
data->dialog = win = pidgin_dialog_new(title, 12, "multifield", TRUE) ;
- g_signal_connect(G_OBJECT(win), "delete_event",
+ g_signal_connect(G_OBJECT(win), "close-request", 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))),
+ gtk_box_append(GTK_BOX(content), hbox); 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_box_append(GTK_BOX(hbox), img); pidgin_request_add_help(GTK_DIALOG(win), cpar);
@@ -1952,18 +1977,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);
- gtk_window_set_default(GTK_WINDOW(win), button);
+ gtk_window_set_default_widget(GTK_WINDOW(win), button); 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,
@@ -1971,8 +1994,9 @@
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); sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
datasheet_buttons_sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
@@ -1985,99 +2009,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);
- tab_names = purple_request_fields_get_tab_names(fields);
- if (tab_names == NULL) {
- pages = g_new0(GtkWidget*, 1);
- 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;
- it = purple_request_fields_get_groups(fields);
- for (; it != NULL; it = g_list_next(it)) {
- if (purple_request_field_group_get_tab(group) != i)
- total_fields += g_list_length(
- purple_request_field_group_get_fields(group));
- GtkWidget *hbox_for_spacing, *vbox_for_spacing;
- gtk_container_set_border_width(
- GTK_CONTAINER(pages[i]), 0);
- 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,
- GTK_SHADOW_NONE, -1, 200),
- gtk_widget_show(hbox_for_spacing);
- gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
- gtk_box_pack_start(GTK_BOX(hbox_for_spacing),
- vbox_for_spacing, TRUE, TRUE,
- 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]);
secondary_esc = pidgin_request_escape(cpar, secondary);
label = gtk_label_new(NULL);
gtk_label_set_markup(GTK_LABEL(label), 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);
@@ -2088,44 +2036,21 @@
- gboolean contains_resizable = FALSE, frame_fill;
+ gboolean contains_resizable = FALSE; 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);
+ if(purple_request_field_group_get_title(group) != NULL) { + frame = pidgin_make_frame(vbox, + purple_request_field_group_get_title(group)); - if (purple_request_field_group_get_title(group) != NULL)
- frame = pidgin_make_frame(pages[tab_no],
- purple_request_field_group_get_title(group));
field_count = g_list_length(field_list);
- rows = field_count / 2;
for (fl = field_list; fl != NULL; fl = fl->next)
@@ -2140,61 +2065,47 @@
if (type == PURPLE_REQUEST_FIELD_LABEL)
else if ((type == PURPLE_REQUEST_FIELD_LIST) ||
(type == PURPLE_REQUEST_FIELD_STRING &&
purple_request_field_string_is_multiline(field)))
} else if (compact && type != PURPLE_REQUEST_FIELD_BOOLEAN)
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);
+ /* 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 + g_object_set(G_OBJECT(grid), + "hexpand", contains_resizable, + "vexpand", contains_resizable, + if(contains_resizable) { + g_object_set(G_OBJECT(grid), + "halign", GTK_ALIGN_FILL, + "valign", GTK_ALIGN_FILL, + gtk_box_append(GTK_BOX(frame), grid); for (row_num = 0, fl = field_list;
row_num < rows && fl != NULL;
- col_num < cols && fl != NULL;
- col_num++, fl = fl->next)
gboolean dummy_counter = TRUE;
/* it's the same as loop above */
for (; dummy_counter && fl != NULL; dummy_counter = FALSE, fl = fl->next)
- size_t col_offset = col_num * 2;
PurpleRequestFieldType type;
GtkWidget *widget = NULL;
@@ -2203,9 +2114,6 @@
if (!purple_request_field_is_visible(field)) {
@@ -2239,18 +2147,10 @@
(type == PURPLE_REQUEST_FIELD_STRING &&
purple_request_field_string_is_multiline(field)))
gtk_grid_attach(GTK_GRID(grid), label,
0, row_num, 2 * cols, 1);
@@ -2258,7 +2158,6 @@
col_offset, row_num, 1, 1);
- gtk_widget_show(label);
@@ -2321,8 +2220,6 @@
1, row_num, 2 * cols - 1, 1);
- gtk_widget_show(widget);
purple_request_field_set_ui_data(field, widget);
@@ -2337,8 +2234,6 @@
if (!purple_request_fields_all_valid(fields))
gtk_widget_set_sensitive(data->ok_button, FALSE);
pidgin_auto_parent_window(win);
@@ -2349,7 +2244,7 @@
file_ok_check_if_exists_cb(GtkWidget *widget, gint response, PidginRequestData *data)
if (response != GTK_RESPONSE_ACCEPT) {
if (data->cbs[0] != NULL)
@@ -2358,9 +2253,10 @@
- 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);
@@ -2372,6 +2268,8 @@
((PurpleRequestFileCb)data->cbs[1])(data->user_data, data->u.file.name);
purple_request_close(data->type, data);
+ g_clear_object(¤t_path); @@ -2382,6 +2280,7 @@
GtkFileChooserNative *filesel;
const gchar *current_folder;
gboolean folder_set = FALSE;
@@ -2402,14 +2301,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),
if ((filename != NULL) && (*filename != '\0')) {
- 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); + 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); @@ -2420,20 +2322,27 @@
if ((filename == NULL || *filename == '\0' || !g_file_test(filename, G_FILE_TEST_EXISTS)) &&
- (current_folder != NULL) && (*current_folder != '\0')) {
- folder_set = gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filesel), current_folder);
+ (current_folder != NULL) && (*current_folder != '\0')) + file = g_file_new_for_path(current_folder); + folder_set = gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filesel), file, NULL); if (!folder_set && (filename == NULL || *filename == '\0' || !g_file_test(filename, G_FILE_TEST_EXISTS))) {
char *my_documents = wpurple_get_special_folder(CSIDL_PERSONAL);
if (my_documents != NULL) {
+ file = g_file_new_for_path(my_documents); gtk_file_chooser_set_current_folder(
- GTK_FILE_CHOOSER(filesel), my_documents);
+ GTK_FILE_CHOOSER(filesel), file, NULL); g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response",
@@ -2471,8 +2380,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, g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response",
G_CALLBACK(file_ok_check_if_exists_cb), data);
@@ -2529,7 +2444,7 @@
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)
--- a/pidgin/gtkroomlist.c Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/gtkroomlist.c Sun Aug 28 22:18:46 2022 -0500
@@ -27,7 +27,6 @@
#include "pidginaccountchooser.h"
#define PIDGIN_TYPE_ROOMLIST_DIALOG (pidgin_roomlist_dialog_get_type())
@@ -36,12 +35,20 @@
#define PIDGIN_ROOMLIST_UI_DATA "pidgin-ui"
struct _PidginRoomlistDialog {
GtkWidget *account_widget;
+ GtkTreeSelection *tree_selection; @@ -49,6 +56,8 @@
PurpleRoomlist *roomlist;
@@ -70,30 +79,27 @@
-_search_func(GtkTreeModel *model, gint column, const gchar *key,
- GtkTreeIter *iter, gpointer search_data)
- gchar *name, *fold, *fkey;
- gtk_tree_model_get(model, iter, column, &name, -1);
- fold = g_utf8_casefold(name, -1);
- fkey = g_utf8_casefold(key, -1);
- result = (g_strstr_len(fold, strlen(fold), fkey) == NULL);
+/****************************************************************************** + *****************************************************************************/ +static PurpleRoomlistRoom * +pidgin_roomlist_get_selected(PidginRoomlistDialog *dialog) + GtkTreeModel *model = NULL; + PurpleRoomlistRoom *room = NULL;
+ if(gtk_tree_selection_get_selected(dialog->tree_selection, &model, &iter)) { + gtk_tree_model_get(model, &iter, ROOM_COLUMN, &room, -1);
-static gint delete_win_cb(GtkWidget *w, GdkEventAny *e, gpointer d)
+pidgin_roomlist_close(PidginRoomlistDialog *dialog) - PidginRoomlistDialog *dialog = PIDGIN_ROOMLIST_DIALOG(w);
if (dialog->roomlist && purple_roomlist_get_in_progress(dialog->roomlist))
purple_roomlist_cancel_get_list(dialog->roomlist);
@@ -116,30 +122,10 @@
-dialog_select_account_cb(GtkWidget *w, PidginRoomlistDialog *dialog) {
- PidginAccountChooser *chooser = PIDGIN_ACCOUNT_CHOOSER(w);
- PurpleAccount *account = pidgin_account_chooser_get_selected(chooser);
- gboolean change = (account != dialog->account);
- dialog->account = account;
- if (change && dialog->roomlist) {
- PidginRoomlist *rl = NULL;
- rl = g_object_get_data(G_OBJECT(dialog->roomlist),
- PIDGIN_ROOMLIST_UI_DATA);
- g_clear_object(&rl->model);
- g_object_unref(dialog->roomlist);
- dialog->roomlist = NULL;
-static void list_button_cb(GtkButton *button, PidginRoomlistDialog *dialog)
+pidgin_roomlist_start_listing(PidginRoomlistDialog *dialog) @@ -183,7 +169,8 @@
gtk_widget_set_sensitive(dialog->join_button, FALSE);
-static void stop_button_cb(GtkButton *button, PidginRoomlistDialog *dialog)
+pidgin_roomlist_stop_listing(PidginRoomlistDialog *dialog) purple_roomlist_cancel_get_list(dialog->roomlist);
@@ -195,53 +182,21 @@
gtk_widget_set_sensitive(dialog->join_button, FALSE);
- PurpleRoomlistRoom *room;
-selection_changed_cb(GtkTreeSelection *selection,
- PidginRoomlistDialog *dialog)
+pidgin_roomlist_add_to_blist(PidginRoomlistDialog *dialog)
- PurpleRoomlistRoom *room;
- static struct _menu_cb_info *info;
- PidginRoomlist *grl = NULL;
- grl = g_object_get_data(G_OBJECT(dialog->roomlist),
- PIDGIN_ROOMLIST_UI_DATA);
- if (gtk_tree_selection_get_selected(selection, NULL, &iter)) {
- gtk_tree_model_get(GTK_TREE_MODEL(grl->model), &iter,
+ PurpleAccount *account = NULL; + PurpleConnection *gc = NULL; + PurpleProtocol *protocol = NULL; + PurpleRoomlistRoom *room = NULL; - info = g_new0(struct _menu_cb_info, 1);
- info->list = dialog->roomlist;
- g_object_set_data_full(G_OBJECT(dialog->join_button), "room-info",
- g_object_set_data(G_OBJECT(dialog->add_button), "room-info", info);
- gtk_widget_set_sensitive(dialog->add_button, TRUE);
- gtk_widget_set_sensitive(dialog->join_button, TRUE);
+ account = purple_roomlist_get_account(dialog->roomlist); + gc = purple_account_get_connection(account);
- gtk_widget_set_sensitive(dialog->add_button, FALSE);
- gtk_widget_set_sensitive(dialog->join_button, FALSE);
+ room = pidgin_roomlist_get_selected(dialog);
-do_add_room_cb(G_GNUC_UNUSED GtkWidget *w, struct _menu_cb_info *info)
- PurpleAccount *account = purple_roomlist_get_account(info->list);
- PurpleConnection *gc = purple_account_get_connection(account);
- PurpleProtocol *protocol = NULL;
+ g_return_if_fail(room != NULL); protocol = purple_connection_get_protocol(gc);
@@ -249,9 +204,9 @@
if(protocol != NULL && PURPLE_PROTOCOL_IMPLEMENTS(protocol, ROOMLIST, room_serialize)) {
name = purple_protocol_roomlist_room_serialize(PURPLE_PROTOCOL_ROOMLIST(protocol),
- name = g_strdup(purple_roomlist_room_get_name(info->room));
+ name = g_strdup(purple_roomlist_room_get_name(room)); purple_blist_request_add_chat(account, NULL, NULL, name);
@@ -259,26 +214,135 @@
+_search_func(GtkTreeModel *model, gint column, const gchar *key, + GtkTreeIter *iter, gpointer search_data) + gchar *name, *fold, *fkey; + gtk_tree_model_get(model, iter, column, &name, -1); + fold = g_utf8_casefold(name, -1); + fkey = g_utf8_casefold(key, -1); + result = (g_strstr_len(fold, strlen(fold), fkey) == NULL); -add_room_to_blist_cb(GtkButton *button, G_GNUC_UNUSED gpointer data)
+pidgin_roomlist_join(PidginRoomlistDialog *dialog) + PurpleRoomlistRoom *room = NULL; + room = pidgin_roomlist_get_selected(dialog); + purple_roomlist_join_room(dialog->roomlist, room); +/****************************************************************************** + *****************************************************************************/ +pidgin_roomlist_add_to_blist_cb(G_GNUC_UNUSED GSimpleAction *action, + G_GNUC_UNUSED GVariant *parameter, + pidgin_roomlist_add_to_blist(data); +pidgin_roomlist_join_cb(GSimpleAction *action, GVariant *parameter, - struct _menu_cb_info *info = g_object_get_data(G_OBJECT(button), "room-info");
+ pidgin_roomlist_join(data); +static GActionEntry actions[] = { + .activate = pidgin_roomlist_add_to_blist_cb, + .activate = pidgin_roomlist_join_cb, +/****************************************************************************** + *****************************************************************************/ +pidgin_roomlist_response_cb(GtkDialog *gtk_dialog, gint response_id, + PidginRoomlistDialog *dialog = PIDGIN_ROOMLIST_DIALOG(gtk_dialog);
- do_add_room_cb(NULL, info);
+ pidgin_roomlist_stop_listing(dialog); + pidgin_roomlist_start_listing(dialog); + pidgin_roomlist_add_to_blist(dialog); + pidgin_roomlist_join(dialog); + case GTK_RESPONSE_CLOSE: + case GTK_RESPONSE_DELETE_EVENT: + gtk_window_destroy(GTK_WINDOW(gtk_dialog)); +close_request_cb(GtkWidget *w, G_GNUC_UNUSED gpointer d) + pidgin_roomlist_close(PIDGIN_ROOMLIST_DIALOG(w)); + gtk_window_destroy(GTK_WINDOW(w)); +dialog_select_account_cb(G_GNUC_UNUSED GtkWidget *w, PidginRoomlistDialog *dialog) { + PidginAccountChooser *chooser = PIDGIN_ACCOUNT_CHOOSER(w); + PurpleAccount *account = pidgin_account_chooser_get_selected(chooser); + gboolean change = (account != dialog->account); + dialog->account = account; + if (change && dialog->roomlist) { + PidginRoomlist *rl = NULL; + rl = g_object_get_data(G_OBJECT(dialog->roomlist), + PIDGIN_ROOMLIST_UI_DATA); + g_clear_object(&rl->model); + g_object_unref(dialog->roomlist); + dialog->roomlist = NULL; -do_join_cb(G_GNUC_UNUSED GtkWidget *w, struct _menu_cb_info *info) {
- purple_roomlist_join_room(info->list, info->room);
+selection_changed_cb(GtkTreeSelection *selection, + PidginRoomlistDialog *dialog) + gboolean found = FALSE;
-join_button_cb(GtkButton *button, G_GNUC_UNUSED gpointer data) {
- struct _menu_cb_info *info = g_object_get_data(G_OBJECT(button), "room-info");
+ found = gtk_tree_selection_get_selected(selection, NULL, NULL); - purple_roomlist_join_room(info->list, info->room);
+ gtk_widget_set_sensitive(dialog->add_button, found); + gtk_widget_set_sensitive(dialog->join_button, found); @@ -289,72 +353,41 @@
PidginRoomlist *grl = NULL;
PurpleRoomlistRoom *room;
- struct _menu_cb_info info;
grl = g_object_get_data(G_OBJECT(dialog->roomlist), PIDGIN_ROOMLIST_UI_DATA);
gtk_tree_model_get_iter(GTK_TREE_MODEL(grl->model), &iter, path);
gtk_tree_model_get(GTK_TREE_MODEL(grl->model), &iter, ROOM_COLUMN, &room, -1);
- info.list = dialog->roomlist;
- do_join_cb(NULL, &info);
+ if(PURPLE_IS_ROOMLIST_ROOM(room)) { + purple_roomlist_join_room(dialog->roomlist, room);
-room_click_cb(GtkWidget *tv, GdkEventButton *event, gpointer data) {
+room_click_cb(G_GNUC_UNUSED GtkGestureClick *self, gint n_press, gdouble x, + gdouble y, gpointer data) PidginRoomlistDialog *dialog = data;
- PidginRoomlist *grl = NULL;
- PurpleRoomlistRoom *room;
- static struct _menu_cb_info info; /* XXX? */
- if (!gdk_event_triggers_context_menu((GdkEvent *)event))
- grl = g_object_get_data(G_OBJECT(dialog->roomlist), PIDGIN_ROOMLIST_UI_DATA);
- /* Here we figure out which room was clicked */
- if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL))
- gtk_tree_model_get_iter(GTK_TREE_MODEL(grl->model), &iter, path);
- gtk_tree_path_free(path);
- gtk_tree_model_get(GTK_TREE_MODEL(grl->model), &iter, ROOM_COLUMN, &room, -1);
- info.list = dialog->roomlist;
- /* The current implementation isn't expecting a ref to unref the one we got
- * when we pulled the room out of the model.
+ if(!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(dialog->tree), (gint)x, + (gint)y, NULL, NULL, NULL, NULL)) - menuitem = gtk_menu_item_new_with_mnemonic(_("_Join"));
- g_signal_connect(G_OBJECT(menuitem), "activate",
- G_CALLBACK(do_join_cb), &info);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+ gtk_popover_set_pointing_to(GTK_POPOVER(dialog->popover), + &(const GdkRectangle){(int)x, (int)y, 0, 0}); - menuitem = gtk_menu_item_new_with_mnemonic(_("_Add"));
- g_signal_connect(G_OBJECT(menuitem), "activate",
- G_CALLBACK(do_add_room_cb), &info);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
- gtk_widget_show_all(menu);
- gtk_menu_popup_at_pointer(GTK_MENU(menu), (GdkEvent *)event);
+ gtk_popover_popup(GTK_POPOVER(dialog->popover));
pidgin_roomlist_query_tooltip(GtkWidget *widget, int x, int y,
gboolean keyboard_mode, GtkTooltip *tooltip,
@@ -370,8 +403,7 @@
grl = g_object_get_data(G_OBJECT(dialog->roomlist), PIDGIN_ROOMLIST_UI_DATA);
- GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
- if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) {
+ if (!gtk_tree_selection_get_selected(dialog->tree_selection, NULL, &iter)) { path = gtk_tree_model_get_path(GTK_TREE_MODEL(grl->model), &iter);
@@ -449,6 +481,8 @@
gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
+ gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog, gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
@@ -460,10 +494,10 @@
gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog,
+ gtk_widget_class_bind_template_child(widget_class, PidginRoomlistDialog, - gtk_widget_class_bind_template_callback(widget_class,
- gtk_widget_class_bind_template_callback(widget_class, delete_win_cb);
+ gtk_widget_class_bind_template_callback(widget_class, close_request_cb); gtk_widget_class_bind_template_callback(widget_class, row_activated_cb);
gtk_widget_class_bind_template_callback(widget_class, room_click_cb);
gtk_widget_class_bind_template_callback(widget_class,
@@ -472,14 +506,15 @@
gtk_widget_class_bind_template_callback(widget_class,
pidgin_roomlist_query_tooltip);
- gtk_widget_class_bind_template_callback(widget_class, join_button_cb);
- gtk_widget_class_bind_template_callback(widget_class, list_button_cb);
- gtk_widget_class_bind_template_callback(widget_class, stop_button_cb);
+ gtk_widget_class_bind_template_callback(widget_class, + pidgin_roomlist_response_cb); pidgin_roomlist_dialog_init(PidginRoomlistDialog *self)
+ GSimpleActionGroup *group = NULL; gtk_widget_init_template(GTK_WIDGET(self));
pidgin_account_chooser_set_filter_func(
@@ -488,6 +523,13 @@
gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(self->tree),
_search_func, NULL, NULL);
+ /* Now setup our actions. */ + group = g_simple_action_group_new(); + g_action_map_add_action_entries(G_ACTION_MAP(group), actions, + G_N_ELEMENTS(actions), self); + gtk_widget_insert_action_group(GTK_WIDGET(self), "roomlist", + G_ACTION_GROUP(group)); static PidginRoomlistDialog *
@@ -519,10 +561,7 @@
PidginRoomlistDialog *dialog = pidgin_roomlist_dialog_new_with_account(account);
- list_button_cb(GTK_BUTTON(dialog->list_button), dialog);
+ pidgin_roomlist_start_listing(dialog); void pidgin_roomlist_dialog_show(void)
@@ -604,18 +643,12 @@
-pidgin_roomlist_destroy(PidginRoomlist *rl)
pidgin_roomlist_new(PurpleRoomlist *list)
PidginRoomlist *rl = g_new0(PidginRoomlist, 1);
g_object_set_data_full(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA, rl,
- (GDestroyNotify)pidgin_roomlist_destroy);
+ (GDestroyNotify)g_free); rl->model = gtk_tree_store_new(3, G_TYPE_OBJECT, G_TYPE_STRING,
--- a/pidgin/gtkwhiteboard.c Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/gtkwhiteboard.c Sun Aug 28 22:18:46 2022 -0500
@@ -32,12 +32,6 @@
#include "gtkwhiteboard.h"
- PIDGIN_WHITEBOARD_BRUSH_UP,
- PIDGIN_WHITEBOARD_BRUSH_DOWN,
- PIDGIN_WHITEBOARD_BRUSH_MOTION
-} PidginWhiteboardBrushState;
#define UI_DATA "pidgin-ui-data"
#define PIDGIN_TYPE_WHITEBOARD (pidgin_whiteboard_get_type())
G_DECLARE_FINAL_TYPE(PidginWhiteboard, pidgin_whiteboard, PIDGIN, WHITEBOARD,
@@ -74,13 +68,12 @@
- PidginWhiteboardBrushState brush_state;
/* Tracks last position of the mouse when drawing */
- /* Tracks how many brush motions made */
G_DEFINE_TYPE(PidginWhiteboard, pidgin_whiteboard, GTK_TYPE_WINDOW)
@@ -94,7 +87,7 @@
color->red = ((color_rgb >> 16) & 0xFF) / 255.0f;
color->green = ((color_rgb >> 8) & 0xFF) / 255.0f;
color->blue = (color_rgb & 0xFF) / 255.0f;
@@ -108,30 +101,24 @@
-static gboolean pidgin_whiteboard_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
+pidgin_whiteboard_resize(GtkDrawingArea *self, gint width, gint height, PidginWhiteboard *gtkwb = (PidginWhiteboard*)data;
+ GdkRGBA white = {1.0f, 1.0f, 1.0f, 1.0f}; - GtkAllocation allocation;
- GdkRGBA white = {1.0, 1.0, 1.0, 1.0};
- cairo_destroy(gtkwb->cr);
- cairo_surface_destroy(gtkwb->surface);
+ g_clear_pointer(>kwb->cr, cairo_destroy); + g_clear_pointer(>kwb->surface, cairo_surface_destroy); - gtk_widget_get_allocation(widget, &allocation);
- gtkwb->surface = cairo_image_surface_create(
- CAIRO_FORMAT_RGB24, allocation.width, allocation.height);
+ gtkwb->surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, gtkwb->cr = cr = cairo_create(gtkwb->surface);
gdk_cairo_set_source_rgba(cr, &white);
- cairo_rectangle(cr, 0, 0, allocation.width, allocation.height);
+ cairo_rectangle(cr, 0, 0, width, height);
@@ -147,18 +134,6 @@
-pidgin_whiteboard_set_canvas_as_icon(PidginWhiteboard *gtkwb)
- /* Makes an icon from the whiteboard's canvas 'image' */
- pixbuf = gdk_pixbuf_get_from_surface(gtkwb->surface, 0, 0, gtkwb->width,
- gtk_window_set_icon(GTK_WINDOW(gtkwb), pixbuf);
- g_object_unref(pixbuf);
pidgin_whiteboard_draw_brush_point(PurpleWhiteboard *wb, int x, int y,
@@ -175,9 +150,9 @@
cairo_arc(gfx_con, x, y, size / 2.0, 0.0, 2.0 * M_PI);
- gtk_widget_queue_draw_area(widget, x - size / 2, y - size / 2, size,
+ gtk_widget_queue_draw(widget); /* Uses Bresenham's algorithm (as provided by Wikipedia) */
pidgin_whiteboard_draw_brush_line(PurpleWhiteboard *wb, int x0, int y0, int x1,
@@ -254,179 +229,86 @@
-static gboolean pidgin_whiteboard_brush_down(GtkWidget *widget, GdkEventButton *event, gpointer data)
+pidgin_whiteboard_brush_down(GtkGestureDrag* self, gdouble x, gdouble y, PidginWhiteboard *gtkwb = (PidginWhiteboard*)data;
PurpleWhiteboard *wb = gtkwb->wb;
GList *draw_list = purple_whiteboard_get_draw_list(wb);
- if (gtkwb->brush_state != PIDGIN_WHITEBOARD_BRUSH_UP) {
- /* Potential double-click DOWN to DOWN? */
- gtkwb->brush_state = PIDGIN_WHITEBOARD_BRUSH_DOWN;
- gtkwb->brush_state = PIDGIN_WHITEBOARD_BRUSH_DOWN;
- if (event->button == GDK_BUTTON_PRIMARY && gtkwb->cr != NULL) {
+ if(gtkwb->cr != NULL) { /* Check if draw_list has contents; if so, clear it */
purple_whiteboard_draw_list_destroy(draw_list);
/* Set tracking variables */
- gtkwb->last_x = event->x;
- gtkwb->last_y = event->y;
- gtkwb->motion_count = 0;
- draw_list = g_list_append(draw_list,
- GINT_TO_POINTER(gtkwb->last_x));
- draw_list = g_list_append(draw_list,
- GINT_TO_POINTER(gtkwb->last_y));
+ draw_list = g_list_append(draw_list, GINT_TO_POINTER(gtkwb->start_x)); + draw_list = g_list_append(draw_list, GINT_TO_POINTER(gtkwb->start_y)); - pidgin_whiteboard_draw_brush_point(gtkwb->wb,
- gtkwb->brush_color, gtkwb->brush_size);
+ pidgin_whiteboard_draw_brush_point(gtkwb->wb, gtkwb->start_x, + gtkwb->start_y, gtkwb->brush_color, purple_whiteboard_set_draw_list(wb, draw_list);
-static gboolean pidgin_whiteboard_brush_motion(GtkWidget *widget, GdkEventMotion *event, gpointer data)
+pidgin_whiteboard_brush_motion(GtkGestureDrag* self, gdouble x, gdouble y,
PidginWhiteboard *gtkwb = (PidginWhiteboard*)data;
PurpleWhiteboard *wb = gtkwb->wb;
GList *draw_list = purple_whiteboard_get_draw_list(wb);
- gdk_window_get_device_position(event->window, event->device, &x, &y,
- if (state & GDK_BUTTON1_MASK && gtkwb->cr != NULL) {
- if ((gtkwb->brush_state != PIDGIN_WHITEBOARD_BRUSH_DOWN) &&
- (gtkwb->brush_state != PIDGIN_WHITEBOARD_BRUSH_MOTION)) {
- "***Bad brush state transition %d to MOTION\n",
- gtkwb->brush_state = PIDGIN_WHITEBOARD_BRUSH_MOTION;
- gtkwb->brush_state = PIDGIN_WHITEBOARD_BRUSH_MOTION;
- dx = x - gtkwb->last_x;
- dy = y - gtkwb->last_y;
+ if (gtkwb->cr != NULL) { - /* NOTE 100 is a temporary constant for how many deltas/motions in a
- * stroke (needs UI Ops?)
+ /* x and y are relative to the starting post, but we need to know where + * there are according to the last point, so we have to do the algebra. - if (gtkwb->motion_count == 100) {
- draw_list = g_list_append(draw_list, GINT_TO_POINTER(dx));
- draw_list = g_list_append(draw_list, GINT_TO_POINTER(dy));
- /* Send draw list to the draw_list handler */
- purple_whiteboard_send_draw_list(gtkwb->wb, draw_list);
- /* The brush stroke is finished, clear the list for another one */
- purple_whiteboard_draw_list_destroy(draw_list);
- /* Reset motion tracking */
- gtkwb->motion_count = 0;
- draw_list = g_list_append(
- draw_list, GINT_TO_POINTER(gtkwb->last_x));
- draw_list = g_list_append(
- draw_list, GINT_TO_POINTER(gtkwb->last_y));
- dx = x - gtkwb->last_x;
- dy = y - gtkwb->last_y;
+ dx = (x + gtkwb->start_x - gtkwb->last_x); + dy = (y + gtkwb->start_y - gtkwb->last_y); draw_list = g_list_append(draw_list, GINT_TO_POINTER(dx));
draw_list = g_list_append(draw_list, GINT_TO_POINTER(dy));
- pidgin_whiteboard_draw_brush_line(
- gtkwb->wb, gtkwb->last_x, gtkwb->last_y, x, y,
- gtkwb->brush_color, gtkwb->brush_size);
+ pidgin_whiteboard_draw_brush_line(gtkwb->wb, + gtkwb->start_x + gtkwb->last_x, + gtkwb->start_y + gtkwb->last_y, - /* Set tracking variables */
purple_whiteboard_set_draw_list(wb, draw_list);
-static gboolean pidgin_whiteboard_brush_up(GtkWidget *widget, GdkEventButton *event, gpointer data)
+pidgin_whiteboard_brush_up(GtkGestureDrag *self, gdouble x, gdouble y, PidginWhiteboard *gtkwb = (PidginWhiteboard*)data;
PurpleWhiteboard *wb = gtkwb->wb;
GList *draw_list = purple_whiteboard_get_draw_list(wb);
- if ((gtkwb->brush_state != PIDGIN_WHITEBOARD_BRUSH_DOWN) &&
- (gtkwb->brush_state != PIDGIN_WHITEBOARD_BRUSH_MOTION)) {
- purple_debug_error("gtkwhiteboard",
- "***Bad brush state transition %d to UP\n",
- gtkwb->brush_state = PIDGIN_WHITEBOARD_BRUSH_UP;
- gtkwb->brush_state = PIDGIN_WHITEBOARD_BRUSH_UP;
- if (event->button == GDK_BUTTON_PRIMARY && gtkwb->cr != NULL) {
- /* If the brush was never moved, express two sets of two deltas That's a
- * 'point,' but not for Yahoo!
- if (gtkwb->motion_count == 0) {
- /* For Yahoo!, a (0 0) indicates the end of drawing */
- /* FIXME: Yahoo Doodle specific! */
- for (index = 0; index < 2; index++) {
- draw_list = g_list_append(draw_list, 0);
- draw_list = g_list_append(draw_list, 0);
+ if(gtkwb->cr != NULL) { /* Send draw list to protocol draw_list handler */
purple_whiteboard_send_draw_list(gtkwb->wb, draw_list);
- pidgin_whiteboard_set_canvas_as_icon(gtkwb);
/* The brush stroke is finished, clear the list for another one
@@ -435,8 +317,6 @@
purple_whiteboard_set_draw_list(wb, NULL);
static void pidgin_whiteboard_set_dimensions(PurpleWhiteboard *wb, int width, int height)
@@ -461,7 +341,7 @@
GtkWidget *drawing_area = gtkwb->drawing_area;
GtkAllocation allocation;
- GdkRGBA white = {1.0, 1.0, 1.0, 1.0};
+ GdkRGBA white = {1.0f, 1.0f, 1.0f, 1.0f}; gtk_widget_get_allocation(drawing_area, &allocation);
@@ -469,12 +349,27 @@
cairo_rectangle(cr, 0, 0, allocation.width, allocation.height);
- gtk_widget_queue_draw_area(drawing_area, 0, 0,
- allocation.width, allocation.height);
+ gtk_widget_queue_draw(drawing_area); -static void pidgin_whiteboard_button_clear_press(GtkWidget *widget, gpointer data)
+pidgin_whiteboard_clear_response(GtkDialog *self, guint response, + PidginWhiteboard *gtkwb = (PidginWhiteboard *)data; + if(response == GTK_RESPONSE_YES) { + pidgin_whiteboard_clear(gtkwb->wb); + /* Do protocol specific clearing procedures */ + purple_whiteboard_send_clear(gtkwb->wb); + gtk_window_destroy(GTK_WINDOW(self)); +pidgin_whiteboard_button_clear_press(GtkWidget *widget, gpointer data) { PidginWhiteboard *gtkwb = (PidginWhiteboard*)(data);
/* Confirm whether the user really wants to clear */
@@ -482,62 +377,67 @@
GTK_WINDOW(gtkwb), GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s",
_("Do you really want to clear?"));
- gint response = gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
+ g_signal_connect(dialog, "response", + G_CALLBACK(pidgin_whiteboard_clear_response), gtkwb); + gtk_widget_show(dialog); - if (response == GTK_RESPONSE_YES)
- pidgin_whiteboard_clear(gtkwb->wb);
+pidgin_whiteboard_save_response(GtkNativeDialog *self, gint response_id, + PidginWhiteboard *gtkwb = (PidginWhiteboard *)data; + if(response_id == GTK_RESPONSE_ACCEPT) { + GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(self)); + gchar *filename = g_file_get_path(file); + pixbuf = gdk_pixbuf_get_from_surface(gtkwb->surface, 0, 0, + gtkwb->width, gtkwb->height); - pidgin_whiteboard_set_canvas_as_icon(gtkwb);
+ success = gdk_pixbuf_save(pixbuf, filename, "png", NULL, + "compression", "9", NULL); + g_object_unref(pixbuf); - /* Do protocol specific clearing procedures */
- purple_whiteboard_send_clear(gtkwb->wb);
+ purple_debug_info("gtkwhiteboard", "whiteboard saved to \"%s\"", + purple_notify_error(NULL, _("Whiteboard"), + _("Unable to save the file"), NULL, NULL); + purple_debug_error("gtkwhiteboard", "whiteboard " + "couldn't be saved to \"%s\"", filename); pidgin_whiteboard_button_save_press(GtkWidget *widget, gpointer _gtkwb)
PidginWhiteboard *gtkwb = _gtkwb;
GtkFileChooserNative *chooser;
chooser = gtk_file_chooser_native_new(_("Save File"), GTK_WINDOW(gtkwb),
GTK_FILE_CHOOSER_ACTION_SAVE,
_("_Save"), _("_Cancel"));
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(chooser),
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(chooser),
- result = gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser));
- if (result == GTK_RESPONSE_ACCEPT) {
- gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser));
- pixbuf = gdk_pixbuf_get_from_surface(
- gtkwb->surface, 0, 0, gtkwb->width, gtkwb->height);
+ g_signal_connect(chooser, "response", + G_CALLBACK(pidgin_whiteboard_save_response), gtkwb); - success = gdk_pixbuf_save(pixbuf, filename, "png", NULL,
- "compression", "9", NULL);
- g_object_unref(pixbuf);
- purple_debug_info("gtkwhiteboard",
- "whiteboard saved to \"%s\"", filename);
- purple_notify_error(NULL, _("Whiteboard"),
- _("Unable to save the file"), NULL, NULL);
- purple_debug_error("gtkwhiteboard", "whiteboard "
- "couldn't be saved to \"%s\"", filename);
- g_object_unref(chooser);
+ gtk_native_dialog_show(GTK_NATIVE_DIALOG(chooser)); @@ -606,8 +506,6 @@
/* Make all this (window) visible */
gtk_widget_show(GTK_WIDGET(gtkwb));
- pidgin_whiteboard_set_canvas_as_icon(gtkwb);
/* TODO Specific protocol/whiteboard assignment here? Needs a UI Op? */
/* Set default brush size and color */
@@ -635,16 +533,12 @@
*****************************************************************************/
-pidgin_whiteboard_init(PidginWhiteboard *self)
+pidgin_whiteboard_init(PidginWhiteboard *self) { gtk_widget_init_template(GTK_WIDGET(self));
- self->brush_state = PIDGIN_WHITEBOARD_BRUSH_UP;
-pidgin_whiteboard_finalize(GObject *obj)
+pidgin_whiteboard_finalize(GObject *obj) { PidginWhiteboard *gtkwb = PIDGIN_WHITEBOARD(obj);
/* Clear graphical memory */
@@ -675,7 +569,7 @@
gtk_widget_class_bind_template_callback(
widget_class, pidgin_whiteboard_draw_event);
gtk_widget_class_bind_template_callback(
- widget_class, pidgin_whiteboard_configure_event);
+ widget_class, pidgin_whiteboard_resize); gtk_widget_class_bind_template_callback(
widget_class, pidgin_whiteboard_brush_down);
gtk_widget_class_bind_template_callback(
--- a/pidgin/plugins/xmppconsole/console.ui Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/plugins/xmppconsole/console.ui Sun Aug 28 22:18:46 2022 -0500
@@ -20,7 +20,7 @@
- <requires lib="gtk+" version="3.18"/>
+ <requires lib="gtk" version="4.0"/> <requires lib="pidgin" version="3.0"/>
<!-- interface-license-type gplv2 -->
<!-- interface-name Pidgin -->
@@ -92,210 +92,127 @@
<property name="tag_table">tags.table</property>
<template parent="GtkWindow" class="PidginXmppConsole">
- <property name="can_focus">False</property>
<property name="title" translatable="yes">XMPP Console</property>
<property name="default_width">580</property>
<property name="default_height">400</property>
+ <property name="child"> - <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="orientation">vertical</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="margin_left">6</property>
+ <property name="margin-start">6</property> <property name="spacing">6</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">Account:</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
<object class="PidginAccountChooser">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="model">connected_xmpp_accounts</property>
<property name="active">0</property>
+ <property name="halign">fill</property> + <property name="hexpand">1</property> <signal name="changed" handler="dropdown_changed_cb" object="PidginXmppConsole" swapped="no"/>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
<object class="GtkScrolledWindow">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="shadow_type">etched-in</property>
+ <property name="valign">fill</property> + <property name="vexpand">1</property> + <property name="focusable">1</property> + <property name="child"> <object class="GtkTextView">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">False</property>
+ <property name="focusable">1</property> + <property name="editable">0</property> <property name="wrap_mode">word</property>
<property name="buffer">buffer</property>
+ <object class="GtkBox"> + <class name="toolbar"/> + <object class="GtkMenuButton"> + <property name="label"><iq/></property> + <property name="popover">iq.popover</property> + <object class="GtkMenuButton"> + <property name="label"><presence/></property> + <property name="popover">presence.popover</property> + <object class="GtkMenuButton"> + <property name="label"><message/></property> + <property name="popover">message.popover</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <object class="GtkToolbar">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="toolbar_style">text</property>
- <object class="GtkToolItem">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
+ <object class="GtkScrolledWindow" id="sw"> + <property name="focusable">1</property> + <property name="child"> + <object class="GtkTextView" id="entry"> + <property name="focusable">1</property> + <property name="wrap_mode">word</property> + <property name="buffer">entry_buffer</property> - <object class="GtkMenuButton">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label"><iq/></property>
- <property name="popover">iq.popover</property>
+ <object class="GtkEventControllerKey"> + <signal name="key-pressed" handler="message_send_cb" object="PidginXmppConsole" swapped="no"/>
- <property name="expand">False</property>
- <property name="homogeneous">False</property>
- <object class="GtkToolItem">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <object class="GtkMenuButton">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label"><presence/></property>
- <property name="popover">presence.popover</property>
- <property name="expand">False</property>
- <property name="homogeneous">False</property>
- <object class="GtkToolItem">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <object class="GtkMenuButton">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label"><message/></property>
- <property name="popover">message.popover</property>
- <property name="expand">False</property>
- <property name="homogeneous">False</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- <object class="GtkScrolledWindow" id="sw">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="shadow_type">etched-in</property>
- <object class="GtkTextView" id="entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="wrap_mode">word</property>
- <property name="buffer">entry_buffer</property>
- <signal name="key-press-event" handler="message_send_cb" object="PidginXmppConsole" swapped="no"/>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">3</property>
<object class="GtkPopover" id="iq.popover">
- <property name="can_focus">False</property>
<property name="position">right</property>
+ <property name="child"> - <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="column_spacing">6</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">To:</property>
+ <property name="column">0</property> + <property name="row">0</property>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">Type:</property>
+ <property name="column">0</property> + <property name="row">1</property>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
<object class="GtkEntry" id="iq.to">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="activates_default">True</property>
+ <property name="focusable">1</property> + <property name="activates_default">1</property> + <property name="column">1</property> + <property name="row">0</property>
- <property name="left_attach">1</property>
- <property name="top_attach">0</property>
<object class="GtkComboBoxText" id="iq.type">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="active">0</property>
@@ -303,163 +220,138 @@
+ <property name="column">1</property> + <property name="row">1</property>
- <property name="left_attach">1</property>
- <property name="top_attach">1</property>
<object class="GtkButton">
<property name="label" translatable="yes">Insert</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="receives_default">True</property>
+ <property name="focusable">1</property> + <property name="receives_default">1</property> <signal name="clicked" handler="iq_clicked_cb" swapped="no"/>
+ <property name="column">0</property> + <property name="row">2</property> + <property name="column-span">2</property>
- <property name="left_attach">0</property>
- <property name="top_attach">2</property>
- <property name="width">2</property>
<object class="GtkPopover" id="message.popover">
- <property name="can_focus">False</property>
<property name="position">right</property>
+ <property name="child"> - <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="column_spacing">6</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">To:</property>
<property name="xalign">0</property>
+ <property name="column">0</property> + <property name="row">0</property>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">Type:</property>
<property name="xalign">0</property>
+ <property name="column">0</property> + <property name="row">1</property>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">Body:</property>
<property name="xalign">0</property>
+ <property name="column">0</property> + <property name="row">2</property>
- <property name="left_attach">0</property>
- <property name="top_attach">2</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">Subject:</property>
<property name="xalign">0</property>
+ <property name="column">0</property> + <property name="row">3</property>
- <property name="left_attach">0</property>
- <property name="top_attach">3</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">Thread:</property>
<property name="xalign">0</property>
+ <property name="column">0</property> + <property name="row">4</property>
- <property name="left_attach">0</property>
- <property name="top_attach">4</property>
<object class="GtkEntry" id="message.to">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="activates_default">True</property>
+ <property name="focusable">1</property> + <property name="activates_default">1</property> + <property name="column">1</property> + <property name="row">0</property>
- <property name="left_attach">1</property>
- <property name="top_attach">0</property>
<object class="GtkEntry" id="message.body">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="activates_default">True</property>
+ <property name="focusable">1</property> + <property name="activates_default">1</property> + <property name="column">1</property> + <property name="row">2</property>
- <property name="left_attach">1</property>
- <property name="top_attach">2</property>
<object class="GtkEntry" id="message.subject">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="activates_default">True</property>
+ <property name="focusable">1</property> + <property name="activates_default">1</property> + <property name="column">1</property> + <property name="row">3</property>
- <property name="left_attach">1</property>
- <property name="top_attach">3</property>
<object class="GtkEntry" id="message.thread">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="activates_default">True</property>
+ <property name="focusable">1</property> + <property name="activates_default">1</property> + <property name="column">1</property> + <property name="row">4</property>
- <property name="left_attach">1</property>
- <property name="top_attach">4</property>
<object class="GtkButton">
<property name="label" translatable="yes">Insert</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="receives_default">True</property>
+ <property name="focusable">1</property> + <property name="receives_default">1</property> <signal name="clicked" handler="message_clicked_cb" swapped="no"/>
+ <property name="column">0</property> + <property name="row">5</property> + <property name="column-span">2</property>
- <property name="left_attach">0</property>
- <property name="top_attach">5</property>
- <property name="width">2</property>
<object class="GtkComboBoxText" id="message.type">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="active">0</property>
@@ -468,97 +360,81 @@
+ <property name="column">1</property> + <property name="row">1</property>
- <property name="left_attach">1</property>
- <property name="top_attach">1</property>
<object class="GtkPopover" id="presence.popover">
- <property name="can_focus">False</property>
<property name="position">right</property>
+ <property name="child"> - <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="column_spacing">6</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">To:</property>
<property name="xalign">0</property>
+ <property name="column">0</property> + <property name="row">0</property>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">Type:</property>
<property name="xalign">0</property>
+ <property name="column">0</property> + <property name="row">1</property>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">Show:</property>
<property name="xalign">0</property>
+ <property name="column">0</property> + <property name="row">2</property>
- <property name="left_attach">0</property>
- <property name="top_attach">2</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">Status:</property>
<property name="xalign">0</property>
+ <property name="column">0</property> + <property name="row">3</property>
- <property name="left_attach">0</property>
- <property name="top_attach">3</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="label" translatable="yes">Priority:</property>
<property name="xalign">0</property>
+ <property name="column">0</property> + <property name="row">4</property>
- <property name="left_attach">0</property>
- <property name="top_attach">4</property>
<object class="GtkEntry" id="presence.to">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
+ <property name="focusable">1</property> + <property name="column">1</property> + <property name="row">0</property>
- <property name="left_attach">1</property>
- <property name="top_attach">0</property>
<object class="GtkComboBoxText" id="presence.type">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="active">0</property>
@@ -570,16 +446,14 @@
+ <property name="column">1</property> + <property name="row">1</property>
- <property name="left_attach">1</property>
- <property name="top_attach">1</property>
<object class="GtkComboBoxText" id="presence.show">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
<property name="active">0</property>
@@ -588,52 +462,47 @@
+ <property name="column">1</property> + <property name="row">2</property>
- <property name="left_attach">1</property>
- <property name="top_attach">2</property>
<object class="GtkEntry" id="presence.status">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="activates_default">True</property>
+ <property name="focusable">1</property> + <property name="activates_default">1</property> + <property name="column">1</property> + <property name="row">3</property>
- <property name="left_attach">1</property>
- <property name="top_attach">3</property>
<object class="GtkButton">
<property name="label" translatable="yes">Insert</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="receives_default">True</property>
+ <property name="focusable">1</property> + <property name="receives_default">1</property> <signal name="clicked" handler="presence_clicked_cb" swapped="no"/>
+ <property name="column">0</property> + <property name="row">5</property> + <property name="column-span">2</property>
- <property name="left_attach">0</property>
- <property name="top_attach">5</property>
- <property name="width">2</property>
<object class="GtkSpinButton" id="presence.priority">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
+ <property name="focusable">1</property> <property name="adjustment">presence.priority_adjustment</property>
- <property name="numeric">True</property>
+ <property name="numeric">1</property> + <property name="column">1</property> + <property name="row">4</property>
- <property name="left_attach">1</property>
- <property name="top_attach">4</property>
--- a/pidgin/resources/Keypad/keypad.ui Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/resources/Keypad/keypad.ui Sun Aug 28 22:18:46 2022 -0500
@@ -20,24 +20,19 @@
- <requires lib="gtk+" version="3.22"/>
+ <requires lib="gtk" version="4.0"/> <!-- interface-license-type gplv2 -->
<!-- interface-name Pidgin -->
<!-- interface-description Internet Messenger -->
<!-- interface-copyright Pidgin Developers <devel@pidgin.im> -->
<!-- n-columns=3 n-rows=4 -->
<template class="PidginKeypad" parent="GtkGrid">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="row-homogeneous">True</property>
- <property name="column-homogeneous">True</property>
+ <property name="row-homogeneous">1</property> + <property name="column-homogeneous">1</property> <object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -46,55 +41,35 @@
<property name="action-target">49</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">1</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- <object class="GtkLabel" id="secondary_labels[1]">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <object class="GtkLabel" id="secondary_labels[1]"/> <class name="image-button"/>
+ <property name="column">0</property> + <property name="row">0</property>
- <property name="left-attach">0</property>
- <property name="top-attach">0</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -103,60 +78,41 @@
<property name="action-target">50</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">2</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="secondary_labels[2]">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<!-- Translators: These are the letters on the '2' key of a numeric
keypad; translate according to the tables in §7 of ETSI ES 202 130:
http://webapp.etsi.org/WorkProgram/Report_WorkItem.asp?WKI_ID=11730
- <property name="label" translatable="yes">ABC</property>
+ <property name="label" translatable="1">ABC</property> <class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">1</property> + <property name="row">0</property>
- <property name="left-attach">1</property>
- <property name="top-attach">0</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -165,60 +121,41 @@
<property name="action-target">51</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">3</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="secondary_labels[3]">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<!-- Translators: These are the letters on the '3' key of a numeric
keypad; translate according to the tables in §7 of ETSI ES 202 130:
http://webapp.etsi.org/WorkProgram/Report_WorkItem.asp?WKI_ID=11730
- <property name="label" translatable="yes">DEF</property>
+ <property name="label" translatable="1">DEF</property> <class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">2</property> + <property name="row">0</property>
- <property name="left-attach">2</property>
- <property name="top-attach">0</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -227,60 +164,41 @@
<property name="action-target">52</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">4</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="secondary_labels[4]">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<!-- Translators: These are the letters on the '4' key of a numeric
keypad; translate according to the tables in §7 of ETSI ES 202 130:
http://webapp.etsi.org/WorkProgram/Report_WorkItem.asp?WKI_ID=11730
- <property name="label" translatable="yes">GHI</property>
+ <property name="label" translatable="1">GHI</property> <class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">0</property> + <property name="row">1</property>
- <property name="left-attach">0</property>
- <property name="top-attach">1</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -289,60 +207,41 @@
<property name="action-target">53</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">5</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="secondary_labels[5]">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<!-- Translators: These are the letters on the '5' key of a numeric
keypad; translate according to the tables in §7 of ETSI ES 202 130:
http://webapp.etsi.org/WorkProgram/Report_WorkItem.asp?WKI_ID=11730
- <property name="label" translatable="yes">JKL</property>
+ <property name="label" translatable="1">JKL</property> <class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">1</property> + <property name="row">1</property>
- <property name="left-attach">1</property>
- <property name="top-attach">1</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -351,60 +250,41 @@
<property name="action-target">54</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">6</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="secondary_labels[6]">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<!-- Translators: These are the letters on the '6' key of a numeric
keypad; translate according to the tables in §7 of ETSI ES 202 130:
http://webapp.etsi.org/WorkProgram/Report_WorkItem.asp?WKI_ID=11730
- <property name="label" translatable="yes">MNO</property>
+ <property name="label" translatable="1">MNO</property> <class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">2</property> + <property name="row">1</property>
- <property name="left-attach">2</property>
- <property name="top-attach">1</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -413,60 +293,41 @@
<property name="action-target">55</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">7</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="secondary_labels[7]">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<!-- Translators: These are the letters on the '7' key of a numeric
keypad; translate according to the tables in §7 of ETSI ES 202 130:
http://webapp.etsi.org/WorkProgram/Report_WorkItem.asp?WKI_ID=11730
- <property name="label" translatable="yes">PQRS</property>
+ <property name="label" translatable="1">PQRS</property> <class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">0</property> + <property name="row">2</property>
- <property name="left-attach">0</property>
- <property name="top-attach">2</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -475,60 +336,41 @@
<property name="action-target">56</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">8</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="secondary_labels[8]">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<!-- Translators: These are the letters on the '8' key of a numeric
keypad; translate according to the tables in §7 of ETSI ES 202 130:
http://webapp.etsi.org/WorkProgram/Report_WorkItem.asp?WKI_ID=11730
- <property name="label" translatable="yes">TUV</property>
+ <property name="label" translatable="1">TUV</property> <class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">1</property> + <property name="row">2</property>
- <property name="left-attach">1</property>
- <property name="top-attach">2</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -537,60 +379,41 @@
<property name="action-target">57</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">9</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="secondary_labels[9]">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<!-- Translators: These are the letters on the '9' key of a numeric
keypad; translate according to the tables in §7 of ETSI ES 202 130:
http://webapp.etsi.org/WorkProgram/Report_WorkItem.asp?WKI_ID=11730
- <property name="label" translatable="yes">WXYZ</property>
+ <property name="label" translatable="1">WXYZ</property> <class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">2</property> + <property name="row">2</property>
- <property name="left-attach">2</property>
- <property name="top-attach">2</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -599,55 +422,36 @@
<property name="action-target">42</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">*</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="asterisk">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">0</property> + <property name="row">3</property>
- <property name="left-attach">0</property>
- <property name="top-attach">3</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -656,55 +460,36 @@
<property name="action-target">48</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">0</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="secondary_labels[0]">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">1</property> + <property name="row">3</property>
- <property name="left-attach">1</property>
- <property name="top-attach">3</property>
<object class="GtkButton">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="margin-left">2</property>
- <property name="margin-right">2</property>
+ <property name="focusable">1</property> + <property name="receives-default">1</property> <property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
@@ -713,47 +498,31 @@
<property name="action-target">35</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">1</property> <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="label">#</property>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="2"/>
+ <attribute name="weight" value="bold"></attribute> + <attribute name="scale" value="2"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkLabel" id="octothorpe">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<class name="dim-label"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="column">2</property> + <property name="row">3</property>
- <property name="left-attach">2</property>
- <property name="top-attach">3</property>
--- a/pidgin/resources/Prefs/network.ui Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/resources/Prefs/network.ui Sun Aug 28 22:18:46 2022 -0500
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
Pidgin - Internet Messenger
Copyright (C) Pidgin Developers <devel@pidgin.im>
@@ -16,10 +15,10 @@
You should have received a copy of the GNU General Public License
along with this program; if not, see <https://www.gnu.org/licenses/>.
- <requires lib="gtk+" version="3.22"/>
+ <requires lib="gtk" version="4.0"/> + <requires lib="Adw" version="1.0"/> <!-- interface-license-type gplv2 -->
<!-- interface-name Pidgin -->
<!-- interface-description Internet Messenger -->
@@ -44,434 +43,230 @@
<property name="step-increment">1</property>
<property name="page-increment">10</property>
- <template class="PidginNetworkPrefs" parent="HdyPreferencesPage">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
+ <template class="PidginNetworkPrefs" parent="AdwPreferencesPage"> - <object class="HdyPreferencesGroup">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="title" translatable="yes">IP Address</property>
+ <object class="AdwPreferencesGroup"> + <property name="title" translatable="1">IP Address</property> - <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="margin-start">12</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="spacing">6</property>
<object class="GtkLabel" id="label8">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">ST_UN server:</property>
- <property name="use-underline">True</property>
+ <property name="label" translatable="1">ST_UN server:</property> + <property name="use-underline">1</property> <property name="mnemonic-widget">stun_server</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkEntry" id="stun_server">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="placeholder-text" translatable="yes">Example: stunserver.org</property>
+ <property name="halign">fill</property> + <property name="hexpand">1</property> + <property name="focusable">1</property> + <property name="placeholder-text" translatable="1">Example: stunserver.org</property> <property name="input-purpose">url</property>
- <signal name="focus-out-event" handler="network_stun_server_changed_cb" swapped="no"/>
+ <object class="GtkEventControllerFocus"> + <signal name="leave" handler="network_stun_server_changed_cb" object="stun_server" swapped="no"/>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkCheckButton" id="auto_ip">
- <property name="label" translatable="yes">Use _automatically detected IP address</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">False</property>
- <property name="use-underline">True</property>
- <property name="draw-indicator">True</property>
+ <property name="label" translatable="1">Use _automatically detected IP address</property> + <property name="focusable">1</property> + <property name="use-underline">1</property> <signal name="toggled" handler="auto_ip_button_clicked_cb" after="yes" swapped="no"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
<object class="GtkBox" id="public_ip_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="spacing">6</property>
<object class="GtkLabel" id="label9">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Public _IP:</property>
- <property name="use-underline">True</property>
+ <property name="label" translatable="1">Public _IP:</property> + <property name="use-underline">1</property> <property name="mnemonic-widget">public_ip</property>
<property name="xalign">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkEntry" id="public_ip">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
+ <property name="focusable">1</property> <signal name="changed" handler="network_ip_changed" swapped="no"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- <object class="HdyPreferencesGroup">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="title" translatable="yes">Ports</property>
+ <object class="AdwPreferencesGroup"> + <property name="title" translatable="1">Ports</property> - <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="margin-start">12</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<object class="GtkCheckButton" id="map_ports">
- <property name="label" translatable="yes">_Enable automatic router port forwarding</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">False</property>
- <property name="use-underline">True</property>
- <property name="draw-indicator">True</property>
+ <property name="label" translatable="1">_Enable automatic router port forwarding</property> + <property name="focusable">1</property> + <property name="use-underline">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="spacing">6</property>
<object class="GtkCheckButton" id="ports_range_use">
- <property name="label" translatable="yes">_Manually specify range of ports to listen on:</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">False</property>
- <property name="use-underline">True</property>
- <property name="draw-indicator">True</property>
+ <property name="label" translatable="1">_Manually specify range of ports to listen on:</property> + <property name="focusable">1</property> + <property name="use-underline">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkBox" id="ports_range_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="spacing">6</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">_Start:</property>
- <property name="use-underline">True</property>
+ <property name="label" translatable="1">_Start:</property> + <property name="use-underline">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkSpinButton" id="ports_range_start">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="text" translatable="yes">0</property>
+ <property name="focusable">1</property> + <property name="text" translatable="1">0</property> <property name="adjustment">ports_range_start.adjustment</property>
- <property name="numeric">True</property>
+ <property name="numeric">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">_End:</property>
- <property name="use-underline">True</property>
+ <property name="label" translatable="1">_End:</property> + <property name="use-underline">1</property> <property name="mnemonic-widget">ports_range_end</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
<object class="GtkSpinButton" id="ports_range_end">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="text" translatable="yes">0</property>
+ <property name="focusable">1</property> + <property name="text" translatable="1">0</property> <property name="adjustment">ports_range_end.adjustment</property>
- <property name="numeric">True</property>
+ <property name="numeric">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <object class="HdyPreferencesGroup">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="title" translatable="yes">Relay Server (TURN)</property>
+ <object class="AdwPreferencesGroup"> + <property name="title" translatable="1">Relay Server (TURN)</property> - <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="margin-start">12</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="spacing">6</property>
<object class="GtkLabel" id="label10">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">_TURN server:</property>
- <property name="use-underline">True</property>
+ <property name="label" translatable="1">_TURN server:</property> + <property name="use-underline">1</property> <property name="mnemonic-widget">turn_server</property>
<property name="xalign">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkEntry" id="turn_server">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <signal name="focus-out-event" handler="network_turn_server_changed_cb" swapped="no"/>
+ <property name="focusable">1</property> + <object class="GtkEventControllerFocus"> + <signal name="leave" handler="network_turn_server_changed_cb" swapped="no"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">_UDP Port:</property>
- <property name="use-underline">True</property>
+ <property name="label" translatable="1">_UDP Port:</property> + <property name="use-underline">1</property> <property name="mnemonic-widget">turn_port_udp</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
<object class="GtkSpinButton" id="turn_port_udp">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
+ <property name="focusable">1</property> <property name="adjustment">turn_port_udp.adjustment</property>
- <property name="numeric">True</property>
+ <property name="numeric">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">T_CP Port:</property>
- <property name="use-underline">True</property>
+ <property name="label" translatable="1">T_CP Port:</property> + <property name="use-underline">1</property> <property name="mnemonic-widget">turn_port_tcp</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">4</property>
<object class="GtkSpinButton" id="turn_port_tcp">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
+ <property name="focusable">1</property> <property name="adjustment">turn_port_tcp.adjustment</property>
- <property name="numeric">True</property>
+ <property name="numeric">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">5</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="spacing">6</property>
<object class="GtkLabel" id="label11">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Use_rname:</property>
- <property name="use-underline">True</property>
+ <property name="label" translatable="1">Use_rname:</property> + <property name="use-underline">1</property> <property name="mnemonic-widget">turn_username</property>
<property name="xalign">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkEntry" id="turn_username">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
+ <property name="focusable">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Pass_word:</property>
- <property name="use-underline">True</property>
+ <property name="label" translatable="1">Pass_word:</property> + <property name="use-underline">1</property> <property name="mnemonic-widget">turn_password</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- <object class="GtkEntry" id="turn_password">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="visibility">False</property>
- <property name="invisible-char">●</property>
- <property name="input-purpose">password</property>
+ <object class="GtkPasswordEntry" id="turn_password"> + <property name="focusable">1</property> + <property name="show-peek-icon">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
<object class="GtkSizeGroup" id="sg">
--- a/pidgin/resources/Prefs/vv.ui Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/resources/Prefs/vv.ui Sun Aug 28 22:18:46 2022 -0500
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
Pidgin - Internet Messenger
Copyright (C) Pidgin Developers <devel@pidgin.im>
@@ -15,12 +14,11 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+along with this program; if not, see <https://www.gnu.org/licenses/>. - <requires lib="gtk+" version="3.22"/>
+ <requires lib="gtk" version="4.0"/> + <requires lib="Adw" version="1.0"/> <!-- interface-license-type gplv2 -->
<!-- interface-name Pidgin -->
<!-- interface-description Internet Messenger -->
@@ -67,50 +65,29 @@
<column type="gchararray"/>
- <template class="PidginVVPrefs" parent="HdyPreferencesPage">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
+ <template class="PidginVVPrefs" parent="AdwPreferencesPage"> - <object class="HdyPreferencesGroup">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="title" translatable="yes">Audio</property>
+ <object class="AdwPreferencesGroup"> + <property name="title" translatable="1">Audio</property> - <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="margin-start">12</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<object class="GtkFrame">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
+ <property name="child"> - <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="margin-start">12</property>
<property name="spacing">6</property>
<object class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" context="Device for Audio Input">Device</property>
+ <property name="label" translatable="1" context="Device for Audio Input">Device</property> <property name="xalign">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkComboBox" id="voice.input.combo">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="id-column">1</property>
<property name="model">voice.input.store</property>
@@ -120,60 +97,33 @@
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" context="Input for Audio">Input</property>
+ <property name="label" translatable="1" context="Input for Audio">Input</property> - <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkFrame">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
+ <property name="child"> - <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="margin-start">12</property>
<property name="spacing">6</property>
<object class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" context="Device for Audio Output">Device</property>
+ <property name="label" translatable="1" context="Device for Audio Output">Device</property> <property name="xalign">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkComboBox" id="voice.output.combo">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="id-column">1</property>
<property name="model">voice.output.store</property>
@@ -183,195 +133,93 @@
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" context="Output for Audio">Output</property>
+ <property name="label" translatable="1" context="Output for Audio">Output</property> - <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="spacing">6</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Volume:</property>
+ <property name="label" translatable="1">Volume:</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkVolumeButton" id="voice.volume">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="focus-on-click">False</property>
- <property name="receives-default">True</property>
- <property name="relief">none</property>
+ <property name="focusable">1</property> + <property name="focus-on-click">0</property> + <property name="receives-default">1</property> <property name="orientation">vertical</property>
<property name="adjustment">adjustment2</property>
<signal name="value-changed" handler="volume_changed_cb" swapped="no"/>
- <child internal-child="plus_button">
- <object class="GtkButton">
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="halign">center</property>
- <property name="valign">center</property>
- <property name="relief">none</property>
- <child internal-child="minus_button">
- <object class="GtkButton">
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="halign">center</property>
- <property name="valign">center</property>
- <property name="relief">none</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
<object class="GtkLabel" id="voice.threshold_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Silence threshold:</property>
+ <property name="label" translatable="1">Silence threshold:</property> <property name="xalign">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
<object class="GtkScale" id="voice.threshold">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
+ <property name="focusable">1</property> <property name="adjustment">adjustment1</property>
<property name="round-digits">0</property>
<property name="digits">0</property>
- <property name="draw-value">False</property>
<signal name="value-changed" handler="threshold_value_changed_cb" object="PidginVVPrefs" swapped="no"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">4</property>
<object class="GtkToggleButton" id="voice.test">
- <property name="label" translatable="yes">Test Audio</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
+ <property name="label" translatable="1">Test Audio</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> <signal name="toggled" handler="toggle_voice_test_cb" object="PidginVVPrefs" swapped="no"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">5</property>
<object class="GtkProgressBar" id="voice.level">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
+ <property name="sensitive">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">6</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- <object class="HdyPreferencesGroup">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="title" translatable="yes">Video</property>
+ <object class="AdwPreferencesGroup"> + <property name="title" translatable="1">Video</property> - <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="margin-start">12</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<object class="GtkFrame">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
+ <property name="child"> - <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="margin-start">12</property>
<property name="spacing">6</property>
<object class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" context="Device for Video Input">Device</property>
+ <property name="label" translatable="1" context="Device for Video Input">Device</property> <property name="xalign">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkComboBox" id="video.input.combo">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="id-column">1</property>
<property name="model">video.input.store</property>
@@ -381,60 +229,33 @@
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" context="Input for Video">Input</property>
+ <property name="label" translatable="1" context="Input for Video">Input</property> - <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkFrame">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
+ <property name="child"> - <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="margin-start">12</property>
<property name="spacing">6</property>
<object class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" context="Device for Video Output">Device</property>
+ <property name="label" translatable="1" context="Device for Video Output">Device</property> <property name="xalign">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkComboBox" id="video.output.combo">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="id-column">1</property>
<property name="model">video.output.store</property>
@@ -444,70 +265,40 @@
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" context="Output for Video">Output</property>
+ <property name="label" translatable="1" context="Output for Video">Output</property> - <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
<object class="GtkAspectFrame" id="video.frame">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
+ <property name="valign">fill</property> + <property name="vexpand">1</property> <property name="ratio">1.33</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">2</property>
<object class="GtkToggleButton" id="video.test">
- <property name="label" translatable="yes">Test Video</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
+ <property name="label" translatable="1">Test Video</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> <signal name="toggled" handler="toggle_video_test_cb" object="PidginVVPrefs" swapped="no"/>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
<object class="GtkSizeGroup" id="sg">
--- a/pidgin/resources/Xfer/xfer.ui Tue Aug 23 01:09:33 2022 -0500
+++ b/pidgin/resources/Xfer/xfer.ui Sun Aug 28 22:18:46 2022 -0500
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
Pidgin - Internet Messenger
Copyright (C) Pidgin Developers <devel@pidgin.im>
@@ -15,12 +14,10 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+along with this library; if not, see <https://www.gnu.org/licenses/>. - <requires lib="gtk+" version="3.22"/>
+ <requires lib="gtk" version="4.0"/> <!-- interface-license-type gplv2 -->
<!-- interface-name Pidgin -->
<!-- interface-description Internet Messenger -->
@@ -42,105 +39,26 @@
<template class="PidginXferDialog" parent="GtkDialog">
- <property name="can-focus">False</property>
- <property name="title" translatable="yes">File Transfer</property>
- <property name="role">file transfer</property>
+ <property name="title" translatable="1">File Transfer</property> <property name="default-width">450</property>
<property name="default-height">250</property>
- <property name="type-hint">normal</property>
- <signal name="delete-event" handler="delete_win_cb" swapped="no"/>
- <child internal-child="vbox">
+ <signal name="close-request" handler="close_request_cb" swapped="no"/> + <child internal-child="content_area"> - <property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
- <child internal-child="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <object class="GtkButton" id="open_button">
- <property name="label" translatable="yes">_Open</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-underline">True</property>
- <signal name="clicked" handler="open_button_cb" object="PidginXferDialog" swapped="no"/>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- <object class="GtkButton" id="remove_button">
- <property name="label" translatable="yes">_Remove</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-underline">True</property>
- <signal name="clicked" handler="remove_button_cb" object="PidginXferDialog" swapped="no"/>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- <object class="GtkButton" id="stop_button">
- <property name="label" translatable="yes">_Stop</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-underline">True</property>
- <signal name="clicked" handler="stop_button_cb" object="PidginXferDialog" swapped="no"/>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- <object class="GtkButton" id="close_button">
- <property name="label" translatable="yes">_Close</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-underline">True</property>
- <signal name="clicked" handler="close_button_cb" object="PidginXferDialog" swapped="no"/>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
+ <property name="vexpand">1</property> <property name="orientation">vertical</property>
<object class="GtkScrolledWindow">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="shadow-type">in</property>
+ <property name="vexpand">1</property> + <property name="focusable">1</property> <property name="min-content-height">140</property>
+ <property name="child"> <object class="GtkTreeView" id="tree">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
+ <property name="focusable">1</property> <property name="model">model</property>
<child internal-child="selection">
<object class="GtkTreeSelection">
@@ -149,7 +67,7 @@
<object class="GtkTreeViewColumn">
- <property name="resizable">True</property>
+ <property name="resizable">1</property> <property name="sizing">fixed</property>
<property name="fixed-width">25</property>
@@ -162,8 +80,8 @@
<object class="GtkTreeViewColumn">
- <property name="resizable">True</property>
- <property name="title" translatable="yes">Progress</property>
+ <property name="resizable">1</property> + <property name="title" translatable="1">Progress</property> <object class="GtkCellRendererProgress"/>
@@ -174,8 +92,8 @@
<object class="GtkTreeViewColumn">
- <property name="resizable">True</property>
- <property name="title" translatable="yes">Filename</property>
+ <property name="resizable">1</property> + <property name="title" translatable="1">Filename</property> <object class="GtkCellRendererText"/>
@@ -186,8 +104,8 @@
<object class="GtkTreeViewColumn">
- <property name="resizable">True</property>
- <property name="title" translatable="yes">Size</property>
+ <property name="resizable">1</property> + <property name="title" translatable="1">Size</property> <object class="GtkCellRendererText"/>
@@ -198,8 +116,8 @@
<object class="GtkTreeViewColumn">
- <property name="resizable">True</property>
- <property name="title" translatable="yes">Remaining</property>
+ <property name="resizable">1</property> + <property name="title" translatable="1">Remaining</property> <object class="GtkCellRendererText"/>
@@ -209,377 +127,314 @@
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
<object class="GtkCheckButton" id="keep_open">
- <property name="label" translatable="yes">Close this window when all transfers _finish</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">False</property>
- <property name="use-underline">True</property>
- <property name="draw-indicator">True</property>
+ <property name="valign">center</property> + <property name="label" translatable="1">Close this window when all transfers _finish</property> + <property name="focusable">1</property> + <property name="use-underline">1</property> <signal name="toggled" handler="toggle_keep_open_cb" swapped="no"/>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
<object class="GtkCheckButton" id="auto_clear">
- <property name="label" translatable="yes">C_lear finished transfers</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">False</property>
- <property name="use-underline">True</property>
- <property name="draw-indicator">True</property>
+ <property name="valign">center</property> + <property name="label" translatable="1">C_lear finished transfers</property> + <property name="focusable">1</property> + <property name="use-underline">1</property> <signal name="toggled" handler="toggle_clear_finished_cb" swapped="no"/>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
<object class="GtkExpander" id="expander">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">True</property>
- <property name="resize-toplevel">True</property>
+ <property name="valign">center</property> + <property name="sensitive">0</property> + <property name="focusable">1</property> + <property name="resize-toplevel">1</property> - <!-- n-columns=3 n-rows=10 -->
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="margin-start">20</property>
<property name="row-spacing">6</property>
<property name="column-spacing">6</property>
<object class="GtkLabel" id="local_user_desc_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="justify">right</property>
<property name="xalign">0</property>
- <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute> + <property name="column">0</property> + <property name="row">0</property>
- <property name="left-attach">0</property>
- <property name="top-attach">0</property>
<object class="GtkLabel" id="remote_user_desc_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="justify">right</property>
<property name="xalign">0</property>
- <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute> + <property name="column">0</property> + <property name="row">1</property>
- <property name="left-attach">0</property>
- <property name="top-attach">1</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Protocol:</property>
+ <property name="label" translatable="1">Protocol:</property> <property name="justify">right</property>
<property name="xalign">0</property>
- <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute> + <property name="column">0</property> + <property name="row">2</property>
- <property name="left-attach">0</property>
- <property name="top-attach">2</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Filename:</property>
+ <property name="label" translatable="1">Filename:</property> <property name="justify">right</property>
<property name="xalign">0</property>
- <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute> + <property name="column">0</property> + <property name="row">3</property>
- <property name="left-attach">0</property>
- <property name="top-attach">3</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Local File:</property>
+ <property name="label" translatable="1">Local File:</property> <property name="justify">right</property>
<property name="xalign">0</property>
- <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute> + <property name="column">0</property> + <property name="row">4</property>
- <property name="left-attach">0</property>
- <property name="top-attach">4</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Status:</property>
+ <property name="label" translatable="1">Status:</property> <property name="justify">right</property>
<property name="xalign">0</property>
- <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute> + <property name="column">0</property> + <property name="row">5</property>
- <property name="left-attach">0</property>
- <property name="top-attach">5</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Speed:</property>
+ <property name="label" translatable="1">Speed:</property> <property name="justify">right</property>
<property name="xalign">0</property>
- <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute> + <property name="column">0</property> + <property name="row">6</property>
- <property name="left-attach">0</property>
- <property name="top-attach">6</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Time Elapsed:</property>
+ <property name="label" translatable="1">Time Elapsed:</property> <property name="justify">right</property>
<property name="xalign">0</property>
- <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute> + <property name="column">0</property> + <property name="row">7</property>
- <property name="left-attach">0</property>
- <property name="top-attach">7</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Time Remaining:</property>
+ <property name="label" translatable="1">Time Remaining:</property> <property name="justify">right</property>
<property name="xalign">0</property>
- <attribute name="weight" value="bold"/>
+ <attribute name="weight" value="bold"></attribute> + <property name="column">0</property> + <property name="row">8</property>
- <property name="left-attach">0</property>
- <property name="top-attach">8</property>
<object class="GtkLabel" id="local_user_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hexpand">True</property>
+ <property name="hexpand">1</property> <property name="xalign">0</property>
+ <property name="column">1</property> + <property name="row">0</property>
- <property name="left-attach">1</property>
- <property name="top-attach">0</property>
<object class="GtkLabel" id="remote_user_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hexpand">True</property>
+ <property name="hexpand">1</property> <property name="xalign">0</property>
+ <property name="column">1</property> + <property name="row">1</property>
- <property name="left-attach">1</property>
- <property name="top-attach">1</property>
<object class="GtkLabel" id="protocol_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="justify">right</property>
<property name="xalign">0</property>
+ <property name="column">1</property> + <property name="row">2</property>
- <property name="left-attach">1</property>
- <property name="top-attach">2</property>
<object class="GtkLabel" id="filename_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="justify">right</property>
<property name="xalign">0</property>
+ <property name="column">1</property> + <property name="row">3</property>
- <property name="left-attach">1</property>
- <property name="top-attach">3</property>
<object class="GtkLabel" id="localfile_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="justify">right</property>
<property name="xalign">0</property>
+ <property name="column">1</property> + <property name="row">4</property>
- <property name="left-attach">1</property>
- <property name="top-attach">4</property>
<object class="GtkLabel" id="status_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="justify">right</property>
<property name="xalign">0</property>
+ <property name="column">1</property> + <property name="row">5</property>
- <property name="left-attach">1</property>
- <property name="top-attach">5</property>
<object class="GtkLabel" id="speed_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="justify">right</property>
<property name="xalign">0</property>
+ <property name="column">1</property> + <property name="row">6</property>
- <property name="left-attach">1</property>
- <property name="top-attach">6</property>
<object class="GtkLabel" id="time_elapsed_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="justify">right</property>
<property name="xalign">0</property>
+ <property name="column">1</property> + <property name="row">7</property>
- <property name="left-attach">1</property>
- <property name="top-attach">7</property>
<object class="GtkLabel" id="time_remaining_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
<property name="justify">right</property>
<property name="xalign">0</property>
+ <property name="column">1</property> + <property name="row">8</property>
- <property name="left-attach">1</property>
- <property name="top-attach">8</property>
<object class="GtkProgressBar" id="progress">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="show-text">True</property>
+ <property name="show-text">1</property> + <property name="column">0</property> + <property name="row">9</property> + <property name="column-span">2</property>
- <property name="left-attach">0</property>
- <property name="top-attach">9</property>
- <property name="width">2</property>
<object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">File transfer _details</property>
- <property name="use-underline">True</property>
+ <property name="label" translatable="1">File transfer _details</property> + <property name="use-underline">1</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">3</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <object class="GtkButton" id="open_button"> + <property name="label" translatable="1">_Open</property> + <property name="sensitive">0</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> + <property name="use-underline">1</property> + <signal name="clicked" handler="open_button_cb" object="PidginXferDialog" swapped="no"/> + <object class="GtkButton" id="remove_button"> + <property name="label" translatable="1">_Remove</property> + <property name="sensitive">0</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> + <property name="use-underline">1</property> + <signal name="clicked" handler="remove_button_cb" object="PidginXferDialog" swapped="no"/> + <object class="GtkButton" id="stop_button"> + <property name="label" translatable="1">_Stop</property> + <property name="sensitive">0</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> + <property name="use-underline">1</property> + <signal name="clicked" handler="stop_button_cb" object="PidginXferDialog" swapped="no"/> + <object class="GtkButton" id="close_button"> + <property name="label" translatable="1">_Close</property> + <property name="focusable">1</property> + <property name="receives-default">1</property> + <property name="use-underline">1</property> + <signal name="clicked" handler="close_button_cb" object="PidginXferDialog" swapped="no"/>