pidgin/pidginaccountsmenu.c

Fri, 18 Mar 2022 00:13:23 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Fri, 18 Mar 2022 00:13:23 -0500
changeset 41305
92438aae2067
parent 41209
909561f42b1f
child 41392
b5c84f55d5d2
permissions
-rw-r--r--

Remove a bunch of unused pixmaps

Testing Done:
Compiled and ran, didn't see anything missing.

It's worth noting that we've been using the logo from the resource for a long time, and the other icons were removed when we purge the `GtkStock` stuff, but there's existing items in the default icon theme for them anyways. Also we nuked the system tray stuff forever ago to.

Reviewed at https://reviews.imfreedom.org/r/1336/

/*
 * Pidgin - Internet Messenger
 * Copyright (C) Pidgin Developers <devel@pidgin.im>
 *
 * Pidgin is the legal property of its developers, whose names are too numerous
 * to list here.  Please refer to the COPYRIGHT file distributed with this
 * source distribution.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * 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, see <https://www.gnu.org/licenses/>.
 */

#include "pidginaccountsmenu.h"

#include <purple.h>

#include "pidginaccountactionsmenu.h"

#include "pidgincore.h"

struct _PidginAccountsMenu {
	GtkMenu parent;

	GtkWidget *enable_account;
	GtkWidget *disabled_menu;
	GtkWidget *separator;

	GHashTable *account_items;
	GHashTable *disabled_items;
};

/******************************************************************************
 * GSignal Handlers
 *****************************************************************************/
static void
pidgin_accounts_menu_enable_account(GtkMenuItem *item, gpointer data) {
	PurpleAccount *account = PURPLE_ACCOUNT(data);

	purple_account_set_enabled(account, PIDGIN_UI, TRUE);
}

/******************************************************************************
 * Helpers
 *****************************************************************************/
static GtkWidget *
pidgin_accounts_menu_create_account_menu_item(PidginAccountsMenu *menu,
                                              PurpleAccount *account)
{
	GtkWidget *item = NULL;
	const gchar *account_name = purple_account_get_username(account);
	const gchar *protocol_name = purple_account_get_protocol_name(account);
	gchar *label = g_strdup_printf("%s (%s)", account_name, protocol_name);

	item = gtk_menu_item_new_with_label(label);
	g_free(label);
	gtk_widget_show(item);

	return item;
}

static void
pidgin_accounts_menu_add_enabled_account(PidginAccountsMenu *menu,
                                         PurpleAccount *account)
{
	GtkWidget *item = NULL, *submenu = NULL;
	gpointer data = NULL;
	gboolean found = FALSE;

	/* if the account is in the disabled list, delete its widget */
	found = g_hash_table_lookup_extended(menu->disabled_items, account, NULL,
	                                     &data);
	if(found) {
		g_clear_pointer(&data, gtk_widget_destroy);
		g_hash_table_remove(menu->disabled_items, account);

		if(g_hash_table_size(menu->disabled_items) == 0) {
			gtk_widget_set_sensitive(menu->enable_account, FALSE);
		}
	}

	item = pidgin_accounts_menu_create_account_menu_item(menu, account);
	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
	g_hash_table_insert(menu->account_items,
	                    g_object_ref(G_OBJECT(account)),
	                    item);

	/* create the submenu and attach it to item right away, this allows us to
	 * reuse item for the submenu items.
	 */
	submenu = pidgin_account_actions_menu_new(account);
	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
}

static void
pidgin_accounts_menu_add_disabled_account(PidginAccountsMenu *menu,
                                          PurpleAccount *account)
{
	GtkWidget *item = NULL;
	gpointer data = NULL;
	gboolean found = FALSE;

	/* if the account is in the enabled list, delete its widget */
	found = g_hash_table_lookup_extended(menu->account_items, account, NULL,
	                                     &data);
	if(found) {
		g_clear_pointer(&data, gtk_widget_destroy);
		g_hash_table_remove(menu->account_items, account);
	}

	item = pidgin_accounts_menu_create_account_menu_item(menu, account);
	g_signal_connect(G_OBJECT(item), "activate",
	                 G_CALLBACK(pidgin_accounts_menu_enable_account), account);
	gtk_menu_shell_append(GTK_MENU_SHELL(menu->disabled_menu), item);

	g_hash_table_insert(menu->disabled_items,
	                    g_object_ref(G_OBJECT(account)),
	                    item);

	/* We know there's at least one item in the menu, so make sure it is
	 * sensitive.
	 */
	gtk_widget_set_sensitive(menu->enable_account, TRUE);
}

static void
pidgin_accounts_menu_foreach_cb(PurpleAccount *account, gpointer data) {
	PidginAccountsMenu *menu = PIDGIN_ACCOUNTS_MENU(data);

	if(purple_account_get_enabled(account, PIDGIN_UI)) {
		pidgin_accounts_menu_add_enabled_account(menu, account);
	} else {
		pidgin_accounts_menu_add_disabled_account(menu, account);
	}
}

static void
pidgin_accounts_menu_add_current(PidginAccountsMenu *menu) {
	PurpleAccountManager *manager = NULL;

	manager = purple_account_manager_get_default();
	purple_account_manager_foreach(manager, pidgin_accounts_menu_foreach_cb,
	                               menu);
}

/******************************************************************************
 * Purple Signal Callbacks
 *****************************************************************************/
static void
pidgin_accounts_menu_account_status_changed(PurpleAccount *account,
                                            gpointer d)
{
	PidginAccountsMenu *menu = PIDGIN_ACCOUNTS_MENU(d);
	gpointer data = NULL;

	data = g_hash_table_lookup(menu->account_items, account);
	if(GTK_IS_WIDGET(data)) {
		gtk_menu_item_set_submenu(GTK_MENU_ITEM(data),
		                          pidgin_account_actions_menu_new(account));
	}
}

static void
pidgin_accounts_menu_account_enabled(PurpleAccount *account, gpointer data) {
	pidgin_accounts_menu_add_enabled_account(PIDGIN_ACCOUNTS_MENU(data),
	                                         account);
}

static void
pidgin_accounts_menu_account_disabled(PurpleAccount *account, gpointer data) {
	pidgin_accounts_menu_add_disabled_account(PIDGIN_ACCOUNTS_MENU(data),
	                                          account);
}

/******************************************************************************
 * GObject Implementation
 *****************************************************************************/
G_DEFINE_TYPE(PidginAccountsMenu, pidgin_accounts_menu, GTK_TYPE_MENU)

static void
pidgin_accounts_menu_init(PidginAccountsMenu *menu) {
	gpointer handle;

	/* initialize our template */
	gtk_widget_init_template(GTK_WIDGET(menu));

	/* create our storage for the items */
	menu->account_items = g_hash_table_new_full(g_direct_hash, g_direct_equal,
	                                            g_object_unref, NULL);
	menu->disabled_items = g_hash_table_new_full(g_direct_hash, g_direct_equal,
	                                             g_object_unref, NULL);

	/* add all of the existing accounts */
	pidgin_accounts_menu_add_current(menu);

	/* finally connect to the purple signals to stay up to date */
	handle = purple_accounts_get_handle();
	purple_signal_connect(handle, "account-signed-on", menu,
	                      G_CALLBACK(pidgin_accounts_menu_account_status_changed),
	                      menu);
	purple_signal_connect(handle, "account-signed-off", menu,
	                      G_CALLBACK(pidgin_accounts_menu_account_status_changed),
	                      menu);
	purple_signal_connect(handle, "account-actions-changed", menu,
	                      G_CALLBACK(pidgin_accounts_menu_account_status_changed),
	                      menu);
	purple_signal_connect(handle, "account-enabled", menu,
	                      G_CALLBACK(pidgin_accounts_menu_account_enabled),
	                      menu);
	purple_signal_connect(handle, "account-disabled", menu,
	                      G_CALLBACK(pidgin_accounts_menu_account_disabled),
	                      menu);
};

static void
pidgin_accounts_menu_finalize(GObject *obj) {
	PidginAccountsMenu *menu = PIDGIN_ACCOUNTS_MENU(obj);

	purple_signals_disconnect_by_handle(obj);

	g_hash_table_destroy(menu->account_items);
	g_hash_table_destroy(menu->disabled_items);

	G_OBJECT_CLASS(pidgin_accounts_menu_parent_class)->finalize(obj);
}

static void
pidgin_accounts_menu_class_init(PidginAccountsMenuClass *klass) {
	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);

	obj_class->finalize = pidgin_accounts_menu_finalize;

	gtk_widget_class_set_template_from_resource(
	    widget_class,
	    "/im/pidgin/Pidgin3/Accounts/menu.ui"
	);

	gtk_widget_class_bind_template_child(widget_class, PidginAccountsMenu,
	                                     enable_account);
	gtk_widget_class_bind_template_child(widget_class, PidginAccountsMenu,
	                                     disabled_menu);
	gtk_widget_class_bind_template_child(widget_class, PidginAccountsMenu,
	                                     separator);
}

/******************************************************************************
 * Public API
 *****************************************************************************/
GtkWidget *
pidgin_accounts_menu_new(void) {
	return GTK_WIDGET(g_object_new(PIDGIN_TYPE_ACCOUNTS_MENU, NULL));
}

mercurial