Merged in default (pull request #578)

Tue, 01 Oct 2019 07:19:14 +0000

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 01 Oct 2019 07:19:14 +0000
changeset 39896
e94146df6f96
parent 39892
4fb59abd727e (current diff)
parent 39895
9021ee76539a (diff)
child 39898
f0bd659d30c3

Merged in default (pull request #578)

Remove Purple type macros

ChangeLog.API file | annotate | diff | comparison | revisions
finch/plugins/grouping.c file | annotate | diff | comparison | revisions
libpurple/plugins.h file | annotate | diff | comparison | revisions
libpurple/protocol.h file | annotate | diff | comparison | revisions
libpurple/protocols/gg/gg.c file | annotate | diff | comparison | revisions
libpurple/protocols/irc/irc.c file | annotate | diff | comparison | revisions
libpurple/protocols/jabber/gtalk.h file | annotate | diff | comparison | revisions
libpurple/protocols/jabber/xmpp.h file | annotate | diff | comparison | revisions
libpurple/protocols/null/nullprpl.c file | annotate | diff | comparison | revisions
libpurple/protocols/oscar/aim.h file | annotate | diff | comparison | revisions
libpurple/protocols/oscar/icq.h file | annotate | diff | comparison | revisions
libpurple/protocols/simple/simple.c file | annotate | diff | comparison | revisions
libpurple/protocols/zephyr/zephyr.c file | annotate | diff | comparison | revisions
--- a/ChangeLog.API	Tue Oct 01 02:21:00 2019 -0400
+++ b/ChangeLog.API	Tue Oct 01 07:19:14 2019 +0000
@@ -78,17 +78,6 @@
 		* purple_plugin_info_get_pref_request_cb
 		* purple_plugin_info_get_ui_data
 		* purple_plugin_info_set_ui_data
-		* purple_plugin_register_type
-		* purple_plugin_add_interface
-		* PURPLE_DEFINE_TYPE
-		* PURPLE_DEFINE_TYPE_EXTENDED
-		* PURPLE_IMPLEMENT_INTERFACE_STATIC
-		* PURPLE_IMPLEMENT_INTERFACE
-		* PURPLE_DEFINE_DYNAMIC_TYPE
-		* PURPLE_DEFINE_DYNAMIC_TYPE_EXTENDED
-		* PURPLE_IMPLEMENT_INTERFACE_DYNAMIC
-		* PURPLE_DEFINE_STATIC_TYPE
-		* PURPLE_DEFINE_STATIC_TYPE_EXTENDED
 		* PurpleProtocol, inherits GObject. Please see the documentation for
 		  details.
 		* PurpleProtocolAction
--- a/finch/plugins/grouping.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/finch/plugins/grouping.c	Tue Oct 01 07:19:14 2019 +0000
@@ -41,18 +41,23 @@
  * GObject code
  */
 static void
-finch_grouping_node_init(FinchGroupingNode *node)
+finch_grouping_node_init(G_GNUC_UNUSED FinchGroupingNode *node)
 {
 }
 
 static void
-finch_grouping_node_class_init(FinchGroupingNodeClass *klass)
+finch_grouping_node_class_init(G_GNUC_UNUSED FinchGroupingNodeClass *klass)
+{
+}
+
+static void
+finch_grouping_node_class_finalize(G_GNUC_UNUSED FinchGroupingNodeClass *klass)
 {
 }
 
 GType finch_grouping_node_get_type(void);
-PURPLE_DEFINE_TYPE(FinchGroupingNode, finch_grouping_node,
-                   PURPLE_TYPE_BLIST_NODE);
+G_DEFINE_DYNAMIC_TYPE(FinchGroupingNode, finch_grouping_node,
+                      PURPLE_TYPE_BLIST_NODE);
 
 /**
  * Online/Offline
@@ -358,7 +363,7 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	finch_grouping_node_register_type(plugin);
+	finch_grouping_node_register_type(G_TYPE_MODULE(plugin));
 
 	default_manager = finch_blist_manager_find("default");
 
--- a/libpurple/plugins.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/plugins.c	Tue Oct 01 07:19:14 2019 +0000
@@ -262,29 +262,6 @@
 		plugins_to_disable = g_list_prepend(plugins_to_disable, plugin);
 }
 
-GType
-purple_plugin_register_type(PurplePlugin *plugin, GType parent,
-                            const gchar *name, const GTypeInfo *info,
-                            GTypeFlags flags)
-{
-	g_return_val_if_fail(G_IS_TYPE_MODULE(plugin), G_TYPE_INVALID);
-
-	return g_type_module_register_type(G_TYPE_MODULE(plugin),
-	                                   parent, name, info, flags);
-}
-
-void
-purple_plugin_add_interface(PurplePlugin *plugin, GType instance_type,
-                            GType interface_type,
-                            const GInterfaceInfo *interface_info)
-{
-	g_return_if_fail(G_IS_TYPE_MODULE(plugin));
-
-	g_type_module_add_interface(G_TYPE_MODULE(plugin),
-	                            instance_type, interface_type,
-	                            interface_info);
-}
-
 gboolean
 purple_plugin_is_internal(PurplePlugin *plugin)
 {
@@ -629,19 +606,8 @@
 	return purple_plugin_action_new(action->label, action->callback);
 }
 
-GType
-purple_plugin_action_get_type(void)
-{
-	static GType type = 0;
-
-	if (G_UNLIKELY(type == 0)) {
-		type = g_boxed_type_register_static("PurplePluginAction",
-				(GBoxedCopyFunc)purple_plugin_action_copy,
-				(GBoxedFreeFunc)purple_plugin_action_free);
-	}
-
-	return type;
-}
+G_DEFINE_BOXED_TYPE(PurplePluginAction, purple_plugin_action,
+                    purple_plugin_action_copy, purple_plugin_action_free)
 
 /**************************************************************************
  * Plugins API
--- a/libpurple/plugins.h	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/plugins.h	Tue Oct 01 07:19:14 2019 +0000
@@ -54,17 +54,9 @@
 typedef GPluginPluginInterface PurplePluginInterface;
 
 #define PURPLE_TYPE_PLUGIN_INFO             (purple_plugin_info_get_type())
-#define PURPLE_PLUGIN_INFO(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_PLUGIN_INFO, PurplePluginInfo))
-#define PURPLE_PLUGIN_INFO_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_PLUGIN_INFO, PurplePluginInfoClass))
-#define PURPLE_IS_PLUGIN_INFO(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_PLUGIN_INFO))
-#define PURPLE_IS_PLUGIN_INFO_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_PLUGIN_INFO))
-#define PURPLE_PLUGIN_INFO_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_PLUGIN_INFO, PurplePluginInfoClass))
-
 typedef struct _PurplePluginInfo PurplePluginInfo;
-typedef struct _PurplePluginInfoClass PurplePluginInfoClass;
 
 #define PURPLE_TYPE_PLUGIN_ACTION  (purple_plugin_action_get_type())
-
 typedef struct _PurplePluginAction PurplePluginAction;
 
 #include "pluginpref.h"
@@ -145,16 +137,6 @@
 	gpointer ui_data;
 };
 
-struct _PurplePluginInfoClass {
-	GPluginPluginInfoClass parent_class;
-
-	/*< private >*/
-	void (*_purple_reserved1)(void);
-	void (*_purple_reserved2)(void);
-	void (*_purple_reserved3)(void);
-	void (*_purple_reserved4)(void);
-};
-
 /**
  * PurplePluginAction:
  * @label: The label to display in the user interface.
@@ -226,113 +208,6 @@
 		return pluginunload(PURPLE_PLUGIN(p), e); \
 	}
 
-/**
- * PURPLE_DEFINE_TYPE:
- * @TN:   The name of the new type, in Camel case.
- * @t_n:  The name of the new type, in lowercase, words separated by '_'.
- * @T_P:  The #GType of the parent type.
- * 
- * A convenience macro for type implementations, which defines a *_get_type()
- * function; and a *_register_type() function for use in your plugin's load
- * function. You must define an instance initialization function *_init()
- * and a class initialization function *_class_init() for the type.
- */
-#define PURPLE_DEFINE_TYPE(TN, t_n, T_P) \
-	PURPLE_DEFINE_DYNAMIC_TYPE(TN, t_n, T_P)
-
-/**
- * PURPLE_DEFINE_TYPE_EXTENDED:
- * @TN:     The name of the new type, in Camel case.
- * @t_n:    The name of the new type, in lowercase, words separated by '_'.
- * @T_P:    The #GType of the parent type.
- * @flags:  #GTypeFlags to register the type with.
- * @CODE:   Custom code that gets inserted in *_get_type().
- *
- * A more general version of PURPLE_DEFINE_TYPE() which allows you to
- * specify #GTypeFlags and custom code.
- */
-#define PURPLE_DEFINE_TYPE_EXTENDED \
-	PURPLE_DEFINE_DYNAMIC_TYPE_EXTENDED
-
-/**
- * PURPLE_IMPLEMENT_INTERFACE_STATIC:
- * @TYPE_IFACE:  The #GType of the interface to add.
- * @iface_init:  The interface init function.
- *
- * A convenience macro to ease static interface addition in the CODE section
- * of PURPLE_DEFINE_TYPE_EXTENDED(). You should use this macro if the
- * interface is a part of the libpurple core.
- */
-#define PURPLE_IMPLEMENT_INTERFACE_STATIC(TYPE_IFACE, iface_init) { \
-	const GInterfaceInfo interface_info = { \
-		(GInterfaceInitFunc) iface_init, NULL, NULL \
-	}; \
-	g_type_add_interface_static(type_id, TYPE_IFACE, &interface_info); \
-}
-
-/**
- * PURPLE_IMPLEMENT_INTERFACE:
- * @TYPE_IFACE:  The #GType of the interface to add.
- * @iface_init:  The interface init function.
- *
- * A convenience macro to ease interface addition in the CODE section
- * of PURPLE_DEFINE_TYPE_EXTENDED(). You should use this macro if the
- * interface lives in the plugin.
- */
-#define PURPLE_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) \
-	PURPLE_IMPLEMENT_INTERFACE_DYNAMIC(TYPE_IFACE, iface_init)
-
-/**
- * PURPLE_DEFINE_DYNAMIC_TYPE:
- *
- * A convenience macro for dynamic type implementations.
- */
-#define PURPLE_DEFINE_DYNAMIC_TYPE(TN, t_n, T_P) \
-	PURPLE_DEFINE_DYNAMIC_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
-
-/**
- * PURPLE_DEFINE_DYNAMIC_TYPE_EXTENDED:
- *
- * A more general version of PURPLE_DEFINE_DYNAMIC_TYPE().
- */
-#define PURPLE_DEFINE_DYNAMIC_TYPE_EXTENDED(TypeName, type_name, TYPE_PARENT, flags, CODE) \
-static GType type_name##_type_id = 0; \
-G_MODULE_EXPORT GType type_name##_get_type(void) { \
-	return type_name##_type_id; \
-} \
-void type_name##_register_type(PurplePlugin *); \
-void type_name##_register_type(PurplePlugin *plugin) { \
-	GType type_id; \
-	const GTypeInfo type_info = { \
-		sizeof (TypeName##Class), \
-		(GBaseInitFunc) NULL, \
-		(GBaseFinalizeFunc) NULL, \
-		(GClassInitFunc) type_name##_class_init, \
-		(GClassFinalizeFunc) NULL, \
-		NULL, \
-		sizeof (TypeName), \
-		0, \
-		(GInstanceInitFunc) type_name##_init, \
-		NULL \
-	}; \
-	type_id = purple_plugin_register_type(plugin, TYPE_PARENT, #TypeName, \
-	                                      &type_info, (GTypeFlags) flags); \
-	type_name##_type_id = type_id; \
-	{ CODE ; } \
-}
-
-/**
- * PURPLE_IMPLEMENT_INTERFACE_DYNAMIC:
- *
- * A convenience macro to ease dynamic interface addition.
- */
-#define PURPLE_IMPLEMENT_INTERFACE_DYNAMIC(TYPE_IFACE, iface_init) { \
-	const GInterfaceInfo interface_info = { \
-		(GInterfaceInitFunc) iface_init, NULL, NULL \
-	}; \
-	purple_plugin_add_interface(plugin, type_id, TYPE_IFACE, &interface_info); \
-}
-
 G_BEGIN_DECLS
 
 /**************************************************************************/
@@ -404,37 +279,6 @@
 void purple_plugin_disable(PurplePlugin *plugin);
 
 /**
- * purple_plugin_register_type:
- * @plugin:  The plugin that is registering the type.
- * @parent:  Type from which this type will be derived.
- * @name:    Name of the new type.
- * @info:    Information to initialize and destroy a type's classes and
- *           instances.
- * @flags:   Bitwise combination of values that determines the nature
- *           (e.g. abstract or not) of the type.
- *
- * Registers a new dynamic type.
- *
- * Returns: The new GType, or %G_TYPE_INVALID if registration failed.
- */
-GType purple_plugin_register_type(PurplePlugin *plugin, GType parent,
-                                  const gchar *name, const GTypeInfo *info,
-                                  GTypeFlags flags);
-
-/**
- * purple_plugin_add_interface:
- * @plugin:          The plugin that is adding the interface type.
- * @instance_type:   The GType of the instantiable type.
- * @interface_type:  The GType of the interface type.
- * @interface_info:  Information used to manage the interface type.
- *
- * Adds a dynamic interface type to an instantiable type.
- */
-void purple_plugin_add_interface(PurplePlugin *plugin, GType instance_type,
-                                 GType interface_type,
-                                 const GInterfaceInfo *interface_info);
-
-/**
  * purple_plugin_is_internal:
  * @plugin: The plugin.
  *
@@ -467,7 +311,8 @@
  *
  * Returns: The #GType for the #PurplePluginInfo object.
  */
-GType purple_plugin_info_get_type(void);
+G_DECLARE_FINAL_TYPE(PurplePluginInfo, purple_plugin_info, PURPLE, PLUGIN_INFO,
+                     GPluginPluginInfo)
 
 /**
  * purple_plugin_info_new:
--- a/libpurple/protocol.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocol.c	Tue Oct 01 07:19:14 2019 +0000
@@ -119,20 +119,6 @@
 	protocol->icon_spec = NULL;
 }
 
-void
-purple_protocol_override(PurpleProtocol *protocol,
-                         PurpleProtocolOverrideFlags flags)
-{
-	g_return_if_fail(PURPLE_IS_PROTOCOL(protocol));
-
-	if (flags & PURPLE_PROTOCOL_OVERRIDE_USER_SPLITS)
-		user_splits_free(protocol);
-	if (flags & PURPLE_PROTOCOL_OVERRIDE_PROTOCOL_OPTIONS)
-		account_options_free(protocol);
-	if (flags & PURPLE_PROTOCOL_OVERRIDE_ICON_SPEC)
-		icon_spec_free(protocol);
-}
-
 /**************************************************************************
  * GObject stuff
  **************************************************************************/
--- a/libpurple/protocol.h	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocol.h	Tue Oct 01 07:19:14 2019 +0000
@@ -56,21 +56,6 @@
 #include "whiteboard.h"
 
 /**
- * PurpleProtocolOverrideFlags:
- *
- * Flags to indicate what base protocol's data a derived protocol wants to
- * override.
- *
- * See purple_protocol_override().
- */
-typedef enum /*< flags >*/
-{
-    PURPLE_PROTOCOL_OVERRIDE_USER_SPLITS      = 1 << 1,
-    PURPLE_PROTOCOL_OVERRIDE_PROTOCOL_OPTIONS = 1 << 2,
-    PURPLE_PROTOCOL_OVERRIDE_ICON_SPEC        = 1 << 3,
-} PurpleProtocolOverrideFlags;
-
-/**
  * PurpleProtocol:
  * @id:              Protocol ID
  * @name:            Translated name of the protocol
@@ -746,19 +731,6 @@
  */
 PurpleWhiteboardOps *purple_protocol_get_whiteboard_ops(const PurpleProtocol *protocol);
 
-/**
- * purple_protocol_override:
- * @protocol: The protocol instance.
- * @flags:    What instance data to delete.
- *
- * Lets derived protocol types override the base type's instance data, such as
- * protocol options, user splits, icon spec, etc.
- * This function is called in the *_init() function of your derived protocol,
- * to delete the parent type's data so you can define your own.
- */
-void purple_protocol_override(PurpleProtocol *protocol,
-		PurpleProtocolOverrideFlags flags);
-
 /**************************************************************************/
 /* Protocol Class API                                                     */
 /**************************************************************************/
--- a/libpurple/protocols/bonjour/bonjour.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/bonjour/bonjour.c	Tue Oct 01 07:19:14 2019 +0000
@@ -630,8 +630,9 @@
 }
 
 static void
-bonjour_protocol_init(PurpleProtocol *protocol)
+bonjour_protocol_init(BonjourProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
 	PurpleAccountOption *option;
 
 	protocol->id        = "prpl-bonjour";
@@ -662,12 +663,19 @@
 }
 
 static void
-bonjour_protocol_class_init(PurpleProtocolClass *klass)
+bonjour_protocol_class_init(BonjourProtocolClass *klass)
 {
-	klass->login        = bonjour_login;
-	klass->close        = bonjour_close;
-	klass->status_types = bonjour_status_types;
-	klass->list_icon    = bonjour_list_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = bonjour_login;
+	protocol_class->close = bonjour_close;
+	protocol_class->status_types = bonjour_status_types;
+	protocol_class->list_icon = bonjour_list_icon;
+}
+
+static void
+bonjour_protocol_class_finalize(G_GNUC_UNUSED BonjourProtocolClass *klass)
+{
 }
 
 static void
@@ -704,21 +712,20 @@
 	xfer_iface->new_xfer    = bonjour_new_xfer;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	BonjourProtocol, bonjour_protocol, PURPLE_TYPE_PROTOCOL, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        BonjourProtocol, bonjour_protocol, PURPLE_TYPE_PROTOCOL, 0,
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  bonjour_protocol_client_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      bonjour_protocol_client_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  bonjour_protocol_server_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      bonjour_protocol_server_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-	                                  bonjour_protocol_im_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      bonjour_protocol_im_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_XFER,
-	                                  bonjour_protocol_xfer_iface_init)
-);
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_XFER,
+                                      bonjour_protocol_xfer_iface_init));
 
 static PurplePluginInfo *
 plugin_query(GError **error)
@@ -741,7 +748,7 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	bonjour_protocol_register_type(plugin);
+	bonjour_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	xep_xfer_register(G_TYPE_MODULE(plugin));
 
--- a/libpurple/protocols/facebook/facebook.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/facebook/facebook.c	Tue Oct 01 07:19:14 2019 +0000
@@ -1536,8 +1536,9 @@
 }
 
 static void
-facebook_protocol_init(PurpleProtocol *protocol)
+facebook_protocol_init(FacebookProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
 	GList *opts = NULL;
 	PurpleAccountOption *opt;
 
@@ -1573,12 +1574,19 @@
 }
 
 static void
-facebook_protocol_class_init(PurpleProtocolClass *klass)
+facebook_protocol_class_init(FacebookProtocolClass *klass)
 {
-	klass->login        = fb_login;
-	klass->close        = fb_close;
-	klass->status_types = fb_status_types;
-	klass->list_icon    = fb_list_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = fb_login;
+	protocol_class->close = fb_close;
+	protocol_class->status_types = fb_status_types;
+	protocol_class->list_icon = fb_list_icon;
+}
+
+static void
+facebook_protocol_class_finalize(G_GNUC_UNUSED FacebookProtocolClass *klass)
+{
 }
 
 static void
@@ -1621,20 +1629,19 @@
 	iface->cancel   = fb_roomlist_cancel;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	FacebookProtocol, facebook_protocol, PURPLE_TYPE_PROTOCOL, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        FacebookProtocol, facebook_protocol, PURPLE_TYPE_PROTOCOL, 0,
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  facebook_protocol_client_iface_init)
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  facebook_protocol_server_iface_init)
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-	                                  facebook_protocol_im_iface_init)
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT,
-	                                  facebook_protocol_chat_iface_init)
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
-	                                  facebook_protocol_roomlist_iface_init)
-);
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      facebook_protocol_client_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      facebook_protocol_server_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      facebook_protocol_im_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
+                                      facebook_protocol_chat_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
+                                      facebook_protocol_roomlist_iface_init));
 
 static void
 fb_cmds_register(void)
@@ -1694,7 +1701,7 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	facebook_protocol_register_type(plugin);
+	facebook_protocol_register_type(G_TYPE_MODULE(plugin));
 	fb_protocol = purple_protocols_add(FACEBOOK_TYPE_PROTOCOL, error);
 
 	if (fb_protocol == NULL) {
--- a/libpurple/protocols/gg/gg.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/gg/gg.c	Tue Oct 01 07:19:14 2019 +0000
@@ -1000,8 +1000,9 @@
 }
 
 static void
-ggp_protocol_init(PurpleProtocol *protocol)
+ggp_protocol_init(GGPProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
 	PurpleAccountOption *option;
 	GList *encryption_options = NULL;
 	GList *protocol_version = NULL;
@@ -1052,12 +1053,19 @@
 }
 
 static void
-ggp_protocol_class_init(PurpleProtocolClass *klass)
+ggp_protocol_class_init(GGPProtocolClass *klass)
 {
-	klass->login        = ggp_login;
-	klass->close        = ggp_close;
-	klass->status_types = ggp_status_types;
-	klass->list_icon    = ggp_list_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = ggp_login;
+	protocol_class->close = ggp_close;
+	protocol_class->status_types = ggp_status_types;
+	protocol_class->list_icon = ggp_list_icon;
+}
+
+static void
+ggp_protocol_class_finalize(G_GNUC_UNUSED GGPProtocolClass *klass)
+{
 }
 
 static void
@@ -1130,30 +1138,29 @@
 	xfer_iface->new_xfer    = ggp_edisc_xfer_send_new;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	GGPProtocol, ggp_protocol, PURPLE_TYPE_PROTOCOL, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        GGPProtocol, ggp_protocol, PURPLE_TYPE_PROTOCOL, 0,
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  ggp_protocol_client_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      ggp_protocol_client_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  ggp_protocol_server_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      ggp_protocol_server_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-	                                  ggp_protocol_im_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      ggp_protocol_im_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT,
-	                                  ggp_protocol_chat_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
+                                      ggp_protocol_chat_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
-	                                  ggp_protocol_roomlist_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
+                                      ggp_protocol_roomlist_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
-	                                  ggp_protocol_privacy_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
+                                      ggp_protocol_privacy_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_XFER,
-	                                  ggp_protocol_xfer_iface_init)
-);
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_XFER,
+                                      ggp_protocol_xfer_iface_init));
 
 static gchar *
 plugin_extra(PurplePlugin *plugin)
@@ -1189,7 +1196,7 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	ggp_protocol_register_type(plugin);
+	ggp_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	ggp_xfer_register(G_TYPE_MODULE(plugin));
 
--- a/libpurple/protocols/irc/irc.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/irc/irc.c	Tue Oct 01 07:19:14 2019 +0000
@@ -954,8 +954,9 @@
 }
 
 static void
-irc_protocol_init(PurpleProtocol *protocol)
+irc_protocol_init(IRCProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
 	PurpleAccountUserSplit *split;
 	PurpleAccountOption *option;
 
@@ -1002,12 +1003,19 @@
 }
 
 static void
-irc_protocol_class_init(PurpleProtocolClass *klass)
+irc_protocol_class_init(IRCProtocolClass *klass)
 {
-	klass->login        = irc_login;
-	klass->close        = irc_close;
-	klass->status_types = irc_status_types;
-	klass->list_icon    = irc_blist_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = irc_login;
+	protocol_class->close = irc_close;
+	protocol_class->status_types = irc_status_types;
+	protocol_class->list_icon = irc_blist_icon;
+}
+
+static void
+irc_protocol_class_finalize(G_GNUC_UNUSED IRCProtocolClass *klass)
+{
 }
 
 static void
@@ -1062,27 +1070,26 @@
 	xfer_iface->new_xfer  = irc_dccsend_new_xfer;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	IRCProtocol, irc_protocol, PURPLE_TYPE_PROTOCOL, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        IRCProtocol, irc_protocol, PURPLE_TYPE_PROTOCOL, 0,
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  irc_protocol_client_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      irc_protocol_client_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  irc_protocol_server_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      irc_protocol_server_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-	                                  irc_protocol_im_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      irc_protocol_im_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT,
-	                                  irc_protocol_chat_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
+                                      irc_protocol_chat_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
-	                                  irc_protocol_roomlist_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
+                                      irc_protocol_roomlist_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_XFER,
-	                                  irc_protocol_xfer_iface_init)
-);
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_XFER,
+                                      irc_protocol_xfer_iface_init));
 
 static PurplePluginInfo *
 plugin_query(GError **error)
@@ -1105,7 +1112,7 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	irc_protocol_register_type(plugin);
+	irc_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	irc_xfer_register(G_TYPE_MODULE(plugin));
 
--- a/libpurple/protocols/jabber/gtalk.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/jabber/gtalk.c	Tue Oct 01 07:19:14 2019 +0000
@@ -34,8 +34,9 @@
 }
 
 static void
-gtalk_protocol_init(PurpleProtocol *protocol)
+gtalk_protocol_init(GTalkProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
 	PurpleAccountUserSplit *split;
 	PurpleAccountOption *option;
 	GList *encryption_values = NULL;
@@ -104,9 +105,16 @@
 }
 
 static void
-gtalk_protocol_class_init(PurpleProtocolClass *klass)
+gtalk_protocol_class_init(GTalkProtocolClass *klass)
 {
-	klass->list_icon = gtalk_list_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->list_icon = gtalk_list_icon;
+}
+
+static void
+gtalk_protocol_class_finalize(G_GNUC_UNUSED GTalkProtocolClass *klass)
+{
 }
 
 static void
@@ -117,9 +125,16 @@
 	server_iface->unregister_user = NULL;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	GTalkProtocol, gtalk_protocol, JABBER_TYPE_PROTOCOL, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        GTalkProtocol, gtalk_protocol, JABBER_TYPE_PROTOCOL, 0,
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      gtalk_protocol_server_iface_init));
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  gtalk_protocol_server_iface_init)
-);
+/* This exists solely because the above macro makes gtalk_protocol_register_type
+ * static. */
+void
+gtalk_protocol_register(PurplePlugin *plugin)
+{
+	gtalk_protocol_register_type(G_TYPE_MODULE(plugin));
+}
--- a/libpurple/protocols/jabber/gtalk.h	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/jabber/gtalk.h	Tue Oct 01 07:19:14 2019 +0000
@@ -45,7 +45,8 @@
 /**
  * Registers the GTalkProtocol type in the type system.
  */
-void gtalk_protocol_register_type(PurplePlugin *plugin);
+G_GNUC_INTERNAL
+void gtalk_protocol_register(PurplePlugin *plugin);
 
 /**
  * Returns the GType for the GTalkProtocol object.
--- a/libpurple/protocols/jabber/jabber.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/jabber/jabber.c	Tue Oct 01 07:19:14 2019 +0000
@@ -4091,8 +4091,10 @@
 }
 
 static void
-jabber_protocol_init(PurpleProtocol *protocol)
+jabber_protocol_init(JabberProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
+
 	protocol->id        = "prpl-jabber";
 	protocol->name      = "XMPP";
 	protocol->options   = OPT_PROTO_CHAT_TOPIC | OPT_PROTO_UNIQUE_CHATNAME |
@@ -4109,12 +4111,19 @@
 }
 
 static void
-jabber_protocol_class_init(PurpleProtocolClass *klass)
+jabber_protocol_class_init(JabberProtocolClass *klass)
 {
-	klass->login        = jabber_login;
-	klass->close        = jabber_close;
-	klass->status_types = jabber_status_types;
-	klass->list_icon    = jabber_list_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = jabber_login;
+	protocol_class->close = jabber_close;
+	protocol_class->status_types = jabber_status_types;
+	protocol_class->list_icon = jabber_list_icon;
+}
+
+static void
+jabber_protocol_class_finalize(G_GNUC_UNUSED JabberProtocolClass *klass)
+{
 }
 
 static void
@@ -4210,36 +4219,36 @@
 	xfer_iface->new_xfer    = jabber_si_new_xfer;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	JabberProtocol, jabber_protocol, PURPLE_TYPE_PROTOCOL, G_TYPE_FLAG_ABSTRACT,
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  jabber_protocol_client_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  jabber_protocol_server_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-	                                  jabber_protocol_im_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT,
-	                                  jabber_protocol_chat_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
-	                                  jabber_protocol_privacy_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
-	                                  jabber_protocol_roomlist_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_ATTENTION,
-	                                  jabber_protocol_attention_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_MEDIA,
-	                                  jabber_protocol_media_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_XFER,
-	                                  jabber_protocol_xfer_iface_init)
-);
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        JabberProtocol, jabber_protocol, PURPLE_TYPE_PROTOCOL,
+        G_TYPE_FLAG_ABSTRACT,
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      jabber_protocol_client_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      jabber_protocol_server_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      jabber_protocol_im_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
+                                      jabber_protocol_chat_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
+                                      jabber_protocol_privacy_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
+                                      jabber_protocol_roomlist_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ATTENTION,
+                                      jabber_protocol_attention_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_MEDIA,
+                                      jabber_protocol_media_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_XFER,
+                                      jabber_protocol_xfer_iface_init));
 
 static PurplePluginInfo *
 plugin_query(GError **error)
@@ -4274,10 +4283,10 @@
 	jingle_rtp_register(plugin);
 #endif
 
-	jabber_protocol_register_type(plugin);
-
-	gtalk_protocol_register_type(plugin);
-	xmpp_protocol_register_type(plugin);
+	jabber_protocol_register_type(G_TYPE_MODULE(plugin));
+
+	gtalk_protocol_register(plugin);
+	xmpp_protocol_register(plugin);
 
 	jabber_si_xfer_register(G_TYPE_MODULE(plugin));
 
--- a/libpurple/protocols/jabber/xmpp.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/jabber/xmpp.c	Tue Oct 01 07:19:14 2019 +0000
@@ -28,8 +28,9 @@
 #include "xmpp.h"
 
 static void
-xmpp_protocol_init(PurpleProtocol *protocol)
+xmpp_protocol_init(XMPPProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
 	PurpleAccountUserSplit *split;
 	PurpleAccountOption *option;
 	GList *encryption_values = NULL;
@@ -98,8 +99,21 @@
 }
 
 static void
-xmpp_protocol_class_init(PurpleProtocolClass *klass)
+xmpp_protocol_class_init(G_GNUC_UNUSED XMPPProtocolClass *klass)
+{
+}
+
+static void
+xmpp_protocol_class_finalize(G_GNUC_UNUSED XMPPProtocolClass *klass)
 {
 }
 
-PURPLE_DEFINE_TYPE(XMPPProtocol, xmpp_protocol, JABBER_TYPE_PROTOCOL);
+G_DEFINE_DYNAMIC_TYPE(XMPPProtocol, xmpp_protocol, JABBER_TYPE_PROTOCOL);
+
+/* This exists solely because the above macro makes xmpp_protocol_register_type
+ * static. */
+void
+xmpp_protocol_register(PurplePlugin *plugin)
+{
+	xmpp_protocol_register_type(G_TYPE_MODULE(plugin));
+}
--- a/libpurple/protocols/jabber/xmpp.h	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/jabber/xmpp.h	Tue Oct 01 07:19:14 2019 +0000
@@ -45,7 +45,8 @@
 /**
  * Registers the XMPPProtocol type in the type system.
  */
-void xmpp_protocol_register_type(PurplePlugin *plugin);
+G_GNUC_INTERNAL
+void xmpp_protocol_register(PurplePlugin *plugin);
 
 /**
  * Returns the GType for the XMPPProtocol object.
--- a/libpurple/protocols/novell/novell.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/novell/novell.c	Tue Oct 01 07:19:14 2019 +0000
@@ -3486,8 +3486,9 @@
 }
 
 static void
-novell_protocol_init(PurpleProtocol *protocol)
+novell_protocol_init(NovellProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
 	PurpleAccountOption *option;
 
 	protocol->id   = "prpl-novell";
@@ -3503,12 +3504,19 @@
 }
 
 static void
-novell_protocol_class_init(PurpleProtocolClass *klass)
+novell_protocol_class_init(NovellProtocolClass *klass)
 {
-	klass->login        = novell_login;
-	klass->close        = novell_close;
-	klass->status_types = novell_status_types;
-	klass->list_icon    = novell_list_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = novell_login;
+	protocol_class->close = novell_close;
+	protocol_class->status_types = novell_status_types;
+	protocol_class->list_icon = novell_list_icon;
+}
+
+static void
+novell_protocol_class_finalize(G_GNUC_UNUSED NovellProtocolClass *klass)
+{
 }
 
 static void
@@ -3562,24 +3570,23 @@
 	privacy_iface->set_permit_deny = novell_set_permit_deny;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	NovellProtocol, novell_protocol, PURPLE_TYPE_PROTOCOL, 0,
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  novell_protocol_client_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  novell_protocol_server_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-	                                  novell_protocol_im_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT,
-	                                  novell_protocol_chat_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
-	                                  novell_protocol_privacy_iface_init)
-);
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        NovellProtocol, novell_protocol, PURPLE_TYPE_PROTOCOL, 0,
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      novell_protocol_client_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      novell_protocol_server_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      novell_protocol_im_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
+                                      novell_protocol_chat_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
+                                      novell_protocol_privacy_iface_init));
 
 static PurplePluginInfo *
 plugin_query(GError **error)
@@ -3602,7 +3609,7 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	novell_protocol_register_type(plugin);
+	novell_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	my_protocol = purple_protocols_add(NOVELL_TYPE_PROTOCOL, error);
 	if (!my_protocol)
--- a/libpurple/protocols/null/nullprpl.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/null/nullprpl.c	Tue Oct 01 07:19:14 2019 +0000
@@ -976,36 +976,38 @@
  * Initialize the protocol instance. see protocol.h for more information.
  */
 static void
-null_protocol_init(PurpleProtocol *protocol)
+null_protocol_init(NullProtocol *self)
 {
-  PurpleAccountUserSplit *split;
-  PurpleAccountOption *option;
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
+	PurpleAccountUserSplit *split;
+	PurpleAccountOption *option;
 
-  protocol->id        = "prpl-null";
-  protocol->name      = "Null - Testing Protocol";
-  protocol->options   = OPT_PROTO_NO_PASSWORD | OPT_PROTO_CHAT_TOPIC;
-  protocol->icon_spec = purple_buddy_icon_spec_new(
-      "png,jpg,gif",                   /* format */
-      0,                               /* min_width */
-      0,                               /* min_height */
-      128,                             /* max_width */
-      128,                             /* max_height */
-      10000,                           /* max_filesize */
-      PURPLE_ICON_SCALE_DISPLAY        /* scale_rules */
-  );
+	protocol->id = "prpl-null";
+	protocol->name = "Null - Testing Protocol";
+	protocol->options = OPT_PROTO_NO_PASSWORD | OPT_PROTO_CHAT_TOPIC;
+	protocol->icon_spec = purple_buddy_icon_spec_new(
+	        "png,jpg,gif",            /* format */
+	        0,                        /* min_width */
+	        0,                        /* min_height */
+	        128,                      /* max_width */
+	        128,                      /* max_height */
+	        10000,                    /* max_filesize */
+	        PURPLE_ICON_SCALE_DISPLAY /* scale_rules */
+	);
 
-  /* see accountopt.h for information about user splits and protocol options */
-  split = purple_account_user_split_new(
-    _("Example user split"),  /* text shown to user */
-    "default",                /* default value */
-    '@');                     /* field separator */
-  option = purple_account_option_string_new(
-    _("Example option"),      /* text shown to user */
-    "example",                /* pref name */
-    "default");               /* default value */
+	/* see accountopt.h for information about user splits and protocol
+	 * options */
+	split = purple_account_user_split_new(
+	        _("Example user split"), /* text shown to user */
+	        "default",               /* default value */
+	        '@');                    /* field separator */
+	option = purple_account_option_string_new(
+	        _("Example option"), /* text shown to user */
+	        "example",           /* pref name */
+	        "default");          /* default value */
 
-  protocol->user_splits = g_list_append(NULL, split);
-  protocol->account_options = g_list_append(NULL, option);
+	protocol->user_splits = g_list_append(NULL, split);
+	protocol->account_options = g_list_append(NULL, option);
 }
 
 /*
@@ -1014,12 +1016,19 @@
  */
 
 static void
-null_protocol_class_init(PurpleProtocolClass *klass)
+null_protocol_class_init(NullProtocolClass *klass)
 {
-  klass->login        = null_login;
-  klass->close        = null_close;
-  klass->status_types = null_status_types;
-  klass->list_icon    = null_list_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = null_login;
+	protocol_class->close = null_close;
+	protocol_class->status_types = null_status_types;
+	protocol_class->list_icon = null_list_icon;
+}
+
+static void
+null_protocol_class_finalize(G_GNUC_UNUSED NullProtocolClass *klass)
+{
 }
 
 static void
@@ -1099,27 +1108,26 @@
  * to register this type with the type system, and null_protocol_get_type()
  * which returns the registered GType.
  */
-PURPLE_DEFINE_TYPE_EXTENDED(
-  NullProtocol, null_protocol, PURPLE_TYPE_PROTOCOL, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        NullProtocol, null_protocol, PURPLE_TYPE_PROTOCOL, 0,
 
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-                                    null_protocol_client_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      null_protocol_client_iface_init)
 
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-                                    null_protocol_server_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      null_protocol_server_iface_init)
 
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-                                    null_protocol_im_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      null_protocol_im_iface_init)
 
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT,
-                                    null_protocol_chat_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
+                                      null_protocol_chat_iface_init)
 
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
-                                    null_protocol_privacy_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
+                                      null_protocol_privacy_iface_init)
 
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
-                                    null_protocol_roomlist_iface_init)
-);
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
+                                      null_protocol_roomlist_iface_init));
 
 static PurplePluginInfo *
 plugin_query(GError **error)
@@ -1146,8 +1154,8 @@
 plugin_load(PurplePlugin *plugin, GError **error)
 {
   /* register the NULL_TYPE_PROTOCOL type in the type system. this function
-   * is defined by PURPLE_DEFINE_TYPE_EXTENDED. */
-  null_protocol_register_type(plugin);
+   * is defined by G_DEFINE_DYNAMIC_TYPE_EXTENDED. */
+  null_protocol_register_type(G_TYPE_MODULE(plugin));
 
   /* add the protocol to the core */
   my_protocol = purple_protocols_add(NULL_TYPE_PROTOCOL, error);
--- a/libpurple/protocols/oscar/aim.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/oscar/aim.c	Tue Oct 01 07:19:14 2019 +0000
@@ -29,8 +29,10 @@
 #include "oscarcommon.h"
 
 static void
-aim_protocol_init(PurpleProtocol *protocol)
+aim_protocol_init(AIMProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
+
 	protocol->id   = "prpl-aim";
 	protocol->name = "AIM";
 
@@ -38,9 +40,16 @@
 }
 
 static void
-aim_protocol_class_init(PurpleProtocolClass *klass)
+aim_protocol_class_init(AIMProtocolClass *klass)
 {
-	klass->list_icon = oscar_list_icon_aim;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->list_icon = oscar_list_icon_aim;
+}
+
+static void
+aim_protocol_class_finalize(G_GNUC_UNUSED AIMProtocolClass *klass)
+{
 }
 
 static void
@@ -57,12 +66,19 @@
 	privacy_iface->set_permit_deny = oscar_set_aim_permdeny;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	AIMProtocol, aim_protocol, OSCAR_TYPE_PROTOCOL, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        AIMProtocol, aim_protocol, OSCAR_TYPE_PROTOCOL, 0,
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      aim_protocol_client_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  aim_protocol_client_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
+                                      aim_protocol_privacy_iface_init));
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
-	                                  aim_protocol_privacy_iface_init)
-);
+/* This exists solely because the above macro makes aim_protocol_register_type
+ * static. */
+void
+aim_protocol_register(PurplePlugin *plugin)
+{
+	aim_protocol_register_type(G_TYPE_MODULE(plugin));
+}
--- a/libpurple/protocols/oscar/aim.h	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/oscar/aim.h	Tue Oct 01 07:19:14 2019 +0000
@@ -45,7 +45,8 @@
 /**
  * Registers the AIMProtocol type in the type system.
  */
-void aim_protocol_register_type(PurplePlugin *plugin);
+G_GNUC_INTERNAL
+void aim_protocol_register(PurplePlugin *plugin);
 
 /**
  * Returns the GType for the AIMProtocol object.
--- a/libpurple/protocols/oscar/icq.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/oscar/icq.c	Tue Oct 01 07:19:14 2019 +0000
@@ -45,8 +45,10 @@
 }
 
 static void
-icq_protocol_init(PurpleProtocol *protocol)
+icq_protocol_init(ICQProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
+
 	protocol->id   = "prpl-icq";
 	protocol->name = "ICQ";
 
@@ -54,9 +56,16 @@
 }
 
 static void
-icq_protocol_class_init(PurpleProtocolClass *klass)
+icq_protocol_class_init(ICQProtocolClass *klass)
 {
-	klass->list_icon = oscar_list_icon_icq;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->list_icon = oscar_list_icon_icq;
+}
+
+static void
+icq_protocol_class_finalize(G_GNUC_UNUSED ICQProtocolClass *klass)
+{
 }
 
 static void
@@ -67,9 +76,16 @@
 	client_iface->get_max_message_size   = icq_get_max_message_size;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	ICQProtocol, icq_protocol, OSCAR_TYPE_PROTOCOL, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        ICQProtocol, icq_protocol, OSCAR_TYPE_PROTOCOL, 0,
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      icq_protocol_client_iface_init));
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  icq_protocol_client_iface_init)
-);
+/* This exists solely because the above macro makes icq_protocol_register_type
+ * static. */
+void
+icq_protocol_register(PurplePlugin *plugin)
+{
+	icq_protocol_register_type(G_TYPE_MODULE(plugin));
+}
--- a/libpurple/protocols/oscar/icq.h	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/oscar/icq.h	Tue Oct 01 07:19:14 2019 +0000
@@ -45,7 +45,8 @@
 /**
  * Registers the ICQProtocol type in the type system.
  */
-void icq_protocol_register_type(PurplePlugin *plugin);
+G_GNUC_INTERNAL
+void icq_protocol_register(PurplePlugin *plugin);
 
 /**
  * Returns the GType for the ICQProtocol object.
--- a/libpurple/protocols/oscar/oscar.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/oscar/oscar.c	Tue Oct 01 07:19:14 2019 +0000
@@ -5677,8 +5677,10 @@
 }
 
 static void
-oscar_protocol_init(PurpleProtocol *protocol)
+oscar_protocol_init(OscarProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
+
 	protocol->options   = OPT_PROTO_MAIL_CHECK | OPT_PROTO_INVITE_MESSAGE |
 	                      OPT_PROTO_AUTHORIZATION_DENIED_MESSAGE;
 	protocol->icon_spec = purple_buddy_icon_spec_new("gif,jpeg,bmp,ico",
@@ -5688,11 +5690,18 @@
 }
 
 static void
-oscar_protocol_class_init(PurpleProtocolClass *klass)
+oscar_protocol_class_init(OscarProtocolClass *klass)
 {
-	klass->login        = oscar_login;
-	klass->close        = oscar_close;
-	klass->status_types = oscar_status_types;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = oscar_login;
+	protocol_class->close = oscar_close;
+	protocol_class->status_types = oscar_status_types;
+}
+
+static void
+oscar_protocol_class_finalize(G_GNUC_UNUSED OscarProtocolClass *klass)
+{
 }
 
 static void
@@ -5760,27 +5769,27 @@
 	xfer_iface->new_xfer    = oscar_new_xfer;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	OscarProtocol, oscar_protocol, PURPLE_TYPE_PROTOCOL, G_TYPE_FLAG_ABSTRACT,
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  oscar_protocol_client_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  oscar_protocol_server_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-	                                  oscar_protocol_im_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT,
-	                                  oscar_protocol_chat_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
-	                                  oscar_protocol_privacy_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_XFER,
-	                                  oscar_protocol_xfer_iface_init)
-);
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        OscarProtocol, oscar_protocol, PURPLE_TYPE_PROTOCOL,
+        G_TYPE_FLAG_ABSTRACT,
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      oscar_protocol_client_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      oscar_protocol_server_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      oscar_protocol_im_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
+                                      oscar_protocol_chat_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
+                                      oscar_protocol_privacy_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_XFER,
+                                      oscar_protocol_xfer_iface_init));
 
 static PurplePluginInfo *
 plugin_query(GError **error)
@@ -5803,10 +5812,10 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	oscar_protocol_register_type(plugin);
-
-	aim_protocol_register_type(plugin);
-	icq_protocol_register_type(plugin);
+	oscar_protocol_register_type(G_TYPE_MODULE(plugin));
+
+	aim_protocol_register(plugin);
+	icq_protocol_register(plugin);
 
 	oscar_xfer_register(G_TYPE_MODULE(plugin));
 
--- a/libpurple/protocols/sametime/sametime.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/sametime/sametime.c	Tue Oct 01 07:19:14 2019 +0000
@@ -5197,65 +5197,72 @@
   }
 }
 
+static void
+mw_protocol_init(mwProtocol *self)
+{
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
+	PurpleAccountUserSplit *split;
+	PurpleAccountOption *opt;
+	GList *l = NULL;
+
+	protocol->id = PROTOCOL_ID;
+	protocol->name = PROTOCOL_NAME;
+
+	/* set up the preferences */
+	purple_prefs_add_none(MW_PROTOCOL_OPT_BASE);
+	purple_prefs_add_int(MW_PROTOCOL_OPT_BLIST_ACTION,
+	                     BLIST_CHOICE_DEFAULT);
+
+	/* set up account ID as user:server */
+	split = purple_account_user_split_new(_("Server"),
+	                                      MW_PLUGIN_DEFAULT_HOST, ':');
+	protocol->user_splits = g_list_append(protocol->user_splits, split);
+
+	/* remove dead preferences */
+	purple_prefs_remove(MW_PROTOCOL_OPT_PSYCHIC);
+	purple_prefs_remove(MW_PROTOCOL_OPT_SAVE_DYNAMIC);
+
+	/* port to connect to */
+	opt = purple_account_option_int_new(_("Port"), MW_KEY_PORT,
+	                                    MW_PLUGIN_DEFAULT_PORT);
+	l = g_list_append(l, opt);
+
+	{ /* copy the old force login setting from prefs if it's
+	     there. Don't delete the preference, since there may be more
+	     than one account that wants to check for it. */
+		gboolean b = FALSE;
+		const char *label = _("Force login (ignore server redirects)");
+
+		if (purple_prefs_exists(MW_PROTOCOL_OPT_FORCE_LOGIN))
+			b = purple_prefs_get_bool(MW_PROTOCOL_OPT_FORCE_LOGIN);
+
+		opt = purple_account_option_bool_new(label, MW_KEY_FORCE, b);
+		l = g_list_append(l, opt);
+	}
+
+	/* pretend to be Sametime Connect */
+	opt = purple_account_option_bool_new(_("Hide client identity"),
+	                                     MW_KEY_FAKE_IT, FALSE);
+	l = g_list_append(l, opt);
+
+	protocol->account_options = l;
+	l = NULL;
+}
 
 static void
-mw_protocol_init(PurpleProtocol *protocol)
+mw_protocol_class_init(mwProtocolClass *klass)
 {
-  PurpleAccountUserSplit *split;
-  PurpleAccountOption *opt;
-  GList *l = NULL;
-
-  protocol->id      = PROTOCOL_ID;
-  protocol->name    = PROTOCOL_NAME;
-
-  /* set up the preferences */
-  purple_prefs_add_none(MW_PROTOCOL_OPT_BASE);
-  purple_prefs_add_int(MW_PROTOCOL_OPT_BLIST_ACTION, BLIST_CHOICE_DEFAULT);
-
-  /* set up account ID as user:server */
-  split = purple_account_user_split_new(_("Server"),
-                                        MW_PLUGIN_DEFAULT_HOST, ':');
-  protocol->user_splits = g_list_append(protocol->user_splits, split);
-
-  /* remove dead preferences */
-  purple_prefs_remove(MW_PROTOCOL_OPT_PSYCHIC);
-  purple_prefs_remove(MW_PROTOCOL_OPT_SAVE_DYNAMIC);
-
-  /* port to connect to */
-  opt = purple_account_option_int_new(_("Port"), MW_KEY_PORT,
-            MW_PLUGIN_DEFAULT_PORT);
-  l = g_list_append(l, opt);
-
-  { /* copy the old force login setting from prefs if it's
-       there. Don't delete the preference, since there may be more
-       than one account that wants to check for it. */
-    gboolean b = FALSE;
-    const char *label = _("Force login (ignore server redirects)");
-
-    if(purple_prefs_exists(MW_PROTOCOL_OPT_FORCE_LOGIN))
-      b = purple_prefs_get_bool(MW_PROTOCOL_OPT_FORCE_LOGIN);
-
-    opt = purple_account_option_bool_new(label, MW_KEY_FORCE, b);
-    l = g_list_append(l, opt);
-  }
-
-  /* pretend to be Sametime Connect */
-  opt = purple_account_option_bool_new(_("Hide client identity"),
-             MW_KEY_FAKE_IT, FALSE);
-  l = g_list_append(l, opt);
-
-  protocol->account_options = l;
-  l = NULL;
-}
-
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = mw_protocol_login;
+	protocol_class->close = mw_protocol_close;
+	protocol_class->status_types = mw_protocol_status_types;
+	protocol_class->list_icon = mw_protocol_list_icon;
+}
 
 static void
-mw_protocol_class_init(PurpleProtocolClass *klass)
+mw_protocol_class_finalize(G_GNUC_UNUSED mwProtocolClass *klass)
 {
-  klass->login        = mw_protocol_login;
-  klass->close        = mw_protocol_close;
-  klass->status_types = mw_protocol_status_types;
-  klass->list_icon    = mw_protocol_list_icon;
 }
 
 
@@ -5331,29 +5338,26 @@
   xfer_iface->new_xfer    = mw_protocol_new_xfer;
 }
 
-
-PURPLE_DEFINE_TYPE_EXTENDED(
-  mwProtocol, mw_protocol, PURPLE_TYPE_PROTOCOL, 0,
-
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-                                    mw_protocol_client_iface_init)
-
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-                                    mw_protocol_server_iface_init)
-
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-                                    mw_protocol_im_iface_init)
-
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT,
-                                    mw_protocol_chat_iface_init)
-
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
-                                    mw_protocol_privacy_iface_init)
-
-  PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_XFER,
-                                    mw_protocol_xfer_iface_init)
-);
-
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        mwProtocol, mw_protocol, PURPLE_TYPE_PROTOCOL, 0,
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      mw_protocol_client_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      mw_protocol_server_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      mw_protocol_im_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
+                                      mw_protocol_chat_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_PRIVACY,
+                                      mw_protocol_privacy_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_XFER,
+                                      mw_protocol_xfer_iface_init));
 
 static PurplePluginInfo *
 plugin_query(GError **error)
@@ -5383,7 +5387,7 @@
   GLogLevelFlags logflags =
     G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION;
 
-  mw_protocol_register_type(plugin);
+  mw_protocol_register_type(G_TYPE_MODULE(plugin));
 
   mw_xfer_register_type(G_TYPE_MODULE(plugin));
 
--- a/libpurple/protocols/silc/silc.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/silc/silc.c	Tue Oct 01 07:19:14 2019 +0000
@@ -2113,10 +2113,10 @@
 	NULL
 };
 
-
 static void
-silcpurple_protocol_init(PurpleProtocol *protocol)
+silcpurple_protocol_init(SilcProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
 	PurpleAccountOption *option;
 	PurpleAccountUserSplit *split;
 	char tmp[256];
@@ -2195,12 +2195,19 @@
 }
 
 static void
-silcpurple_protocol_class_init(PurpleProtocolClass *klass)
+silcpurple_protocol_class_init(SilcProtocolClass *klass)
 {
-	klass->login        = silcpurple_login;
-	klass->close        = silcpurple_close;
-	klass->status_types = silcpurple_away_states;
-	klass->list_icon    = silcpurple_list_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = silcpurple_login;
+	protocol_class->close = silcpurple_close;
+	protocol_class->status_types = silcpurple_away_states;
+	protocol_class->list_icon = silcpurple_list_icon;
+}
+
+static void
+silcpurple_protocol_class_finalize(G_GNUC_UNUSED SilcProtocolClass *klass)
+{
 }
 
 static void
@@ -2259,27 +2266,26 @@
 	xfer_iface->new_xfer  = silcpurple_ftp_new_xfer;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	SilcProtocol, silcpurple_protocol, PURPLE_TYPE_PROTOCOL, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        SilcProtocol, silcpurple_protocol, PURPLE_TYPE_PROTOCOL, 0,
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  silcpurple_protocol_client_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      silcpurple_protocol_client_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  silcpurple_protocol_server_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      silcpurple_protocol_server_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-	                                  silcpurple_protocol_im_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      silcpurple_protocol_im_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT,
-	                                  silcpurple_protocol_chat_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
+                                      silcpurple_protocol_chat_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
-	                                  silcpurple_protocol_roomlist_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_ROOMLIST,
+                                      silcpurple_protocol_roomlist_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_XFER,
-	                                  silcpurple_protocol_xfer_iface_init)
-);
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_XFER,
+                                      silcpurple_protocol_xfer_iface_init));
 
 static PurplePluginInfo *
 plugin_query(GError **error)
@@ -2308,7 +2314,7 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	silcpurple_protocol_register_type(plugin);
+	silcpurple_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	my_protocol = purple_protocols_add(SILCPURPLE_TYPE_PROTOCOL, error);
 	if (!my_protocol)
--- a/libpurple/protocols/simple/simple.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/simple/simple.c	Tue Oct 01 07:19:14 2019 +0000
@@ -2146,8 +2146,9 @@
 }
 
 static void
-simple_protocol_init(PurpleProtocol *protocol)
+simple_protocol_init(SIMPLEProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
 	PurpleAccountUserSplit *split;
 	PurpleAccountOption *option;
 
@@ -2176,12 +2177,19 @@
 }
 
 static void
-simple_protocol_class_init(PurpleProtocolClass *klass)
+simple_protocol_class_init(SIMPLEProtocolClass *klass)
 {
-	klass->login        = simple_login;
-	klass->close        = simple_close;
-	klass->status_types = simple_status_types;
-	klass->list_icon    = simple_list_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = simple_login;
+	protocol_class->close = simple_close;
+	protocol_class->status_types = simple_status_types;
+	protocol_class->list_icon = simple_list_icon;
+}
+
+static void
+simple_protocol_class_finalize(G_GNUC_UNUSED SIMPLEProtocolClass *klass)
+{
 }
 
 static void
@@ -2201,15 +2209,14 @@
 	im_iface->send_typing = simple_typing;
 }
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	SIMPLEProtocol, simple_protocol, PURPLE_TYPE_PROTOCOL, 0,
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        SIMPLEProtocol, simple_protocol, PURPLE_TYPE_PROTOCOL, 0,
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  simple_protocol_server_iface_init)
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      simple_protocol_server_iface_init)
 
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-	                                  simple_protocol_im_iface_init)
-);
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      simple_protocol_im_iface_init));
 
 static PurplePluginInfo *
 plugin_query(GError **error)
@@ -2238,7 +2245,7 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	simple_protocol_register_type(plugin);
+	simple_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	my_protocol = purple_protocols_add(SIMPLE_TYPE_PROTOCOL, error);
 	if (!my_protocol)
--- a/libpurple/protocols/zephyr/zephyr.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/libpurple/protocols/zephyr/zephyr.c	Tue Oct 01 07:19:14 2019 +0000
@@ -2911,8 +2911,9 @@
 
 
 static void
-zephyr_protocol_init(PurpleProtocol *protocol)
+zephyr_protocol_init(ZephyrProtocol *self)
 {
+	PurpleProtocol *protocol = PURPLE_PROTOCOL(self);
 	PurpleAccountOption *option;
 	const gchar *tmp = get_exposure_level();
 
@@ -2950,12 +2951,20 @@
 
 
 static void
-zephyr_protocol_class_init(PurpleProtocolClass *klass)
+zephyr_protocol_class_init(ZephyrProtocolClass *klass)
 {
-	klass->login        = zephyr_login;
-	klass->close        = zephyr_close;
-	klass->status_types = zephyr_status_types;
-	klass->list_icon    = zephyr_list_icon;
+	PurpleProtocolClass *protocol_class = PURPLE_PROTOCOL_CLASS(klass);
+
+	protocol_class->login = zephyr_login;
+	protocol_class->close = zephyr_close;
+	protocol_class->status_types = zephyr_status_types;
+	protocol_class->list_icon = zephyr_list_icon;
+}
+
+
+static void
+zephyr_protocol_class_finalize(G_GNUC_UNUSED ZephyrProtocolClass *klass)
+{
 }
 
 
@@ -3001,22 +3010,20 @@
 }
 
 
-PURPLE_DEFINE_TYPE_EXTENDED(
-	ZephyrProtocol, zephyr_protocol, PURPLE_TYPE_PROTOCOL, 0,
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CLIENT,
-	                                  zephyr_protocol_client_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_SERVER,
-	                                  zephyr_protocol_server_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_IM,
-	                                  zephyr_protocol_im_iface_init)
-
-	PURPLE_IMPLEMENT_INTERFACE_STATIC(PURPLE_TYPE_PROTOCOL_CHAT,
-	                                  zephyr_protocol_chat_iface_init)
-);
-
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(
+        ZephyrProtocol, zephyr_protocol, PURPLE_TYPE_PROTOCOL, 0,
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
+                                      zephyr_protocol_client_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
+                                      zephyr_protocol_server_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
+                                      zephyr_protocol_im_iface_init)
+
+        G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
+                                      zephyr_protocol_chat_iface_init));
 
 static PurplePluginInfo *plugin_query(GError **error)
 {
@@ -3039,7 +3046,7 @@
 static gboolean
 plugin_load(PurplePlugin *plugin, GError **error)
 {
-	zephyr_protocol_register_type(plugin);
+	zephyr_protocol_register_type(G_TYPE_MODULE(plugin));
 
 	my_protocol = purple_protocols_add(ZEPHYR_TYPE_PROTOCOL, error);
 	if (!my_protocol)
--- a/pidgin/plugins/ticker/gtkticker.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/pidgin/plugins/ticker/gtkticker.c	Tue Oct 01 07:19:14 2019 +0000
@@ -65,8 +65,15 @@
 
 static GtkContainerClass *parent_class = NULL;
 
+G_DEFINE_DYNAMIC_TYPE(GtkTicker, gtk_ticker, GTK_TYPE_CONTAINER);
 
-PURPLE_DEFINE_TYPE(GtkTicker, gtk_ticker, GTK_TYPE_CONTAINER);
+/* This exists solely because the above macro makes gtk_ticker_register_type
+ * static. */
+void
+gtk_ticker_register(PurplePlugin *plugin)
+{
+	gtk_ticker_register_type(G_TYPE_MODULE(plugin));
+}
 
 static void gtk_ticker_finalize(GObject *object) {
 	gtk_ticker_stop_scroll(GTK_TICKER(object));
@@ -100,6 +107,11 @@
 	container_class->child_type = gtk_ticker_child_type;
 }
 
+static void
+gtk_ticker_class_finalize(G_GNUC_UNUSED GtkTickerClass *klass)
+{
+}
+
 static GType gtk_ticker_child_type (GtkContainer *container)
 {
 	return GTK_TYPE_WIDGET;
--- a/pidgin/plugins/ticker/gtkticker.h	Tue Oct 01 02:21:00 2019 -0400
+++ b/pidgin/plugins/ticker/gtkticker.h	Tue Oct 01 07:19:14 2019 +0000
@@ -48,7 +48,8 @@
 
 G_MODULE_EXPORT
 G_DECLARE_FINAL_TYPE(GtkTicker, gtk_ticker, GTK, TICKER, GtkContainer)
-void       gtk_ticker_register_type     (PurplePlugin *plugin);
+G_GNUC_INTERNAL
+void gtk_ticker_register(PurplePlugin *plugin);
 
 GtkWidget* gtk_ticker_new               (void);
 void       gtk_ticker_add               (GtkTicker       *ticker,
--- a/pidgin/plugins/ticker/ticker.c	Tue Oct 01 02:21:00 2019 -0400
+++ b/pidgin/plugins/ticker/ticker.c	Tue Oct 01 07:19:14 2019 +0000
@@ -341,7 +341,7 @@
 {
 	void *blist_handle = purple_blist_get_handle();
 
-	gtk_ticker_register_type(plugin);
+	gtk_ticker_register(plugin);
 
 	purple_signal_connect(purple_connections_get_handle(), "signed-off",
 						plugin, PURPLE_CALLBACK(signoff_cb), NULL);

mercurial