--- a/ChangeLog.API Fri May 20 02:40:14 2022 -0500
+++ b/ChangeLog.API Fri May 20 02:55:51 2022 -0500
@@ -426,6 +426,7 @@
* purple_conversations_find_chat. Use
purple_conversation_manager_find_chat_by_id instead.
* purple_conversation_set_logging
+ * purple_core_get_ui, use purple_core_get_ui_info instead. * purple_core_ensure_single_instance. Check via GApplication
or whatever is appropriate for your UI.
--- a/finch/libfinch.c Fri May 20 02:40:14 2022 -0500
+++ b/finch/libfinch.c Fri May 20 02:55:51 2022 -0500
@@ -39,12 +39,6 @@
#include "package_revision.h"
-finch_ui_get_info(void) {
- return purple_ui_info_new(_("Finch"), VERSION, "https://pidgin.im",
- "https://developer.pidgin.im", "console");
@@ -56,7 +50,6 @@
@@ -97,6 +90,7 @@
init_libpurple(int argc, char **argv)
+ PurpleUiInfo *ui_info = NULL; gboolean opt_nologin = FALSE;
gboolean opt_version = FALSE;
gboolean opt_debug = FALSE;
@@ -189,7 +183,11 @@
purple_core_set_ui_ops(gnt_core_get_ui_ops());
purple_idle_set_ui(finch_idle_new());
- if (!purple_core_init(FINCH_UI))
+ ui_info = purple_ui_info_new("finch", _("Finch"), VERSION, + "https://developer.pidgin.im", "console"); + if (!purple_core_init(ui_info)) "Initialization of the Purple core failed. Dumping core.\n"
--- a/libpurple/core.c Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/core.c Fri May 20 02:55:51 2022 -0500
@@ -49,7 +49,7 @@
@@ -84,19 +84,14 @@
purple_core_get_version());
- if(PURPLE_IS_UI_INFO(ui_info)) {
- g_object_unref(G_OBJECT(ui_info));
-purple_core_init(const char *ui)
+purple_core_init(PurpleUiInfo *ui_info) { - g_return_val_if_fail(ui != NULL, FALSE);
+ g_return_val_if_fail(PURPLE_IS_UI_INFO(ui_info), FALSE); g_return_val_if_fail(purple_get_core() == NULL, FALSE);
bindtextdomain(PACKAGE, PURPLE_LOCALEDIR);
@@ -106,7 +101,7 @@
_core = core = g_new0(PurpleCore, 1);
- core->ui = g_strdup(ui);
+ core->ui_info = ui_info; ops = purple_core_get_ui_ops();
@@ -258,7 +253,7 @@
+ g_clear_object(&core->ui_info); @@ -282,16 +277,6 @@
-purple_core_get_ui(void)
- PurpleCore *core = purple_get_core();
- g_return_val_if_fail(core != NULL, NULL);
@@ -310,11 +295,7 @@
-PurpleUiInfo* purple_core_get_ui_info() {
- PurpleCoreUiOps *ops = purple_core_get_ui_ops();
- if(NULL == ops || NULL == ops->get_ui_info)
- return ops->get_ui_info();
+purple_core_get_ui_info() { --- a/libpurple/core.h Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/core.h Fri May 20 02:55:51 2022 -0500
@@ -37,8 +37,7 @@
- * @ui: The ID of the UI using the core. This should be a
- * unique ID, registered with the purple team.
+ * @ui_info: (transfer full): The [class@UiInfo] of the UI using the core. * Initializes the core of purple.
@@ -46,7 +45,7 @@
* Returns: %TRUE if successful, or %FALSE otherwise.
-gboolean purple_core_init(const char *ui);
+gboolean purple_core_init(PurpleUiInfo *ui_info); @@ -87,16 +86,6 @@
const char *purple_core_get_version(void);
- * Returns the ID of the UI that is using the core, as passed to
- * Returns: The ID of the UI that is currently using the core.
-const char *purple_core_get_ui(void);
* This is used to connect to
@@ -128,9 +117,9 @@
* Returns a #PurpleUiInfo that contains information about the user interface.
- * Returns: (transfer full): A #PurpleUiInfo instance.
+ * Returns: (transfer none): A #PurpleUiInfo instance. -PurpleUiInfo* purple_core_get_ui_info(void);
+PurpleUiInfo *purple_core_get_ui_info(void); --- a/libpurple/example/nullclient.c Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/example/nullclient.c Fri May 20 02:55:51 2022 -0500
@@ -84,6 +84,8 @@
+ PurpleUiInfo *ui_info = NULL; /* Set a custom user directory (optional) */
purple_util_set_user_dir(CUSTOM_USER_DIRECTORY);
@@ -98,10 +100,13 @@
purple_core_set_ui_ops(&null_core_uiops);
+ ui_info = purple_ui_info_new(UI_ID, "NullClient", VERSION, PURPLE_WEBSITE, + PURPLE_WEBSITE, "example"); /* Now that all the essential stuff has been set, let's try to init the core. It's
* necessary to provide a non-NULL name for the current ui to the core. This name
* is used by stuff that depends on this ui, for example the ui-specific plugins. */
- if (!purple_core_init(UI_ID)) {
+ if (!purple_core_init(ui_info)) { /* Initializing the core failed. Terminate. */
"libpurple initialization failed. Dumping core.\n"
--- a/libpurple/plugins/kwallet/purplekwallet.cpp Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/plugins/kwallet/purplekwallet.cpp Fri May 20 02:55:51 2022 -0500
@@ -59,7 +59,6 @@
ui_info = purple_core_get_ui_info();
if(PURPLE_IS_UI_INFO(ui_info)) {
ui_name = purple_ui_info_get_name(ui_info);
- g_object_unref(G_OBJECT(ui_info));
--- a/libpurple/protocols/jabber/bosh.c Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/protocols/jabber/bosh.c Fri May 20 02:55:51 2022 -0500
@@ -81,10 +81,6 @@
jabber_bosh_useragent = g_strdup("libpurple " VERSION);
- g_object_unref(G_OBJECT(ui_info));
void jabber_bosh_uninit(void)
--- a/libpurple/protocols/silc/silc.c Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/protocols/silc/silc.c Fri May 20 02:55:51 2022 -0500
@@ -720,10 +720,6 @@
quit_msg = g_strdup_printf(_("Download %s: %s"), ui_name, ui_website);
- if (PURPLE_IS_UI_INFO(ui_info)) {
- g_object_unref(G_OBJECT(ui_info));
--- a/libpurple/purplecoreuiops.h Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/purplecoreuiops.h Fri May 20 02:55:51 2022 -0500
@@ -42,8 +42,6 @@
* should use this hook to set all other necessary
* <link linkend="chapter-ui-ops"><literal>UiOps structures</literal></link>.
* @quit: Called after most of libpurple has been uninitialized.
- * @get_ui_info: Called by purple_core_get_ui_info(); should return the
- * information documented there.
* Callbacks that fire at different points of the initialization and teardown
* of libpurple, along with a hook to return descriptive information about the
@@ -55,8 +53,6 @@
- PurpleUiInfo *(*get_ui_info)(void);
--- a/libpurple/purpleplugininfo.c Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/purpleplugininfo.c Fri May 20 02:55:51 2022 -0500
@@ -154,10 +154,12 @@
if(priv->ui_requirement != NULL) {
- if(!purple_strequal(priv->ui_requirement, purple_core_get_ui())) {
+ PurpleUiInfo *ui_info = purple_core_get_ui_info(); + const gchar *ui_id = purple_ui_info_get_id(ui_info); + if(!purple_strequal(priv->ui_requirement, ui_id)) { priv->error = g_strdup_printf(_("You are using %s, but this plugin "
purple_debug_error("plugins",
"%s is not loadable: The UI requirement is not "
--- a/libpurple/purpleuiinfo.c Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/purpleuiinfo.c Fri May 20 02:55:51 2022 -0500
@@ -25,6 +25,7 @@
@@ -34,6 +35,7 @@
@@ -47,6 +49,12 @@
*****************************************************************************/
+purple_ui_info_set_id(PurpleUiInfo *info, const gchar *id) { + info->id = g_strdup(id); purple_ui_info_set_name(PurpleUiInfo *info, const gchar *name) {
info->name = g_strdup(name);
@@ -90,6 +98,9 @@
PurpleUiInfo *info = PURPLE_UI_INFO(obj);
+ g_value_set_string(value, purple_ui_info_get_id(info)); g_value_set_string(value, purple_ui_info_get_name(info));
@@ -118,6 +129,9 @@
PurpleUiInfo *info = PURPLE_UI_INFO(obj);
+ purple_ui_info_set_id(info, g_value_get_string(value)); purple_ui_info_set_name(info, g_value_get_string(value));
@@ -148,6 +162,7 @@
purple_ui_info_finalize(GObject *obj) {
PurpleUiInfo *info = PURPLE_UI_INFO(obj);
+ g_clear_pointer(&info->id, g_free); g_clear_pointer(&info->name, g_free);
g_clear_pointer(&info->version, g_free);
g_clear_pointer(&info->website, g_free);
@@ -166,9 +181,24 @@
obj_class->finalize = purple_ui_info_finalize;
+ * The identifier of the user interface. + g_param_spec_string("id", "id", "The identifier of the user interface", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); * The name of the user interface.
g_param_spec_string("name", "name", "The name of the user interface",
@@ -177,9 +207,11 @@
- * PurpleUiInfo::version:
+ * PurpleUiInfo:version: - * The name of the user interface.
+ * The version of the user interface. properties[PROP_VERSION] =
g_param_spec_string("version", "version",
@@ -189,9 +221,11 @@
- * PurpleUiInfo::website:
+ * PurpleUiInfo:website: * The website of the user interface.
properties[PROP_WEBSITE] =
g_param_spec_string("website", "website",
@@ -201,9 +235,11 @@
- * PurpleUiInfo::support-website:
+ * PurpleUiInfo:support-website: * The support website of the user interface.
properties[PROP_SUPPORT_WEBSITE] =
g_param_spec_string("support-website", "support-website",
@@ -213,9 +249,11 @@
- * PurpleUiInfo::client-type:
+ * PurpleUiInfo:client-type: * The client type of the user interface.
properties[PROP_CLIENT_TYPE] =
g_param_spec_string("client-type", "client-type",
@@ -231,11 +269,12 @@
*****************************************************************************/
-purple_ui_info_new(const gchar *name, const gchar *version,
- const gchar *website, const gchar *support_website,
- const gchar *client_type)
+purple_ui_info_new(const gchar *id, const gchar *name, + const gchar *version, const gchar *website, + const gchar *support_website, const gchar *client_type) return g_object_new(PURPLE_TYPE_UI_INFO,
@@ -245,6 +284,13 @@
+purple_ui_info_get_id(PurpleUiInfo *info) { + g_return_val_if_fail(PURPLE_IS_UI_INFO(info), NULL); purple_ui_info_get_name(PurpleUiInfo *info) {
g_return_val_if_fail(PURPLE_IS_UI_INFO(info), NULL);
@@ -278,4 +324,3 @@
return info->client_type;
--- a/libpurple/purpleuiinfo.h Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/purpleuiinfo.h Fri May 20 02:55:51 2022 -0500
@@ -48,7 +48,8 @@
+ * @name: The name, which will be displayed. * @support_website: The support website.
@@ -61,13 +62,26 @@
-PurpleUiInfo *purple_ui_info_new(const gchar *name,
+PurpleUiInfo *purple_ui_info_new(const gchar *id, const gchar *support_website,
const gchar *client_type);
+ * purple_ui_info_get_id: + * Gets the identifier from @info. + * Returns: The identifier from @info. +const gchar *purple_ui_info_get_id(PurpleUiInfo *info); * purple_ui_info_get_name:
* @info: The #PurpleUiInfo instance.
--- a/libpurple/tests/test_ui.c Fri May 20 02:40:14 2022 -0500
+++ b/libpurple/tests/test_ui.c Fri May 20 02:55:51 2022 -0500
@@ -92,6 +92,7 @@
test_ui_purple_init(void) {
+ PurpleUiInfo *ui_info = NULL; @@ -114,10 +115,13 @@
purple_core_set_ui_ops(&test_core_uiops);
+ ui_info = purple_ui_info_new("test", "Test-UI", VERSION, PURPLE_WEBSITE, + PURPLE_WEBSITE, "test"); /* Now that all the essential stuff has been set, let's try to init the core. It's
* necessary to provide a non-NULL name for the current ui to the core. This name
* is used by stuff that depends on this ui, for example the ui-specific plugins. */
- if (!purple_core_init("test-ui")) {
+ if (!purple_core_init(ui_info)) { /* Initializing the core failed. Terminate. */
"libpurple initialization failed. Dumping core.\n"
--- a/pidgin/libpidgin.c Fri May 20 02:40:14 2022 -0500
+++ b/pidgin/libpidgin.c Fri May 20 02:55:51 2022 -0500
@@ -299,18 +299,11 @@
g_application_quit(g_application_get_default());
-pidgin_ui_get_info(void) {
- return purple_ui_info_new(PIDGIN_NAME, VERSION, "https://pidgin.im",
- "https://developer.pidgin.im", "pc");
static PurpleCoreUiOps core_ops =
--- a/pidgin/pidginapplication.c Fri May 20 02:40:14 2022 -0500
+++ b/pidgin/pidginapplication.c Fri May 20 02:55:51 2022 -0500
@@ -646,6 +646,7 @@
pidgin_application_startup(GApplication *application) {
PurpleAccountManager *manager = NULL;
+ PurpleUiInfo *ui_info = NULL; GtkCssProvider *provider = NULL;
GList *active_accounts = NULL;
@@ -701,7 +702,11 @@
purple_core_set_ui_ops(pidgin_core_get_ui_ops());
- if(!purple_core_init(PIDGIN_UI)) {
+ ui_info = purple_ui_info_new(PIDGIN_UI, PIDGIN_NAME, VERSION, + "https://developer.pidgin.im", "pc"); + if(!purple_core_init(ui_info)) { _("Initialization of the libpurple core failed. Aborting!\n"
"Please report this!\n"));