Cleanup old and abandoned plugins

Wed, 04 Nov 2020 03:24:02 -0600

author
Gary Kramlich <grim@reaperworld.com>
date
Wed, 04 Nov 2020 03:24:02 -0600
changeset 40581
0670e82f1f58
parent 40580
fdf04534e7d1
child 40582
8d41e1838429

Cleanup old and abandoned plugins

Remove all plugins that weren't installed as well an a few that are being replaced by talkatu and new apis.

Testing Done:
built and ran `ninja pidgin-pot`

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

libpurple/plugins/codeinline.c file | annotate | diff | comparison | revisions
libpurple/plugins/debug_example.c file | annotate | diff | comparison | revisions
libpurple/plugins/filectl.c file | annotate | diff | comparison | revisions
libpurple/plugins/helloworld.c file | annotate | diff | comparison | revisions
libpurple/plugins/meson.build file | annotate | diff | comparison | revisions
libpurple/plugins/notify_example.c file | annotate | diff | comparison | revisions
libpurple/plugins/one_time_password.c file | annotate | diff | comparison | revisions
libpurple/plugins/pluginpref_example.c file | annotate | diff | comparison | revisions
libpurple/plugins/signals-test.c file | annotate | diff | comparison | revisions
libpurple/plugins/simple.c file | annotate | diff | comparison | revisions
libpurple/plugins/test-request-input.c file | annotate | diff | comparison | revisions
pidgin/plugins/contact_priority.c file | annotate | diff | comparison | revisions
pidgin/plugins/gtk-signals-test.c file | annotate | diff | comparison | revisions
pidgin/plugins/history.c file | annotate | diff | comparison | revisions
pidgin/plugins/imgupload.c file | annotate | diff | comparison | revisions
pidgin/plugins/mailchk.c file | annotate | diff | comparison | revisions
pidgin/plugins/meson.build file | annotate | diff | comparison | revisions
pidgin/plugins/musicmessaging/meson.build file | annotate | diff | comparison | revisions
pidgin/plugins/musicmessaging/music.png file | annotate | diff | comparison | revisions
pidgin/plugins/musicmessaging/musicmessaging.c file | annotate | diff | comparison | revisions
pidgin/plugins/pidgininc.c file | annotate | diff | comparison | revisions
pidgin/plugins/screencap.c file | annotate | diff | comparison | revisions
po/POTFILES.in file | annotate | diff | comparison | revisions
--- a/libpurple/plugins/codeinline.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-/*
- * purple
- *
- * Purple 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#include <glib/gi18n-lib.h>
-
-#include <purple.h>
-
-PurplePlugin *plugin_handle = NULL;
-
-static char *
-outgoing_msg_common(const char *message)
-{
-  char *m;
-  char **ms = g_strsplit(message, "<u>", -1);
-  m = g_strjoinv("<font face=\"monospace\" color=\"#00b025\">", ms);
-  g_strfreev(ms);
-
-  ms = g_strsplit(m, "</u>", -1);
-  g_free(m);
-  m = g_strjoinv("</font>", ms);
-  g_strfreev(ms);
-  return m;
-}
-
-static gboolean outgoing_msg_cb1(PurpleConversation *conv, PurpleMessage *msg,
-	gpointer null)
-{
-	purple_message_set_contents(msg,
-		outgoing_msg_common(purple_message_get_contents(msg)));
-	return FALSE;
-}
-
-static void
-outgoing_msg_cb2(PurpleAccount *account, PurpleMessage *msg,
-	PurpleConversation *conv, PurpleMessageFlags flags, gpointer null)
-{
-	purple_message_set_contents(msg,
-		outgoing_msg_common(purple_message_get_contents(msg)));
-}
-
-static PurplePluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Sean Egan <seanegan@gmail.com>",
-		NULL
-	};
-
-	return purple_plugin_info_new(
-		"id",           "codeinline",
-		"name",         "Code Inline",
-		"version",      "1.0",
-		"category",     "Formatting",
-		"summary",      "Formats text as code",
-		"description",  "Changes the formatting of any outgoing text such "
-		                "that anything underlined will be received green and "
-		                "monospace.",
-		"authors",      authors,
-		"website",      PURPLE_WEBSITE,
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-     void *handle = purple_conversations_get_handle();
-     plugin_handle = plugin;
-     purple_signal_connect(handle, "writing-im-msg", plugin,
-                PURPLE_CALLBACK(outgoing_msg_cb1), NULL);
-     purple_signal_connect(handle, "sending-im-msg", plugin,
-		PURPLE_CALLBACK(outgoing_msg_cb2), NULL);
-
-     return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(codeinline, plugin_query, plugin_load, plugin_unload);
--- a/libpurple/plugins/debug_example.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-/*
- * Debug Example Plugin
- *
- * Copyright (C) 2007, John Bailey <rekkanoryo@cpw.pidgin.im>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02111-1301, USA.
- *
- */
-
-#include <glib/gi18n-lib.h>
-
-/* This file includes all the libpurple headers */
-#include <purple.h>
-
-/* It's more convenient to type PLUGIN_ID all the time than it is to type
- * "core-debugexample", so define this convenience macro. */
-#define PLUGIN_ID "core-debugexample"
-
-/* Common practice in third-party plugins is to define convenience macros for
- * many of the fields of the plugin info struct, so we'll do that for the
- * purposes of demonstration. */
-#define PLUGIN_AUTHORS { "John Bailey <rekkanoryo@cpw.pidgin.im>", NULL }
-
-static PurplePluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = PLUGIN_AUTHORS;
-
-	return purple_plugin_info_new(
-		"id",           PLUGIN_ID,
-		"name",         "Debug API Example",
-		"version",      DISPLAY_VERSION,
-		"category",     "Example",
-		"summary",      "Debug API Example",
-		"description",  "Debug API Example",
-		"authors",      authors,
-		"website",      "https://pidgin.im",
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-/* As we've covered before, this function is called when the plugin is loaded.
- * Here we're using it to show off the capabilities of the debug API and just
- * blindly returning TRUE to tell libpurple it's safe to continue loading. */
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	/* Define these for convenience--we're just using them to show the
-	 * similarities of the debug functions to the standard printf(). */
-	gint i = 256;
-	gfloat f = 512.1024;
-	const gchar *s = "example string";
-
-	/* Introductory message */
-	purple_debug_info(PLUGIN_ID,
-		"Called plugin_load.  Beginning debug demonstration\n");
-
-	/* Show off the debug API a bit */
-	purple_debug_misc(PLUGIN_ID,
-		"MISC level debug message.  i = %d, f = %f, s = %s\n", i, f, s);
-
-	purple_debug_info(PLUGIN_ID,
-		"INFO level debug message.  i = %d, f = %f, s = %s\n", i, f, s);
-
-	purple_debug_warning(PLUGIN_ID,
-		"WARNING level debug message.  i = %d, f = %f, s = %s\n", i, f, s);
-
-	purple_debug_error(PLUGIN_ID,
-		"ERROR level debug message.  i = %d, f = %f, s = %s\n", i, f, s);
-
-	purple_debug_fatal(PLUGIN_ID,
-		"FATAL level debug message. i = %d, f = %f, s = %s\n", i, f, s);
-
-	/* Now just return TRUE to tell libpurple to finish loading. */
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(debugexample, plugin_query, plugin_load, plugin_unload);
--- a/libpurple/plugins/filectl.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,235 +0,0 @@
-/**
- * Send commands to Purple via ~/.purple/control
- *
- * Originally by Eric Warmenhoven <eric@warmenhoven.org>
- * Compile fixes/mini hacks Alex Bennee <alex@bennee.com>
- * and Brian Tarricone <bjt23@users.sourceforge.net>
- */
-
-/* system includes */
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "internal.h"
-#include <purple.h>
-
-#define FILECTL_PLUGIN_ID "core-filectl"
-static int check;
-static time_t mtime;
-
-static void init_file(void);
-static gboolean check_file(void);
-
-/* parse char * as if were word array */
-char *getarg(char *, int, int);
-
-/* go through file and run any commands */
-void
-run_commands()
-{
-	GStatBuf finfo;
-	gchar *filename;
-	char buffer[1024];
-	char *command, *arg1, *arg2;
-	FILE *file;
-
-	filename = g_build_filename(purple_config_dir(), "control", NULL);
-
-	file = g_fopen(filename, "r+");
-	while (fgets(buffer, sizeof(buffer), file)) {
-
-		/* Read the next command */
-		if (buffer[strlen(buffer) - 1] == '\n')
-			buffer[strlen(buffer) - 1] = 0;
-		purple_debug_misc("filectl", "read: %s\n", buffer);
-		command = getarg(buffer, 0, 0);
-
-		if (!g_ascii_strncasecmp(command, "login", 6)) {
-			PurpleAccount *account;
-
-			arg1 = getarg(buffer, 1, 0);
-			arg2 = getarg(buffer, 2, 1);
-
-			account = purple_accounts_find(arg1, arg2);
-			if (account != NULL) /* username found */
-				purple_account_connect(account);
-
-			free(arg1);
-			free(arg2);
-
-		} else if (!g_ascii_strncasecmp(command, "logout", 7)) {
-			PurpleAccount *account;
-
-			arg1 = getarg(buffer, 1, 1);
-			arg2 = getarg(buffer, 2, 1);
-
-			account = purple_accounts_find(arg1, arg2);
-			if (account != NULL)
-			{
-				purple_account_disconnect(account);
-			}
-			else if (arg1 == NULL)
-				purple_connections_disconnect_all();
-
-			free(arg1);
-			free(arg2);
-
-		} else if (!g_ascii_strncasecmp(command, "away", 4)) {
-			arg1 = getarg(buffer, 1, 1);
-			/* serv_set_away_all(arg1); */
-			free(arg1);
-
-		} else if (!g_ascii_strncasecmp(command, "hide", 4)) {
-			purple_blist_set_visible(FALSE);
-
-		} else if (!g_ascii_strncasecmp(command, "unhide", 6)) {
-			purple_blist_set_visible(TRUE);
-
-		} else if (!g_ascii_strncasecmp(command, "back", 4)) {
-			/* do_im_back(); */
-
-		} else if (!g_ascii_strncasecmp(command, "quit", 4)) {
-			purple_core_quit();
-
-		}
-
-		free(command);
-	}
-
-	fclose(file);
-
-	if (g_stat(filename, &finfo) == 0)
-		mtime = finfo.st_mtime;
-
-	g_free(filename);
-}
-
-/**
- * Check to see if the size of the file is > 0. if so, run commands.
- */
-void
-init_file()
-{
-	/* most of this was taken from Bash v2.04 by the FSF */
-	GStatBuf finfo;
-	gchar *filename;
-
-	filename = g_build_filename(purple_config_dir(), "control", NULL);
-
-	if ((g_stat(filename, &finfo) == 0) && (finfo.st_size > 0))
-		run_commands();
-
-	g_free(filename);
-}
-
-/**
- * Check to see if we need to run commands from the file.
- */
-gboolean
-check_file()
-{
-	/* most of this was taken from Bash v2.04 by the FSF */
-	GStatBuf finfo;
-	gchar *filename;
-
-	filename = g_build_filename(purple_config_dir(), "control", NULL);
-
-	if ((g_stat(filename, &finfo) == 0) && (finfo.st_size > 0))
-	{
-		if (mtime != finfo.st_mtime) {
-			purple_debug_info("filectl", "control changed, checking\n");
-			run_commands();
-		}
-	}
-
-	g_free(filename);
-
-	return TRUE;
-}
-
-char *
-getarg(char *line, int which, int remain)
-{
-	char *arr;
-	char *val;
-	int count = -1;
-	int i;
-	int state = 0;
-
-	for (i = 0; i < strlen(line) && count < which; i++) {
-		switch (state) {
-		case 0: /* in whitespace, expecting word */
-			if (isalnum(line[i])) {
-				count++;
-				state = 1;
-			}
-			break;
-		case 1: /* inside word, waiting for whitespace */
-			if (isspace(line[i])) {
-				state = 0;
-			}
-			break;
-		}
-	}
-
-	arr = g_strdup(&line[i - 1]);
-	if (remain)
-		return arr;
-
-	for (i = 0; i < strlen(arr) && isalnum(arr[i]); i++);
-	arr[i] = 0;
-	val = g_strdup(arr);
-	arr[i] = ' ';
-	free(arr);
-	return val;
-}
-
-/*
- *  EXPORTED FUNCTIONS
- */
-
-static PurplePluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Eric Warmenhoven <eric@warmenhoven.org>",
-		NULL
-	};
-
-	return purple_plugin_info_new(
-		"id",           FILECTL_PLUGIN_ID,
-		"name",         N_("File Control"),
-		"version",      DISPLAY_VERSION,
-		"category",     N_("Utility"),
-		"summary",      N_("Allows control by entering commands in a file."),
-		"description",  N_("Allows control by entering commands in a file."),
-		"authors",      authors,
-		"website",      PURPLE_WEBSITE,
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	init_file();
-	check = g_timeout_add_seconds(5, (GSourceFunc)check_file, NULL);
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	g_source_remove(check);
-
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(filectl, plugin_query, plugin_load, plugin_unload);
--- a/libpurple/plugins/helloworld.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-/*
- * Hello World Plugin
- *
- * Copyright (C) 2004, Gary Kramlich <grim@guifications.org>,
- *               2007, John Bailey <rekkanoryo@cpw.pidgin.im>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02111-1301, USA.
- *
- */
-
-#include <glib/gi18n-lib.h>
-
-/* This file includes all the libpurple headers */
-#include <purple.h>
-
-/* This function is the callback for the plugin action we added. All we're
- * doing here is displaying a message. When the user selects the plugin
- * action, this function is called. */
-static void
-plugin_action_test_cb (PurplePluginAction * action)
-{
-	purple_notify_message (action->plugin, PURPLE_NOTIFY_MSG_INFO,
-		"Plugin Actions Test", "This is a plugin actions test :)", NULL, NULL,
-		NULL, NULL);
-}
-
-/* we tell libpurple in the PurplePluginInfo struct to call this function to
- * get a list of plugin actions to use for the plugin.  This function gives
- * libpurple that list of actions. */
-static GList *
-plugin_actions (PurplePlugin * plugin)
-{
-	/* some C89 (a.k.a. ANSI C) compilers will warn if any variable declaration
-	 * includes an initilization that calls a function.  To avoid that, we
-	 * generally initialize our variables first with constant values like NULL
-	 * or 0 and assign to them with function calls later */
-	GList *list = NULL;
-	PurplePluginAction *action = NULL;
-
-	/* The action gets created by specifying a name to show in the UI and a
-	 * callback function to call. */
-	action = purple_plugin_action_new ("Plugin Action Test", plugin_action_test_cb);
-
-	/* libpurple requires a GList of plugin actions, even if there is only one
-	 * action in the list.  We append the action to a GList here. */
-	list = g_list_append (list, action);
-
-	/* Once the list is complete, we send it to libpurple. */
-	return list;
-}
-
-static PurplePluginInfo *
-plugin_query (GError ** error)
-{
-	const gchar * const authors[] = {
-		"John Bailey <rekkanoryo@cpw.pidgin.im>", /* correct author */
-		NULL
-	};
-
-	/* For specific notes on the meanings of each of these members, consult the
-	   C Plugin Howto on the website. */
-	return purple_plugin_info_new (
-		"id",           "core-hello_world",
-		"name",         "Hello World!",
-		"version",      DISPLAY_VERSION, /* This constant is defined in config.h, but you shouldn't use it for your
-		                                    own plugins.  We use it here because it's our plugin. And we're lazy. */
-		"category",     "Example",
-		"summary",      "Hello World Plugin",
-		"description",  "Hello World Plugin",
-		"authors",      authors,
-		"website",      "http://helloworld.tld",
-		"abi-version",  PURPLE_ABI_VERSION,
-		"actions-cb",   plugin_actions, /* this tells libpurple the address of the function to call to get the list
-		                                   of plugin actions. */
-		NULL
-	);
-}
-
-static gboolean
-plugin_load (PurplePlugin * plugin, GError ** error)
-{
-	purple_notify_message (plugin, PURPLE_NOTIFY_MSG_INFO, "Hello World!",
-		"This is the Hello World! plugin :)", NULL, NULL,
-		NULL, NULL);
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload (PurplePlugin * plugin, GError ** error)
-{
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT (hello_world, plugin_query, plugin_load, plugin_unload);
--- a/libpurple/plugins/meson.build	Wed Nov 04 02:41:46 2020 -0600
+++ b/libpurple/plugins/meson.build	Wed Nov 04 03:24:02 2020 -0600
@@ -12,18 +12,6 @@
 	    name_prefix : '',
 	    install : true, install_dir : PURPLE_PLUGINDIR)
 
-	codeinline = library('codeinline', 'codeinline.c',
-	    dependencies : [libpurple_dep],
-	    name_prefix : '')
-
-	debug_example = library('debug_example', 'debug_example.c',
-	    dependencies : [libpurple_dep],
-	    name_prefix : '')
-
-	helloworld = library('helloworld', 'helloworld.c',
-	    dependencies : [libpurple_dep],
-	    name_prefix : '')
-
 	idle = library('idle', 'idle.c',
 	    dependencies : [libpurple_dep],
 	    name_prefix : '',
@@ -39,46 +27,21 @@
 	    name_prefix : '',
 	    install : true, install_dir : PURPLE_PLUGINDIR)
 
-	notify_example = library('notify_example', 'notify_example.c',
-	    dependencies : [libpurple_dep],
-	    name_prefix : '')
-
 	offlinemsg = library('offlinemsg', 'offlinemsg.c',
 	    dependencies : [libpurple_dep],
 	    name_prefix : '',
 	    install : true, install_dir : PURPLE_PLUGINDIR)
 
-	one_time_password = library('one_time_password', 'one_time_password.c',
-	    dependencies : [libpurple_dep],
-	    name_prefix : '')
-
-	pluginpref_example = library('pluginpref_example', 'pluginpref_example.c',
-	    dependencies : [libpurple_dep],
-	    name_prefix : '')
-
 	psychic = library('psychic', 'psychic.c',
 	    dependencies : [libpurple_dep],
 	    name_prefix : '',
 	    install : true, install_dir : PURPLE_PLUGINDIR)
 
-	signals_test = library('signals-test', 'signals-test.c',
-	    dependencies : [libpurple_dep],
-	    name_prefix : '')
-
-	simple = library('simple-plugin', 'simple.c',
-	    dependencies : [libpurple_dep],
-	    name_prefix : '')
-
 	statenotify = library('statenotify', 'statenotify.c',
 	    dependencies : [libpurple_dep],
 	    name_prefix : '',
 	    install : true, install_dir : PURPLE_PLUGINDIR)
 
-	test_request_input = library('test-request-input', 'test-request-input.c',
-		dependencies : [libpurple_dep],
-		name_prefix : '',
-	)
-
 	purple_toast = library('purple-toast', 'purple-toast.c',
 		dependencies : [libpurple_dep],
 		name_prefix: '',
--- a/libpurple/plugins/notify_example.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,126 +0,0 @@
-/*
- * Notify API Example Plugin
- *
- * Copyright (C) 2007, John Bailey <rekkanoryo@cpw.pidgin.im>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02111-1301, USA.
- *
- */
-
-#include <glib/gi18n-lib.h>
-
-/* This file includes all the libpurple headers */
-#include <purple.h>
-
-#define PLUGIN_ID "core-notifyexample"
-#define PLUGIN_AUTHORS { "John Bailey <rekkanoryo@cpw.pidgin.im>", NULL }
-
-/* The next four functions and the calls within them should cause dialog boxes to appear
- * when you select the plugin action from the Tools->Notify Example menu */
-static void
-notify_error_cb(PurplePluginAction *action)
-{
-	purple_notify_error(action->plugin, "Test Notification", "Test Notification",
-		"This is a test error notification", NULL);
-}
-
-static void
-notify_info_cb(PurplePluginAction *action)
-{
-	purple_notify_info(action->plugin, "Test Notification", "Test Notification",
-		"This is a test informative notification", NULL);
-}
-
-static void
-notify_warn_cb(PurplePluginAction *action)
-{
-	purple_notify_warning(action->plugin, "Test Notification", "Test Notification",
-		"This is a test warning notification", NULL);
-}
-
-static void
-notify_format_cb(PurplePluginAction *action)
-{
-	purple_notify_formatted(action->plugin, "Test Notification", "Test Notification",
-		"Test Notification",
-		"<I>This is a test notification with formatted text.</I>", NULL, NULL);
-}
-
-static void
-notify_uri_cb(PurplePluginAction *action)
-{
-	/* This one should open your web browser of choice. */
-	purple_notify_uri(action->plugin, "https://pidgin.im/");
-}
-
-static GList *
-plugin_actions(PurplePlugin *plugin)
-{
-	GList *actions = NULL;
-
-	/* Here we take advantage of return values to avoid the need for a temp variable */
-	actions = g_list_prepend(actions,
-		purple_plugin_action_new("Show Error Notification", notify_error_cb));
-
-	actions = g_list_prepend(actions,
-		purple_plugin_action_new("Show Info Notification", notify_info_cb));
-
-	actions = g_list_prepend(actions,
-		purple_plugin_action_new("Show Warning Notification", notify_warn_cb));
-
-	actions = g_list_prepend(actions,
-		purple_plugin_action_new("Show Formatted Notification", notify_format_cb));
-
-	actions = g_list_prepend(actions,
-		purple_plugin_action_new("Show URI Notification", notify_uri_cb));
-
-	return g_list_reverse(actions);
-}
-
-static PurplePluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = PLUGIN_AUTHORS;
-
-	return purple_plugin_info_new(
-		"id",           PLUGIN_ID,
-		"name",         "Notify API Example",
-		"version",      DISPLAY_VERSION,
-		"category",     "Example",
-		"summary",      "Notify API Example",
-		"description",  "Notify API Example",
-		"authors",      authors,
-		"website",      "https://pidgin.im",
-		"abi-version",  PURPLE_ABI_VERSION,
-		"actions-cb",   plugin_actions,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(notifyexample, plugin_query, plugin_load, plugin_unload);
-
--- a/libpurple/plugins/one_time_password.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,137 +0,0 @@
-/*
- * One Time Password support plugin for libpurple
- *
- * Copyright (C) 2009, Daniel Atallah <datallah@pidgin.im>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02111-1301, USA.
- */
-#include <glib/gi18n-lib.h>
-
-#include <purple.h>
-
-#define PLUGIN_ID "core-one_time_password"
-#define PREF_NAME PLUGIN_ID "_enabled"
-
-static void
-signed_on_cb(PurpleConnection *conn, void *data)
-{
-	PurpleAccount *account = purple_connection_get_account(conn);
-
-	if (purple_account_get_bool(account, PREF_NAME, FALSE)) {
-		if(purple_account_get_remember_password(account))
-			purple_debug_error("One Time Password",
-					   "Unable to enforce one time password for account %s (%s).\n"
-					   "Account is set to remember the password.\n",
-					   purple_account_get_username(account),
-					   purple_account_get_protocol_name(account));
-		else {
-
-			purple_debug_info("One Time Password", "Clearing password for account %s (%s).\n",
-					  purple_account_get_username(account),
-					  purple_account_get_protocol_name(account));
-
-			purple_account_set_password(account, NULL, NULL, NULL);
-			/* TODO: Do we need to somehow clear conn->password ? */
-		}
-	}
-}
-
-static PurplePluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Daniel Atallah <datallah@pidgin.im>",
-		NULL
-	};
-
-	return purple_plugin_info_new(
-		"id",           PLUGIN_ID,
-		"name",         N_("One Time Password Support"),
-		"version",      DISPLAY_VERSION,
-		"category",     N_("Security"),
-		"summary",      N_("Enforce that passwords are used only once."),
-		"description",  N_("Allows you to enforce on a per-account basis that "
-		                   "passwords not being saved are only used in a "
-		                   "single successful connection.\n"
-		                   "Note: The account password must not be saved for "
-		                   "this to work."),
-		"authors",      authors,
-		"website",      PURPLE_WEBSITE,
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	PurpleProtocol *protocol;
-	PurpleAccountOption *option;
-	GList *list, *l;
-
-	list = purple_protocols_get_all();
-
-	/* Register protocol preference. */
-	for (l = list; l != NULL; l = l->next) {
-		protocol = PURPLE_PROTOCOL(l->data);
-		if (protocol != NULL && !(purple_protocol_get_options(protocol) & OPT_PROTO_NO_PASSWORD)) {
-			option = purple_account_option_bool_new(_("One Time Password"),
-								PREF_NAME, FALSE);
-			protocol->account_options = g_list_append(protocol->account_options, option);
-		}
-	}
-	g_list_free(list);
-
-	/* Register callback. */
-	purple_signal_connect(purple_connections_get_handle(), "signed-on",
-			      plugin, PURPLE_CALLBACK(signed_on_cb), NULL);
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	PurpleProtocol *protocol;
-	PurpleAccountOption *option;
-	GList *list, *l, *options;
-
-	list = purple_protocols_get_all();
-
-	/* Remove protocol preference. */
-	for (l = list; l != NULL; l = l->next) {
-		protocol = PURPLE_PROTOCOL(l->data);
-		if (protocol != NULL && !(purple_protocol_get_options(protocol) & OPT_PROTO_NO_PASSWORD)) {
-			options = purple_protocol_get_account_options(protocol);
-			while (options != NULL) {
-				option = (PurpleAccountOption *) options->data;
-				if (purple_strequal(PREF_NAME, purple_account_option_get_setting(option))) {
-					protocol->account_options = g_list_delete_link(protocol->account_options, options);
-					purple_account_option_destroy(option);
-					break;
-				}
-				options = options->next;
-			}
-		}
-	}
-	g_list_free(list);
-
-	/* Callback will be automagically unregistered */
-
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(one_time_password, plugin_query, plugin_load, plugin_unload);
--- a/libpurple/plugins/pluginpref_example.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-/*
- * PluginPref Example Plugin
- *
- * Copyright (C) 2004, Gary Kramlich <amc_grim@users.sf.net>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02111-1301, USA.
- */
-
-#include <glib/gi18n-lib.h>
-
-/* This file includes all the libpurple headers */
-#include <purple.h>
-
-static PurplePluginPrefFrame *
-get_plugin_pref_frame(PurplePlugin *plugin) {
-	PurplePluginPrefFrame *frame;
-	PurplePluginPref *ppref;
-
-	frame = purple_plugin_pref_frame_new();
-
-	ppref = purple_plugin_pref_new_with_label("boolean");
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_name_and_label(
-									"/plugins/core/pluginpref_example/bool",
-									"boolean pref");
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_label("integer");
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_name_and_label(
-									"/plugins/core/pluginpref_example/int",
-									"integer pref");
-	purple_plugin_pref_set_bounds(ppref, 0, 255);
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_name_and_label(
-									"/plugins/core/pluginpref_example/int_choice",
-									"integer choice");
-	purple_plugin_pref_set_pref_type(ppref, PURPLE_PLUGIN_PREF_CHOICE);
-	purple_plugin_pref_add_choice(ppref, "One", GINT_TO_POINTER(1));
-	purple_plugin_pref_add_choice(ppref, "Two", GINT_TO_POINTER(2));
-	purple_plugin_pref_add_choice(ppref, "Four", GINT_TO_POINTER(4));
-	purple_plugin_pref_add_choice(ppref, "Eight", GINT_TO_POINTER(8));
-	purple_plugin_pref_add_choice(ppref, "Sixteen", GINT_TO_POINTER(16));
-	purple_plugin_pref_add_choice(ppref, "Thirty Two", GINT_TO_POINTER(32));
-	purple_plugin_pref_add_choice(ppref, "Sixty Four", GINT_TO_POINTER(64));
-	purple_plugin_pref_add_choice(ppref, "One Hundred Twenty Eight", GINT_TO_POINTER(128));
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_label("string");
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_name_and_label(
-								"/plugins/core/pluginpref_example/string",
-								"string pref");
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_name_and_label(
-								"/plugins/core/pluginpref_example/masked_string",
-								"masked string");
-	purple_plugin_pref_set_masked(ppref, TRUE);
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_name_and_label(
-							"/plugins/core/pluginpref_example/max_string",
-							"string pref\n(max length of 16)");
-	purple_plugin_pref_set_max_length(ppref, 16);
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_name_and_label(
-							"/plugins/core/pluginpref_example/multiline",
-							"multiline string pref");
-	purple_plugin_pref_set_pref_type(ppref, PURPLE_PLUGIN_PREF_STRING_FORMAT);
-	purple_plugin_pref_set_format_type(ppref, PURPLE_STRING_FORMAT_TYPE_MULTILINE);
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_name_and_label(
-							"/plugins/core/pluginpref_example/html",
-							"html string pref");
-	purple_plugin_pref_set_pref_type(ppref, PURPLE_PLUGIN_PREF_STRING_FORMAT);
-	purple_plugin_pref_set_format_type(ppref, PURPLE_STRING_FORMAT_TYPE_HTML);
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	ppref = purple_plugin_pref_new_with_name_and_label(
-							"/plugins/core/pluginpref_example/string_choice",
-							"string choice");
-	purple_plugin_pref_set_pref_type(ppref, PURPLE_PLUGIN_PREF_CHOICE);
-	purple_plugin_pref_add_choice(ppref, "red", "red");
-	purple_plugin_pref_add_choice(ppref, "orange", "orange");
-	purple_plugin_pref_add_choice(ppref, "yellow", "yellow");
-	purple_plugin_pref_add_choice(ppref, "green", "green");
-	purple_plugin_pref_add_choice(ppref, "blue", "blue");
-	purple_plugin_pref_add_choice(ppref, "purple", "purple");
-	purple_plugin_pref_frame_add(frame, ppref);
-
-	return frame;
-}
-
-static PurplePluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Gary Kramlich <amc_grim@users.sf.net>",
-		NULL
-	};
-
-	return purple_plugin_info_new(
-		"id",             "core-pluginpref_example",
-		"name",           "Pluginpref Example",
-		"version",        DISPLAY_VERSION,
-		"category",       "Example",
-		"summary",        "An example of how to use pluginprefs",
-		"description",    "An example of how to use pluginprefs",
-		"authors",        authors,
-		"website",        PURPLE_WEBSITE,
-		"abi-version",    PURPLE_ABI_VERSION,
-		"pref-frame-cb",  get_plugin_pref_frame,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	purple_prefs_add_none("/plugins/core/pluginpref_example");
-	purple_prefs_add_bool("/plugins/core/pluginpref_example/bool", TRUE);
-	purple_prefs_add_int("/plugins/core/pluginpref_example/int", 0);
-	purple_prefs_add_int("/plugins/core/pluginpref_example/int_choice", 1);
-	purple_prefs_add_string("/plugins/core/pluginpref_example/string",
-							"string");
-	purple_prefs_add_string("/plugins/core/pluginpref_example/max_string",
-							"max length string");
-	purple_prefs_add_string("/plugins/core/pluginpref_example/multiline",
-							"line1\nline2");
-	purple_prefs_add_string("/plugins/core/pluginpref_example/html",
-							"foo <b>bar</b> baz");
-	purple_prefs_add_string("/plugins/core/pluginpref_example/masked_string", "masked");
-	purple_prefs_add_string("/plugins/core/pluginpref_example/string_choice", "red");
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(ppexample, plugin_query, plugin_load, plugin_unload);
--- a/libpurple/plugins/signals-test.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,826 +0,0 @@
-/*
- * Signals test plugin.
- *
- * Copyright (C) 2003 Christian Hammond.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02111-1301, USA.
- */
-#define SIGNAL_TEST_PLUGIN_ID "core-signals-test"
-
-#include <glib/gi18n-lib.h>
-
-#include <purple.h>
-
-#include <stdio.h>
-
-/**************************************************************************
- * Account subsystem signal callbacks
- **************************************************************************/
-static void
-account_connecting_cb(PurpleAccount *account, void *data)
-{
-	purple_debug_misc("signals test", "account-connecting (%s)\n",
-					purple_account_get_username(account));
-}
-
-static void
-account_setting_info_cb(PurpleAccount *account, const char *info, void *data)
-{
-	purple_debug_misc("signals test", "account-setting-info (%s, %s)\n",
-					purple_account_get_username(account), info);
-}
-
-static void
-account_set_info_cb(PurpleAccount *account, const char *info, void *data)
-{
-	purple_debug_misc("signals test", "account-set-info (%s, %s)\n",
-					purple_account_get_username(account), info);
-}
-
-static void
-account_status_changed(PurpleAccount *account, PurpleStatus *old, PurpleStatus *new,
-						gpointer data)
-{
-	purple_debug_misc("signals test", "account-status-changed (%s, %s, %s)\n",
-					purple_account_get_username(account),
-					purple_status_get_name(old),
-					purple_status_get_name(new));
-}
-
-static void
-account_alias_changed(PurpleAccount *account, const char *old, gpointer data)
-{
-	purple_debug_misc("signals test", "account-alias-changed (%s, %s, %s)\n",
-					purple_account_get_username(account),
-					old, purple_account_get_private_alias(account));
-}
-
-static int
-account_authorization_requested_cb(PurpleAccount *account, const char *user, const char *message, char *response, gpointer data)
-{
-	purple_debug_misc("signals test", "account-authorization-requested (%s, %s, %s)\n",
-			purple_account_get_username(account), user, message);
-	return PURPLE_ACCOUNT_RESPONSE_PASS;
-}
-
-static void
-account_authorization_granted_cb(PurpleAccount *account, const char *user, const char *message, gpointer data)
-{
-	purple_debug_misc("signals test", "account-authorization-granted (%s, %s, %s)\n",
-			purple_account_get_username(account), user, message);
-}
-
-static void
-account_authorization_denied_cb(PurpleAccount *account, const char *user, const char *message, gpointer data)
-{
-	purple_debug_misc("signals test", "account-authorization-denied (%s, %s, %s)\n",
-			purple_account_get_username(account), user, message);
-}
-
-/**************************************************************************
- * Buddy Icons signal callbacks
- **************************************************************************/
-static void
-buddy_icon_changed_cb(PurpleBuddy *buddy)
-{
-	purple_debug_misc("signals test", "buddy icon changed (%s)\n",
-					purple_buddy_get_name(buddy));
-}
-
-/**************************************************************************
- * Buddy List subsystem signal callbacks
- **************************************************************************/
-static void
-buddy_status_changed_cb(PurpleBuddy *buddy, PurpleStatus *old_status,
-                        PurpleStatus *status, void *data)
-{
-	purple_debug_misc("signals test", "buddy-status-changed (%s %s to %s)\n",
-	                  purple_buddy_get_name(buddy),
-	                  purple_status_get_id(old_status),
-	                  purple_status_get_id(status));
-}
-
-static void
-buddy_idle_changed_cb(PurpleBuddy *buddy, gboolean old_idle, gboolean idle,
-                      void *data)
-{
-	purple_debug_misc("signals test", "buddy-idle-changed (%s %s)\n",
-	                  purple_buddy_get_name(buddy),
-	                  old_idle ? "unidled" : "idled");
-}
-
-static void
-buddy_signed_on_cb(PurpleBuddy *buddy, void *data)
-{
-	purple_debug_misc("signals test", "buddy-signed-on (%s)\n",
-	                  purple_buddy_get_name(buddy));
-}
-
-static void
-buddy_signed_off_cb(PurpleBuddy *buddy, void *data)
-{
-	purple_debug_misc("signals test", "buddy-signed-off (%s)\n",
-	                  purple_buddy_get_name(buddy));
-}
-
-static void
-blist_node_added_cb(PurpleBlistNode *bnode, void *data)
-{
-	const char *name;
-	if (PURPLE_IS_GROUP(bnode))
-		name = purple_group_get_name(PURPLE_GROUP(bnode));
-	else if (PURPLE_IS_CONTACT(bnode))
-		/* Close enough */
-		name = purple_contact_get_alias(PURPLE_CONTACT(bnode));
-	else if (PURPLE_IS_BUDDY(bnode))
-		name = purple_buddy_get_name(PURPLE_BUDDY(bnode));
-	else
-		name = "(unknown)";
-
-	purple_debug_misc("signals test", "blist_node_added_cb (%s)\n",
-	                  name ? name : "(null)");
-}
-
-static void
-blist_node_removed_cb(PurpleBlistNode *bnode, void *data)
-{
-	const char *name;
-	if (PURPLE_IS_GROUP(bnode))
-		name = purple_group_get_name(PURPLE_GROUP(bnode));
-	else if (PURPLE_IS_CONTACT(bnode))
-		/* Close enough */
-		name = purple_contact_get_alias(PURPLE_CONTACT(bnode));
-	else if (PURPLE_IS_BUDDY(bnode))
-		name = purple_buddy_get_name(PURPLE_BUDDY(bnode));
-	else
-		name = "(unknown)";
-
-	purple_debug_misc("signals test", "blist_node_removed_cb (%s)\n",
-	                  name ? name : "(null)");
-}
-
-static void
-blist_node_aliased(PurpleBlistNode *node, const char *old_alias)
-{
-	PurpleContact *p = PURPLE_CONTACT(node);
-	PurpleBuddy *b = PURPLE_BUDDY(node);
-	PurpleChat *c = PURPLE_CHAT(node);
-	PurpleGroup *g = PURPLE_GROUP(node);
-
-	if (PURPLE_IS_CONTACT(node)) {
-		purple_debug_misc("signals test",
-		                  "blist-node-aliased (Contact: %s, %s)\n",
-		                  purple_contact_get_alias(p), old_alias);
-	} else if (PURPLE_IS_BUDDY(node)) {
-		purple_debug_misc("signals test",
-		                  "blist-node-aliased (Buddy: %s, %s)\n",
-		                  purple_buddy_get_name(b), old_alias);
-	} else if (PURPLE_IS_CHAT(node)) {
-		purple_debug_misc("signals test",
-		                  "blist-node-aliased (Chat: %s, %s)\n",
-		                  purple_chat_get_name(c), old_alias);
-	} else if (PURPLE_IS_GROUP(node)) {
-		purple_debug_misc("signals test",
-		                  "blist-node-aliased (Group: %s, %s)\n",
-		                  purple_group_get_name(g), old_alias);
-	}
-}
-
-static void
-blist_node_extended_menu_cb(PurpleBlistNode *node, void *data)
-{
-	PurpleContact *p = PURPLE_CONTACT(node);
-	PurpleBuddy *b = PURPLE_BUDDY(node);
-	PurpleChat *c = PURPLE_CHAT(node);
-	PurpleGroup *g = PURPLE_GROUP(node);
-
-	if (PURPLE_IS_CONTACT(node)) {
-		purple_debug_misc("signals test",
-		                  "blist-node-extended-menu (Contact: %s)\n",
-		                  purple_contact_get_alias(p));
-	} else if (PURPLE_IS_BUDDY(node)) {
-		purple_debug_misc("signals test",
-		                  "blist-node-extended-menu (Buddy: %s)\n",
-		                  purple_buddy_get_name(b));
-	} else if (PURPLE_IS_CHAT(node)) {
-		purple_debug_misc("signals test",
-		                  "blist-node-extended-menu (Chat: %s)\n",
-		                  purple_chat_get_name(c));
-	} else if (PURPLE_IS_GROUP(node)) {
-		purple_debug_misc("signals test",
-		                  "blist-node-extended-menu (Group: %s)\n",
-		                  purple_group_get_name(g));
-	}
-}
-
-
-/**************************************************************************
- * Connection subsystem signal callbacks
- **************************************************************************/
-static void
-signing_on_cb(PurpleConnection *gc, void *data)
-{
-	purple_debug_misc("signals test", "signing-on (%s)\n",
-					purple_account_get_username(purple_connection_get_account(gc)));
-}
-
-static void
-signed_on_cb(PurpleConnection *gc, void *data)
-{
-	purple_debug_misc("signals test", "signed-on (%s)\n",
-					purple_account_get_username(purple_connection_get_account(gc)));
-}
-
-static void
-signing_off_cb(PurpleConnection *gc, void *data)
-{
-	purple_debug_misc("signals test", "signing-off (%s)\n",
-					purple_account_get_username(purple_connection_get_account(gc)));
-}
-
-static void
-signed_off_cb(PurpleConnection *gc, void *data)
-{
-	purple_debug_misc("signals test", "signed-off (%s)\n",
-					purple_account_get_username(purple_connection_get_account(gc)));
-}
-
-static void
-connection_error_cb(PurpleConnection *gc,
-                    PurpleConnectionError err,
-                    const gchar *desc,
-                    void *data)
-{
-	const gchar *username =
-		purple_account_get_username(purple_connection_get_account(gc));
-	purple_debug_misc("signals test", "connection-error (%s, %u, %s)\n",
-		username, err, desc);
-}
-
-/**************************************************************************
- * Conversation subsystem signal callbacks
- **************************************************************************/
-static gboolean
-writing_im_msg_cb(PurpleConversation *conv, PurpleMessage *pmsg)
-{
-	purple_debug_misc("signals test", "writing-im-msg (%s, %s)\n",
-		purple_conversation_get_name(conv),
-		purple_message_get_contents(pmsg));
-
-	return FALSE;
-
-}
-
-static void
-wrote_im_msg_cb(PurpleConversation *conv, PurpleMessage *msg, gpointer data)
-{
-	purple_debug_misc("signals test", "wrote-im-msg (%s, %s)\n",
-		purple_conversation_get_name(conv),
-		purple_message_get_contents(msg));
-}
-
-static void
-sending_im_msg_cb(PurpleAccount *account, PurpleMessage *msg, void *data)
-{
-	purple_debug_misc("signals test", "sending-im-msg (%s, %s, %s)\n",
-		purple_account_get_username(account),
-		purple_message_get_recipient(msg),
-		purple_message_get_contents(msg));
-
-}
-
-static void
-sent_im_msg_cb(PurpleAccount *account, PurpleMessage *msg, void *data)
-{
-	purple_debug_misc("signals test", "sent-im-msg (%s, %s, %s)\n",
-		purple_account_get_username(account),
-		purple_message_get_recipient(msg),
-		purple_message_get_contents(msg));
-}
-
-static gboolean
-receiving_im_msg_cb(PurpleAccount *account, char **sender, char **buffer,
-				    PurpleConversation *conv, PurpleMessageFlags *flags, void *data)
-{
-	purple_debug_misc("signals test", "receiving-im-msg (%s, %s, %s, %s, %d)\n",
-					purple_account_get_username(account), *sender, *buffer,
-					(conv != NULL) ? purple_conversation_get_name(conv) : "(null)", *flags);
-
-	return FALSE;
-}
-
-static void
-received_im_msg_cb(PurpleAccount *account, char *sender, char *buffer,
-				   PurpleConversation *conv, PurpleMessageFlags flags, void *data)
-{
-	purple_debug_misc("signals test", "received-im-msg (%s, %s, %s, %s, %d)\n",
-					purple_account_get_username(account), sender, buffer,
-					(conv != NULL) ? purple_conversation_get_name(conv) : "(null)", flags);
-}
-
-static gboolean
-writing_chat_msg_cb(PurpleAccount *account, const char *who, char **buffer,
-				PurpleConversation *conv, PurpleMessageFlags flags, void *data)
-{
-	purple_debug_misc("signals test", "writing-chat-msg (%s, %s)\n",
-					purple_conversation_get_name(conv), *buffer);
-
-	return FALSE;
-}
-
-static void
-wrote_chat_msg_cb(PurpleConversation *conv, PurpleMessage *msg, gpointer data)
-{
-	purple_debug_misc("signals test", "wrote-chat-msg (%s, %s)\n",
-		purple_conversation_get_name(conv),
-		purple_message_get_contents(msg));
-}
-
-static gboolean
-sending_chat_msg_cb(PurpleAccount *account, PurpleMessage *msg, int id, void *data)
-{
-	purple_debug_misc("signals test", "sending-chat-msg (%s, %s, %d)\n",
-		purple_account_get_username(account),
-		purple_message_get_contents(msg), id);
-
-	return FALSE;
-}
-
-static void
-sent_chat_msg_cb(PurpleAccount *account, PurpleMessage *msg, int id, void *data)
-{
-	purple_debug_misc("signals test", "sent-chat-msg (%s, %s, %d)\n",
-		purple_account_get_username(account),
-		purple_message_get_contents(msg), id);
-}
-
-static gboolean
-receiving_chat_msg_cb(PurpleAccount *account, char **sender, char **buffer,
-					 PurpleConversation *chat, PurpleMessageFlags *flags, void *data)
-{
-	purple_debug_misc("signals test",
-					"receiving-chat-msg (%s, %s, %s, %s, %d)\n",
-					purple_account_get_username(account), *sender, *buffer,
-					purple_conversation_get_name(chat), *flags);
-
-	return FALSE;
-}
-
-static void
-received_chat_msg_cb(PurpleAccount *account, char *sender, char *buffer,
-					 PurpleConversation *chat, PurpleMessageFlags flags, void *data)
-{
-	purple_debug_misc("signals test",
-					"received-chat-msg (%s, %s, %s, %s, %d)\n",
-					purple_account_get_username(account), sender, buffer,
-					purple_conversation_get_name(chat), flags);
-}
-
-static void
-conversation_created_cb(PurpleConversation *conv, void *data)
-{
-	purple_debug_misc("signals test", "conversation-created (%s)\n",
-					purple_conversation_get_name(conv));
-}
-
-static void
-deleting_conversation_cb(PurpleConversation *conv, void *data)
-{
-	purple_debug_misc("signals test", "deleting-conversation (%s)\n",
-					purple_conversation_get_name(conv));
-}
-
-static void
-buddy_typing_cb(PurpleAccount *account, const char *name, void *data)
-{
-	purple_debug_misc("signals test", "buddy-typing (%s, %s)\n",
-					purple_account_get_username(account), name);
-}
-
-static void
-buddy_typing_stopped_cb(PurpleAccount *account, const char *name, void *data)
-{
-	purple_debug_misc("signals test", "buddy-typing-stopped (%s, %s)\n",
-					purple_account_get_username(account), name);
-}
-
-static gboolean
-chat_user_joining_cb(PurpleConversation *conv, const char *user,
-					  PurpleChatUserFlags flags, void *data)
-{
-	purple_debug_misc("signals test", "chat-user-joining (%s, %s, %d)\n",
-					purple_conversation_get_name(conv), user, flags);
-
-	return FALSE;
-}
-
-static void
-chat_user_joined_cb(PurpleConversation *conv, const char *user,
-					 PurpleChatUserFlags flags, gboolean new_arrival, void *data)
-{
-	purple_debug_misc("signals test", "chat-user-joined (%s, %s, %d, %d)\n",
-					purple_conversation_get_name(conv), user, flags, new_arrival);
-}
-
-static void
-chat_user_flags_cb(PurpleChatUser *cb, PurpleChatUserFlags oldflags,
-					 PurpleChatUserFlags newflags, void *data)
-{
-	purple_debug_misc("signals test", "chat-user-flags (%s, %s, %d, %d)\n",
-					purple_conversation_get_name(PURPLE_CONVERSATION(
-					purple_chat_user_get_chat(cb))),
-					purple_chat_user_get_name(cb), oldflags, newflags);
-}
-
-static gboolean
-chat_user_leaving_cb(PurpleConversation *conv, const char *user,
-					  const char *reason, void *data)
-{
-	purple_debug_misc("signals test", "chat-user-leaving (%s, %s, %s)\n",
-					purple_conversation_get_name(conv), user, reason);
-
-	return FALSE;
-}
-
-static void
-chat_user_left_cb(PurpleConversation *conv, const char *user,
-				   const char *reason, void *data)
-{
-	purple_debug_misc("signals test", "chat-user-left (%s, %s, %s)\n",
-					purple_conversation_get_name(conv), user, reason);
-}
-
-static void
-chat_inviting_user_cb(PurpleConversation *conv, const char *name,
-					  char **reason, void *data)
-{
-	purple_debug_misc("signals test", "chat-inviting-user (%s, %s, %s)\n",
-					purple_conversation_get_name(conv), name, *reason);
-}
-
-static void
-chat_invited_user_cb(PurpleConversation *conv, const char *name,
-					  const char *reason, void *data)
-{
-	purple_debug_misc("signals test", "chat-invited-user (%s, %s, %s)\n",
-					purple_conversation_get_name(conv), name, reason);
-}
-
-static gint
-chat_invited_cb(PurpleAccount *account, const char *inviter,
-				const char *room_name, const char *message,
-				const GHashTable *components, void *data)
-{
-	purple_debug_misc("signals test", "chat-invited (%s, %s, %s, %s)\n",
-					purple_account_get_username(account), inviter,
-					room_name, message);
-
-	return 0;
-}
-
-static void
-chat_joined_cb(PurpleConversation *conv, void *data)
-{
-	purple_debug_misc("signals test", "chat-joined (%s)\n",
-					purple_conversation_get_name(conv));
-}
-
-static void
-chat_left_cb(PurpleConversation *conv, void *data)
-{
-	purple_debug_misc("signals test", "chat-left (%s)\n",
-					purple_conversation_get_name(conv));
-}
-
-static void
-chat_topic_changed_cb(PurpleConversation *conv, const char *who,
-					  const char *topic, void *data)
-{
-	purple_debug_misc("signals test",
-					"chat-topic-changed (%s topic changed to: \"%s\" by %s)\n",
-					purple_conversation_get_name(conv), topic,
-					(who) ? who : "unknown");
-}
-/**************************************************************************
- * Core signal callbacks
- **************************************************************************/
-static void
-quitting_cb(void *data)
-{
-	purple_debug_misc("signals test", "quitting ()\n");
-}
-
-static void
-printhash(gpointer key, gpointer value, gpointer data)
-{
-	char *a = (char *)key;
-	char *b = (char *)value;
-	GString *str = (GString *)data;
-	g_string_append_printf(str, "   [%s] = [%s]\n", a, b ? b : "(null)");
-}
-
-static gboolean
-uri_handler(const char *proto, const char *cmd, GHashTable *params)
-{
-	GString *str = g_string_new("\n{\n");
-	g_hash_table_foreach(params, printhash, str);
-	g_string_append_c(str, '}');
-	purple_debug_misc("signals test", "uri handler (%s, %s, %s)\n", proto, cmd, str->str);
-	g_string_free(str, TRUE);
-	return FALSE;
-}
-
-/**************************************************************************
- * Notify signals callbacks
- **************************************************************************/
-static void
-notify_email_cb(char *subject, char *from, char *to, char *url) {
-	purple_debug_misc("signals test", "notify email: subject=%s, from=%s, to=%s, url=%s\n",
-					subject, from, to, url);
-}
-
-static void
-notify_emails_cb(char **subjects, char **froms, char **tos, char **urls, guint count) {
-	guint i;
-	purple_debug_misc("signals test", "notify emails: count=%u\n", count);
-	for(i=0; i<count && i<5; i++) {
-		if(subjects[i]==NULL || froms[i]==NULL || tos[i]==NULL || urls[i]==NULL) continue;
-		purple_debug_misc("signals test", "notify emails[%u]: subject=%s, from=%s, to=%s, url=%s\n",
-			i, subjects[i], froms[i], tos[i], urls[i]);
-	}
-}
-
-/**************************************************************************
- * Jabber signals callbacks
- **************************************************************************/
-static gboolean
-jabber_iq_received(PurpleConnection *pc, const char *type, const char *id,
-                   const char *from, PurpleXmlNode *iq)
-{
-	purple_debug_misc("signals test", "jabber IQ (type=%s, id=%s, from=%s) %p\n",
-	                  type, id, from ? from : "(null)", iq);
-
-	/* We don't want the plugin to stop processing */
-	return FALSE;
-}
-
-static gboolean
-jabber_message_received(PurpleConnection *pc, const char *type, const char *id,
-                        const char *from, const char *to, PurpleXmlNode *message)
-{
-	purple_debug_misc("signals test", "jabber message (type=%s, id=%s, "
-	                  "from=%s to=%s) %p\n",
-	                  type ? type : "(null)", id ? id : "(null)",
-	                  from ? from : "(null)", to ? to : "(null)", message);
-
-	/* We don't want the plugin to stop processing */
-	return FALSE;
-}
-
-static gboolean
-jabber_presence_received(PurpleConnection *pc, const char *type,
-                         const char *from, PurpleXmlNode *presence)
-{
-	purple_debug_misc("signals test", "jabber presence (type=%s, from=%s) %p\n",
-	                  type ? type : "(null)", from ? from : "(null)", presence);
-
-	/* We don't want the plugin to stop processing */
-	return FALSE;
-}
-
-static gboolean
-jabber_watched_iq(PurpleConnection *pc, const char *type, const char *id,
-                  const char *from, PurpleXmlNode *child)
-{
-	purple_debug_misc("signals test", "jabber watched IQ (type=%s, id=%s, from=%s)\n"
-	                  "child %p name=%s, namespace=%s\n",
-	                  type, id, from, child, child->name,
-	                  purple_xmlnode_get_namespace(child));
-
-	if (purple_strequal(type, "get") || purple_strequal(type, "set")) {
-		/* Send the requisite reply */
-		PurpleXmlNode *iq = purple_xmlnode_new("iq");
-		purple_xmlnode_set_attrib(iq, "to", from);
-		purple_xmlnode_set_attrib(iq, "id", id);
-		purple_xmlnode_set_attrib(iq, "type", "result");
-
-		purple_signal_emit(purple_connection_get_protocol(pc),
-		                   "jabber-sending-xmlnode", pc, &iq);
-		if (iq != NULL)
-			purple_xmlnode_free(iq);
-	}
-
-	/* Cookie monster eats IQ stanzas; the protocol shouldn't keep processing */
-	return TRUE;
-}
-
-/**************************************************************************
- * Plugin stuff
- **************************************************************************/
-static PurplePluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Christian Hammond <chipx86@gnupdate.org>",
-		NULL
-	};
-
-	return purple_plugin_info_new(
-		"id",          SIGNAL_TEST_PLUGIN_ID,
-		"name",        N_("Signals Test"),
-		"version",     DISPLAY_VERSION,
-		"category",    N_("Testing"),
-		"summary",     N_("Test to see that all signals are working properly."),
-		"description", N_("Test to see that all signals are working properly."),
-		"authors",     authors,
-		"website",     PURPLE_WEBSITE,
-		"abi-version", PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	void *core_handle     = purple_get_core();
-	void *blist_handle    = purple_blist_get_handle();
-	void *conn_handle     = purple_connections_get_handle();
-	void *conv_handle     = purple_conversations_get_handle();
-	void *accounts_handle = purple_accounts_get_handle();
-	void *notify_handle   = purple_notify_get_handle();
-	void *jabber_handle   = purple_protocols_find("prpl-jabber");
-
-	/* Accounts subsystem signals */
-	purple_signal_connect(accounts_handle, "account-connecting",
-						plugin, PURPLE_CALLBACK(account_connecting_cb), NULL);
-	purple_signal_connect(accounts_handle, "account-setting-info",
-						plugin, PURPLE_CALLBACK(account_setting_info_cb), NULL);
-	purple_signal_connect(accounts_handle, "account-set-info",
-						plugin, PURPLE_CALLBACK(account_set_info_cb), NULL);
-	purple_signal_connect(accounts_handle, "account-status-changed",
-						plugin, PURPLE_CALLBACK(account_status_changed), NULL);
-	purple_signal_connect(accounts_handle, "account-alias-changed",
-						plugin, PURPLE_CALLBACK(account_alias_changed), NULL);
-	purple_signal_connect(accounts_handle, "account-authorization-requested",
-						plugin, PURPLE_CALLBACK(account_authorization_requested_cb), NULL);
-	purple_signal_connect(accounts_handle, "account-authorization-denied",
-						plugin, PURPLE_CALLBACK(account_authorization_denied_cb), NULL);
-	purple_signal_connect(accounts_handle, "account-authorization-granted",
-						plugin, PURPLE_CALLBACK(account_authorization_granted_cb), NULL);
-
-	/* Buddy List subsystem signals */
-	purple_signal_connect(blist_handle, "buddy-status-changed",
-						plugin, PURPLE_CALLBACK(buddy_status_changed_cb), NULL);
-	purple_signal_connect(blist_handle, "buddy-idle-changed",
-						plugin, PURPLE_CALLBACK(buddy_idle_changed_cb), NULL);
-	purple_signal_connect(blist_handle, "buddy-signed-on",
-						plugin, PURPLE_CALLBACK(buddy_signed_on_cb), NULL);
-	purple_signal_connect(blist_handle, "buddy-signed-off",
-						plugin, PURPLE_CALLBACK(buddy_signed_off_cb), NULL);
-	purple_signal_connect(blist_handle, "blist-node-added",
-						plugin, PURPLE_CALLBACK(blist_node_added_cb), NULL);
-	purple_signal_connect(blist_handle, "blist-node-removed",
-						plugin, PURPLE_CALLBACK(blist_node_removed_cb), NULL);
-	purple_signal_connect(blist_handle, "buddy-icon-changed",
-						plugin, PURPLE_CALLBACK(buddy_icon_changed_cb), NULL);
-	purple_signal_connect(blist_handle, "blist-node-aliased",
-						plugin, PURPLE_CALLBACK(blist_node_aliased), NULL);
-	purple_signal_connect(blist_handle, "blist-node-extended-menu",
-						plugin, PURPLE_CALLBACK(blist_node_extended_menu_cb), NULL);
-
-	/* Connection subsystem signals */
-	purple_signal_connect(conn_handle, "signing-on",
-						plugin, PURPLE_CALLBACK(signing_on_cb), NULL);
-	purple_signal_connect(conn_handle, "signed-on",
-						plugin, PURPLE_CALLBACK(signed_on_cb), NULL);
-	purple_signal_connect(conn_handle, "signing-off",
-						plugin, PURPLE_CALLBACK(signing_off_cb), NULL);
-	purple_signal_connect(conn_handle, "signed-off",
-						plugin, PURPLE_CALLBACK(signed_off_cb), NULL);
-	purple_signal_connect(conn_handle, "connection-error",
-						plugin, PURPLE_CALLBACK(connection_error_cb), NULL);
-
-	/* Conversations subsystem signals */
-	purple_signal_connect(conv_handle, "writing-im-msg",
-						plugin, PURPLE_CALLBACK(writing_im_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "wrote-im-msg",
-						plugin, PURPLE_CALLBACK(wrote_im_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "sending-im-msg",
-						plugin, PURPLE_CALLBACK(sending_im_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "sent-im-msg",
-						plugin, PURPLE_CALLBACK(sent_im_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "receiving-im-msg",
-						plugin, PURPLE_CALLBACK(receiving_im_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "received-im-msg",
-						plugin, PURPLE_CALLBACK(received_im_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "writing-chat-msg",
-						plugin, PURPLE_CALLBACK(writing_chat_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "wrote-chat-msg",
-						plugin, PURPLE_CALLBACK(wrote_chat_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "sending-chat-msg",
-						plugin, PURPLE_CALLBACK(sending_chat_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "sent-chat-msg",
-						plugin, PURPLE_CALLBACK(sent_chat_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "receiving-chat-msg",
-						plugin, PURPLE_CALLBACK(receiving_chat_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "received-chat-msg",
-						plugin, PURPLE_CALLBACK(received_chat_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "conversation-created",
-						plugin, PURPLE_CALLBACK(conversation_created_cb), NULL);
-	purple_signal_connect(conv_handle, "deleting-conversation",
-						plugin, PURPLE_CALLBACK(deleting_conversation_cb), NULL);
-	purple_signal_connect(conv_handle, "buddy-typing",
-						plugin, PURPLE_CALLBACK(buddy_typing_cb), NULL);
-	purple_signal_connect(conv_handle, "buddy-typing-stopped",
-						plugin, PURPLE_CALLBACK(buddy_typing_stopped_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-user-joining",
-						plugin, PURPLE_CALLBACK(chat_user_joining_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-user-joined",
-						plugin, PURPLE_CALLBACK(chat_user_joined_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-user-flags",
-						plugin, PURPLE_CALLBACK(chat_user_flags_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-user-leaving",
-						plugin, PURPLE_CALLBACK(chat_user_leaving_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-user-left",
-						plugin, PURPLE_CALLBACK(chat_user_left_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-inviting-user",
-						plugin, PURPLE_CALLBACK(chat_inviting_user_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-invited-user",
-						plugin, PURPLE_CALLBACK(chat_invited_user_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-invited",
-						plugin, PURPLE_CALLBACK(chat_invited_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-joined",
-						plugin, PURPLE_CALLBACK(chat_joined_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-left",
-						plugin, PURPLE_CALLBACK(chat_left_cb), NULL);
-	purple_signal_connect(conv_handle, "chat-topic-changed",
-						plugin, PURPLE_CALLBACK(chat_topic_changed_cb), NULL);
-
-	/* Core signals */
-	purple_signal_connect(core_handle, "quitting",
-						plugin, PURPLE_CALLBACK(quitting_cb), NULL);
-	purple_signal_connect(core_handle, "uri-handler",
-						plugin,	PURPLE_CALLBACK(uri_handler), NULL);
-
-	/* Notify signals */
-	purple_signal_connect(notify_handle, "displaying-email-notification",
-						plugin, PURPLE_CALLBACK(notify_email_cb), NULL);
-	purple_signal_connect(notify_handle, "displaying-emails-notification",
-						plugin, PURPLE_CALLBACK(notify_emails_cb), NULL);
-
-	/* Jabber signals */
-	if (jabber_handle) {
-		purple_signal_connect(jabber_handle, "jabber-receiving-iq", plugin,
-		                      PURPLE_CALLBACK(jabber_iq_received), NULL);
-		purple_signal_connect(jabber_handle, "jabber-receiving-message", plugin,
-		                      PURPLE_CALLBACK(jabber_message_received), NULL);
-		purple_signal_connect(jabber_handle, "jabber-receiving-presence", plugin,
-		                      PURPLE_CALLBACK(jabber_presence_received), NULL);
-
-		/* IQ namespace signals */
-		purple_signal_emit(jabber_handle, "jabber-register-namespace-watcher",
-		                   "bogus_node", "super-duper-namespace");
-		/* The above is equivalent to doing:
-			int result = GPOINTER_TO_INT(purple_plugin_ipc_call(jabber_handle, "register_namespace_watcher", &ok, "bogus_node", "super-duper-namespace"));
-		 */
-
-		purple_signal_connect(jabber_handle, "jabber-watched-iq", plugin,
-		                      PURPLE_CALLBACK(jabber_watched_iq), NULL);
-	}
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	void *jabber_handle = purple_protocols_find("prpl-jabber");
-
-	purple_signals_disconnect_by_handle(plugin);
-
-	if (jabber_handle) {
-		/* Unregister watched namespaces */
-		purple_signal_emit(jabber_handle, "jabber-unregister-namespace-watcher",
-		                   "bogus_node", "super-duper-namespace");
-		/* The above is equivalent to doing:
-		   int result = GPOINTER_TO_INT(purple_plugin_ipc_call(jabber_handle, "unregister_namespace_watcher", &ok, "bogus_node", "super-duper-namespace"));
-		 */
-	}
-
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(signalstest, plugin_query, plugin_load, plugin_unload);
--- a/libpurple/plugins/simple.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/*
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02111-1301, USA.
- */
-
-#include <glib/gi18n-lib.h>
-
-#include <purple.h>
-
-/** Plugin id : type-author-name (to guarantee uniqueness) */
-#define SIMPLE_PLUGIN_ID "core-ewarmenhoven-simple"
-
-static PurplePluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Eric Warmenhoven <eric@warmenhoven.org>",
-		NULL
-	};
-
-	return purple_plugin_info_new(
-		"id",           SIMPLE_PLUGIN_ID,
-		"name",         N_("Simple Plugin"),
-		"version",      DISPLAY_VERSION,
-		"category",     N_("Testing"),
-		"summary",      N_("Tests to see that most things are working."),
-		"description",  N_("Tests to see that most things are working."),
-		"authors",      authors,
-		"website",      PURPLE_WEBSITE,
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	purple_debug(PURPLE_DEBUG_INFO, "simple", "simple plugin loaded.\n");
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	purple_debug(PURPLE_DEBUG_INFO, "simple", "simple plugin unloaded.\n");
-
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(simple, plugin_query, plugin_load, plugin_unload);
--- a/libpurple/plugins/test-request-input.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-/* pidgin
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
-#include <purple.h>
-
-#define PREF_ROOT "/plugins"
-#define PREF_TEST "/plugins/tests"
-#define PREF_PREFIX "/plugins/tests/request-input"
-#define PREF_SINGLE PREF_PREFIX "/single"
-#define PREF_MULTIPLE PREF_PREFIX "/multiple"
-#define PREF_HTML PREF_PREFIX "/html"
-
-static void
-plugin_input_callback(const gchar *pref, const gchar *text) {
-	purple_prefs_set_string(pref, text);
-}
-
-static void
-plugin_input_single(PurplePluginAction *action) {
-	purple_request_input(
-		NULL,
-		_("Test request input single"),
-		_("Test request input single"),
-		NULL,
-		purple_prefs_get_string(PREF_SINGLE),
-		FALSE,
-		FALSE,
-		NULL,
-		_("OK"),
-		PURPLE_CALLBACK(plugin_input_callback),
-		_("Cancel"),
-		NULL,
-		purple_request_cpar_new(),
-		PREF_SINGLE
-	);
-}
-
-static void
-plugin_input_multiple(PurplePluginAction *action) {
-	purple_request_input(
-		NULL,
-		_("Test request input multiple"),
-		_("Test request input multiple"),
-		NULL,
-		purple_prefs_get_string(PREF_MULTIPLE),
-		TRUE,
-		FALSE,
-		NULL,
-		_("OK"),
-		PURPLE_CALLBACK(plugin_input_callback),
-		_("Cancel"),
-		NULL,
-		purple_request_cpar_new(),
-		PREF_MULTIPLE
-	);
-}
-
-static void
-plugin_input_html(PurplePluginAction *action) {
-	purple_request_input(
-		NULL,
-		_("Test request input HTML"),
-		_("Test request input HTML"),
-		NULL,
-		purple_prefs_get_string(PREF_HTML),
-		FALSE,
-		FALSE,
-		"html",
-		_("OK"),
-		PURPLE_CALLBACK(plugin_input_callback),
-		_("Cancel"),
-		NULL,
-		purple_request_cpar_new(),
-		PREF_HTML
-	);
-}
-
-static GList *
-plugin_actions(PurplePlugin *plugin) {
-	GList *l = NULL;
-	PurplePluginAction *action = NULL;
-
-	action = purple_plugin_action_new(_("Input single"), plugin_input_single);
-	l = g_list_append(l, action);
-
-	action = purple_plugin_action_new(_("Input multiple"), plugin_input_multiple);
-	l = g_list_append(l, action);
-
-	action = purple_plugin_action_new(_("Input html"), plugin_input_html);
-	l = g_list_append(l, action);
-
-	return l;
-}
-
-static PurplePluginInfo *
-plugin_query(GError **error) {
-	const gchar * const authors[] = {
-		"Gary Kramlich <grim@reaperworld.com>",
-		NULL
-	};
-
-	return purple_plugin_info_new(
-		"id", "core-test_request_input",
-		"name", N_("Test: request input"),
-		"version", DISPLAY_VERSION,
-		"category", N_("Testing"),
-		"summary", N_("Test Request Input"),
-		"description", N_("This plugin adds actions to test purple_request_input"),
-		"authors", authors,
-		"website", "https://pidgin.im",
-		"abi-version", PURPLE_ABI_VERSION,
-		"actions-cb", plugin_actions,
-		NULL
-	);
-};
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error) {
-	purple_prefs_add_none(PREF_ROOT);
-	purple_prefs_add_none(PREF_TEST);
-	purple_prefs_add_none(PREF_PREFIX);
-	purple_prefs_add_string(PREF_SINGLE, "");
-	purple_prefs_add_string(PREF_MULTIPLE, "");
-	purple_prefs_add_string(PREF_HTML, "");
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error) {
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(test_request_input, plugin_query, plugin_load, plugin_unload);
--- a/pidgin/plugins/contact_priority.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,208 +0,0 @@
-/*
- * Contact priority settings plugin.
- *
- * Copyright (C) 2003 Etan Reisner, <deryni9@users.sourceforge.net>.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA.
- */
-
-#include <glib/gi18n-lib.h>
-
-#include <gtk/gtk.h>
-
-#include <purple.h>
-
-#include <pidgin.h>
-
-#define CONTACT_PRIORITY_PLUGIN_ID "gtk-contact-priority"
-
-static void
-select_account(GtkWidget *widget, gpointer data)
-{
-	PidginAccountChooser *chooser = PIDGIN_ACCOUNT_CHOOSER(widget);
-	PurpleAccount *account = pidgin_account_chooser_get_selected(chooser);
-	gtk_spin_button_set_value(GTK_SPIN_BUTTON(data),
-	                          (gdouble)purple_account_get_int(account, "score", 0));
-}
-
-static void
-account_update(GtkWidget *widget, gpointer data)
-{
-	PurpleAccount *account = NULL;
-	PidginAccountChooser *chooser = PIDGIN_ACCOUNT_CHOOSER(data);
-
-	account = pidgin_account_chooser_get_selected(chooser);
-	purple_account_set_int(account, "score", gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)));
-}
-
-static void
-pref_update(GtkWidget *widget, char *pref)
-{
-	if (purple_prefs_get_pref_type(pref) == PURPLE_PREF_INT)
-		purple_prefs_set_int(pref, gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)));
-	if (purple_prefs_get_pref_type(pref) == PURPLE_PREF_BOOLEAN)
-		purple_prefs_set_bool(pref, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
-}
-
-static struct PurpleContactPriorityStatuses
-{
-	const char *id;
-	const char *description;
-} const statuses[] =
-{
-	{ "idle",          N_("Buddy is idle") },
-	{ "away",          N_("Buddy is away") },
-	{ "extended_away", N_("Buddy is \"extended\" away") },
-#if 0
-	/* Not used yet. */
-	{ "mobile",        N_("Buddy is mobile") },
-#endif
-	{ "offline",       N_("Buddy is offline") },
-	{ NULL, NULL }
-};
-
-static GtkWidget *
-get_config_frame(PurplePlugin *plugin)
-{
-	GtkWidget *ret = NULL, *hbox = NULL, *frame = NULL, *vbox = NULL;
-	GtkWidget *label = NULL, *spin = NULL, *check = NULL;
-	GtkWidget *chooser = NULL;
-	GtkAdjustment *adj = NULL;
-	GtkSizeGroup *sg = NULL;
-	GtkListStore *store = NULL;
-	PurpleAccount *account = NULL;
-	int i;
-
-	gboolean last_match = purple_prefs_get_bool("/purple/contact/last_match");
-
-	sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-
-	ret = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18);
-	gtk_container_set_border_width(GTK_CONTAINER(ret), 12);
-
-	frame = pidgin_make_frame(ret, _("Point values to use when..."));
-
-	vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
-	gtk_container_add(GTK_CONTAINER(frame), vbox);
-
-	/* Status Spinboxes */
-	for (i = 0 ; statuses[i].id != NULL && statuses[i].description != NULL ; i++)
-	{
-		char *pref = g_strconcat("/purple/status/scores/", statuses[i].id, NULL);
-
-		hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
-		gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
-		label = gtk_label_new_with_mnemonic(_(statuses[i].description));
-		gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-		gtk_size_group_add_widget(sg, label);
-		gtk_label_set_xalign(GTK_LABEL(label), 0);
-		gtk_label_set_yalign(GTK_LABEL(label), 0);
-
-		adj = GTK_ADJUSTMENT(gtk_adjustment_new(purple_prefs_get_int(pref),
-		                                        -500, 500, 1, 1, 1));
-		spin = gtk_spin_button_new(adj, 1, 0);
-		g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(pref_update), pref);
-		gtk_box_pack_start(GTK_BOX(hbox), spin, FALSE, FALSE, 0);
-
-		g_free(pref);
-	}
-
-	/* Explanation */
-	label = gtk_label_new(NULL);
-	gtk_label_set_markup(GTK_LABEL(label), _("The buddy with the <i>largest score</i> is the buddy who will have priority in the contact.\n"));
-	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
-	/* Last match */
-	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
-	check = gtk_check_button_new_with_label(_("Use last buddy when scores are equal"));
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), last_match);
-	g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(pref_update), "/purple/contact/last_match");
-	gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0);
-
-	frame = pidgin_make_frame(ret, _("Point values to use for account..."));
-
-	vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
-	gtk_container_add(GTK_CONTAINER(frame), vbox);
-
-	/* Account */
-	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
-	/* make this here so I can use it in the option menu callback, we'll
-	 * actually set it up later */
-	adj = GTK_ADJUSTMENT(gtk_adjustment_new(0, -500, 500, 1, 1, 1));
-	spin = gtk_spin_button_new(adj, 1, 0);
-
-	store = pidgin_account_store_new();
-	chooser = pidgin_account_chooser_new();
-	gtk_combo_box_set_model(GTK_COMBO_BOX(chooser), GTK_TREE_MODEL(store));
-	g_object_unref(G_OBJECT(store));
-	gtk_box_pack_start(GTK_BOX(hbox), chooser, FALSE, FALSE, 0);
-	g_signal_connect(chooser, "changed", G_CALLBACK(select_account), spin);
-
-	/* this is where we set up the spin button we made above */
-	account = pidgin_account_chooser_get_selected(PIDGIN_ACCOUNT_CHOOSER(chooser));
-	gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin),
-	                          (gdouble)purple_account_get_int(account, "score", 0));
-	gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(spin), GTK_ADJUSTMENT(adj));
-	g_signal_connect(G_OBJECT(spin), "value-changed",
-	                 G_CALLBACK(account_update), chooser);
-	gtk_box_pack_start(GTK_BOX(hbox), spin, FALSE, FALSE, 0);
-
-	gtk_widget_show_all(ret);
-	g_object_unref(sg);
-
-	return ret;
-}
-
-static PidginPluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Etan Reisner <deryni@eden.rutgers.edu>",
-		NULL
-	};
-
-	return pidgin_plugin_info_new(
-		"id",                   CONTACT_PRIORITY_PLUGIN_ID,
-		"name",                 N_("Contact Priority"),
-		"version",              DISPLAY_VERSION,
-		"category",             N_("Utility"),
-		"summary",              N_("Allows for controlling the values associated with different buddy states."),
-		"description",          N_("Allows for changing the point values of idle/away/offline states for buddies in contact priority computations."),
-		"authors",              authors,
-		"website",              PURPLE_WEBSITE,
-		"abi-version",          PURPLE_ABI_VERSION,
-		"gtk-config-frame-cb",  get_config_frame,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(contactpriority, plugin_query, plugin_load, plugin_unload);
--- a/pidgin/plugins/gtk-signals-test.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,167 +0,0 @@
-/*
- * Signals test plugin.
- *
- * Copyright (C) 2003 Christian Hammond.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02111-1301, USA.
- */
-#define GTK_SIGNAL_TEST_PLUGIN_ID "gtk-signals-test"
-
-#include <glib/gi18n.h>
-
-#include <gtk/gtk.h>
-
-#include <purple.h>
-
-#include <pidgin.h>
-
-/**************************************************************************
- * Account subsystem signal callbacks
- **************************************************************************/
-static void
-account_modified_cb(PurpleAccount *account, void *data) {
-	purple_debug_info("gtk-signal-test", "account modified cb\n");
-}
-
-/**************************************************************************
- * Buddy List subsystem signal callbacks
- **************************************************************************/
-static void
-blist_created_cb(PurpleBuddyList *blist, void *data) {
-	purple_debug_info("gtk-signal-test", "buddy list created\n");
-}
-
-static void
-blist_drawing_tooltip_cb(PurpleBlistNode *node, GString *str, gboolean full, void *data) {
-	purple_debug_info("gtk-signal-test", "drawing tooltip cb\n");
-}
-
-/**************************************************************************
- * Conversation subsystem signal callbacks
- **************************************************************************/
-static void
-conversation_dragging_cb(PidginConvWindow *source, PidginConvWindow *destination) {
-	purple_debug_info("gtk-signal-test", "conversation dragging cb\n");
-}
-
-static gboolean
-displaying_im_msg_cb(PurpleConversation *conv, PurpleMessage *pmsg, gpointer data)
-{
-	purple_debug_misc("gtk-signals test", "displaying-im-msg (%s, %s)\n",
-		purple_conversation_get_name(conv),
-		purple_message_get_contents(pmsg));
-
-	return FALSE;
-}
-
-static void
-displayed_im_msg_cb(PurpleConversation *conv, PurpleMessage *msg, gpointer data)
-{
-	purple_debug_misc("gtk-signals test", "displayed-im-msg (%s, %s)\n",
-		purple_conversation_get_name(conv),
-		purple_message_get_contents(msg));
-}
-
-static gboolean
-displaying_chat_msg_cb(PurpleConversation *conv, PurpleMessage *pmsg, gpointer data)
-{
-	purple_debug_misc("gtk-signals test", "displaying-chat-msg (%s, %s)\n",
-		purple_conversation_get_name(conv),
-		purple_message_get_contents(pmsg));
-
-	return FALSE;
-}
-
-static void
-displayed_chat_msg_cb(PurpleConversation *conv, PurpleMessage *msg, gpointer data)
-{
-	purple_debug_misc("gtk-signals test", "displayed-chat-msg (%s, %s)\n",
-		purple_conversation_get_name(conv),
-		purple_message_get_contents(msg));
-}
-
-static void
-conversation_switched_cb(PurpleConversation *conv, void *data)
-{
-	purple_debug_misc("gtk-signals test", "conversation-switched (%s)\n",
-					purple_conversation_get_name(conv));
-}
-
-/**************************************************************************
- * Plugin stuff
- **************************************************************************/
-static PidginPluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Gary Kramlich <amc_grim@users.sf.net>",
-		NULL
-	};
-
-	return pidgin_plugin_info_new(
-		"id",           GTK_SIGNAL_TEST_PLUGIN_ID,
-		"name",         N_("GTK Signals Test"),
-		"version",      DISPLAY_VERSION,
-		"category",     N_("Testing"),
-		"summary",      N_("Test to see that all ui signals are working properly."),
-		"description",  N_("Test to see that all ui signals are working properly."),
-		"authors",      authors,
-		"website",      PURPLE_WEBSITE,
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	void *accounts_handle = pidgin_accounts_get_handle();
-	void *blist_handle = pidgin_blist_get_handle();
-	void *conv_handle = pidgin_conversations_get_handle();
-
-	/* Accounts subsystem signals */
-	purple_signal_connect(accounts_handle, "account-modified",
-						plugin, PURPLE_CALLBACK(account_modified_cb), NULL);
-
-	/* Buddy List subsystem signals */
-	purple_signal_connect(blist_handle, "gtkblist-created",
-						plugin, PURPLE_CALLBACK(blist_created_cb), NULL);
-	purple_signal_connect(blist_handle, "drawing-tooltip",
-						plugin, PURPLE_CALLBACK(blist_drawing_tooltip_cb), NULL);
-
-	/* Conversations subsystem signals */
-	purple_signal_connect(conv_handle, "conversation-dragging",
-						plugin, PURPLE_CALLBACK(conversation_dragging_cb), NULL);
-	purple_signal_connect(conv_handle, "displaying-im-msg",
-						plugin, PURPLE_CALLBACK(displaying_im_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "displayed-im-msg",
-						plugin, PURPLE_CALLBACK(displayed_im_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "displaying-chat-msg",
-						plugin, PURPLE_CALLBACK(displaying_chat_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "displayed-chat-msg",
-						plugin, PURPLE_CALLBACK(displayed_chat_msg_cb), NULL);
-	purple_signal_connect(conv_handle, "conversation-switched",
-						plugin, PURPLE_CALLBACK(conversation_switched_cb), NULL);
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error) {
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(gtksignalstest, plugin_query, plugin_load, plugin_unload);
--- a/pidgin/plugins/history.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,235 +0,0 @@
-/* Puts last 4k of log in new conversations a la Everybuddy (and then
- * stolen by Trillian "Pro") */
-
-#include "internal.h"
-#include "pidgin.h"
-
-#include <purple.h>
-
-#include "gtkconv.h"
-#include "gtkplugin.h"
-#include "gtkwebview.h"
-
-#define HISTORY_PLUGIN_ID "gtk-history"
-
-#define HISTORY_SIZE (4 * 1024)
-
-static gboolean _scroll_webview_to_end(gpointer data)
-{
-	PidginWebView *webview = data;
-	pidgin_webview_scroll_to_end(PIDGIN_WEBVIEW(webview), FALSE);
-	g_object_unref(G_OBJECT(webview));
-	return FALSE;
-}
-
-static void historize(PurpleConversation *c)
-{
-	PurpleAccount *account = purple_conversation_get_account(c);
-	const char *name = purple_conversation_get_name(c);
-	GList *logs = NULL;
-	const char *alias = name;
-	guint flags;
-	char *history;
-	PidginConversation *gtkconv;
-#if 0
-	/* FIXME: WebView has no options */
-	GtkIMHtmlOptions options = GTK_IMHTML_NO_COLOURS;
-#endif
-	char *header;
-#if 0
-	/* FIXME: WebView has no protocol setting */
-	char *protocol;
-#endif
-	char *escaped_alias;
-	GDateTime *dt;
-	gchar *header_date;
-
-	gtkconv = PIDGIN_CONVERSATION(c);
-	g_return_if_fail(gtkconv != NULL);
-
-	/* An IM which is the first active conversation. */
-	g_return_if_fail(gtkconv->convs != NULL);
-	if (PURPLE_IS_IM_CONVERSATION(c) && !gtkconv->convs->next)
-	{
-		GSList *buddies;
-		GSList *cur;
-
-		/* If we're not logging, don't show anything.
-		 * Otherwise, we might show a very old log. */
-		if (!purple_prefs_get_bool("/purple/logging/log_ims"))
-			return;
-
-		/* Find buddies for this conversation. */
-		buddies = purple_blist_find_buddies(account, name);
-
-		/* If we found at least one buddy, save the first buddy's alias. */
-		if (buddies != NULL)
-			alias = purple_buddy_get_contact_alias(PURPLE_BUDDY(buddies->data));
-
-		for (cur = buddies; cur != NULL; cur = cur->next)
-		{
-			PurpleBlistNode *node = cur->data;
-			PurpleBlistNode *prev = purple_blist_node_get_sibling_prev(node);
-			PurpleBlistNode *next = purple_blist_node_get_sibling_next(node);
-			if ((node != NULL) && ((prev != NULL) || (next != NULL)))
-			{
-				PurpleBlistNode *node2;
-				PurpleBlistNode *parent = purple_blist_node_get_parent(node);
-				PurpleBlistNode *child = purple_blist_node_get_first_child(parent);
-
-				alias = purple_buddy_get_contact_alias(PURPLE_BUDDY(node));
-
-				/* We've found a buddy that matches this conversation.  It's part of a
-				 * PurpleContact with more than one PurpleBuddy.  Loop through the PurpleBuddies
-				 * in the contact and get all the logs. */
-				for (node2 = child ; node2 != NULL ; node2 = purple_blist_node_get_sibling_next(node2))
-				{
-					logs = g_list_concat(purple_log_get_logs(PURPLE_LOG_IM,
-							purple_buddy_get_name(PURPLE_BUDDY(node2)),
-							purple_buddy_get_account(PURPLE_BUDDY(node2))),
-							logs);
-				}
-				break;
-			}
-		}
-		g_slist_free(buddies);
-
-		if (logs == NULL)
-			logs = purple_log_get_logs(PURPLE_LOG_IM, name, account);
-		else
-			logs = g_list_sort(logs, purple_log_compare);
-	}
-	else if (PURPLE_IS_CHAT_CONVERSATION(c))
-	{
-		/* If we're not logging, don't show anything.
-		 * Otherwise, we might show a very old log. */
-		if (!purple_prefs_get_bool("/purple/logging/log_chats"))
-			return;
-
-		logs = purple_log_get_logs(PURPLE_LOG_CHAT, name, account);
-	}
-
-	if (logs == NULL)
-		return;
-
-	history = purple_log_read((PurpleLog*)logs->data, &flags);
-	gtkconv = PIDGIN_CONVERSATION(c);
-#if 0
-	/* FIXME: WebView has no options */
-	if (flags & PURPLE_LOG_READ_NO_NEWLINE)
-		options |= GTK_IMHTML_NO_NEWLINE;
-#endif
-
-#if 0
-	/* FIXME: WebView has no protocol setting */
-	protocol = g_strdup(gtk_imhtml_get_protocol_name(GTK_IMHTML(gtkconv->imhtml)));
-	gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml),
-			purple_account_get_protocol_name(((PurpleLog*)logs->data)->account));
-#endif
-
-#if 0
-	/* TODO WebKit: Do this properly... */
-	if (!pidgin_webview_is_empty(PIDGIN_WEBVIEW(gtkconv->webview)))
-		pidgin_webview_append_html(PIDGIN_WEBVIEW(gtkconv->webview), "<BR>");
-#endif
-
-	escaped_alias = g_markup_escape_text(alias, -1);
-
-	dt = g_date_time_to_local(((PurpleLog *)logs->data)->time);
-	header_date = g_date_time_format(dt, "%c");
-	g_date_time_unref(dt);
-
-	header = g_strdup_printf(_("<b>Conversation with %s on %s:</b><br>"), escaped_alias, header_date);
-	pidgin_webview_append_html(PIDGIN_WEBVIEW(gtkconv->webview), header);
-	g_free(header_date);
-	g_free(header);
-	g_free(escaped_alias);
-
-	g_strchomp(history);
-	pidgin_webview_append_html(PIDGIN_WEBVIEW(gtkconv->webview), history);
-	g_free(history);
-
-	pidgin_webview_append_html(PIDGIN_WEBVIEW(gtkconv->webview), "<hr>");
-
-#if 0
-	/* FIXME: WebView has no protocol setting */
-	gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml), protocol);
-	g_free(protocol);
-#endif
-
-	g_object_ref(G_OBJECT(gtkconv->webview));
-	g_idle_add(_scroll_webview_to_end, gtkconv->webview);
-
-	g_list_free_full(logs, (GDestroyNotify)purple_log_free);
-}
-
-static void
-history_prefs_check(PurplePlugin *plugin)
-{
-	if (!purple_prefs_get_bool("/purple/logging/log_ims") &&
-	    !purple_prefs_get_bool("/purple/logging/log_chats"))
-	{
-		/* Translators: Please maintain the use of ⇦ or ⇨ to represent the menu hierarchy */
-		purple_notify_warning(plugin, NULL, _("History Plugin Requires Logging"),
-							_("Logging can be enabled from Tools ⇨ Preferences ⇨ Logging.\n\n"
-							  "Enabling logs for instant messages and/or chats will activate "
-							  "history for the same conversation type(s)."), NULL);
-	}
-}
-
-static void history_prefs_cb(const char *name, PurplePrefType type,
-							 gconstpointer val, gpointer data)
-{
-	history_prefs_check((PurplePlugin *)data);
-}
-
-static PidginPluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Sean Egan <seanegan@gmail.com>",
-		NULL
-	};
-
-	return pidgin_plugin_info_new(
-		"id",           HISTORY_PLUGIN_ID,
-		"name",         N_("History"),
-		"version",      DISPLAY_VERSION,
-		"category",     N_("User interface"),
-		"summary",      N_("Shows recently logged conversations in new "
-		                   "conversations."),
-		"description",  N_("When a new conversation is opened this plugin will "
-		                   "insert the last conversation into the current "
-		                   "conversation."),
-		"authors",      authors,
-		"website",      PURPLE_WEBSITE,
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	purple_signal_connect(purple_conversations_get_handle(),
-						"conversation-created",
-						plugin, PURPLE_CALLBACK(historize), NULL);
-	/* XXX: Do we want to listen to pidgin's "conversation-displayed" signal? */
-
-	purple_prefs_connect_callback(plugin, "/purple/logging/log_ims",
-								history_prefs_cb, plugin);
-	purple_prefs_connect_callback(plugin, "/purple/logging/log_chats",
-								history_prefs_cb, plugin);
-
-	history_prefs_check(plugin);
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(history, plugin_query, plugin_load, plugin_unload);
--- a/pidgin/plugins/imgupload.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,468 +0,0 @@
-/*
- * Image Uploader - an inline images implementation for protocols without
- * support for such feature.
- *
- * Copyright (C) 2014, Tomasz Wasilczyk <twasilczyk@pidgin.im>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
- */
-
-#include "internal.h"
-
-#include <purple.h>
-
-#include "gtkconv.h"
-#include "gtkplugin.h"
-#include "gtkutils.h"
-#include "gtkwebviewtoolbar.h"
-
-#include <json-glib/json-glib.h>
-#include <libsoup/soup.h>
-
-#define IMGUP_IMGUR_CLIENT_ID "b6d33c6bb80e1b6"
-#define IMGUP_PREF_PREFIX "/plugins/gtk/imgupload/"
-
-static PurplePlugin *plugin_handle = NULL;
-static SoupSession *session = NULL;
-
-static void
-imgup_upload_done(PidginWebView *webview, const gchar *url, const gchar *title);
-static void
-imgup_upload_failed(PidginWebView *webview);
-
-
-/******************************************************************************
- * Helper functions
- ******************************************************************************/
-
-static gboolean
-imgup_conn_is_hooked(PurpleConnection *gc)
-{
-	return GPOINTER_TO_INT(g_object_get_data(G_OBJECT(gc), "imgupload-set"));
-}
-
-
-/******************************************************************************
- * Imgur implementation
- ******************************************************************************/
-
-static void
-imgup_imgur_uploaded(G_GNUC_UNUSED SoupSession *session, SoupMessage *msg,
-                     gpointer _webview)
-{
-	JsonParser *parser;
-	JsonObject *result;
-	PidginWebView *webview = PIDGIN_WEBVIEW(_webview);
-	const gchar *url, *title;
-
-	if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
-		imgup_upload_failed(webview);
-		return;
-	}
-
-	parser = json_parser_new();
-	if (!json_parser_load_from_data(parser, msg->response_body->data,
-	                                msg->response_body->length, NULL)) {
-		purple_debug_warning("imgupload", "Invalid json got from imgur");
-
-		imgup_upload_failed(webview);
-		return;
-	}
-
-	result = json_node_get_object(json_parser_get_root(parser));
-
-	if (!json_object_get_boolean_member(result, "success")) {
-		g_object_unref(parser);
-
-		purple_debug_warning("imgupload", "imgur - not a success");
-
-		imgup_upload_failed(webview);
-		return;
-	}
-
-	result = json_object_get_object_member(result, "data");
-	url = json_object_get_string_member(result, "link");
-
-	title = g_object_get_data(G_OBJECT(msg), "imgupload-imgur-name");
-
-	imgup_upload_done(webview, url, title);
-
-	g_object_unref(parser);
-	g_object_set_data(G_OBJECT(msg), "imgupload-imgur-name", NULL);
-}
-
-static PurpleHttpConnection *
-imgup_imgur_upload(PidginWebView *webview, PurpleImage *image)
-{
-	SoupMessage *msg;
-	gchar *req_data, *img_data, *img_data_e;
-
-	msg = soup_message_new("POST", "https://api.imgur.com/3/image");
-	soup_message_headers_replace(msg, "Authorization",
-	                             "Client-ID " IMGUP_IMGUR_CLIENT_ID);
-
-	/* TODO: make it a plain, multipart/form-data request */
-	img_data = g_base64_encode(purple_image_get_data(image),
-		purple_image_get_data_size(image));
-	img_data_e = g_uri_escape_string(img_data, NULL, FALSE);
-	g_free(img_data);
-	req_data = g_strdup_printf("type=base64&image=%s", img_data_e);
-	g_free(img_data_e);
-
-	soup_message_set_request(msg, "application/x-www-form-urlencoded",
-	                         SOUP_MESSAGE_TAKE, req_data, strlen(req_data));
-
-	g_object_set_data_full(G_OBJECT(msg), "imgupload-imgur-name",
-	                       g_strdup(purple_image_get_friendly_filename(image)),
-	                       g_free);
-
-	soup_session_queue_message(session, msg, imgup_imgur_uploaded, webview);
-
-	return msg;
-}
-
-/******************************************************************************
- * Image/link upload and insertion
- ******************************************************************************/
-
-static void
-imgup_upload_finish(PidginWebView *webview)
-{
-	gpointer plswait;
-
-	g_object_steal_data(G_OBJECT(webview), "imgupload-msg");
-	plswait = g_object_get_data(G_OBJECT(webview), "imgupload-plswait");
-	g_object_set_data(G_OBJECT(webview), "imgupload-plswait", NULL);
-
-	if (plswait)
-		purple_request_close(PURPLE_REQUEST_WAIT, plswait);
-}
-
-static void
-imgup_upload_done(PidginWebView *webview, const gchar *url, const gchar *title)
-{
-	gboolean url_desc;
-
-	imgup_upload_finish(webview);
-
-	if (!purple_prefs_get_bool(IMGUP_PREF_PREFIX "use_url_desc"))
-		url_desc = FALSE;
-	else {
-		PidginWebViewButtons format;
-
-		format = pidgin_webview_get_format_functions(webview);
-		url_desc = format & PIDGIN_WEBVIEW_LINKDESC;
-	}
-
-	pidgin_webview_insert_link(webview, url, url_desc ? title : NULL);
-}
-
-static void
-imgup_upload_failed(PidginWebView *webview)
-{
-	gboolean is_cancelled;
-
-	imgup_upload_finish(webview);
-
-	is_cancelled = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(webview),
-		"imgupload-cancelled"));
-	g_object_set_data(G_OBJECT(webview), "imgupload-cancelled", NULL);
-
-	if (!is_cancelled)
-		purple_debug_error("imgupload", "Failed uploading image");
-}
-
-static void
-imgup_upload_cancel_message(SoupMessage *msg)
-{
-	soup_session_cancel_message(session, msg, SOUP_STATUS_CANCELLED);
-}
-
-static void
-imgup_upload_cancel(gpointer _webview)
-{
-	SoupMessage *msg;
-	PidginWebView *webview = PIDGIN_WEBVIEW(_webview);
-
-	g_object_set_data(G_OBJECT(webview), "imgupload-plswait", NULL);
-	g_object_set_data(G_OBJECT(webview), "imgupload-cancelled",
-		GINT_TO_POINTER(TRUE));
-	msg = g_object_steal_data(G_OBJECT(webview), "imgupload-msg");
-	if (msg) {
-		soup_session_cancel_message(session, msg, SOUP_STATUS_CANCELLED);
-	}
-}
-
-static gboolean
-imgup_upload_start(PidginWebView *webview, PurpleImage *image, gpointer _gtkconv)
-{
-	PidginConversation *gtkconv = _gtkconv;
-	PurpleConversation *conv = gtkconv->active_conv;
-	SoupMessage *msg;
-	gpointer plswait;
-
-	if (!imgup_conn_is_hooked(purple_conversation_get_connection(conv)))
-		return FALSE;
-
-	msg = imgup_imgur_upload(webview, image);
-	g_object_set_data_full(G_OBJECT(webview), "imgupload-msg", msg,
-	                       (GDestroyNotify)imgup_upload_cancel_message);
-
-	plswait = purple_request_wait(plugin_handle, _("Uploading image"),
-		_("Please wait for image URL being retrieved..."),
-		NULL, FALSE, imgup_upload_cancel,
-		purple_request_cpar_from_conversation(conv), webview);
-	g_object_set_data(G_OBJECT(webview), "imgupload-plswait", plswait);
-
-	return TRUE;
-}
-
-
-/******************************************************************************
- * Setup/cleanup
- ******************************************************************************/
-
-static void
-imgup_pidconv_init(PidginConversation *gtkconv)
-{
-	PidginWebView *webview;
-
-	webview = PIDGIN_WEBVIEW(gtkconv->entry);
-
-	g_signal_connect(G_OBJECT(webview), "insert-image",
-		G_CALLBACK(imgup_upload_start), gtkconv);
-}
-
-static void
-imgup_pidconv_uninit(PidginConversation *gtkconv)
-{
-	PidginWebView *webview;
-
-	webview = PIDGIN_WEBVIEW(gtkconv->entry);
-
-	g_signal_handlers_disconnect_by_func(G_OBJECT(webview),
-		G_CALLBACK(imgup_upload_start), gtkconv);
-}
-
-static void
-imgup_conv_init(PurpleConversation *conv)
-{
-	PurpleConnection *gc;
-
-	gc = purple_conversation_get_connection(conv);
-	if (!gc)
-		return;
-	if (!imgup_conn_is_hooked(gc))
-		return;
-
-	purple_conversation_set_features(conv,
-		purple_conversation_get_features(conv) &
-		~PURPLE_CONNECTION_FLAG_NO_IMAGES);
-
-	g_object_set_data(G_OBJECT(conv), "imgupload-set", GINT_TO_POINTER(TRUE));
-}
-
-static void
-imgup_conv_uninit(PurpleConversation *conv)
-{
-	PurpleConnection *gc;
-
-	gc = purple_conversation_get_connection(conv);
-	if (gc) {
-		if (!imgup_conn_is_hooked(gc))
-			return;
-	} else {
-		if (!g_object_get_data(G_OBJECT(conv), "imgupload-set"))
-			return;
-	}
-
-	purple_conversation_set_features(conv,
-		purple_conversation_get_features(conv) |
-		PURPLE_CONNECTION_FLAG_NO_IMAGES);
-
-	g_object_set_data(G_OBJECT(conv), "imgupload-set", NULL);
-}
-
-static void
-imgup_conn_init(PurpleConnection *gc)
-{
-	PurpleConnectionFlags flags;
-
-	flags = purple_connection_get_flags(gc);
-
-	if (!(flags & PURPLE_CONNECTION_FLAG_NO_IMAGES))
-		return;
-
-	flags &= ~PURPLE_CONNECTION_FLAG_NO_IMAGES;
-	purple_connection_set_flags(gc, flags);
-
-	g_object_set_data(G_OBJECT(gc), "imgupload-set", GINT_TO_POINTER(TRUE));
-}
-
-static void
-imgup_conn_uninit(PurpleConnection *gc)
-{
-	if (!imgup_conn_is_hooked(gc))
-		return;
-
-	purple_connection_set_flags(gc, purple_connection_get_flags(gc) |
-		PURPLE_CONNECTION_FLAG_NO_IMAGES);
-
-	g_object_set_data(G_OBJECT(gc), "imgupload-set", NULL);
-}
-
-/******************************************************************************
- * Prefs
- ******************************************************************************/
-
-static void
-imgup_prefs_ok(gpointer _unused, PurpleRequestFields *fields)
-{
-	gboolean use_url_desc;
-
-	use_url_desc = purple_request_fields_get_bool(fields, "use_url_desc");
-
-	purple_prefs_set_bool(IMGUP_PREF_PREFIX "use_url_desc", use_url_desc);
-}
-
-static gpointer
-imgup_prefs_get(PurplePlugin *plugin)
-{
-	PurpleRequestCommonParameters *cpar;
-	PurpleRequestFields *fields;
-	PurpleRequestFieldGroup *group;
-	PurpleRequestField *field;
-	gpointer handle;
-
-	fields = purple_request_fields_new();
-	group = purple_request_field_group_new(NULL);
-	purple_request_fields_add_group(fields, group);
-
-	field = purple_request_field_bool_new("use_url_desc",
-		_("Use image filename as link description"),
-		purple_prefs_get_bool(IMGUP_PREF_PREFIX "use_url_desc"));
-	purple_request_field_group_add_field(group, field);
-
-	cpar = purple_request_cpar_new();
-	purple_request_cpar_set_icon(cpar, PURPLE_REQUEST_ICON_DIALOG);
-
-	handle = purple_request_fields(plugin,
-		_("Image Uploader"), NULL, NULL, fields,
-		_("OK"), (GCallback)imgup_prefs_ok,
-		_("Cancel"), NULL,
-		cpar, NULL);
-
-	return handle;
-}
-
-/******************************************************************************
- * Plugin stuff
- ******************************************************************************/
-
-static PidginPluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Tomasz Wasilczyk <twasilczyk@pidgin.im>",
-		NULL
-	};
-
-	return pidgin_plugin_info_new(
-		"id",              "gtk-imgupload",
-		"name",            N_("Image Uploader"),
-		"version",         DISPLAY_VERSION,
-		"category",        N_("Utility"),
-		"summary",         N_("Inline images implementation for protocols "
-		                      "without such feature."),
-		"description",     N_("Adds inline images support for protocols "
-		                      "lacking this feature by uploading them to the "
-		                      "external service."),
-		"authors",         authors,
-		"website",         PURPLE_WEBSITE,
-		"abi-version",     PURPLE_ABI_VERSION,
-		"pref-request-cb", imgup_prefs_get,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	GList *it;
-
-	purple_prefs_add_none("/plugins");
-	purple_prefs_add_none("/plugins/gtk");
-	purple_prefs_add_none("/plugins/gtk/imgupload");
-
-	purple_prefs_add_bool(IMGUP_PREF_PREFIX "use_url_desc", TRUE);
-
-	plugin_handle = plugin;
-	session = soup_session_new();
-
-	it = purple_connections_get_all();
-	for (; it; it = g_list_next(it)) {
-		PurpleConnection *gc = it->data;
-		imgup_conn_init(gc);
-	}
-
-	it = purple_conversations_get_all();
-	for (; it; it = g_list_next(it)) {
-		PurpleConversation *conv = it->data;
-		imgup_conv_init(conv);
-		if (PIDGIN_IS_PIDGIN_CONVERSATION(conv))
-			imgup_pidconv_init(PIDGIN_CONVERSATION(conv));
-	}
-
-	purple_signal_connect(purple_connections_get_handle(),
-		"signed-on", plugin,
-		PURPLE_CALLBACK(imgup_conn_init), NULL);
-	purple_signal_connect(purple_connections_get_handle(),
-		"signing-off", plugin,
-		PURPLE_CALLBACK(imgup_conn_uninit), NULL);
-	purple_signal_connect(pidgin_conversations_get_handle(),
-		"conversation-displayed", plugin,
-		PURPLE_CALLBACK(imgup_pidconv_init), NULL);
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	GList *it;
-
-	soup_session_abort(session);
-
-	it = purple_conversations_get_all();
-	for (; it; it = g_list_next(it)) {
-		PurpleConversation *conv = it->data;
-		imgup_conv_uninit(conv);
-		if (PIDGIN_IS_PIDGIN_CONVERSATION(conv))
-			imgup_pidconv_uninit(PIDGIN_CONVERSATION(conv));
-	}
-
-	it = purple_connections_get_all();
-	for (; it; it = g_list_next(it)) {
-		PurpleConnection *gc = it->data;
-		imgup_conn_uninit(gc);
-	}
-
-	g_clear_object(&session);
-	plugin_handle = NULL;
-
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(imgupload, plugin_query, plugin_load, plugin_unload);
--- a/pidgin/plugins/mailchk.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-#include "internal.h"
-
-#include <purple.h>
-
-#include "gtkblist.h"
-#include "gtkplugin.h"
-
-#define MAILCHK_PLUGIN_ID      "gtk-mailchk"
-#define MAILCHK_PLUGIN_DOMAIN  (g_quark_from_static_string(MAILCHK_PLUGIN_ID))
-
-#define ANY_MAIL    0x01
-#define UNREAD_MAIL 0x02
-#define NEW_MAIL    0x04
-
-static guint timer = 0;
-static GtkWidget *mail = NULL;
-
-static gint
-check_mail()
-{
-	static off_t oldsize = 0;
-	gchar *filename;
-	off_t newsize;
-	GStatBuf st;
-	gint ret = 0;
-
-	filename = g_strdup(g_getenv("MAIL"));
-	if (!filename)
-		filename = g_strconcat("/var/spool/mail/", g_get_user_name(), NULL);
-
-	if (g_stat(filename, &st) < 0) {
-		g_free(filename);
-		return -1;
-	}
-
-	newsize = st.st_size;
-	if (newsize) ret |= ANY_MAIL;
-	if (st.st_mtime > st.st_atime && newsize) ret |= UNREAD_MAIL;
-	if (newsize != oldsize && (ret & UNREAD_MAIL)) ret |= NEW_MAIL;
-	oldsize = newsize;
-
-	g_free(filename);
-
-	return ret;
-}
-
-static void
-destroy_cb()
-{
-	mail = NULL;
-}
-
-static gboolean
-check_timeout(gpointer data)
-{
-	gint count = check_mail();
-	PurpleBuddyList *list = purple_blist_get_default();
-
-	if (count == -1)
-		return FALSE;
-
-	if (!list || !(PIDGIN_BLIST(list)->vbox))
-		return TRUE;
-
-	if (!mail) {
-		/* guess we better build it then :P */
-		GtkWidget *vbox = PIDGIN_BLIST(list)->vbox;
-
-		mail = gtk_label_new("No mail messages.");
-		gtk_box_pack_start(GTK_BOX(vbox), mail, FALSE, FALSE, 0);
-		gtk_box_reorder_child(GTK_BOX(vbox), mail, 1);
-		g_signal_connect(G_OBJECT(mail), "destroy", G_CALLBACK(destroy_cb), NULL);
-		gtk_widget_show(mail);
-	}
-
-	if (count & UNREAD_MAIL)
-		gtk_label_set_text(GTK_LABEL(mail), "You have new mail!");
-	else if (count & ANY_MAIL)
-		gtk_label_set_text(GTK_LABEL(mail), "You have mail.");
-	else
-		gtk_label_set_text(GTK_LABEL(mail), "No mail messages.");
-
-	return TRUE;
-}
-
-static void
-signon_cb(PurpleConnection *gc)
-{
-	PurpleBuddyList *list = purple_blist_get_default();
-	if (list && !timer) {
-		check_timeout(NULL); /* we want the box to be drawn immediately */
-		timer = g_timeout_add_seconds(2, check_timeout, NULL);
-	}
-}
-
-static void
-signoff_cb(PurpleConnection *gc)
-{
-	PurpleBuddyList *list = purple_blist_get_default();
-	if ((!list || !PIDGIN_BLIST(list)->vbox) && timer) {
-		g_source_remove(timer);
-		timer = 0;
-	}
-}
-
-/*
- *  EXPORTED FUNCTIONS
- */
-
-static PidginPluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Eric Warmenhoven <eric@warmenhoven.org>",
-		NULL
-	};
-
-	return pidgin_plugin_info_new(
-		"id",           MAILCHK_PLUGIN_ID,
-		"name",         N_("Mail Checker"),
-		"version",      DISPLAY_VERSION,
-		"category",     N_("Utility"),
-		"summary",      N_("Checks for new local mail."),
-		"description",  N_("Adds a small box to the buddy list that shows if "
-		                   "you have new mail."),
-		"authors",      authors,
-		"website",      PURPLE_WEBSITE,
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	PurpleBuddyList *list = purple_blist_get_default();
-	void *conn_handle = purple_connections_get_handle();
-
-	if (!check_timeout(NULL)) {
-		g_set_error(error, MAILCHK_PLUGIN_DOMAIN, 0, _("Could not read $MAIL "
-				"or /var/spool/mail/$USER\n"));
-		return FALSE;
-	}
-
-	if (list && PIDGIN_BLIST(list)->vbox)
-		timer = g_timeout_add_seconds(2, check_timeout, NULL);
-
-	purple_signal_connect(conn_handle, "signed-on",
-						plugin, PURPLE_CALLBACK(signon_cb), NULL);
-	purple_signal_connect(conn_handle, "signed-off",
-						plugin, PURPLE_CALLBACK(signoff_cb), NULL);
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	if (timer)
-		g_source_remove(timer);
-	timer = 0;
-	if (mail)
-		gtk_widget_destroy(mail);
-	mail = NULL;
-
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(mailchk, plugin_query, plugin_load, plugin_unload);
--- a/pidgin/plugins/meson.build	Wed Nov 04 02:41:46 2020 -0600
+++ b/pidgin/plugins/meson.build	Wed Nov 04 03:24:02 2020 -0600
@@ -1,42 +1,18 @@
-if false
-	subdir('musicmessaging')
-endif
-
 subdir('disco')
 subdir('gestures')
 subdir('xmppconsole')
 
 if PLUGINS
-	contact_priority = library('contact_priority', 'contact_priority.c',
-	    dependencies : [libpurple_dep, libpidgin_dep, glib],
-	    name_prefix : '')
-
 	gtkbuddynote = library('gtkbuddynote', 'gtkbuddynote.c',
 	    dependencies : [libpurple_dep, libpidgin_dep, glib],
 	    name_prefix : '',
 	    install : true, install_dir : PIDGIN_PLUGINDIR)
 
-	gtk_signals_test = library('gtk_signals_test', 'gtk-signals-test.c',
-	    dependencies : [libpurple_dep, libpidgin_dep, glib],
-	    name_prefix : '')
-
-	history = library('history', 'history.c',
-	    build_by_default: false,
-	    dependencies : [libpurple_dep, libpidgin_dep, glib],
-	    name_prefix : '',
-	    install : false, install_dir : PIDGIN_PLUGINDIR)
-
 	iconaway = library('iconaway', 'iconaway.c',
 	    dependencies : [libpurple_dep, libpidgin_dep, glib],
 	    name_prefix : '',
 	    install : true, install_dir : PIDGIN_PLUGINDIR)
 
-	imgupload = library('imgupload', 'imgupload.c',
-	    dependencies : [json, libpurple_dep, libpidgin_dep, libsoup, glib],
-	    name_prefix : '',
-	    build_by_default: false,
-	    install : false, install_dir : PIDGIN_PLUGINDIR)
-
 	notify = library('notify', 'notify.c',
 	    dependencies : [libpurple_dep, libpidgin_dep, glib],
 	    name_prefix : '',
@@ -48,17 +24,18 @@
 	    name_prefix : '',
 	    install : true, install_dir : PIDGIN_PLUGINDIR)
 
-	screencap = library('screencap', 'screencap.c',
+	spellchk = library('spellchk', 'spellchk.c',
 	    dependencies : [libpurple_dep, libpidgin_dep, glib],
 	    name_prefix : '',
 	    build_by_default: false,
 	    install : false, install_dir : PIDGIN_PLUGINDIR)
 
-	spellchk = library('spellchk', 'spellchk.c',
-	    dependencies : [libpurple_dep, libpidgin_dep, glib],
-	    name_prefix : '',
-	    build_by_default: false,
-	    install : false, install_dir : PIDGIN_PLUGINDIR)
+	if IS_WIN32
+		transparency = library('transparency', 'transparency.c',
+			dependencies : [libpurple_dep, libpidgin_dep, glib],
+			name_prefix : '',
+			install : true, install_dir : PIDGIN_PLUGINDIR)
+	endif
 
 	if enable_unity
 		unity = library('unity', 'unity.c',
--- a/pidgin/plugins/musicmessaging/meson.build	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-if PLUGINS and enable_dbus
-	install_data('music.png',
-		install_dir : get_option('datadir') / 'pixmaps/pidgin/buttons')
-
-	music_messaging_bindings = custom_target('music_messaging_bindings.c',
-	    command : [python, dbus_analyze_functions, '--export-only', '-o', '@OUTPUT@', '@INPUT@'],
-	    input : 'musicmessaging.c',
-	    output : 'music-messaging-bindings.ch')
-
-	musicmessaging = library('musicmessaging', 'musicmessaging.c', music_messaging_bindings,
-	    dependencies : [dbus, libpurple_dep, libpidgin_dep, glib],
-	    name_prefix : '',
-	    install : true, install_dir : PIDGIN_PLUGINDIR)
-endif
Binary file pidgin/plugins/musicmessaging/music.png has changed
--- a/pidgin/plugins/musicmessaging/musicmessaging.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,712 +0,0 @@
-/*
- * Music messaging plugin for Purple
- *
- * Copyright (C) 2005 Christian Muise.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02111-1301, USA.
- */
-
-/* NOTICE: This plugin is currently broken as the libpurple DBus bindings
- * have been removed.
- */
-
-#include "internal.h"
-#include "pidgin.h"
-
-#include <purple.h>
-
-#include <pidgin.h>
-
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus.h>
-#include "dbus-maybe.h"
-#include "dbus-bindings.h"
-#include "dbus-server.h"
-#include "dbus-purple.h"
-
-#define MUSICMESSAGING_PLUGIN_ID "gtk-hazure-musicmessaging"
-#define MUSICMESSAGING_PREFIX "##MM##"
-#define MUSICMESSAGING_START_MSG _("A music messaging session has been requested. Please click the MM icon to accept.")
-#define MUSICMESSAGING_CONFIRM_MSG _("Music messaging session confirmed.")
-
-typedef struct {
-	PurpleConversation *conv; /* pointer to the conversation */
-	GtkWidget *seperator; /* seperator in the conversation */
-	GtkWidget *button; /* button in the conversation */
-	GPid pid; /* the pid of the score editor */
-
-	gboolean started; /* session has started and editor run */
-	gboolean originator; /* started the mm session */
-	gboolean requested; /* received a request to start a session */
-
-} MMConversation;
-
-static gboolean start_session(MMConversation *mmconv);
-static void run_editor(MMConversation *mmconv);
-static void kill_editor(MMConversation *mmconv);
-static void add_button (MMConversation *mmconv);
-static void remove_widget (GtkWidget *button);
-static void init_conversation (PurpleConversation *conv);
-static void conv_destroyed(PurpleConversation *conv);
-static gboolean intercept_sent(PurpleAccount *account, PurpleMessage *msg, void* pData);
-static gboolean intercept_received(PurpleAccount *account, char **sender, char **message, PurpleConversation *conv, int *flags);
-static gboolean send_change_request (const int session, const char *id, const char *command, const char *parameters);
-static gboolean send_change_confirmed (const int session, const char *command, const char *parameters);
-static void session_end (MMConversation *mmconv);
-
-/* Globals */
-/* List of sessions */
-static GList *conversations;
-
-/* Pointer to this plugin */
-static PurplePlugin *plugin_pointer;
-
-/* Define types needed for DBus */
-DBusGConnection *connection;
-DBusGProxy *proxy;
-#define DBUS_SERVICE_GSCORE "org.gscore.GScoreService"
-#define DBUS_PATH_GSCORE "/org/gscore/GScoreObject"
-#define DBUS_INTERFACE_GSCORE "org.gscore.GScoreInterface"
-
-/* Define the functions to export for use with DBus */
-DBUS_EXPORT void
-music_messaging_change_request(const int session, const char *command,
-	const char *parameters);
-
-DBUS_EXPORT void
-music_messaging_change_confirmed(const int session, const char *command,
-	const char *parameters);
-
-DBUS_EXPORT void
-music_messaging_change_failed(const int session, const char *id,
-	const char *command, const char *parameters);
-
-DBUS_EXPORT void
-music_messaging_done_session(const int session);
-
-/* This file has been generated by the #dbus-analize-functions.py
-   script.  It contains dbus wrappers for the four functions declared
-   above. */
-#include "music-messaging-bindings.ch"
-
-/* Exported functions */
-DBUS_EXPORT void
-music_messaging_change_request(const int session, const char *command,
-	const char *parameters)
-{
-
-	MMConversation *mmconv = (MMConversation *)g_list_nth_data(conversations, session);
-
-	if (mmconv->started)
-	{
-		if (mmconv->originator)
-		{
-			const char *name = purple_conversation_get_name(mmconv->conv);
-			send_change_request (session, name, command, parameters);
-		} else
-		{
-			GString *to_send = g_string_new("");
-			g_string_append_printf(to_send, "##MM## request %s %s##MM##", command, parameters);
-
-			purple_conversation_send(mmconv->conv, to_send->str);
-
-			purple_debug_misc("musicmessaging", "Sent request: %s\n", to_send->str);
-		}
-	}
-
-}
-
-DBUS_EXPORT void
-music_messaging_change_confirmed(const int session, const char *command,
-	const char *parameters)
-{
-
-	MMConversation *mmconv = (MMConversation *)g_list_nth_data(conversations, session);
-
-	if (mmconv->started)
-	{
-		if (mmconv->originator)
-		{
-			GString *to_send = g_string_new("");
-			g_string_append_printf(to_send, "##MM## confirm %s %s##MM##", command, parameters);
-
-			purple_conversation_send(mmconv->conv, to_send->str);
-		} else
-		{
-			/* Do nothing. If they aren't the originator, then they can't confirm. */
-		}
-	}
-
-}
-
-DBUS_EXPORT void
-music_messaging_change_failed(const int session, const char *id,
-	const char *command, const char *parameters)
-{
-	MMConversation *mmconv = (MMConversation *)g_list_nth_data(conversations, session);
-
-	purple_notify_message(plugin_pointer, PURPLE_NOTIFY_MSG_INFO, command,
-                        parameters, NULL, NULL, NULL, NULL);
-
-	if (mmconv->started)
-	{
-		if (mmconv->originator)
-		{
-			GString *to_send = g_string_new("");
-			g_string_append_printf(to_send, "##MM## failed %s %s %s##MM##", id, command, parameters);
-
-			purple_conversation_send(mmconv->conv, to_send->str);
-		} else
-		{
-			/* Do nothing. If they aren't the originator, then they can't confirm. */
-		}
-	}
-}
-
-DBUS_EXPORT void
-music_messaging_done_session(const int session)
-{
-	MMConversation *mmconv = (MMConversation *)g_list_nth_data(conversations, session);
-
-	purple_notify_message(plugin_pointer, PURPLE_NOTIFY_MSG_INFO, "Session",
-						"Session Complete", NULL, NULL, NULL, NULL);
-
-	session_end(mmconv);
-}
-
-
-/* DBus commands that can be sent to the editor */
-G_BEGIN_DECLS
-DBusConnection *purple_dbus_get_connection(void);
-G_END_DECLS
-
-static gboolean send_change_request (const int session, const char *id, const char *command, const char *parameters)
-{
-	DBusMessage *message;
-
-	/* Create the signal we need */
-	message = dbus_message_new_signal (PURPLE_DBUS_PATH, PURPLE_DBUS_INTERFACE, "GscoreChangeRequest");
-
-	/* Append the string "Ping!" to the signal */
-	dbus_message_append_args (message,
-							DBUS_TYPE_INT32, &session,
-							DBUS_TYPE_STRING, &id,
-							DBUS_TYPE_STRING, &command,
-							DBUS_TYPE_STRING, &parameters,
-							DBUS_TYPE_INVALID);
-
-	/* Send the signal */
-	dbus_connection_send (purple_dbus_get_connection(), message, NULL);
-
-	/* Free the signal now we have finished with it */
-	dbus_message_unref (message);
-
-	/* Tell the user we sent a signal */
-	g_printerr("Sent change request signal: %d %s %s %s\n", session, id, command, parameters);
-
-	return TRUE;
-}
-
-static gboolean send_change_confirmed (const int session, const char *command, const char *parameters)
-{
-	DBusMessage *message;
-
-	/* Create the signal we need */
-	message = dbus_message_new_signal (PURPLE_DBUS_PATH, PURPLE_DBUS_INTERFACE, "GscoreChangeConfirmed");
-
-	/* Append the string "Ping!" to the signal */
-	dbus_message_append_args (message,
-							DBUS_TYPE_INT32, &session,
-							DBUS_TYPE_STRING, &command,
-							DBUS_TYPE_STRING, &parameters,
-							DBUS_TYPE_INVALID);
-
-	/* Send the signal */
-	dbus_connection_send (purple_dbus_get_connection(), message, NULL);
-
-	/* Free the signal now we have finished with it */
-	dbus_message_unref (message);
-
-	/* Tell the user we sent a signal */
-	g_printerr("Sent change confirmed signal.\n");
-
-	return TRUE;
-}
-
-
-static int
-mmconv_from_conv_loc(PurpleConversation *conv)
-{
-	GList *l;
-	MMConversation *mmconv_current = NULL;
-	guint i;
-
-	i = 0;
-	for (l = conversations; l != NULL; l = l->next)
-	{
-		mmconv_current = l->data;
-		if (conv == mmconv_current->conv)
-		{
-			return i;
-		}
-		i++;
-	}
-	return -1;
-}
-
-static MMConversation*
-mmconv_from_conv(PurpleConversation *conv)
-{
-	return (MMConversation *)g_list_nth_data(conversations, mmconv_from_conv_loc(conv));
-}
-
-static gboolean
-intercept_sent(PurpleAccount *account, PurpleMessage *msg, void* pData)
-{
-	const gchar *cont = purple_message_get_contents(msg);
-
-	if (purple_message_is_empty(msg))
-		return FALSE;
-
-	if (0 == strncmp(cont, MUSICMESSAGING_PREFIX, strlen(MUSICMESSAGING_PREFIX)))
-	{
-		purple_debug_misc("purple-musicmessaging", "Sent MM Message: %s\n", cont);
-	}
-	else if (0 == strncmp(cont, MUSICMESSAGING_START_MSG, strlen(MUSICMESSAGING_START_MSG)))
-	{
-		purple_debug_misc("purple-musicmessaging", "Sent MM request.\n");
-		return FALSE;
-	}
-	else if (0 == strncmp(cont, MUSICMESSAGING_CONFIRM_MSG, strlen(MUSICMESSAGING_CONFIRM_MSG)))
-	{
-		purple_debug_misc("purple-musicmessaging", "Sent MM confirm.\n");
-		return FALSE;
-	}
-	else if (0 == strncmp(cont, "test1", strlen("test1")))
-	{
-		purple_debug_misc("purple-musicmessaging", "\n\nTEST 1\n\n");
-		send_change_request(0, "test-id", "test-command", "test-parameters");
-		return FALSE;
-	}
-	else if (0 == strncmp(cont, "test2", strlen("test2")))
-	{
-		purple_debug_misc("purple-musicmessaging", "\n\nTEST 2\n\n");
-		send_change_confirmed(1, "test-command", "test-parameters");
-		return FALSE;
-	}
-	else
-	{
-		return FALSE;
-		/* Do nothing...procceed as normal */
-	}
-	return TRUE;
-}
-
-static gboolean
-intercept_received(PurpleAccount *account, char **sender, char **message, PurpleConversation *conv, int *flags)
-{
-	MMConversation *mmconv;
-
-	if (conv == NULL) {
-		/* XXX: This is just to avoid a crash (#2726).
-		 *      We may want to create the conversation instead of returning from here
-		 */
-		return FALSE;
-	}
-
-	mmconv = mmconv_from_conv(conv);
-
-	purple_debug_misc("purple-musicmessaging", "Intercepted: %s\n", *message);
-	if (strstr(*message, MUSICMESSAGING_PREFIX))
-	{
-		char *parsed_message = strtok(strstr(*message, MUSICMESSAGING_PREFIX), "<");
-		purple_debug_misc("purple-musicmessaging", "Received an MM Message: %s\n", parsed_message);
-
-		if (mmconv->started)
-		{
-			if (strstr(parsed_message, "request"))
-			{
-				if (mmconv->originator)
-				{
-					int session = mmconv_from_conv_loc(conv);
-					const char *id = purple_conversation_get_name(mmconv->conv);
-					char *command;
-					char *parameters;
-
-					purple_debug_misc("purple-musicmessaging", "Sending request to gscore.\n");
-
-					/* Get past the first two terms - '##MM##' and 'request' */
-					strtok(parsed_message, " "); /* '##MM##' */
-					strtok(NULL, " "); /* 'request' */
-
-					command = strtok(NULL, " ");
-					parameters = strtok(NULL, "#");
-
-					send_change_request (session, id, command, parameters);
-
-				}
-			} else if (strstr(parsed_message, "confirm"))
-			{
-				if (!mmconv->originator)
-				{
-					int session = mmconv_from_conv_loc(conv);
-					char *command;
-					char *parameters;
-
-					purple_debug_misc("purple-musicmessaging", "Sending confirmation to gscore.\n");
-
-					/* Get past the first two terms - '##MM##' and 'confirm' */
-					strtok(parsed_message, " "); /* '##MM##' */
-					strtok(NULL, " "); /* 'confirm' */
-
-					command = strtok(NULL, " ");
-					parameters = strtok(NULL, "#");
-
-					send_change_confirmed (session, command, parameters);
-				}
-			} else if (strstr(parsed_message, "failed"))
-			{
-				char *id;
-				char *command;
-
-				/* Get past the first two terms - '##MM##' and 'confirm' */
-				strtok(parsed_message, " "); /* '##MM##' */
-				strtok(NULL, " "); /* 'failed' */
-
-				id = strtok(NULL, " ");
-				command = strtok(NULL, " ");
-				/* char *parameters = strtok(NULL, "#"); DONT NEED PARAMETERS */
-
-				// TODO: Shouldn't this be strcmp() ?
-				if (purple_conversation_get_name(mmconv->conv) == id)
-				{
-					purple_notify_message(plugin_pointer, PURPLE_NOTIFY_MSG_ERROR,
-							    _("Music Messaging"),
-							    _("There was a conflict in running the command:"), command, NULL, NULL, NULL);
-				}
-			}
-		}
-
-		message = NULL;
-	}
-	else if (strstr(*message, MUSICMESSAGING_START_MSG))
-	{
-		purple_debug_misc("purple-musicmessaging", "Received MM request.\n");
-		if (!(mmconv->originator))
-		{
-			mmconv->requested = TRUE;
-			return FALSE;
-		}
-
-	}
-	else if (strstr(*message, MUSICMESSAGING_CONFIRM_MSG))
-	{
-		purple_debug_misc("purple-musicmessagin", "Received MM confirm.\n");
-
-		if (mmconv->originator)
-		{
-			start_session(mmconv);
-			return FALSE;
-		}
-	}
-	else
-	{
-		return FALSE;
-		/* Do nothing. */
-	}
-	return TRUE;
-}
-
-static void send_request(MMConversation *mmconv)
-{
-	PurpleConnection *connection = purple_conversation_get_connection(mmconv->conv);
-	const char *convName = purple_conversation_get_name(mmconv->conv);
-	purple_serv_send_im(connection, purple_message_new_outgoing(
-		convName, MUSICMESSAGING_START_MSG, 0));
-}
-
-static void send_request_confirmed(MMConversation *mmconv)
-{
-	PurpleConnection *connection = purple_conversation_get_connection(mmconv->conv);
-	const char *convName = purple_conversation_get_name(mmconv->conv);
-	purple_serv_send_im(connection, purple_message_new_outgoing(
-		convName, MUSICMESSAGING_CONFIRM_MSG, 0));
-}
-
-
-static gboolean
-start_session(MMConversation *mmconv)
-{
-	run_editor(mmconv);
-	return TRUE;
-}
-
-static void session_end (MMConversation *mmconv)
-{
-	mmconv->started = FALSE;
-	mmconv->originator = FALSE;
-	mmconv->requested = FALSE;
-	kill_editor(mmconv);
-}
-
-static void music_button_toggled (GtkWidget *widget, gpointer data)
-{
-	MMConversation *mmconv = mmconv_from_conv(((MMConversation *) data)->conv);
-	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
-    {
-		if (((MMConversation *) data)->requested)
-		{
-			start_session(mmconv);
-			send_request_confirmed(mmconv);
-		}
-		else
-		{
-			((MMConversation *) data)->originator = TRUE;
-			send_request((MMConversation *) data);
-		}
-    } else {
-		session_end((MMConversation *)data);
-    }
-}
-
-static void set_editor_path (GtkWidget *button, GtkWidget *text_field)
-{
-	const char * path = gtk_entry_get_text((GtkEntry*)text_field);
-	purple_prefs_set_string("/plugins/gtk/musicmessaging/editor_path", path);
-
-}
-
-static void run_editor (MMConversation *mmconv)
-{
-	GError *spawn_error = NULL;
-	GString *session_id;
-	gchar * args[4];
-	args[0] = (gchar *)purple_prefs_get_string("/plugins/gtk/musicmessaging/editor_path");
-
-	args[1] = "-session_id";
-	session_id = g_string_new("");
-	g_string_append_printf(session_id, "%d", mmconv_from_conv_loc(mmconv->conv));
-	args[2] = session_id->str;
-
-	args[3] = NULL;
-
-	if (!(g_spawn_async (".", args, NULL, 4, NULL, NULL, &(mmconv->pid), &spawn_error)))
-	{
-		purple_notify_error(plugin_pointer, _("Error Running Editor"),
-				  _("The following error has occurred:"), spawn_error->message, NULL);
-		mmconv->started = FALSE;
-	}
-	else
-	{
-		mmconv->started = TRUE;
-	}
-}
-
-static void kill_editor (MMConversation *mmconv)
-{
-	if (mmconv->pid)
-	{
-		kill(mmconv->pid, SIGINT);
-		mmconv->pid = 0;
-	}
-}
-
-static void init_conversation (PurpleConversation *conv)
-{
-	MMConversation *mmconv;
-	mmconv = g_new0(MMConversation, 1);
-
-	mmconv->conv = conv;
-	mmconv->started = FALSE;
-	mmconv->originator = FALSE;
-	mmconv->requested = FALSE;
-
-	add_button(mmconv);
-
-	conversations = g_list_append(conversations, mmconv);
-}
-
-static void conv_destroyed (PurpleConversation *conv)
-{
-	MMConversation *mmconv = mmconv_from_conv(conv);
-
-	remove_widget(mmconv->button);
-	remove_widget(mmconv->seperator);
-	if (mmconv->started)
-	{
-		kill_editor(mmconv);
-	}
-	conversations = g_list_remove(conversations, mmconv);
-}
-
-static void add_button (MMConversation *mmconv)
-{
-#if 0
-	PurpleConversation *conv = mmconv->conv;
-#endif
-
-	GtkWidget *button, *image, *sep;
-	gchar *file_path;
-
-	button = gtk_toggle_button_new();
-	gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
-
-	g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(music_button_toggled), mmconv);
-
-	file_path = g_build_filename(PURPLE_DATADIR,
-		"pixmaps", "purple", "buttons", "music.png", NULL);
-	image = gtk_image_new_from_file(file_path);
-	g_free(file_path);
-
-	gtk_container_add((GtkContainer *)button, image);
-
-	sep = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
-
-	mmconv->seperator = sep;
-	mmconv->button = button;
-
-	gtk_widget_show(sep);
-	gtk_widget_show(image);
-	gtk_widget_show(button);
-
-#if 0
-	gtk_box_pack_start(GTK_BOX(PIDGIN_CONVERSATION(conv)->toolbar), sep, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(PIDGIN_CONVERSATION(conv)->toolbar), button, FALSE, FALSE, 0);
-#endif
-}
-
-static void remove_widget (GtkWidget *button)
-{
-	gtk_widget_hide(button);
-	gtk_widget_destroy(button);
-}
-
-static GtkWidget *
-get_config_frame(PurplePlugin *plugin)
-{
-	GtkWidget *ret;
-	GtkWidget *vbox;
-
-	GtkWidget *editor_path;
-	GtkWidget *editor_path_label;
-	GtkWidget *editor_path_button;
-
-	/* Outside container */
-	ret = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18);
-	gtk_container_set_border_width(GTK_CONTAINER(ret), 10);
-
-	/* Configuration frame */
-	vbox = pidgin_make_frame(ret, _("Music Messaging Configuration"));
-
-	/* Path to the score editor */
-	editor_path = gtk_entry_new();
-	editor_path_label = gtk_label_new(_("Score Editor Path"));
-	editor_path_button = gtk_button_new_with_mnemonic(_("_Apply"));
-
-	gtk_entry_set_text((GtkEntry*)editor_path, "/usr/local/bin/gscore");
-
-	g_signal_connect(G_OBJECT(editor_path_button), "clicked",
-					 G_CALLBACK(set_editor_path), editor_path);
-
-	gtk_box_pack_start(GTK_BOX(vbox), editor_path_label, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(vbox), editor_path, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(vbox), editor_path_button, FALSE, FALSE, 0);
-
-	gtk_widget_show_all(ret);
-
-	return ret;
-}
-
-static PidginPluginInfo *
-plugin_query(GError **error) {
-	const gchar * const authors[] = {
-		"Christian Muise <christian.muise@gmail.com>",
-		NULL
-	};
-
-	return pidgin_plugin_info_new(
-		"id",                   MUSICMESSAGING_PLUGIN_ID,
-		"name",                 N_("Music Messaging"),
-		"version",              DISPLAY_VERSION,
-		"category",             N_("Music"),
-		"summary",              N_("Music Messaging Plugin for "
-		                           "collaborative composition."),
-		"description",          N_("The Music Messaging Plugin allows a "
-		                           "number of users to simultaneously work "
-		                           "on a piece of music by editing a common "
-		                           "score in real-time."),
-		"authors",              authors,
-		"website",              PURPLE_WEBSITE,
-		"abi-version",          PURPLE_ABI_VERSION,
-		"gtk-config-frame-cb",  get_config_frame,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error) {
-	void *conv_list_handle;
-	GList *l;
-
-	PURPLE_DBUS_RETURN_FALSE_IF_DISABLED(plugin);
-
-	purple_prefs_add_none("/plugins/gtk/musicmessaging");
-	purple_prefs_add_string("/plugins/gtk/musicmessaging/editor_path", "/usr/bin/gscore");
-
-    /* First, we have to register our four exported functions with the
-       main purple dbus loop.  Without this statement, the purple dbus
-       code wouldn't know about our functions. */
-    PURPLE_DBUS_REGISTER_BINDINGS(plugin);
-
-	/* Keep the plugin for reference (needed for notify's) */
-	plugin_pointer = plugin;
-
-	/* Add the button to all the current conversations */
-	for (l = purple_conversations_get_all(); l != NULL; l = l->next)
-		init_conversation((PurpleConversation *)l->data);
-
-	/* Listen for any new conversations */
-	conv_list_handle = purple_conversations_get_handle();
-
-	purple_signal_connect(conv_list_handle, "conversation-created",
-					plugin, PURPLE_CALLBACK(init_conversation), NULL);
-
-	/* Listen for conversations that are ending */
-	purple_signal_connect(conv_list_handle, "deleting-conversation",
-					plugin, PURPLE_CALLBACK(conv_destroyed), NULL);
-
-	/* Listen for sending/receiving messages to replace tags */
-	purple_signal_connect(conv_list_handle, "sending-im-msg",
-					plugin, PURPLE_CALLBACK(intercept_sent), NULL);
-	purple_signal_connect(conv_list_handle, "receiving-im-msg",
-					plugin, PURPLE_CALLBACK(intercept_received), NULL);
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error) {
-	MMConversation *mmconv = NULL;
-
-	while (conversations != NULL)
-	{
-		mmconv = conversations->data;
-		conv_destroyed(mmconv->conv);
-	}
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(musicmessaging, plugin_query, plugin_load, plugin_unload);
--- a/pidgin/plugins/pidgininc.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-/* When writing a third-party plugin, do not include libpurple's internal.h
- * included below. This file is for internal libpurple use only. We're including
- * it here for our own convenience. */
-#include "internal.h"
-#include <purple.h>
-
-/* include UI for pidgin_dialogs_about() */
-#include "gtkplugin.h"
-#include "gtkdialogs.h"
-
-#define PURPLEINC_PLUGIN_ID "core-purpleinc"
-
-static void
-echo_hi(PurpleConnection *gc)
-{
-	/* this doesn't do much, just lets you know who we are :) */
-	pidgin_dialogs_about();
-}
-
-static gboolean
-reverse(PurpleAccount *account, char **who, char **message,
-		PurpleConversation *conv, int *flags)
-{
-	/* this will drive you insane. whenever you receive a message,
-	 * the text of the message (HTML and all) will be reversed. */
-	int i, l;
-	char tmp;
-
-	/* this check is necessary in case bad plugins do bad things */
-	if (message == NULL || *message == NULL)
-		return FALSE;
-
-	l = strlen(*message);
-
-	if (purple_strequal(*who, purple_account_get_username(account)))
-		return FALSE;
-
-	for (i = 0; i < l/2; i++) {
-		tmp = (*message)[i];
-		(*message)[i] = (*message)[l - i - 1];
-		(*message)[l - i - 1] = tmp;
-	}
-	return FALSE;
-}
-
-static void
-bud(PurpleBuddy *who)
-{
-	PurpleAccount *acct = purple_buddy_get_account(who);
-	PurpleIMConversation *im = purple_im_conversation_new(acct,
-			purple_buddy_get_name(who));
-
-	purple_conversation_send(PURPLE_CONVERSATION(im), "Hello!");
-}
-
-/*
- *  EXPORTED FUNCTIONS
- */
-
-static PidginPluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Eric Warmenhoven <eric@warmenhoven.org>",
-		NULL
-	};
-
-	return pidgin_plugin_info_new(
-		"id",           PURPLEINC_PLUGIN_ID,
-		"name",         N_("Pidgin Demonstration Plugin"),
-		"version",      DISPLAY_VERSION,
-		"category",     N_("Example"),
-		"summary",      N_("An example plugin that does stuff - see the description."),
-		"description",  N_("This is a really cool plugin that does a lot of stuff:\n"
-		                   "- It tells you who wrote the program when you log in\n"
-		                   "- It reverses all incoming text\n"
-		                   "- It sends a message to people on your list immediately"
-		                   " when they sign on"),
-		"authors",      authors,
-		"website",      PURPLE_WEBSITE,
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	/* this is for doing something fun when we sign on */
-	purple_signal_connect(purple_connections_get_handle(), "signed-on",
-						plugin, PURPLE_CALLBACK(echo_hi), NULL);
-
-	/* this is for doing something fun when we get a message */
-	purple_signal_connect(purple_conversations_get_handle(), "receiving-im-msg",
-						plugin, PURPLE_CALLBACK(reverse), NULL);
-
-	/* this is for doing something fun when a buddy comes online */
-	purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on",
-						plugin, PURPLE_CALLBACK(bud), NULL);
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(purpleinc, plugin_query, plugin_load, plugin_unload);
--- a/pidgin/plugins/screencap.c	Wed Nov 04 02:41:46 2020 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,977 +0,0 @@
-/*
- * Screen Capture - a plugin that allows taking screenshots and sending them
- * to your buddies as inline images.
- *
- * Copyright (C) 2014, Tomasz Wasilczyk <twasilczyk@pidgin.im>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
- */
-
-#include "internal.h"
-
-#include <gdk/gdkkeysyms.h>
-
-#include <purple.h>
-
-#include "gtkconv.h"
-#include "gtkplugin.h"
-#include "gtkutils.h"
-#include "gtkwebviewtoolbar.h"
-#include "pidginicon.h"
-
-#define SCRNCAP_SHOOTING_TIMEOUT 500
-#define SCRNCAP_DEFAULT_COLOR "#FFFF00000000"
-
-enum
-{
-	SCRNCAP_RESPONSE_COLOR
-};
-
-static gboolean is_shooting = FALSE;
-static guint shooting_timeout = 0;
-static GtkWidget *current_window = NULL;
-
-static gint crop_origin_x, crop_origin_y;
-static gboolean crop_active;
-static gint crop_x, crop_y, crop_w, crop_h;
-
-static gint draw_origin_x, draw_origin_y;
-static gboolean draw_active;
-
-static GdkRGBA brush_color = {1, 0, 0, 1};
-static gint line_width = 2;
-
-/******************************************************************************
- * libpidgin helper functions
- ******************************************************************************/
-
-static inline void
-scrncap_conv_set_data(PidginConversation *gtkconv, const gchar *key,
-	gpointer value)
-{
-	g_return_if_fail(gtkconv != NULL);
-
-	g_object_set_data(G_OBJECT(gtkconv->tab_cont), key, value);
-}
-
-static inline gpointer
-scrncap_conv_get_data(PidginConversation *gtkconv, const gchar *key)
-{
-	g_return_val_if_fail(gtkconv != NULL, NULL);
-
-	return g_object_get_data(G_OBJECT(gtkconv->tab_cont), key);
-}
-
-/******************************************************************************
- * GdkPixbuf helper functions
- ******************************************************************************/
-
-static GdkPixbuf *
-scrncap_perform_screenshot(void)
-{
-	GdkWindow *root;
-	gint orig_x, orig_y;
-
-	root = gdk_get_default_root_window();
-	gdk_window_get_origin(root, &orig_x, &orig_y);
-
-	return gdk_pixbuf_get_from_window(root, 0, 0,
-		gdk_window_get_width(root), gdk_window_get_height(root));
-}
-
-static void
-scrncap_pixbuf_darken(GdkPixbuf *pixbuf)
-{
-	guchar *pixels;
-	int i, y, width, height, row_width, n_channels, rowstride, pad;
-
-	pixels = gdk_pixbuf_get_pixels(pixbuf);
-	width = gdk_pixbuf_get_width(pixbuf);
-	height = gdk_pixbuf_get_height(pixbuf);
-	n_channels = gdk_pixbuf_get_n_channels(pixbuf);
-	rowstride = gdk_pixbuf_get_rowstride(pixbuf);
-
-	row_width = width * n_channels;
-	pad = rowstride - row_width;
-	g_return_if_fail(pad >= 0);
-
-	for (y = 0; y < height; y++) {
-		for (i = 0; i < row_width; i++, pixels++)
-			*pixels /= 2;
-		pixels += pad;
-	}
-}
-
-static PurpleImage *
-scrncap_pixbuf_to_image(GdkPixbuf *pixbuf)
-{
-	PurpleImage *image = NULL;
-	gchar *buffer;
-	gsize count;
-	GError *error = NULL;
-
-	if (!gdk_pixbuf_save_to_buffer(pixbuf, &buffer, &count, "png",
-			&error, NULL)) {
-		purple_debug_error("screencap", "Failed saving an image: %s",
-			error->message);
-		g_error_free(error);
-		return NULL;
-	}
-
-	image = purple_image_new_take_data((guint8 *)buffer, count);
-
-	if (purple_image_get_extension(image) == NULL) {
-		purple_debug_error("screencap", "Invalid image format");
-		g_object_unref(image);
-		return NULL;
-	}
-
-	return image;
-}
-
-/******************************************************************************
- * Draw window
- ******************************************************************************/
-
-static gboolean
-scrncap_drawing_area_btnpress(GtkWidget *draw_area, GdkEventButton *event,
-	gpointer _unused)
-{
-	if (draw_active)
-		return TRUE;
-
-	draw_origin_x = event->x;
-	draw_origin_y = event->y;
-	draw_active = TRUE;
-
-	return TRUE;
-}
-
-static gboolean
-scrncap_drawing_area_btnrelease(GtkWidget *draw_area, GdkEvent *event,
-	gpointer _unused)
-{
-	if (!draw_active)
-		return TRUE;
-
-	draw_active = FALSE;
-
-	return TRUE;
-}
-
-static gboolean
-scrncap_drawing_area_motion(GtkWidget *draw_area, GdkEventButton *event,
-	gpointer _cr)
-{
-	cairo_t *cr = _cr;
-	int x, y;
-	int redraw_x, redraw_y, redraw_w, redraw_h;
-
-	x = event->x;
-	y = event->y;
-
-	if (!draw_active) {
-		draw_origin_x = x;
-		draw_origin_y = y;
-		draw_active = TRUE;
-		return FALSE;
-	}
-
-	cairo_move_to(cr, draw_origin_x, draw_origin_y);
-	cairo_line_to(cr, x, y);
-	cairo_set_line_width(cr, line_width);
-	cairo_stroke(cr);
-
-	redraw_x = MIN(draw_origin_x, x) - line_width - 1;
-	redraw_y = MIN(draw_origin_y, y) - line_width - 1;
-	redraw_w = MAX(draw_origin_x, x) - redraw_x + line_width + 1;
-	redraw_h = MAX(draw_origin_y, y) - redraw_y + line_width + 1;
-
-	draw_origin_x = x;
-	draw_origin_y = y;
-
-	gtk_widget_queue_draw_area(draw_area,
-		redraw_x, redraw_y, redraw_w, redraw_h);
-
-	return FALSE;
-}
-
-static gboolean
-scrncap_drawing_area_enter(GtkWidget *widget, GdkEvent *event,
-	GdkCursor *draw_cursor)
-{
-	GdkWindow *gdkwindow;
-
-	gdkwindow = gtk_widget_get_window(GTK_WIDGET(widget));
-	gdk_window_set_cursor(gdkwindow, draw_cursor);
-
-	return FALSE;
-}
-
-static gboolean
-scrncap_drawing_area_leave(GtkWidget *widget, GdkEvent *event,
-	GdkCursor *draw_cursor)
-{
-	GdkWindow *gdkwindow;
-
-	gdkwindow = gtk_widget_get_window(GTK_WIDGET(widget));
-	gdk_window_set_cursor(gdkwindow, NULL);
-
-	return FALSE;
-}
-
-static void
-scrncap_draw_window_close(GtkWidget *window, gpointer _unused)
-{
-	if (current_window != window)
-		return;
-
-	is_shooting = FALSE;
-	current_window = NULL;
-}
-
-static gboolean
-scrncap_draw_window_paint(GtkWidget *widget, cairo_t *cr, gpointer _surface)
-{
-	cairo_surface_t *surface = _surface;
-
-	cairo_set_source_surface(cr, surface, 0, 0);
-	cairo_paint(cr);
-
-	return FALSE;
-}
-
-static void
-scrncap_draw_window_response(GtkDialog *draw_window, gint response_id,
-	gpointer _webview)
-{
-	PidginWebView *webview = PIDGIN_WEBVIEW(_webview);
-	GdkPixbuf *result = NULL;
-	PurpleImage *image;
-	const gchar *fname_prefix;
-	gchar *fname;
-	static guint fname_no = 0;
-
-	if (response_id == SCRNCAP_RESPONSE_COLOR)
-		return;
-
-	if (response_id == GTK_RESPONSE_OK) {
-		cairo_surface_t *surface = g_object_get_data(
-			G_OBJECT(draw_window), "surface");
-		result = gdk_pixbuf_get_from_surface(surface, 0, 0,
-			cairo_image_surface_get_width(surface),
-			cairo_image_surface_get_height(surface));
-	}
-
-	gtk_widget_destroy(GTK_WIDGET(draw_window));
-
-	if (result == NULL)
-		return;
-
-	image = scrncap_pixbuf_to_image(result);
-
-	/* translators: this is the file name prefix,
-	 * keep it lowercase and pure ASCII.
-	 * Please avoid "_" character, use "-" instead. */
-	fname_prefix = _("screenshot-");
-	fname = g_strdup_printf("%s%u", fname_prefix, ++fname_no);
-	purple_image_set_friendly_filename(image, fname);
-	g_free(fname);
-
-	pidgin_webview_insert_image(webview, image);
-	g_object_unref(image);
-}
-
-static void
-scrncap_draw_color_selected(GtkColorButton *button, cairo_t *cr)
-{
-	gchar *color_str;
-
-	gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(button), &brush_color);
-	gdk_cairo_set_source_rgba(cr, &brush_color);
-
-	color_str = gdk_rgba_to_string(&brush_color);
-	purple_prefs_set_string("/plugins/gtk/screencap/brush_color", color_str);
-	g_free(color_str);
-}
-
-static void
-scrncap_draw_window(PidginWebView *webview, GdkPixbuf *screen)
-{
-	GtkDialog *draw_window;
-	GtkWidget *drawing_area, *box;
-	GtkWidget *scroll_area;
-	GtkWidget *color_button;
-	int width, height;
-	cairo_t *cr;
-	cairo_surface_t *surface;
-	GdkDisplay *display;
-	GdkCursor *draw_cursor;
-
-	is_shooting = TRUE;
-
-	current_window = pidgin_create_dialog(
-		_("Insert screenshot"), 0, "insert-screenshot", TRUE);
-	draw_window = GTK_DIALOG(current_window);
-	gtk_widget_set_size_request(GTK_WIDGET(draw_window), 400, 300);
-	gtk_window_set_position(GTK_WINDOW(draw_window), GTK_WIN_POS_CENTER);
-	g_signal_connect(G_OBJECT(draw_window), "destroy",
-		G_CALLBACK(scrncap_draw_window_close), NULL);
-
-	display = gtk_widget_get_display(current_window);
-	draw_cursor = gdk_cursor_new_for_display(display, GDK_PENCIL);
-	g_object_set_data_full(G_OBJECT(draw_window), "draw-cursor",
-		draw_cursor, g_object_unref);
-
-	width = gdk_pixbuf_get_width(screen);
-	height = gdk_pixbuf_get_height(screen);
-
-	surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height);
-	cr = cairo_create(surface);
-	g_signal_connect_swapped(G_OBJECT(draw_window), "destroy",
-		G_CALLBACK(cairo_destroy), cr);
-	g_object_set_data_full(G_OBJECT(draw_window), "surface",
-		surface, (GDestroyNotify)cairo_surface_destroy);
-
-	gdk_cairo_set_source_pixbuf(cr, screen, 0, 0);
-	cairo_rectangle(cr, 0, 0, width, height);
-	cairo_fill(cr);
-	g_object_unref(screen);
-
-	drawing_area = gtk_drawing_area_new();
-	gtk_widget_set_size_request(drawing_area, width, height);
-	g_signal_connect(G_OBJECT(drawing_area), "draw",
-		G_CALLBACK(scrncap_draw_window_paint), surface);
-	gtk_widget_add_events(drawing_area, GDK_BUTTON_PRESS_MASK |
-		GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK |
-		GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
-	g_signal_connect(G_OBJECT(drawing_area), "button-press-event",
-		G_CALLBACK(scrncap_drawing_area_btnpress), NULL);
-	g_signal_connect(G_OBJECT(drawing_area), "button-release-event",
-		G_CALLBACK(scrncap_drawing_area_btnrelease), NULL);
-	g_signal_connect(G_OBJECT(drawing_area), "motion-notify-event",
-		G_CALLBACK(scrncap_drawing_area_motion), cr);
-	g_signal_connect(G_OBJECT(drawing_area), "enter-notify-event",
-		G_CALLBACK(scrncap_drawing_area_enter), draw_cursor);
-	g_signal_connect(G_OBJECT(drawing_area), "leave-notify-event",
-		G_CALLBACK(scrncap_drawing_area_leave), draw_cursor);
-
-	box = drawing_area;
-	g_object_set(drawing_area,
-		"halign", GTK_ALIGN_CENTER,
-		"valign", GTK_ALIGN_CENTER,
-		NULL);
-	scroll_area = pidgin_make_scrollable(box,
-		GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC,
-		GTK_SHADOW_NONE, -1, -1);
-	g_object_set(G_OBJECT(scroll_area), "expand", TRUE, NULL);
-	gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(
-		GTK_DIALOG(draw_window))), scroll_area);
-
-	color_button = gtk_color_button_new();
-	gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(color_button),
-		&brush_color);
-	g_signal_connect(G_OBJECT(color_button), "color-set",
-		G_CALLBACK(scrncap_draw_color_selected), cr);
-	scrncap_draw_color_selected(GTK_COLOR_BUTTON(color_button), cr);
-
-	gtk_dialog_add_action_widget(draw_window, color_button,
-		SCRNCAP_RESPONSE_COLOR);
-	gtk_dialog_add_button(draw_window, _("_Add"), GTK_RESPONSE_OK);
-	gtk_dialog_add_button(draw_window, _("_Cancel"),
-		GTK_RESPONSE_CANCEL);
-	gtk_dialog_set_default_response(draw_window, GTK_RESPONSE_OK);
-	g_signal_connect(G_OBJECT(draw_window), "response",
-		G_CALLBACK(scrncap_draw_window_response), webview);
-
-	gtk_widget_show_all(GTK_WIDGET(draw_window));
-}
-
-/******************************************************************************
- * Crop window
- ******************************************************************************/
-
-static void
-scrncap_crop_window_close(GtkWidget *window, gpointer _unused)
-{
-	if (current_window != window)
-		return;
-
-	is_shooting = FALSE;
-	current_window = NULL;
-}
-
-static gboolean
-scrncap_crop_window_keypress(GtkWidget *crop_window, GdkEventKey *event,
-	gpointer _webview)
-{
-	PidginWebView *webview = PIDGIN_WEBVIEW(_webview);
-	guint key = event->keyval;
-
-	if (key == GDK_KEY_Escape) {
-		gtk_widget_destroy(crop_window);
-		return TRUE;
-	}
-	if (key == GDK_KEY_Return) {
-		GdkPixbuf *screenshot, *subscreen, *result;
-
-		screenshot = g_object_get_data(G_OBJECT(crop_window),
-			"screenshot");
-		subscreen = gdk_pixbuf_new_subpixbuf(screenshot,
-			crop_x, crop_y, crop_w, crop_h);
-		result = gdk_pixbuf_copy(subscreen);
-		g_object_unref(subscreen);
-
-		gtk_widget_destroy(crop_window);
-
-		scrncap_draw_window(webview, result);
-
-		return TRUE;
-	}
-
-	return FALSE;
-}
-
-static gboolean
-scrncap_crop_window_focusout(GtkWidget *window, GdkEventFocus *event,
-	gpointer _unused)
-{
-	gtk_widget_destroy(window);
-	return FALSE;
-}
-
-static gboolean
-scrncap_crop_window_btnpress(GtkWidget *window, GdkEventButton *event,
-	gpointer _unused)
-{
-	GtkWidget *hint_box;
-	GtkImage *selection;
-	GtkFixed *cont;
-
-	g_return_val_if_fail(!crop_active, TRUE);
-
-	hint_box = g_object_get_data(G_OBJECT(window), "hint-box");
-	if (hint_box) {
-		gtk_widget_destroy(hint_box);
-		g_object_set_data(G_OBJECT(window), "hint-box", NULL);
-	}
-
-	selection = g_object_get_data(G_OBJECT(window), "selection");
-	cont = g_object_get_data(G_OBJECT(window), "cont");
-
-	gtk_fixed_move(cont, GTK_WIDGET(selection), -10, -10);
-	gtk_image_set_from_pixbuf(selection, NULL);
-	gtk_widget_show(GTK_WIDGET(selection));
-
-	crop_origin_x = event->x_root;
-	crop_origin_y = event->y_root;
-	crop_active = TRUE;
-
-	return TRUE;
-}
-
-static gboolean
-scrncap_crop_window_btnrelease(GtkWidget *window, GdkEvent *event,
-	gpointer _unused)
-{
-	crop_active = FALSE;
-
-	return TRUE;
-}
-
-static gboolean
-scrncap_crop_window_motion(GtkWidget *window, GdkEventButton *event,
-	gpointer _unused)
-{
-	GtkFixed *cont;
-	GtkImage *selection;
-	GdkPixbuf *crop, *screenshot;
-
-	g_return_val_if_fail(crop_active, FALSE);
-
-	selection = g_object_get_data(G_OBJECT(window), "selection");
-	cont = g_object_get_data(G_OBJECT(window), "cont");
-
-	crop_x = MIN(crop_origin_x, event->x_root);
-	crop_y = MIN(crop_origin_y, event->y_root);
-	crop_w = abs(crop_origin_x - event->x_root);
-	crop_h = abs(crop_origin_y - event->y_root);
-	crop_w = MAX(crop_w, 1);
-	crop_h = MAX(crop_h, 1);
-
-	gtk_fixed_move(cont, GTK_WIDGET(selection), crop_x, crop_y);
-
-	screenshot = g_object_get_data(G_OBJECT(window), "screenshot");
-	crop = gdk_pixbuf_new_subpixbuf(screenshot,
-		crop_x, crop_y, crop_w, crop_h);
-	gtk_image_set_from_pixbuf(GTK_IMAGE(selection), crop);
-	g_object_unref(crop);
-
-	return FALSE;
-}
-
-static void
-scrncap_crop_window_realize(GtkWidget *crop_window, gpointer _unused)
-{
-	GdkWindow *gdkwindow;
-	GdkDisplay *display;
-	GdkCursor *cursor;
-
-	gdkwindow = gtk_widget_get_window(GTK_WIDGET(crop_window));
-	display = gdk_window_get_display(gdkwindow);
-
-	gdk_window_set_events(gdkwindow, gdk_window_get_events(gdkwindow) |
-		GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
-		GDK_BUTTON_MOTION_MASK);
-
-	cursor = gdk_cursor_new_for_display(display, GDK_CROSSHAIR);
-	gdk_window_set_cursor(gdkwindow, cursor);
-	g_object_unref(cursor);
-}
-
-static gboolean
-scrncap_do_screenshot_cb(gpointer _webview)
-{
-	PidginWebView *webview = PIDGIN_WEBVIEW(_webview);
-	GtkWindow *crop_window;
-	GdkPixbuf *screenshot, *screenshot_d;
-	int width, height;
-	GtkFixed *cont;
-	GtkImage *image, *selection;
-	GtkWidget *hint;
-	gchar *hint_msg;
-	GtkRequisition hint_size;
-	GtkWidget *hint_box;
-
-	shooting_timeout = 0;
-	crop_active = FALSE;
-
-	(void)webview;
-
-	screenshot = scrncap_perform_screenshot();
-	g_return_val_if_fail(screenshot != NULL, G_SOURCE_REMOVE);
-	width = gdk_pixbuf_get_width(screenshot);
-	height = gdk_pixbuf_get_height(screenshot);
-
-	crop_x = crop_y = 0;
-	crop_w = width;
-	crop_h = height;
-
-	current_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-	crop_window = GTK_WINDOW(current_window);
-	gtk_window_set_decorated(crop_window, FALSE);
-	gtk_window_set_resizable(crop_window, FALSE);
-	gtk_widget_set_size_request(GTK_WIDGET(crop_window), width, height);
-	gtk_window_fullscreen(crop_window);
-	gtk_window_set_keep_above(crop_window, TRUE);
-
-	g_signal_connect(G_OBJECT(crop_window), "realize",
-		G_CALLBACK(scrncap_crop_window_realize), NULL);
-	g_signal_connect(G_OBJECT(crop_window), "destroy",
-		G_CALLBACK(scrncap_crop_window_close), NULL);
-	g_signal_connect(G_OBJECT(crop_window), "key-press-event",
-		G_CALLBACK(scrncap_crop_window_keypress), webview);
-	g_signal_connect(G_OBJECT(crop_window), "focus-out-event",
-		G_CALLBACK(scrncap_crop_window_focusout), NULL);
-	g_signal_connect(G_OBJECT(crop_window), "button-press-event",
-		G_CALLBACK(scrncap_crop_window_btnpress), NULL);
-	g_signal_connect(G_OBJECT(crop_window), "button-release-event",
-		G_CALLBACK(scrncap_crop_window_btnrelease), NULL);
-	g_signal_connect(G_OBJECT(crop_window), "motion-notify-event",
-		G_CALLBACK(scrncap_crop_window_motion), NULL);
-	g_object_set_data_full(G_OBJECT(crop_window), "screenshot",
-		screenshot, g_object_unref);
-
-	cont = GTK_FIXED(gtk_fixed_new());
-	g_object_set_data(G_OBJECT(crop_window), "cont", cont);
-	gtk_container_add(GTK_CONTAINER(crop_window), GTK_WIDGET(cont));
-
-	screenshot_d = gdk_pixbuf_copy(screenshot);
-	scrncap_pixbuf_darken(screenshot_d);
-	image = GTK_IMAGE(gtk_image_new_from_pixbuf(screenshot_d));
-	g_object_unref(screenshot_d);
-	gtk_fixed_put(cont, GTK_WIDGET(image), 0, 0);
-
-	selection = GTK_IMAGE(gtk_image_new_from_pixbuf(NULL));
-	gtk_fixed_put(cont, GTK_WIDGET(selection), -10, -10);
-	g_object_set_data(G_OBJECT(crop_window), "selection", selection);
-
-	hint = gtk_label_new(NULL);
-	hint_msg = g_strdup_printf("<span size='x-large'>%s</span>",
-		_("Select the region to send and press Enter button to confirm "
-		"or press Escape button to cancel"));
-	gtk_label_set_markup(GTK_LABEL(hint), hint_msg);
-	g_free(hint_msg);
-	gtk_widget_set_margin_start(hint, 10);
-	gtk_widget_set_margin_end(hint, 10);
-	gtk_widget_set_margin_top(hint, 7);
-	gtk_widget_set_margin_bottom(hint, 7);
-	hint_box = gtk_event_box_new();
-	gtk_container_add(GTK_CONTAINER(hint_box), hint);
-	gtk_widget_get_preferred_size(hint, NULL, &hint_size);
-	gtk_fixed_put(cont, hint_box,
-		width / 2 - hint_size.width / 2 - 10,
-		height / 2 - hint_size.height / 2 - 7);
-	g_object_set_data(G_OBJECT(crop_window), "hint-box", hint_box);
-
-	gtk_widget_show_all(GTK_WIDGET(crop_window));
-	gtk_widget_hide(GTK_WIDGET(selection));
-
-	return G_SOURCE_REMOVE;
-}
-
-static void
-scrncap_do_screenshot(GtkAction *action, PidginWebView *webview)
-{
-	if (current_window) {
-		gtk_window_present(GTK_WINDOW(current_window));
-		return;
-	}
-	if (is_shooting)
-		return;
-	is_shooting = TRUE;
-
-	shooting_timeout = g_timeout_add(SCRNCAP_SHOOTING_TIMEOUT,
-		scrncap_do_screenshot_cb, webview);
-}
-
-/******************************************************************************
- * PidginConversation setup
- ******************************************************************************/
-
-static void
-scrncap_convwin_switch(GtkNotebook *notebook, GtkWidget *page, gint page_num,
-	gpointer _win)
-{
-	PidginConvWindow *win = _win;
-	PidginConversation *gtkconv;
-	PidginWebView *webview;
-	gboolean images_supported;
-	GtkAction *action;
-
-	gtkconv = pidgin_conv_window_get_active_gtkconv(win);
-	if (gtkconv == NULL)
-		return;
-
-	webview = PIDGIN_WEBVIEW(gtkconv->entry);
-	action = g_object_get_data(G_OBJECT(win->menu->menubar),
-		"insert-screenshot-action");
-
-	g_return_if_fail(action != NULL);
-
-	images_supported = pidgin_webview_get_format_functions(webview) &
-		PIDGIN_WEBVIEW_IMAGE;
-
-	gtk_action_set_sensitive(action, images_supported);
-}
-
-static void
-scrncap_convwin_menu_cb(GtkAction *action, PidginConvWindow *win)
-{
-	PidginConversation *gtkconv;
-	PidginWebView *webview;
-
-	gtkconv = pidgin_conv_window_get_active_gtkconv(win);
-	webview = PIDGIN_WEBVIEW(gtkconv->entry);
-
-	scrncap_do_screenshot(action, webview);
-}
-
-static void
-scrncap_convwin_init(PidginConvWindow *win)
-{
-	PidginConvWindowMenu *menu = win->menu;
-	GtkAction *action;
-	GtkWidget *conv_submenu, *conv_insert_image;
-	GtkWidget *scrncap_btn_menu;
-	gint pos = -1, i;
-	GList *children, *it;
-
-	action = g_object_get_data(G_OBJECT(menu->menubar),
-		"insert-screenshot-action");
-	if (action != NULL)
-		return;
-
-	action = gtk_action_new("InsertScreenshot", _("Insert Screens_hot..."),
-		NULL, PIDGIN_ICON_CAMERA_PHOTO);
-	gtk_action_set_is_important(action, TRUE);
-	g_object_set_data_full(G_OBJECT(menu->menubar),
-		"insert-screenshot-action", action, g_object_unref);
-	g_signal_connect(G_OBJECT(action), "activate",
-		G_CALLBACK(scrncap_convwin_menu_cb), win);
-
-	conv_insert_image = gtk_ui_manager_get_widget(menu->ui,
-		"/Conversation/ConversationMenu/InsertImage");
-	g_return_if_fail(conv_insert_image != NULL);
-	conv_submenu = gtk_widget_get_parent(conv_insert_image);
-
-	children = gtk_container_get_children(GTK_CONTAINER(conv_submenu));
-	pos = g_list_index(children, conv_insert_image);
-	if (pos != -1)
-		++pos;
-	g_list_free(children);
-	g_warn_if_fail(pos >= 0);
-
-	scrncap_btn_menu = gtk_action_create_menu_item(action);
-	g_object_set_data(G_OBJECT(menu->menubar), "insert-screenshot-btn",
-		scrncap_btn_menu);
-	gtk_menu_shell_insert(GTK_MENU_SHELL(conv_submenu),
-		GTK_WIDGET(scrncap_btn_menu), pos);
-	gtk_widget_show(GTK_WIDGET(scrncap_btn_menu));
-
-	g_signal_connect_after(G_OBJECT(win->notebook), "switch-page",
-		G_CALLBACK(scrncap_convwin_switch), win);
-	scrncap_convwin_switch(GTK_NOTEBOOK(win->notebook), NULL, 0, win);
-}
-
-static void
-scrncap_convwin_uninit(PidginConvWindow *win)
-{
-	PidginConvWindowMenu *menu = win->menu;
-	GtkWidget *btn;
-
-	btn = g_object_get_data(G_OBJECT(menu->menubar),
-		"insert-screenshot-btn");
-	if (btn)
-		gtk_widget_destroy(btn);
-
-	g_object_set_data(G_OBJECT(menu->menubar),
-		"insert-screenshot-btn", NULL);
-	g_object_set_data(G_OBJECT(menu->menubar),
-		"insert-screenshot-action", NULL);
-
-	g_signal_handlers_disconnect_matched(win->notebook, G_SIGNAL_MATCH_FUNC,
-		0, 0, NULL, scrncap_convwin_switch, NULL);
-}
-
-static void
-scrncap_conversation_update(PidginWebView *webview,
-	PidginWebViewButtons buttons, gpointer _action)
-{
-	GtkAction *action = GTK_ACTION(_action);
-
-	gtk_action_set_sensitive(action, buttons & PIDGIN_WEBVIEW_IMAGE);
-}
-
-static void
-scrncap_conversation_init(PidginConversation *gtkconv)
-{
-	PidginWebView *webview;
-	PidginWebViewToolbar *toolbar;
-	GtkAction *action;
-	GtkToolItem *scrncap_btn_wide;
-	GtkWidget *scrncap_btn_lean;
-	gint pos = -1, i;
-	GtkToolbar *wide_view, *lean_view;
-	GtkMenu *wide_menu = NULL;
-	GList *wide_children, *it;
-
-	if (scrncap_conv_get_data(gtkconv, "scrncap-btn-wide") != NULL)
-		return;
-
-	webview = PIDGIN_WEBVIEW(gtkconv->entry);
-	toolbar = PIDGIN_WEBVIEWTOOLBAR(pidgin_webview_get_toolbar(webview));
-	g_return_if_fail(toolbar != NULL);
-	wide_view = GTK_TOOLBAR(pidgin_webviewtoolbar_get_wide_view(toolbar));
-	g_return_if_fail(wide_view != NULL);
-	lean_view = GTK_TOOLBAR(pidgin_webviewtoolbar_get_lean_view(toolbar));
-	g_return_if_fail(lean_view != NULL);
-
-	action = gtk_action_new("InsertScreenshot", _("_Screenshot"),
-		_("Insert screenshot"), PIDGIN_ICON_CAMERA_PHOTO);
-	gtk_action_set_is_important(action, TRUE);
-	g_signal_connect(G_OBJECT(action), "activate",
-		G_CALLBACK(scrncap_do_screenshot), webview);
-
-	scrncap_btn_wide = GTK_TOOL_ITEM(gtk_action_create_tool_item(action));
-	scrncap_conv_set_data(gtkconv, "scrncap-btn-wide", scrncap_btn_wide);
-	for (i = 0; i < gtk_toolbar_get_n_items(wide_view); i++) {
-		GtkToolItem *ref_item = gtk_toolbar_get_nth_item(wide_view, i);
-		GtkAction *action;
-
-		action = g_object_get_data(G_OBJECT(ref_item), "action");
-		if (action == NULL)
-			continue;
-
-		if (g_strcmp0(gtk_action_get_name(action), "InsertImage") == 0) {
-			pos = i + 1;
-			break;
-		}
-	}
-	gtk_toolbar_insert(wide_view, scrncap_btn_wide, pos);
-	gtk_widget_show(GTK_WIDGET(scrncap_btn_wide));
-
-	for (i = 0; i < gtk_toolbar_get_n_items(lean_view); i++) {
-		GtkToolItem *ref_item = gtk_toolbar_get_nth_item(lean_view, i);
-		const gchar *menu_name;
-
-		menu_name = g_object_get_data(G_OBJECT(ref_item), "menu-name");
-		if (g_strcmp0(menu_name, "insert") == 0) {
-			wide_menu = g_object_get_data(G_OBJECT(ref_item), "menu");
-			break;
-		}
-	}
-	g_return_if_fail(wide_menu);
-
-	pos = -1;
-	wide_children = gtk_container_get_children(GTK_CONTAINER(wide_menu));
-	for (it = wide_children, i = 0; it; it = g_list_next(it), i++) {
-		GtkWidget *child = it->data;
-		GtkAction *action;
-
-		action = g_object_get_data(G_OBJECT(child), "action");
-		if (action == NULL)
-			continue;
-
-		if (g_strcmp0(gtk_action_get_name(action), "InsertImage") == 0) {
-			pos = i + 1;
-			break;
-		}
-	}
-	g_list_free(wide_children);
-	if (pos < 0) {
-		g_warn_if_fail(pos >= 0);
-		pos = 0;
-	}
-
-	g_signal_connect_object(G_OBJECT(webview), "allowed-formats-updated",
-		G_CALLBACK(scrncap_conversation_update), action, 0);
-	scrncap_conversation_update(webview,
-		pidgin_webview_get_format_functions(webview), action);
-
-	scrncap_btn_lean = gtk_action_create_menu_item(action);
-	scrncap_conv_set_data(gtkconv, "scrncap-btn-lean", scrncap_btn_lean);
-	gtk_menu_shell_insert(GTK_MENU_SHELL(wide_menu),
-		GTK_WIDGET(scrncap_btn_lean), pos);
-	gtk_widget_show(GTK_WIDGET(scrncap_btn_lean));
-}
-
-static void
-scrncap_conversation_uninit(PidginConversation *gtkconv)
-{
-	GtkWidget *scrncap_btn_wide, *scrncap_btn_lean;
-
-	scrncap_btn_wide = scrncap_conv_get_data(gtkconv, "scrncap-btn-wide");
-	if (scrncap_btn_wide == NULL)
-		return;
-
-	scrncap_btn_lean = scrncap_conv_get_data(gtkconv, "scrncap-btn-lean");
-
-	gtk_widget_destroy(scrncap_btn_wide);
-	if (scrncap_btn_lean)
-		gtk_widget_destroy(scrncap_btn_lean);
-
-	scrncap_conv_set_data(gtkconv, "scrncap-btn-wide", NULL);
-	scrncap_conv_set_data(gtkconv, "scrncap-btn-lean", NULL);
-}
-
-/******************************************************************************
- * Plugin setup
- ******************************************************************************/
-
-static PidginPluginInfo *
-plugin_query(GError **error)
-{
-	const gchar * const authors[] = {
-		"Tomasz Wasilczyk <twasilczyk@pidgin.im>",
-		NULL
-	};
-
-	return pidgin_plugin_info_new(
-		"id",           "gtk-screencap",
-		"name",         N_("Screen Capture"),
-		"version",      DISPLAY_VERSION,
-		"category",     N_("Utility"),
-		"summary",      N_("Send screenshots to your buddies."),
-		"description",  N_("Adds an option to send a screenshot as an inline "
-		                   "image. It works only with protocols that supports "
-		                   "inline images."),
-		"authors",      authors,
-		"website",      PURPLE_WEBSITE,
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-plugin_load(PurplePlugin *plugin, GError **error)
-{
-	GList *it;
-	const gchar *color_str;
-
-	purple_prefs_add_none("/plugins");
-	purple_prefs_add_none("/plugins/gtk");
-	purple_prefs_add_none("/plugins/gtk/screencap");
-	purple_prefs_add_string("/plugins/gtk/screencap/brush_color",
-		SCRNCAP_DEFAULT_COLOR);
-
-	color_str = purple_prefs_get_string("/plugins/gtk/screencap/brush_color");
-	if (color_str && color_str[0])
-		gdk_rgba_parse(&brush_color, color_str);
-
-	purple_signal_connect(pidgin_conversations_get_handle(),
-		"conversation-displayed", plugin,
-		PURPLE_CALLBACK(scrncap_conversation_init), NULL);
-	purple_signal_connect(pidgin_conversations_get_handle(),
-		"conversation-window-created", plugin,
-		PURPLE_CALLBACK(scrncap_convwin_init), NULL);
-
-	it = purple_conversations_get_all();
-	for (; it; it = g_list_next(it)) {
-		PurpleConversation *conv = it->data;
-
-		if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv))
-			continue;
-		scrncap_conversation_init(PIDGIN_CONVERSATION(conv));
-	}
-
-	it = pidgin_conv_windows_get_list();
-	for (; it; it = g_list_next(it)) {
-		PidginConvWindow *win = it->data;
-		scrncap_convwin_init(win);
-	}
-
-	return TRUE;
-}
-
-static gboolean
-plugin_unload(PurplePlugin *plugin, GError **error)
-{
-	GList *it;
-
-	if (shooting_timeout > 0)
-		g_source_remove(shooting_timeout);
-	if (current_window != NULL)
-		gtk_widget_destroy(GTK_WIDGET(current_window));
-
-	it = purple_conversations_get_all();
-	for (; it; it = g_list_next(it)) {
-		PurpleConversation *conv = it->data;
-
-		if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv))
-			continue;
-		scrncap_conversation_uninit(PIDGIN_CONVERSATION(conv));
-	}
-
-	it = pidgin_conv_windows_get_list();
-	for (; it; it = g_list_next(it)) {
-		PidginConvWindow *win = it->data;
-		scrncap_convwin_uninit(win);
-	}
-
-	return TRUE;
-}
-
-PURPLE_PLUGIN_INIT(screencap, plugin_query, plugin_load, plugin_unload);
--- a/po/POTFILES.in	Wed Nov 04 02:41:46 2020 -0600
+++ b/po/POTFILES.in	Wed Nov 04 03:24:02 2020 -0600
@@ -67,10 +67,6 @@
 libpurple/plugins/autoaccept.c
 libpurple/plugins/buddynote.c
 libpurple/plugins.c
-libpurple/plugins/codeinline.c
-libpurple/plugins/debug_example.c
-libpurple/plugins/filectl.c
-libpurple/plugins/helloworld.c
 libpurple/plugins/idle.c
 libpurple/plugins/joinpart.c
 libpurple/plugins/keyrings/internalkeyring.c
@@ -78,15 +74,9 @@
 libpurple/plugins/keyrings/secretservice.c
 libpurple/plugins/keyrings/wincred.c
 libpurple/plugins/log_reader.c
-libpurple/plugins/notify_example.c
 libpurple/plugins/offlinemsg.c
-libpurple/plugins/one_time_password.c
-libpurple/plugins/pluginpref_example.c
 libpurple/plugins/psychic.c
-libpurple/plugins/signals-test.c
-libpurple/plugins/simple.c
 libpurple/plugins/statenotify.c
-libpurple/plugins/test-request-input.c
 libpurple/pounce.c
 libpurple/prefs.c
 libpurple/protocol.c
@@ -364,7 +354,6 @@
 pidgin/pidgintalkatu.c
 pidgin/pidgintooltip.c
 pidgin/pidginwindow.c
-pidgin/plugins/contact_priority.c
 pidgin/plugins/disco/gtkdisco.c
 pidgin/plugins/disco/xmppdisco.c
 pidgin/plugins/disco/resources/disco.ui
@@ -372,16 +361,9 @@
 pidgin/plugins/gestures/stroke.c
 pidgin/plugins/gestures/stroke-draw.c
 pidgin/plugins/gtkbuddynote.c
-pidgin/plugins/gtk-signals-test.c
-pidgin/plugins/history.c
 pidgin/plugins/iconaway.c
-pidgin/plugins/imgupload.c
-pidgin/plugins/mailchk.c
-pidgin/plugins/musicmessaging/musicmessaging.c
 pidgin/plugins/notify.c
-pidgin/plugins/pidgininc.c
 pidgin/plugins/relnot.c
-pidgin/plugins/screencap.c
 pidgin/plugins/spellchk.c
 pidgin/plugins/transparency.c
 pidgin/plugins/unity.c

mercurial