From 901f4ebdfe8b3a3740a0757c169cef54551dc381 Mon Sep 17 00:00:00 2001 From: Gary Kramlich Date: Mon, 31 Oct 2022 04:02:09 -0500 Subject: Create PurpleUi that merges PurpleCoreUiOps and PurpleUiInfo This created a lot more refactoring that I imagined, but it's mostly just moving stuff around. I skipped the unit tests for now because we already have a `test_ui.[ch]` in the tests directory which we can/should move to a separate library or something, so it's available outside of the `libpurple/tests/` directory. Testing Done: Ran the unit tests, launched pidgin3, and launched finch3 with out issue. Bugs closed: PIDGIN-17697 Reviewed at https://reviews.imfreedom.org/r/1925/ --- finch/finchui.c | 246 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ finch/finchui.h | 51 +++++++++++ finch/gntui.c | 184 ---------------------------------------- finch/gntui.h | 36 -------- finch/libfinch.c | 45 +--------- finch/meson.build | 4 +- 6 files changed, 301 insertions(+), 265 deletions(-) create mode 100644 finch/finchui.c create mode 100644 finch/finchui.h delete mode 100644 finch/gntui.c delete mode 100644 finch/gntui.h (limited to 'finch') diff --git a/finch/finchui.c b/finch/finchui.c new file mode 100644 index 0000000000..f4af9330fd --- /dev/null +++ b/finch/finchui.c @@ -0,0 +1,246 @@ +/* + * Finch - Universal Text Chat Client + * Copyright (C) Pidgin Developers + * + * Finch is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include +#include + +#define G_SETTINGS_ENABLE_BACKEND +#include + +#include "finchui.h" + +#include "finchnotifications.h" +#include "gntaccount.h" +#include "gntblist.h" +#include "gntconn.h" +#include "gntconv.h" +#include "gntdebug.h" +#include "gntmedia.h" +#include "gntnotify.h" +#include "gntplugin.h" +#include "gntprefs.h" +#include "gntprefs.h" +#include "gntrequest.h" +#include "gntroomlist.h" +#include "gntstatus.h" +#include "gntxfer.h" + +struct _FinchUi { + PurpleUi parent; +}; + +G_DEFINE_TYPE(FinchUi, finch_ui, PURPLE_TYPE_UI) + +/****************************************************************************** + * Helpers + *****************************************************************************/ +static gboolean +finch_history_init(GError **error) { + PurpleHistoryManager *manager = NULL; + PurpleHistoryAdapter *adapter = NULL; + gchar *filename = NULL; + const gchar *id = NULL; + + manager = purple_history_manager_get_default(); + + /* Attempt to create the config directory. */ + g_mkdir_with_parents(purple_config_dir(), 0700); + + filename = g_build_filename(purple_config_dir(), "history.db", NULL); + adapter = purple_sqlite_history_adapter_new(filename); + g_free(filename); + + id = purple_history_adapter_get_id(adapter); + if(!purple_history_manager_register(manager, adapter, error)) { + g_clear_object(&adapter); + + return FALSE; + } + + /* The manager adds a ref to the adapter on registration, so we can remove + * our reference. + */ + g_clear_object(&adapter); + + return purple_history_manager_set_active(manager, id, error); +} + +/****************************************************************************** + * PurpleUi Implementation + *****************************************************************************/ +static void +finch_ui_prefs_init(G_GNUC_UNUSED PurpleUi *ui) { + finch_prefs_init(); +} + +static void +finch_ui_start(G_GNUC_UNUSED PurpleUi *ui) { + GError *error = NULL; + + finch_debug_init(); + +#ifdef STANDALONE +#ifdef _WIN32 /* TODO: don't change it when using FHS under win32 */ + gnt_set_config_dir(purple_config_dir()); +#endif /* _WIN32 */ + + gnt_init(); +#endif /* STANDALONE */ + + if(!finch_history_init(&error)) { + g_critical("failed to initialize the history api: %s", + error != NULL ? error->message : "unknown"); + g_clear_error(&error); + } + + purple_prefs_add_none("/purple/gnt"); + + /* Accounts */ + finch_accounts_init(); + + /* Connections */ + finch_connections_init(); + purple_connections_set_ui_ops(finch_connections_get_ui_ops()); + + /* Initialize the buddy list */ + finch_blist_init(); + purple_blist_set_ui(FINCH_TYPE_BUDDY_LIST); + + /* Now the conversations */ + finch_conversation_init(); + purple_conversations_set_ui_ops(finch_conv_get_ui_ops()); + + /* Notify */ + finch_notify_init(); + purple_notify_set_ui_ops(finch_notify_get_ui_ops()); + + /* Request */ + finch_request_init(); + purple_request_set_ui_ops(finch_request_get_ui_ops()); + + /* File transfer */ + finch_xfers_init(); + purple_xfers_set_ui_ops(finch_xfers_get_ui_ops()); + + /* Roomlist */ + finch_roomlist_init(); + purple_roomlist_set_ui_ops(finch_roomlist_get_ui_ops()); + + /* Media */ + finch_media_manager_init(); + + gnt_register_action(_("Accounts"), finch_accounts_show_all); + gnt_register_action(_("Buddy List"), finch_blist_show); + gnt_register_action(_("Notifications"), finch_notifications_window_show); + gnt_register_action(_("Debug Window"), finch_debug_window_show); + gnt_register_action(_("File Transfers"), finch_xfer_dialog_show); + gnt_register_action(_("Plugins"), finch_plugins_show_all); + gnt_register_action(_("Room List"), finch_roomlist_show_all); + gnt_register_action(_("Preferences"), finch_prefs_show_all); + gnt_register_action(_("Statuses"), finch_savedstatus_show_all); + +#ifdef STANDALONE +} + +static void +finch_ui_stop(G_GNUC_UNUSED PurpleUi *ui) { + purple_accounts_set_ui_ops(NULL); + finch_accounts_uninit(); + + purple_connections_set_ui_ops(NULL); + finch_connections_uninit(); + + purple_blist_set_ui(G_TYPE_INVALID); + finch_blist_uninit(); + + purple_conversations_set_ui_ops(NULL); + finch_conversation_uninit(); + + purple_notify_set_ui_ops(NULL); + finch_notify_uninit(); + + purple_request_set_ui_ops(NULL); + finch_request_uninit(); + + finch_xfers_uninit(); + purple_xfers_set_ui_ops(NULL); + + finch_roomlist_uninit(); + purple_roomlist_set_ui_ops(NULL); + + finch_media_manager_uninit(); + + gnt_quit(); + + finch_debug_uninit(); + +#ifdef _WIN32 + gnt_set_config_dir(NULL); +#endif /* _WIN32 */ +#endif /* STANDALONE */ +} + +static gpointer +finch_ui_get_settings_backend(G_GNUC_UNUSED PurpleUi *ui) { + GSettingsBackend *backend = NULL; + char *config = NULL; + + config = g_build_filename(purple_config_dir(), "finch3.ini", NULL); + backend = g_keyfile_settings_backend_new(config, "/", NULL); + + g_free(config); + + return backend; +} + +/****************************************************************************** + * GObject Implementation + *****************************************************************************/ +static void +finch_ui_init(G_GNUC_UNUSED FinchUi *ui) { +} + +static void +finch_ui_class_init(FinchUiClass *klass) { + PurpleUiClass *ui_class = PURPLE_UI_CLASS(klass); + + ui_class->prefs_init = finch_ui_prefs_init; + ui_class->start = finch_ui_start; + ui_class->stop = finch_ui_stop; + ui_class->get_settings_backend = finch_ui_get_settings_backend; +} + +/****************************************************************************** + * Public API + *****************************************************************************/ +PurpleUi * +finch_ui_new(void) { + return g_object_new( + FINCH_TYPE_UI, + "id", "finch3", + "name", _("Finch"), + "version", VERSION, + "website", "https://pidgin.im", + "support-website", "https://pidgin.im/contact/", + "client-type", "console", + NULL); +} diff --git a/finch/finchui.h b/finch/finchui.h new file mode 100644 index 0000000000..4913707067 --- /dev/null +++ b/finch/finchui.h @@ -0,0 +1,51 @@ +/* + * Finch - Universal Text Chat Client + * Copyright (C) Pidgin Developers + * + * Finch is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#if !defined(FINCH_GLOBAL_HEADER_INSIDE) && !defined(FINCH_COMPILATION) +# error "only may be included directly" +#endif + +#ifndef FINCH_UI_H +#define FINCH_UI_H + +#include + +G_BEGIN_DECLS + +#define FINCH_TYPE_UI (finch_ui_get_type()) +G_DECLARE_FINAL_TYPE(FinchUi, finch_ui, FINCH, UI, PurpleUi) + +/** + * finch_ui_new: + * + * Creates the [class@Purple.Ui] for finch. + * + * Note: This isn't really useful outside of Finch itself. + * + * Since: 3.0.0 + */ +PurpleUi *finch_ui_new(void); + +G_END_DECLS + +#endif /* FINCH_UI_H */ + diff --git a/finch/gntui.c b/finch/gntui.c deleted file mode 100644 index f0f15a1563..0000000000 --- a/finch/gntui.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * finch - * - * Finch 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 - -#include - -#include - -#include "gntui.h" - -#include "finchnotifications.h" -#include "gntaccount.h" -#include "gntblist.h" -#include "gntconn.h" -#include "gntconv.h" -#include "gntdebug.h" -#include "gntxfer.h" -#include "gntmedia.h" -#include "gntnotify.h" -#include "gntplugin.h" -#include "gntprefs.h" -#include "gntrequest.h" -#include "gntroomlist.h" -#include "gntstatus.h" - -static gboolean -finch_history_init(GError **error) { - PurpleHistoryManager *manager = NULL; - PurpleHistoryAdapter *adapter = NULL; - gchar *filename = NULL; - const gchar *id = NULL; - - manager = purple_history_manager_get_default(); - - /* Attempt to create the config directory. */ - g_mkdir_with_parents(purple_config_dir(), 0700); - - filename = g_build_filename(purple_config_dir(), "history.db", NULL); - adapter = purple_sqlite_history_adapter_new(filename); - g_free(filename); - - id = purple_history_adapter_get_id(adapter); - if(!purple_history_manager_register(manager, adapter, error)) { - g_clear_object(&adapter); - - return FALSE; - } - - /* The manager adds a ref to the adapter on registration, so we can remove - * our reference. - */ - g_clear_object(&adapter); - - return purple_history_manager_set_active(manager, id, error); -} - -void -finch_ui_init(void) -{ - GError *error = NULL; - - finch_debug_init(); - -#ifdef STANDALONE -#ifdef _WIN32 /* TODO: don't change it when using FHS under win32 */ - gnt_set_config_dir(purple_config_dir()); -#endif /* _WIN32 */ - - gnt_init(); -#endif /* STANDALONE */ - - if(!finch_history_init(&error)) { - g_critical("failed to initialize the history api: %s", - error != NULL ? error->message : "unknown"); - g_clear_error(&error); - } - - purple_prefs_add_none("/purple/gnt"); - - /* Accounts */ - finch_accounts_init(); - - /* Connections */ - finch_connections_init(); - purple_connections_set_ui_ops(finch_connections_get_ui_ops()); - - /* Initialize the buddy list */ - finch_blist_init(); - purple_blist_set_ui(FINCH_TYPE_BUDDY_LIST); - - /* Now the conversations */ - finch_conversation_init(); - purple_conversations_set_ui_ops(finch_conv_get_ui_ops()); - - /* Notify */ - finch_notify_init(); - purple_notify_set_ui_ops(finch_notify_get_ui_ops()); - - /* Request */ - finch_request_init(); - purple_request_set_ui_ops(finch_request_get_ui_ops()); - - /* File transfer */ - finch_xfers_init(); - purple_xfers_set_ui_ops(finch_xfers_get_ui_ops()); - - /* Roomlist */ - finch_roomlist_init(); - purple_roomlist_set_ui_ops(finch_roomlist_get_ui_ops()); - - /* Media */ - finch_media_manager_init(); - - gnt_register_action(_("Accounts"), finch_accounts_show_all); - gnt_register_action(_("Buddy List"), finch_blist_show); - gnt_register_action(_("Notifications"), finch_notifications_window_show); - gnt_register_action(_("Debug Window"), finch_debug_window_show); - gnt_register_action(_("File Transfers"), finch_xfer_dialog_show); - gnt_register_action(_("Plugins"), finch_plugins_show_all); - gnt_register_action(_("Room List"), finch_roomlist_show_all); - gnt_register_action(_("Preferences"), finch_prefs_show_all); - gnt_register_action(_("Statuses"), finch_savedstatus_show_all); - -#ifdef STANDALONE -} - -void -finch_ui_uninit(void) -{ - purple_accounts_set_ui_ops(NULL); - finch_accounts_uninit(); - - purple_connections_set_ui_ops(NULL); - finch_connections_uninit(); - - purple_blist_set_ui(G_TYPE_INVALID); - finch_blist_uninit(); - - purple_conversations_set_ui_ops(NULL); - finch_conversation_uninit(); - - purple_notify_set_ui_ops(NULL); - finch_notify_uninit(); - - purple_request_set_ui_ops(NULL); - finch_request_uninit(); - - finch_xfers_uninit(); - purple_xfers_set_ui_ops(NULL); - - finch_roomlist_uninit(); - purple_roomlist_set_ui_ops(NULL); - - finch_media_manager_uninit(); - - gnt_quit(); - - finch_debug_uninit(); - -#ifdef _WIN32 - gnt_set_config_dir(NULL); -#endif /* _WIN32 */ -#endif /* STANDALONE */ -} diff --git a/finch/gntui.h b/finch/gntui.h deleted file mode 100644 index 36597cae56..0000000000 --- a/finch/gntui.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * finch - * - * Finch 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 - */ - -#if !defined(FINCH_GLOBAL_HEADER_INSIDE) && !defined(FINCH_COMPILATION) -# error "only may be included directly" -#endif - -#ifndef FINCH_UI_H -#define FINCH_UI_H - -#include "gnt.h" - -void finch_ui_init(void); -void finch_ui_uninit(void); - -#endif /* FINCH_UI_H */ - diff --git a/finch/libfinch.c b/finch/libfinch.c index 191a9eb9e4..d978d34289 100644 --- a/finch/libfinch.c +++ b/finch/libfinch.c @@ -26,54 +26,19 @@ #include #include -#define G_SETTINGS_ENABLE_BACKEND -#include - #include #include +#include "finchui.h" #include "gntdebug.h" #include "gntidle.h" #include "gntprefs.h" -#include "gntui.h" #include "libfinch.h" #include "config.h" #include "package_revision.h" -static void -finch_quit(void) -{ - finch_ui_uninit(); -} - -static gpointer -finch_get_settings_backend(void) { - GSettingsBackend *backend = NULL; - char *config = NULL; - - config = g_build_filename(purple_config_dir(), "finch3.ini", NULL); - backend = g_keyfile_settings_backend_new(config, "/", NULL); - - g_free(config); - - return backend; -} - -static PurpleCoreUiOps core_ops = { - .ui_prefs_init = finch_prefs_init, - .ui_init = finch_ui_init, - .quit = finch_quit, - .get_settings_backend = finch_get_settings_backend, -}; - -static PurpleCoreUiOps * -gnt_core_get_ui_ops(void) -{ - return &core_ops; -} - static gboolean start_with_debugwin(gpointer null) { @@ -106,7 +71,6 @@ finch_plugins_init(void) { static int init_libpurple(int argc, char **argv) { - PurpleUiInfo *ui_info = NULL; gboolean opt_nologin = FALSE; gboolean opt_version = FALSE; gboolean opt_debug = FALSE; @@ -196,14 +160,9 @@ init_libpurple(int argc, char **argv) g_timeout_add(0, start_with_debugwin, NULL); } - purple_core_set_ui_ops(gnt_core_get_ui_ops()); purple_idle_set_ui(finch_idle_new()); - ui_info = purple_ui_info_new("finch3", _("Finch"), VERSION, - "https://pidgin.im", - "https://developer.pidgin.im", "console"); - - if (!purple_core_init(ui_info)) + if (!purple_core_init(finch_ui_new())) { fprintf(stderr, "Initialization of the Purple core failed. Dumping core.\n" diff --git a/finch/meson.build b/finch/meson.build index e6b7bcca12..56d5af6ab6 100644 --- a/finch/meson.build +++ b/finch/meson.build @@ -79,6 +79,7 @@ enable_consoleui = true libfinch_SOURCES = [ 'finchnotifications.c', + 'finchui.c', 'gntaccount.c', 'gntblist.c', 'gntconn.c', @@ -93,7 +94,6 @@ libfinch_SOURCES = [ 'gntrequest.c', 'gntroomlist.c', 'gntstatus.c', - 'gntui.c', 'gntxfer.c', package_revision, 'libfinch.c' @@ -101,6 +101,7 @@ libfinch_SOURCES = [ libfinch_headers = [ 'finchnotifications.h', + 'finchui.h', 'gntaccount.h', 'gntblist.h', 'gntconn.h', @@ -115,7 +116,6 @@ libfinch_headers = [ 'gntrequest.h', 'gntroomlist.h', 'gntstatus.h', - 'gntui.h', 'gntxfer.h', 'libfinch.h' ] -- cgit v1.2.1