/* gdict-app.c - main application class * * This file is part of GNOME Dictionary * * Copyright (C) 2005 Emmanuele Bassi * * 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 . */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include "gdict-common.h" #include "gdict-about.h" #include "gdict-pref-dialog.h" #include "gdict-app.h" G_DEFINE_TYPE (GdictApp, gdict_app, GTK_TYPE_APPLICATION) static GOptionEntry gdict_app_goptions[] = { { "look-up", 0, 0, G_OPTION_ARG_STRING_ARRAY, NULL, N_("Words to look up"), N_("WORD") }, { "match", 0, 0, G_OPTION_ARG_STRING_ARRAY, NULL, N_("Words to match"), N_("WORD") }, { "source", 's', 0, G_OPTION_ARG_STRING, NULL, N_("Dictionary source to use"), N_("NAME") }, { "database", 'D', 0, G_OPTION_ARG_STRING, NULL, N_("Database to use"), N_("NAME") }, { "strategy", 'S', 0, G_OPTION_ARG_STRING, NULL, N_("Strategy to use"), N_("NAME") }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, NULL, N_("Words to look up"), N_("WORDS") }, { NULL }, }; static void gdict_app_cmd_new (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GdictApp *app = user_data; GtkWidget *window = gdict_window_new (GDICT_WINDOW_ACTION_CLEAR, GTK_APPLICATION (app), app->loader, NULL, NULL, NULL, NULL); gtk_widget_show (window); } static void gdict_app_cmd_preferences (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkApplication *app = user_data; GdictWindow *window; g_assert (GTK_IS_APPLICATION (app)); window = GDICT_WINDOW (gtk_application_get_windows (app)->data); gdict_show_pref_dialog (GTK_WIDGET (window), _("Dictionary Preferences"), window->loader); } static void gdict_app_cmd_help (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkApplication *app = user_data; GdictWindow *window; GError *err = NULL; g_return_if_fail (GTK_IS_APPLICATION (app)); window = GDICT_WINDOW (gtk_application_get_windows (app)->data); gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET (window)), "help:gnome-dictionary", gtk_get_current_event_time (), &err); if (err) { gdict_show_gerror_dialog (GTK_WINDOW (window), _("There was an error while displaying help"), err); g_error_free (err); } } static void gdict_app_cmd_about (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkApplication *app = user_data; GdictWindow *window; g_assert (GTK_IS_APPLICATION (app)); window = GDICT_WINDOW (gtk_application_get_windows (app)->data); gdict_show_about_dialog (GTK_WIDGET (window)); } static void gdict_app_cmd_quit (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkApplication *app = user_data; GList *windows; g_assert (GTK_IS_APPLICATION (app)); windows = gtk_application_get_windows (app); g_list_foreach (windows, (GFunc)gtk_widget_destroy, NULL); } static const GActionEntry app_entries[] = { { "new", gdict_app_cmd_new, NULL, NULL, NULL }, { "preferences", gdict_app_cmd_preferences, NULL, NULL, NULL }, { "help", gdict_app_cmd_help, NULL, NULL, NULL }, { "about", gdict_app_cmd_about, NULL, NULL, NULL }, { "quit", gdict_app_cmd_quit, NULL, NULL, NULL } }; static void gdict_app_dispose (GObject *object) { GdictApp *app = GDICT_APP (object); g_clear_object (&app->loader); G_OBJECT_CLASS (gdict_app_parent_class)->dispose (object); } static gchar ** strv_concat (gchar **strv1, gchar **strv2) { gchar **tmp; guint len1, len2; gint i; len1 = g_strv_length (strv1); len2 = g_strv_length (strv2); tmp = g_realloc (strv1, len1 + len2 + 1); for (i = 0; i < len2; i++) tmp[len1 + i] = (gchar *)strv2[i]; tmp[len1 + len2] = NULL; return tmp; } static int gdict_app_command_line (GApplication *application, GApplicationCommandLine *cmd_line) { GdictApp *app = GDICT_APP (application); gsize words_len, i; GVariantDict *options; gchar **gdict_lookup_words = NULL; gchar **gdict_match_words = NULL; gchar **remaining = NULL; const gchar *gdict_source_name = NULL; const gchar *gdict_database_name = NULL; const gchar *gdict_strategy_name = NULL; options = g_application_command_line_get_options_dict (cmd_line); g_variant_dict_lookup (options, "look-up", "^as", &gdict_lookup_words); g_variant_dict_lookup (options, "match", "^as", &gdict_match_words); g_variant_dict_lookup (options, "source", "&s", &gdict_source_name); g_variant_dict_lookup (options, "database", "&s", &gdict_database_name); g_variant_dict_lookup (options, "strategy", "&s", &gdict_strategy_name); g_variant_dict_lookup (options, G_OPTION_REMAINING, "^as", &remaining); if (remaining != NULL) { if (gdict_match_words != NULL) { gchar **tmp; tmp = strv_concat (gdict_match_words, remaining); g_strfreev (gdict_match_words); g_strfreev (remaining); gdict_match_words = tmp; } else { gdict_match_words = remaining; } remaining = NULL; } if (gdict_lookup_words == NULL && gdict_match_words == NULL) { GtkWidget *window = gdict_window_new (GDICT_WINDOW_ACTION_CLEAR, GTK_APPLICATION (application), app->loader, gdict_source_name, gdict_database_name, gdict_strategy_name, NULL); gtk_widget_show (window); goto out; } if (gdict_lookup_words != NULL) words_len = g_strv_length (gdict_lookup_words); else words_len = 0; for (i = 0; i < words_len; i++) { const gchar *word = gdict_lookup_words[i]; GtkWidget *window; window = gdict_window_new (GDICT_WINDOW_ACTION_LOOKUP, GTK_APPLICATION (application), app->loader, gdict_source_name, gdict_database_name, gdict_strategy_name, word); gtk_widget_show (window); } if (gdict_match_words != NULL) words_len = g_strv_length (gdict_match_words); else words_len = 0; for (i = 0; i < words_len; i++) { const gchar *word = gdict_match_words[i]; GtkWidget *window; window = gdict_window_new (GDICT_WINDOW_ACTION_MATCH, GTK_APPLICATION (application), app->loader, gdict_source_name, gdict_database_name, gdict_strategy_name, word); gtk_widget_show (window); } out: g_strfreev (gdict_lookup_words); g_strfreev (gdict_match_words); return 0; } static void gdict_app_activate (GApplication *application) { GdictApp *app = GDICT_APP (application); GtkWidget *window = gdict_window_new (GDICT_WINDOW_ACTION_CLEAR, GTK_APPLICATION (application), app->loader, NULL, NULL, NULL, NULL); gtk_widget_show (window); } static void gdict_app_startup (GApplication *application) { static const char *lookup_accels[2] = { "l", NULL }; static const char *escape_accels[2] = { "Escape", NULL }; G_APPLICATION_CLASS (gdict_app_parent_class)->startup (application); g_action_map_add_action_entries (G_ACTION_MAP (application), app_entries, G_N_ELEMENTS (app_entries), application); gtk_application_set_accels_for_action (GTK_APPLICATION (application), "win.lookup", lookup_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (application), "win.escape", escape_accels); } static void gdict_app_class_init (GdictAppClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GApplicationClass *application_class = G_APPLICATION_CLASS (klass); gobject_class->dispose = gdict_app_dispose; application_class->startup = gdict_app_startup; application_class->activate = gdict_app_activate; application_class->command_line = gdict_app_command_line; } static void gdict_app_init (GdictApp *app) { char *loader_path; /* add user's path for fetching dictionary sources */ app->loader = gdict_source_loader_new (); loader_path = gdict_get_config_dir (); gdict_source_loader_add_search_path (app->loader, loader_path); g_free (loader_path); /* Add the command line options */ g_application_add_main_option_entries (G_APPLICATION (app), gdict_app_goptions); /* Set main application icon */ gtk_window_set_default_icon_name ("accessories-dictionary"); } GApplication * gdict_app_new (void) { return g_object_new (gdict_app_get_type (), "application-id", "org.gnome.Dictionary", "resource-base-path", "/org/gnome/Dictionary", "flags", G_APPLICATION_HANDLES_COMMAND_LINE, NULL); }