diff --git a/ChangeLog.API b/ChangeLog.API
--- a/ChangeLog.API
+++ b/ChangeLog.API
@@ -670,6 +670,9 @@ version 3.0.0 (??/??/????):
* 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 @@ version 3.0.0 (??/??/????):
* 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 @@ version 3.0.0 (??/??/????):
* pidgin_tooltip_setup_for_widget
* pidgin_tooltip_show
* PidginThemeFont
+ * PidginUtilMiniDialogCallback; use PidginMiniDialogCallback
+ instead
* struct _GtkIMHtmlAnimation
* struct _GtkIMHtmlFontDetail
* struct _GtkIMHtmlHr
diff --git a/pidgin/gtkaccount.c b/pidgin/gtkaccount.c
--- a/pidgin/gtkaccount.c
+++ b/pidgin/gtkaccount.c
@@ -2422,16 +2422,21 @@ pidgin_accounts_window_hide(void)
}
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 @@ add_user_cb(PidginAccountAddUserData *da
NULL, data->alias);
}
- free_add_user_data(data);
+ free_add_user_data(NULL, NULL, user_data);
}
static char *
@@ -2476,8 +2481,9 @@ pidgin_accounts_notify_added(PurpleAccou
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 @@ pidgin_accounts_request_add(PurpleAccoun
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 @@ authorize_noreason_cb(struct auth_reques
}
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 @@ deny_noreason_cb(struct auth_request *ar
}
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 @@ get_user_info_cb(GtkWidget *label,
}
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 @@ pidgin_accounts_request_authorization(Pu
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);
diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c
--- a/pidgin/gtkblist.c
+++ b/pidgin/gtkblist.c
@@ -4266,15 +4266,30 @@ remove_child_widget_by_account(GtkContai
/* 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 @@ add_generic_error_dialog(PurpleAccount *
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);
diff --git a/pidgin/gtkutils.h b/pidgin/gtkutils.h
--- a/pidgin/gtkutils.h
+++ b/pidgin/gtkutils.h
@@ -416,73 +416,6 @@ GtkFileChooserNative *pidgin_buddy_icon_
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
- * (char *) 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 Stock Resources.
- *
- * 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
- * (char *) 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.
diff --git a/pidgin/gtkutils.c b/pidgin/gtkutils.c
--- a/pidgin/gtkutils.c
+++ b/pidgin/gtkutils.c
@@ -110,18 +110,11 @@ struct _icon_chooser {
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 @@ pidgin_convert_buddy_icon(PurpleProtocol
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."
diff --git a/pidgin/minidialog.h b/pidgin/minidialog.h
--- a/pidgin/minidialog.h
+++ b/pidgin/minidialog.h
@@ -124,6 +124,32 @@ PidginMiniDialog *pidgin_mini_dialog_new
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 (char *) 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
diff --git a/pidgin/minidialog.c b/pidgin/minidialog.c
--- a/pidgin/minidialog.c
+++ b/pidgin/minidialog.c
@@ -379,6 +379,31 @@ pidgin_mini_dialog_new_with_custom_icon(
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)
{
diff --git a/pidgin/plugins/relnot.c b/pidgin/plugins/relnot.c
--- a/pidgin/plugins/relnot.c
+++ b/pidgin/plugins/relnot.c
@@ -34,14 +34,18 @@ static SoupSession *session = NULL;
#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 @@ version_fetch_cb(G_GNUC_UNUSED SoupSessi
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);