pidgin/pidgin

Move minidialog stuff from utils to its source file

2021-07-22, Elliott Sales de Andrade
d92defc9ba95
Parents 7988932faf91
Children 3a973a9c5a64
Move minidialog stuff from utils to its source file

* Remove minidialog list from utils.
It's supposed to be used to delete them when the connection is dropped, but this list is never added to. And the dialogs are automatically closed when the account disconnects in some other way that I could not find.
Consequently, drop the unused `gc` from `pidgin_make_mini_dialog*`.
* Replace `PidginUtilMiniDialogCallback` by `PidginMiniDialogCallback`.
It is just a wrapper around the latter, with different argument order.
* Move minidialog wrappers from utils to `minidialog.c`. And fix naming/arguments to match the existing functions.

Testing Done:
Compiled, connected an account that had buddy requests, but didn't act on them.

Reviewed at https://reviews.imfreedom.org/r/788/
--- a/ChangeLog.API Thu Jul 22 22:32:11 2021 -0500
+++ b/ChangeLog.API Thu Jul 22 22:33:54 2021 -0500
@@ -670,6 +670,9 @@
* PALETTE_NUM_COLORS renamed to PIDGIN_PALETTE_NUM_COLORS
* pidgin_account_option_menu_* renamed to
pidgin_account_chooser_*
+ * pidgin_make_mini_dialog renamed to
+ pidgin_mini_dialog_new_with_buttons; note the argument order
+ has changed to match pidgin_mini_dialog_new
* pidgin_new_item_from_stock renamed to pidgin_new_menu_item and
removed the accel related parameters.
* pidgin_setup_screenname_autocomplete now takes a filter function and
@@ -750,6 +753,8 @@
* pidgin_create_window, use pidgin_window_new instead.
* PIDGIN_DIALOG
* pidgin_dialogs_alias_contact
+ * pidgin_make_mini_dialog_with_custom_icon; use
+ pidgin_mini_dialog_new_with_custom_icon instead.
* pidgin_make_pretty_arrows
* pidgin_menu_position_func_helper
* pidgin_mini_dialog_links_supported
@@ -796,6 +801,8 @@
* pidgin_tooltip_setup_for_widget
* pidgin_tooltip_show
* PidginThemeFont
+ * PidginUtilMiniDialogCallback; use PidginMiniDialogCallback
+ instead
* struct _GtkIMHtmlAnimation
* struct _GtkIMHtmlFontDetail
* struct _GtkIMHtmlHr
--- a/pidgin/gtkaccount.c Thu Jul 22 22:32:11 2021 -0500
+++ b/pidgin/gtkaccount.c Thu Jul 22 22:33:54 2021 -0500
@@ -2422,16 +2422,21 @@
}
static void
-free_add_user_data(PidginAccountAddUserData *data)
+free_add_user_data(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+ G_GNUC_UNUSED GtkButton *button,
+ gpointer user_data)
{
+ PidginAccountAddUserData *data = user_data;
g_free(data->username);
g_free(data->alias);
g_free(data);
}
static void
-add_user_cb(PidginAccountAddUserData *data)
+add_user_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+ G_GNUC_UNUSED GtkButton *button, gpointer user_data)
{
+ PidginAccountAddUserData *data = user_data;
PurpleConnection *gc = purple_account_get_connection(data->account);
if (g_list_find(purple_connections_get_all(), gc))
@@ -2440,7 +2445,7 @@
NULL, data->alias);
}
- free_add_user_data(data);
+ free_add_user_data(NULL, NULL, user_data);
}
static char *
@@ -2476,8 +2481,9 @@
gc = purple_account_get_connection(account);
buffer = make_info(account, gc, remote_user, id, alias, msg);
- alert = pidgin_make_mini_dialog(gc, "dialog-information", buffer,
- NULL, NULL, _("Close"), NULL, NULL);
+ alert = pidgin_mini_dialog_new_with_buttons(
+ buffer, NULL, "dialog-information", NULL,
+ _("Close"), NULL, NULL);
pidgin_blist_add_alert(alert);
g_free(buffer);
@@ -2501,10 +2507,9 @@
data->alias = g_strdup(alias);
buffer = make_info(account, gc, remote_user, id, alias, msg);
- alert = pidgin_make_mini_dialog(gc, "dialog-question",
- _("Add buddy to your list?"), buffer, data,
- _("Add"), G_CALLBACK(add_user_cb),
- _("Cancel"), G_CALLBACK(free_add_user_data), NULL);
+ alert = pidgin_mini_dialog_new_with_buttons(
+ _("Add buddy to your list?"), buffer, "dialog-question", data,
+ _("Add"), add_user_cb, _("Cancel"), free_add_user_data, NULL);
pidgin_blist_add_alert(alert);
g_free(buffer);
@@ -2545,8 +2550,10 @@
}
static void
-authorize_reason_cb(struct auth_request *ar)
+authorize_reason_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+ G_GNUC_UNUSED GtkButton *button, gpointer user_data)
{
+ struct auth_request *ar = user_data;
PurpleProtocol *protocol = purple_account_get_protocol(ar->account);
if (protocol && (purple_protocol_get_options(protocol) & OPT_PROTO_AUTHORIZATION_GRANTED_MESSAGE)) {
@@ -2584,8 +2591,10 @@
}
static void
-deny_reason_cb(struct auth_request *ar)
+deny_reason_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+ G_GNUC_UNUSED GtkButton *button, gpointer user_data)
{
+ struct auth_request *ar = user_data;
PurpleProtocol *protocol = purple_account_get_protocol(ar->account);
if (protocol && (purple_protocol_get_options(protocol) & OPT_PROTO_AUTHORIZATION_DENIED_MESSAGE)) {
@@ -2621,8 +2630,8 @@
}
static void
-send_im_cb(PidginMiniDialog *mini_dialog,
- GtkButton *button,
+send_im_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+ G_GNUC_UNUSED GtkButton *button,
gpointer data)
{
struct auth_request *ar = data;
@@ -2694,17 +2703,15 @@
aa->account = account;
aa->add_buddy_after_auth = !on_list;
- alert = pidgin_make_mini_dialog_with_custom_icon(
- gc, protocol_icon,
- _("Authorize buddy?"), NULL, aa,
- _("Authorize"), authorize_reason_cb,
- _("Deny"), deny_reason_cb,
- NULL);
-
- dialog = PIDGIN_MINI_DIALOG(alert);
+ dialog = pidgin_mini_dialog_new_with_custom_icon(
+ _("Authorize buddy?"), NULL, protocol_icon);
+ alert = GTK_WIDGET(dialog);
+
pidgin_mini_dialog_enable_description_markup(dialog);
pidgin_mini_dialog_set_link_callback(dialog, G_CALLBACK(get_user_info_cb), aa);
pidgin_mini_dialog_set_description(dialog, buffer);
+ pidgin_mini_dialog_add_button(dialog, _("Authorize"), authorize_reason_cb, aa);
+ pidgin_mini_dialog_add_button(dialog, _("Deny"), deny_reason_cb, aa);
pidgin_mini_dialog_add_non_closing_button(dialog, _("Send Instant Message"), send_im_cb, aa);
g_signal_connect_swapped(G_OBJECT(alert), "destroy", G_CALLBACK(free_auth_request), aa);
--- a/pidgin/gtkblist.c Thu Jul 22 22:32:11 2021 -0500
+++ b/pidgin/gtkblist.c Thu Jul 22 22:33:54 2021 -0500
@@ -4266,15 +4266,30 @@
/* Generic error buttons */
static void
-generic_error_modify_cb(PurpleAccount *account)
-{
+generic_account_connect_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+ G_GNUC_UNUSED GtkButton *button,
+ gpointer user_data)
+{
+ PurpleAccount *account = user_data;
+ purple_account_connect(account);
+}
+
+static void
+generic_error_modify_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+ G_GNUC_UNUSED GtkButton *button,
+ gpointer user_data)
+{
+ PurpleAccount *account = user_data;
purple_account_clear_current_error(account);
pidgin_account_dialog_show(PIDGIN_MODIFY_ACCOUNT_DIALOG, account);
}
static void
-generic_error_enable_cb(PurpleAccount *account)
-{
+generic_error_enable_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+ G_GNUC_UNUSED GtkButton *button,
+ gpointer user_data)
+{
+ PurpleAccount *account = user_data;
purple_account_clear_current_error(account);
purple_account_set_enabled(account, purple_core_get_ui(), TRUE);
}
@@ -4316,12 +4331,11 @@
else
primary = g_strdup_printf(_("%s disabled"), username);
- mini_dialog = pidgin_make_mini_dialog(NULL, "dialog-error",
- primary, err->description, account,
- (enabled ? _("Reconnect") : _("Re-enable")),
- (enabled ? PURPLE_CALLBACK(purple_account_connect)
- : PURPLE_CALLBACK(generic_error_enable_cb)),
- _("Modify Account"), PURPLE_CALLBACK(generic_error_modify_cb),
+ mini_dialog = pidgin_mini_dialog_new_with_buttons(
+ primary, err->description, "dialog-error", account,
+ enabled ? _("Reconnect") : _("Re-enable"),
+ enabled ? generic_account_connect_cb : generic_error_enable_cb,
+ _("Modify Account"), generic_error_modify_cb,
NULL);
g_free(primary);
--- a/pidgin/gtkutils.c Thu Jul 22 22:32:11 2021 -0500
+++ b/pidgin/gtkutils.c Thu Jul 22 22:33:54 2021 -0500
@@ -110,18 +110,11 @@
gpointer data;
};
-struct _old_button_clicked_cb_data
-{
- PidginUtilMiniDialogCallback cb;
- gpointer data;
-};
-
/******************************************************************************
* Globals
*****************************************************************************/
static guint accels_save_timer = 0;
-static GSList *minidialogs = NULL;
/******************************************************************************
* Code
@@ -1687,116 +1680,6 @@
return NULL;
}
-static void *
-pidgin_utils_get_handle(void)
-{
- static int handle;
-
- return &handle;
-}
-
-static void connection_signed_off_cb(PurpleConnection *gc)
-{
- GSList *list, *l_next;
- for (list = minidialogs; list; list = l_next) {
- l_next = list->next;
- if (g_object_get_data(G_OBJECT(list->data), "gc") == gc) {
- gtk_widget_destroy(GTK_WIDGET(list->data));
- }
- }
-}
-
-static void alert_killed_cb(GtkWidget *widget)
-{
- minidialogs = g_slist_remove(minidialogs, widget);
-}
-
-static void
-old_mini_dialog_button_clicked_cb(PidginMiniDialog *mini_dialog,
- GtkButton *button,
- gpointer user_data)
-{
- struct _old_button_clicked_cb_data *data = user_data;
- data->cb(data->data, button);
-}
-
-static void
-old_mini_dialog_destroy_cb(GtkWidget *dialog,
- GList *cb_datas)
-{
- g_list_free_full(cb_datas, g_free);
-}
-
-static void
-mini_dialog_init(PidginMiniDialog *mini_dialog, PurpleConnection *gc, void *user_data, va_list args)
-{
- const char *button_text;
- GList *cb_datas = NULL;
- static gboolean first_call = TRUE;
-
- if (first_call) {
- first_call = FALSE;
- purple_signal_connect(purple_connections_get_handle(), "signed-off",
- pidgin_utils_get_handle(),
- PURPLE_CALLBACK(connection_signed_off_cb), NULL);
- }
-
- g_object_set_data(G_OBJECT(mini_dialog), "gc" ,gc);
- g_signal_connect(G_OBJECT(mini_dialog), "destroy",
- G_CALLBACK(alert_killed_cb), NULL);
-
- while ((button_text = va_arg(args, char*))) {
- struct _old_button_clicked_cb_data *data = NULL;
- PidginMiniDialogCallback wrapper_cb = NULL;
- PidginUtilMiniDialogCallback callback =
- va_arg(args, PidginUtilMiniDialogCallback);
-
- if (callback != NULL) {
- data = g_new0(struct _old_button_clicked_cb_data, 1);
- data->cb = callback;
- data->data = user_data;
- wrapper_cb = old_mini_dialog_button_clicked_cb;
- }
- pidgin_mini_dialog_add_button(mini_dialog, button_text,
- wrapper_cb, data);
- cb_datas = g_list_append(cb_datas, data);
- }
-
- g_signal_connect(G_OBJECT(mini_dialog), "destroy",
- G_CALLBACK(old_mini_dialog_destroy_cb), cb_datas);
-}
-
-#define INIT_AND_RETURN_MINI_DIALOG(mini_dialog) \
- va_list args; \
- va_start(args, user_data); \
- mini_dialog_init(mini_dialog, gc, user_data, args); \
- va_end(args); \
- return GTK_WIDGET(mini_dialog);
-
-GtkWidget *
-pidgin_make_mini_dialog(PurpleConnection *gc,
- const char *icon_name,
- const char *primary,
- const char *secondary,
- void *user_data,
- ...)
-{
- PidginMiniDialog *mini_dialog = pidgin_mini_dialog_new(primary, secondary, icon_name);
- INIT_AND_RETURN_MINI_DIALOG(mini_dialog);
-}
-
-GtkWidget *
-pidgin_make_mini_dialog_with_custom_icon(PurpleConnection *gc,
- GdkPixbuf *custom_icon,
- const char *primary,
- const char *secondary,
- void *user_data,
- ...)
-{
- PidginMiniDialog *mini_dialog = pidgin_mini_dialog_new_with_custom_icon(primary, secondary, custom_icon);
- INIT_AND_RETURN_MINI_DIALOG(mini_dialog);
-}
-
/*
* "This is so dead sexy."
* "Two thumbs up."
--- a/pidgin/gtkutils.h Thu Jul 22 22:32:11 2021 -0500
+++ b/pidgin/gtkutils.h Thu Jul 22 22:33:54 2021 -0500
@@ -416,73 +416,6 @@
gpointer pidgin_convert_buddy_icon(PurpleProtocol *protocol, const char *path, size_t *len);
/**
- * PidginUtilMiniDialogCallback:
- *
- * The type of callbacks passed to pidgin_make_mini_dialog().
- */
-typedef void (*PidginUtilMiniDialogCallback)(gpointer user_data, GtkButton *button);
-
-/**
- * pidgin_make_mini_dialog:
- * @handle: The #PurpleConnection to which this mini-dialog
- * refers, or %NULL if it does not refer to a
- * connection. If @handle is supplied, the mini-dialog
- * will be automatically removed and destroyed when the
- * connection signs off.
- * @stock_id: The ID of a stock image to use in the mini dialog.
- * @primary: The primary text
- * @secondary: The secondary text, or %NULL for no description.
- * @user_data: Data to pass to the callbacks
- * @...: a %NULL-terminated list of button labels
- * (<type>char *</type>) and callbacks
- * (#PidginUtilMiniDialogCallback). @user_data will be
- * passed as the first argument. (Callbacks may lack a
- * second argument, or be %NULL to take no action when
- * the corresponding button is pressed.) When a button is
- * pressed, the callback (if any) will be called; when
- * the callback returns the dialog will be destroyed.
- *
- * Creates a #PidginMiniDialog, tied to a #PurpleConnection, suitable for
- * embedding in the buddy list scrollbook with pidgin_blist_add_alert().
- *
- * See <link linkend="pidgin-pidginstock">Stock Resources</link>.
- *
- * Returns: (transfer full): A #PidginMiniDialog, suitable for passing to
- * pidgin_blist_add_alert().
- */
-GtkWidget *pidgin_make_mini_dialog(PurpleConnection *handle,
- const char* stock_id, const char *primary, const char *secondary,
- void *user_data, ...) G_GNUC_NULL_TERMINATED;
-
-/**
- * pidgin_make_mini_dialog_with_custom_icon:
- * @custom_icon: A custom GdkPixbuf to use.
- * @primary: The primary text
- * @secondary: The secondary text, or %NULL for no description.
- * @user_data: Data to pass to the callbacks
- * @...: a %NULL-terminated list of button labels
- * (<type>char *</type>) and callbacks
- * (#PidginUtilMiniDialogCallback). @user_data will be
- * passed as the first argument. (Callbacks may lack a
- * second argument, or be %NULL to take no action when
- * the corresponding button is pressed.) When a button is
- * pressed, the callback (if any) will be called; when
- * the callback returns the dialog will be destroyed.
- *
- * Does exactly what pidgin_make_mini_dialog() does, except you can specify
- * a custom icon for the dialog.
- *
- * Returns: (transfer full): A #PidginMiniDialog, suitable for passing to
- * pidgin_blist_add_alert().
- */
-GtkWidget *pidgin_make_mini_dialog_with_custom_icon(PurpleConnection *gc,
- GdkPixbuf *custom_icon,
- const char *primary,
- const char *secondary,
- void *user_data,
- ...) G_GNUC_NULL_TERMINATED;
-
-/**
* pidgin_tree_view_search_equal_func:
*
* This is a callback function to be used for Ctrl+F searching in treeviews.
--- a/pidgin/minidialog.c Thu Jul 22 22:32:11 2021 -0500
+++ b/pidgin/minidialog.c Thu Jul 22 22:33:54 2021 -0500
@@ -379,6 +379,31 @@
return mini_dialog;
}
+GtkWidget *
+pidgin_mini_dialog_new_with_buttons(const gchar *title,
+ const gchar *description,
+ const gchar *icon_name, gpointer user_data,
+ ...)
+{
+ PidginMiniDialog *mini_dialog = NULL;
+ const gchar *button_text = NULL;
+ va_list args;
+
+ mini_dialog = pidgin_mini_dialog_new(title, description, icon_name);
+
+ va_start(args, user_data);
+ while ((button_text = va_arg(args, gchar *)) != NULL) {
+ PidginMiniDialogCallback callback =
+ va_arg(args, PidginMiniDialogCallback);
+
+ pidgin_mini_dialog_add_button(mini_dialog, button_text, callback,
+ user_data);
+ }
+ va_end(args);
+
+ return GTK_WIDGET(mini_dialog);
+}
+
void
pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog, const gchar *title)
{
--- a/pidgin/minidialog.h Thu Jul 22 22:32:11 2021 -0500
+++ b/pidgin/minidialog.h Thu Jul 22 22:33:54 2021 -0500
@@ -124,6 +124,32 @@
const gchar *description, GdkPixbuf *custom_icon);
/**
+ * pidgin_mini_dialog_new_with_buttons:
+ * @title: The primary text.
+ * @description: The secondary text, or %NULL for no description.
+ * @icon_name: The name of an icon to use in the mini dialog.
+ * @user_data: Data to pass to the callbacks.
+ * @...: A %NULL-terminated list of button labels (<type>char *</type>) and
+ * callbacks (#PidginMiniDialogCallback). (Callbacks may be %NULL to
+ * take no action when the corresponding button is pressed.) When a
+ * button is pressed, the callback (if any) will be called; when the
+ * callback returns the dialog will be destroyed.
+ *
+ * Creates a #PidginMiniDialog, suitable for embedding in the buddy list
+ * scrollbook with pidgin_blist_add_alert().
+ *
+ * Returns: (transfer full): A #PidginMiniDialog, suitable for passing to
+ * pidgin_blist_add_alert().
+ *
+ * Since: 3.0.0
+ */
+GtkWidget *pidgin_mini_dialog_new_with_buttons(const gchar *title,
+ const gchar *description,
+ const gchar *icon_name,
+ gpointer user_data, ...)
+ G_GNUC_NULL_TERMINATED;
+
+/**
* pidgin_mini_dialog_set_title:
* @mini_dialog: a mini-dialog
* @title: the new title for @mini_dialog
--- a/pidgin/plugins/relnot.c Thu Jul 22 22:32:11 2021 -0500
+++ b/pidgin/plugins/relnot.c Thu Jul 22 22:33:54 2021 -0500
@@ -34,14 +34,18 @@
#define MIN_CHECK_INTERVAL 60 * 60 * 24
static void
-release_hide()
+release_hide(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+ G_GNUC_UNUSED GtkButton *button,
+ G_GNUC_UNUSED gpointer user_data)
{
/* No-op. We may use this method in the future to avoid showing
* the popup twice */
}
static void
-release_show()
+release_show(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+ G_GNUC_UNUSED GtkButton *button,
+ G_GNUC_UNUSED gpointer user_data)
{
purple_notify_uri(NULL, PURPLE_WEBSITE);
}
@@ -77,14 +81,9 @@
g_string_append_printf(message, _("You can upgrade to %s %s today."),
PIDGIN_NAME, cur_ver);
- release_dialog = pidgin_make_mini_dialog(
- NULL, "dialog-information",
- _("New Version Available"),
- message->str,
- NULL,
- _("Later"), PURPLE_CALLBACK(release_hide),
- _("Download Now"), PURPLE_CALLBACK(release_show),
- NULL);
+ release_dialog = pidgin_mini_dialog_new_with_buttons(
+ _("New Version Available"), message->str, "dialog-information", NULL,
+ _("Later"), release_hide, _("Download Now"), release_show, NULL);
pidgin_blist_add_alert(release_dialog);