diff options
Diffstat (limited to 'finch/finchui.c')
-rw-r--r-- | finch/finchui.c | 246 |
1 files changed, 246 insertions, 0 deletions
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 <devel@pidgin.im> + * + * 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 <https://www.gnu.org/licenses/>. + */ + +#include <glib.h> +#include <glib/gi18n.h> + +#define G_SETTINGS_ENABLE_BACKEND +#include <gio/gsettingsbackend.h> + +#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); +} |