diff options
Diffstat (limited to 'src/gui/gtd-application.c')
| -rw-r--r-- | src/gui/gtd-application.c | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/src/gui/gtd-application.c b/src/gui/gtd-application.c new file mode 100644 index 0000000..f89e25f --- /dev/null +++ b/src/gui/gtd-application.c @@ -0,0 +1,331 @@ +/* gtd-application.c + * + * Copyright (C) 2015-2020 Georges Basile Stavracas Neto <georges.stavracas@gmail.com> + * + * 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 3 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 <http://www.gnu.org/licenses/>. + */ + +#define G_LOG_DOMAIN "GtdApplication" + +#include "config.h" + +#include "gtd-application.h" +#include "gtd-debug.h" +#include "gtd-initial-setup-window.h" +#include "gtd-log.h" +#include "gtd-manager.h" +#include "gtd-manager-protected.h" +#include "gtd-vcs.h" +#include "gtd-window.h" + +#include <glib.h> +#include <glib-object.h> +#include <gio/gio.h> +#include <girepository.h> +#include <glib/gi18n.h> + + +struct _GtdApplication +{ + AdwApplication application; + + GtkWindow *window; + GtkWidget *initial_setup; +}; + +static void gtd_application_activate_action (GSimpleAction *simple, + GVariant *parameter, + gpointer user_data); + +static void gtd_application_show_about (GSimpleAction *simple, + GVariant *parameter, + gpointer user_data); + +static void gtd_application_quit (GSimpleAction *simple, + GVariant *parameter, + gpointer user_data); + +static void gtd_application_show_help (GSimpleAction *simple, + GVariant *parameter, + gpointer user_data); + +G_DEFINE_TYPE (GtdApplication, gtd_application, ADW_TYPE_APPLICATION) + +static GOptionEntry cmd_options[] = { + { "quit", 'q', 0, G_OPTION_ARG_NONE, NULL, N_("Quit Endeavour"), NULL }, + { "debug", 'd', 0, G_OPTION_ARG_NONE, NULL, N_("Enable debug messages"), NULL }, + { "version", 'v', 0, G_OPTION_ARG_NONE, NULL, N_("Print version information and exit"), NULL }, + { NULL } +}; + +static const GActionEntry gtd_application_entries[] = { + { "activate", gtd_application_activate_action }, + { "about", gtd_application_show_about }, + { "quit", gtd_application_quit }, + { "help", gtd_application_show_help } +}; + +static void +gtd_application_activate_action (GSimpleAction *simple, + GVariant *parameter, + gpointer user_data) +{ + GtdApplication *self = GTD_APPLICATION (user_data); + + gtk_window_present (GTK_WINDOW (self->window)); +} + +static void +gtd_application_show_about (GSimpleAction *simple, + GVariant *parameter, + gpointer user_data) +{ + GtdApplication *self; + + static const gchar *developers[] = { + "Emmanuele Bassi <ebassi@gnome.org>", + "Georges Basile Stavracas Neto <georges.stavracas@gmail.com>", + "Isaque Galdino <igaldino@gmail.com>", + "Patrick Griffis <tingping@tingping.se>", + "Jamie Murphy <hello@itsjamie.dev>", + "Saiful B. Khan <saifulbkhan@gmail.com>", + NULL + }; + + static const gchar *designers[] = { + "Allan Day <allanpday@gmail.com>", + "Jakub Steiner <jimmac@gmail.com>", + "Tobias Bernard <tbernard@gnome.org>", + NULL + }; + + self = GTD_APPLICATION (user_data); + + adw_show_about_window (GTK_WINDOW (self->window), + "application-name", _("Endeavour"), + "application-icon", APPLICATION_ID, + "version", GTD_VCS_TAG, + "copyright", _("Copyright \xC2\xA9 2015–2022 The Endeavour authors"), + "issue-url", "https://gitlab.gnome.org/World/Endeavour/-/issues", + "website", "https://gitlab.gnome.org/World/Endeavour", + "license-type", GTK_LICENSE_GPL_3_0, + "developers", developers, + "designers", designers, + "translator-credits", _("translator-credits"), + NULL); +} + +static void +gtd_application_quit (GSimpleAction *simple, + GVariant *parameter, + gpointer user_data) +{ + GtdApplication *self = GTD_APPLICATION (user_data); + + gtk_window_destroy (self->window); +} + +static void +gtd_application_show_help (GSimpleAction *simple, + GVariant *parameter, + gpointer user_data) +{ + GtdApplication *self = GTD_APPLICATION (user_data); + gtk_show_uri (GTK_WINDOW (self->window) , "help:endeavour", GDK_CURRENT_TIME); +} + +GtdApplication * +gtd_application_new (void) +{ + return g_object_new (GTD_TYPE_APPLICATION, + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_HANDLES_COMMAND_LINE, + "resource-base-path", "/org/gnome/todo", + NULL); +} + +static void +set_accel_for_action (GtdApplication *self, + const gchar *detailed_action_name, + const gchar *accel) +{ + const char *accels[] = { accel, NULL }; + + gtk_application_set_accels_for_action (GTK_APPLICATION (self), detailed_action_name, accels); +} + + +static void +run_window (GtdApplication *self) +{ + gtk_window_present (GTK_WINDOW (self->window)); +} + +/* +static void +finish_initial_setup (GtdApplication *application) +{ + g_return_if_fail (GTD_IS_APPLICATION (application)); + + run_window (application); + + gtd_manager_set_is_first_run (application->priv->manager, FALSE); + + g_clear_pointer (&application->priv->initial_setup, gtk_widget_destroy); +} + +static void +run_initial_setup (GtdApplication *application) +{ + GtdApplicationPrivate *priv; + + g_return_if_fail (GTD_IS_APPLICATION (application)); + + priv = application->priv; + + if (!priv->initial_setup) + { + priv->initial_setup = gtd_initial_setup_window_new (application); + + g_signal_connect (priv->initial_setup, + "cancel", + G_CALLBACK (gtk_widget_destroy), + application); + + g_signal_connect_swapped (priv->initial_setup, + "done", + G_CALLBACK (finish_initial_setup), + application); + } + + gtk_widget_show (priv->initial_setup); +} +*/ + +static void +gtd_application_finalize (GObject *object) +{ + G_OBJECT_CLASS (gtd_application_parent_class)->finalize (object); +} + +static void +gtd_application_activate (GApplication *application) +{ + GTD_ENTRY; + + /* FIXME: the initial setup is disabled for the 3.18 release because + * we can't create tasklists on GOA accounts. + */ + run_window (GTD_APPLICATION (application)); + + GTD_EXIT; +} + +static void +gtd_application_startup (GApplication *application) +{ + GtdApplication *self; + + GTD_ENTRY; + + self = GTD_APPLICATION (application); + + /* add actions */ + g_action_map_add_action_entries (G_ACTION_MAP (self), + gtd_application_entries, + G_N_ELEMENTS (gtd_application_entries), + self); + + set_accel_for_action (self, "app.quit", "<Control>q"); + set_accel_for_action (self, "app.help", "F1"); + + G_APPLICATION_CLASS (gtd_application_parent_class)->startup (application); + + /* window */ + gtk_window_set_default_icon_name (APPLICATION_ID); + self->window = GTK_WINDOW (gtd_window_new (self)); + + /* Load the plugins */ + gtd_manager_load_plugins (gtd_manager_get_default ()); + + GTD_EXIT; +} + +static gint +gtd_application_command_line (GApplication *app, + GApplicationCommandLine *command_line) +{ + GVariantDict *options; + + options = g_application_command_line_get_options_dict (command_line); + + if (g_variant_dict_contains (options, "quit")) + { + g_application_quit (app); + return 0; + } + + g_application_activate (app); + + return 0; +} + +static gboolean +gtd_application_local_command_line (GApplication *application, + gchar ***arguments, + gint *exit_status) +{ + g_application_add_option_group (application, g_irepository_get_option_group()); + + return G_APPLICATION_CLASS (gtd_application_parent_class)->local_command_line (application, + arguments, + exit_status); +} + +static gint +gtd_application_handle_local_options (GApplication *application, + GVariantDict *options) +{ + if (g_variant_dict_contains (options, "debug")) + gtd_log_init (); + + if (g_variant_dict_contains (options, "version")) + { + g_print ("%s - Version %s\n", g_get_application_name (), PACKAGE_VERSION); + return 0; + } + + return -1; +} + +static void +gtd_application_class_init (GtdApplicationClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GApplicationClass *application_class = G_APPLICATION_CLASS (klass); + + object_class->finalize = gtd_application_finalize; + + application_class->activate = gtd_application_activate; + application_class->startup = gtd_application_startup; + application_class->command_line = gtd_application_command_line; + application_class->local_command_line = gtd_application_local_command_line; + application_class->handle_local_options = gtd_application_handle_local_options; +} + +static void +gtd_application_init (GtdApplication *self) +{ + g_application_add_main_option_entries (G_APPLICATION (self), cmd_options); +} |
