--- a/ChangeLog.API Fri Nov 04 23:55:30 2022 -0500
+++ b/ChangeLog.API Fri Nov 04 23:58:18 2022 -0500
@@ -328,6 +328,10 @@
* account-added signal. Use PurpleAccountManager::added
+ * account-disabled signal. Use + PurpleAccountManager::account-changed::enabled instead. + * account-enabled signal. Use + PurpleAccountManager::account-changed::enabled instead. * account-alias-changed signal
* account-authorization-denied, account-authorization-granted,
account-authorization-requested,
--- a/doc/reference/libpurple/signals_account.md Fri Nov 04 23:55:30 2022 -0500
+++ b/doc/reference/libpurple/signals_account.md Fri Nov 04 23:58:18 2022 -0500
@@ -7,8 +7,6 @@
* [account-created](#account-created)
* [account-destroying](#account-destroying)
-* [account-disabled](#account-disabled)
-* [account-enabled](#account-enabled)
* [account-status-changed](#account-status-changed)
* [account-actions-changed](#account-actions-changed)
* [account-error-changed](#account-error-changed)
@@ -53,42 +51,6 @@
-void user_function(PurpleAccount *account, gpointer user_data);
-Emitted when an account is disabled.
-: The account that was disabled.
-: User data set when the signal handler was connected.
-----
-void user_function(PurpleAccount *account, gpointer user_data);
-Emitted when an account is enabled.
-: The account that was enabled.
-: User data set when the signal handler was connected.
-----
#### account-status-changed
--- a/finch/gntaccount.c Fri Nov 04 23:55:30 2022 -0500
+++ b/finch/gntaccount.c Fri Nov 04 23:58:18 2022 -0500
@@ -861,14 +861,6 @@
-finch_accounts_get_handle(void)
account_added_callback(G_GNUC_UNUSED PurpleAccountManager *manager,
PurpleAccount *account, G_GNUC_UNUSED gpointer data)
@@ -890,12 +882,16 @@
-account_abled_cb(PurpleAccount *account, gpointer user_data)
+account_abled_cb(G_GNUC_UNUSED PurpleAccountManager *manager, + PurpleAccount *account, + G_GNUC_UNUSED gpointer data) - if (accounts.window == NULL)
+ if(accounts.window == NULL) { gnt_tree_set_choice(GNT_TREE(accounts.tree), account,
- GPOINTER_TO_INT(user_data));
+ purple_account_get_enabled(account)); @@ -903,23 +899,17 @@
PurpleAccountManager *manager = NULL;
GListModel *manager_model = NULL;
- gpointer account_handle = NULL;
manager = purple_account_manager_get_default();
manager_model = G_LIST_MODEL(manager);
- account_handle = purple_accounts_get_handle();
g_signal_connect(manager, "added", G_CALLBACK(account_added_callback),
g_signal_connect(manager, "removed", G_CALLBACK(account_removed_callback),
- purple_signal_connect(account_handle, "account-disabled",
- finch_accounts_get_handle(),
- G_CALLBACK(account_abled_cb), GINT_TO_POINTER(FALSE));
- purple_signal_connect(account_handle, "account-enabled",
- finch_accounts_get_handle(),
- G_CALLBACK(account_abled_cb), GINT_TO_POINTER(TRUE));
+ g_signal_connect(manager, "account-changed::enabled", + G_CALLBACK(account_abled_cb), NULL); n_items = g_list_model_get_n_items(manager_model);
--- a/libpurple/account.c Fri Nov 04 23:55:30 2022 -0500
+++ b/libpurple/account.c Fri Nov 04 23:58:18 2022 -0500
@@ -1500,15 +1500,11 @@
was_enabled = account->enabled;
account->enabled = value;
+ if(was_enabled != value) { + g_object_notify_by_pspec(G_OBJECT(account), properties[PROP_ENABLED]); gc = purple_account_get_connection(account);
- if(was_enabled && !value)
- purple_signal_emit(purple_accounts_get_handle(), "account-disabled", account);
- else if(!was_enabled && value)
- purple_signal_emit(purple_accounts_get_handle(), "account-enabled", account);
- g_object_notify_by_pspec(G_OBJECT(account), properties[PROP_ENABLED]);
if ((gc != NULL) && (_purple_connection_wants_to_die(gc)))
--- a/libpurple/accounts.c Fri Nov 04 23:55:30 2022 -0500
+++ b/libpurple/accounts.c Fri Nov 04 23:58:18 2022 -0500
@@ -680,14 +680,6 @@
void *handle = purple_accounts_get_handle();
void *conn_handle = purple_connections_get_handle();
- purple_signal_register(handle, "account-disabled",
- purple_marshal_VOID__POINTER, G_TYPE_NONE, 1,
- purple_signal_register(handle, "account-enabled",
- purple_marshal_VOID__POINTER, G_TYPE_NONE, 1,
purple_signal_register(handle, "account-created",
purple_marshal_VOID__POINTER, G_TYPE_NONE, 1,
--- a/libpurple/purpleaccountmanager.c Fri Nov 04 23:55:30 2022 -0500
+++ b/libpurple/purpleaccountmanager.c Fri Nov 04 23:58:18 2022 -0500
@@ -26,6 +26,7 @@
static guint signals[N_SIGNALS] = {0, };
@@ -39,6 +40,24 @@
static PurpleAccountManager *default_manager = NULL;
/******************************************************************************
+ *****************************************************************************/ +/* This is the callback for the notify signal on accounts. It re-emits the + * signal as coming from the manager and passes the account as a parameter to + * the callback. It supports details as well so you can use + * g_signal_connect(manager, "account-changed::enabled", ...) to just get + * called when an account's enabled property changes. +purple_account_manager_account_notify_cb(GObject *source, GParamSpec *pspec, + g_signal_emit(data, signals[SIG_ACCOUNT_CHANGED], + g_param_spec_get_name_quark(pspec), +/****************************************************************************** * GListModel Implementation
*****************************************************************************/
@@ -144,6 +163,33 @@
+ * PurpleAccountManager::account-changed: + * @manager: The account manager instance. + * @account: The account that was changed. + * This is a propagation of the notify signal from @account. This means + * that your callback will be called for any account that @manager knows + * This also supports details, so you can specify the signal name as + * something like `account-changed::enabled` and your callback will only + * be called when the enabled property of @account has been changed. + signals[SIG_ACCOUNT_CHANGED] = g_signal_new_class_handler( + G_OBJECT_CLASS_TYPE(klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, /******************************************************************************
@@ -193,6 +239,11 @@
g_ptr_array_insert(manager->accounts, 0, account);
+ /* Connect to the signals of the account that we want to propagate. */ + g_signal_connect_object(account, "notify", + G_CALLBACK(purple_account_manager_account_notify_cb), purple_accounts_schedule_save();
g_signal_emit(manager, signals[SIG_ADDED], 0, account);
--- a/pidgin/pidginaccountsdisabledmenu.c Fri Nov 04 23:55:30 2022 -0500
+++ b/pidgin/pidginaccountsdisabledmenu.c Fri Nov 04 23:58:18 2022 -0500
@@ -62,7 +62,8 @@
-pidgin_accounts_disabled_menu_changed_cb(G_GNUC_UNUSED PurpleAccount *account,
+pidgin_accounts_disabled_menu_changed_cb(G_GNUC_UNUSED PurpleAccountManager *manager, + G_GNUC_UNUSED PurpleAccount *account, PidginAccountsDisabledMenu *menu = data;
@@ -182,16 +183,11 @@
pidgin_accounts_disabled_menu_init(PidginAccountsDisabledMenu *menu) {
- gpointer handle = NULL;
+ PurpleAccountManager *manager = purple_account_manager_get_default(); - /* Wire up the purple signals we care about. */
- handle = purple_accounts_get_handle();
- purple_signal_connect(handle, "account-enabled", menu,
- G_CALLBACK(pidgin_accounts_disabled_menu_changed_cb),
- purple_signal_connect(handle, "account-disabled", menu,
- G_CALLBACK(pidgin_accounts_disabled_menu_changed_cb),
+ g_signal_connect_object(manager, "account-changed::enabled", + G_CALLBACK(pidgin_accounts_disabled_menu_changed_cb), --- a/pidgin/pidginaccountsenabledmenu.c Fri Nov 04 23:55:30 2022 -0500
+++ b/pidgin/pidginaccountsenabledmenu.c Fri Nov 04 23:58:18 2022 -0500
@@ -41,30 +41,30 @@
*****************************************************************************/
-pidgin_accounts_enabled_menu_enabled_cb(PurpleAccount *account, gpointer data) {
+pidgin_accounts_enabled_menu_changed_cb(G_GNUC_UNUSED PurpleAccountManager *manager, + PurpleAccount *account, PidginAccountsEnabledMenu *menu = data;
- /* Add the account to the start of the list. */
- g_queue_push_head(menu->accounts, g_object_ref(account));
+ if(purple_account_get_enabled(account)) { + /* Add the account to the start of the list. */ + g_queue_push_head(menu->accounts, g_object_ref(account)); - /* Tell everyone our model added a new item at position 0. */
- g_menu_model_items_changed(G_MENU_MODEL(menu), 0, 0, 1);
+ /* Tell everyone our model added a new item at position 0. */ + g_menu_model_items_changed(G_MENU_MODEL(menu), 0, 0, 1); + gint index = g_queue_index(menu->accounts, account);
-pidgin_accounts_enabled_menu_disabled_cb(PurpleAccount *account, gpointer data)
- PidginAccountsEnabledMenu *menu = data;
+ g_queue_pop_nth(menu->accounts, index); - index = g_queue_index(menu->accounts, account);
- g_queue_pop_nth(menu->accounts, index);
+ /* Tell the model that we removed one item at the given index. */ + g_menu_model_items_changed(G_MENU_MODEL(menu), index, 1, 0); - /* Tell the model that we removed one item at the given index. */
- g_menu_model_items_changed(G_MENU_MODEL(menu), index, 1, 0);
- g_object_unref(account);
+ /* Remove the reference to the account that we were holding. */ + g_object_unref(account); @@ -311,18 +311,18 @@
pidgin_accounts_enabled_menu_init(PidginAccountsEnabledMenu *menu) {
+ PurpleAccountManager *manager = NULL; menu->accounts = g_queue_new();
+ manager = purple_account_manager_get_default(); + g_signal_connect_object(manager, "account-changed::enabled", + G_CALLBACK(pidgin_accounts_enabled_menu_changed_cb), /* Wire up the purple signals we care about. */
handle = purple_accounts_get_handle();
- purple_signal_connect(handle, "account-enabled", menu,
- G_CALLBACK(pidgin_accounts_enabled_menu_enabled_cb),
- purple_signal_connect(handle, "account-disabled", menu,
- G_CALLBACK(pidgin_accounts_enabled_menu_disabled_cb),
/* For the account actions, we also need to know when an account is online