/* * This file is part of gspell, a spell-checking library. * * Copyright 2015, 2017 - Sébastien Wilmet * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ /* * Usage: gspell-app [lang_code] * * gspell-app is a small spell-checker. It does only one thing but does it * (hopefully) well. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #define GSPELL_TYPE_APP_CONTENT (gspell_app_content_get_type ()) G_DECLARE_FINAL_TYPE (GspellAppContent, gspell_app_content, GSPELL, APP_CONTENT, GtkGrid) struct _GspellAppContent { GtkGrid parent; GtkTextView *view; }; G_DEFINE_TYPE (GspellAppContent, gspell_app_content, GTK_TYPE_GRID) static GspellChecker * get_spell_checker (GspellAppContent *content) { GtkTextBuffer *gtk_buffer; GspellTextBuffer *gspell_buffer; gtk_buffer = gtk_text_view_get_buffer (content->view); gspell_buffer = gspell_text_buffer_get_from_gtk_text_buffer (gtk_buffer); return gspell_text_buffer_get_spell_checker (gspell_buffer); } static void gspell_app_content_class_init (GspellAppContentClass *klass) { } static GtkWidget * get_sidebar (GspellAppContent *content) { GtkWidget *sidebar; GtkWidget *language_button; GspellChecker *checker; const GspellLanguage *language; sidebar = gtk_grid_new (); g_object_set (sidebar, "margin", 6, NULL); gtk_orientable_set_orientation (GTK_ORIENTABLE (sidebar), GTK_ORIENTATION_VERTICAL); gtk_grid_set_row_spacing (GTK_GRID (sidebar), 6); /* Button to launch a language dialog */ checker = get_spell_checker (content); language = gspell_checker_get_language (checker); language_button = gspell_language_chooser_button_new (language); gtk_container_add (GTK_CONTAINER (sidebar), language_button); g_object_bind_property (language_button, "language", checker, "language", G_BINDING_BIDIRECTIONAL); return sidebar; } static void init_view (GspellAppContent *content) { GspellTextView *gspell_view; GtkStyleContext *style_context; GtkCssProvider *css_provider; GError *error = NULL; g_assert (content->view == NULL); content->view = GTK_TEXT_VIEW (gtk_text_view_new ()); gspell_view = gspell_text_view_get_from_gtk_text_view (content->view); gspell_text_view_basic_setup (gspell_view); gtk_text_view_set_wrap_mode (content->view, GTK_WRAP_WORD); g_object_set (content->view, "top-margin", 6, "right-margin", 6, "bottom-margin", 6, "left-margin", 6, NULL); style_context = gtk_widget_get_style_context (GTK_WIDGET (content->view)); css_provider = gtk_css_provider_new (); gtk_css_provider_load_from_data (css_provider, "textview { font-size: 120%; }\n", -1, &error); if (error == NULL) { gtk_style_context_add_provider (style_context, GTK_STYLE_PROVIDER (css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); } else { g_warning ("CSS error: %s", error->message); g_clear_error (&error); } g_object_unref (css_provider); } static void gspell_app_content_init (GspellAppContent *content) { GtkWidget *scrolled_window; init_view (content); gtk_orientable_set_orientation (GTK_ORIENTABLE (content), GTK_ORIENTATION_HORIZONTAL); gtk_container_add (GTK_CONTAINER (content), get_sidebar (content)); scrolled_window = gtk_scrolled_window_new (NULL, NULL); /* Overlay scrolling is annoying when trying to place the cursor at the * last character of a line. */ gtk_scrolled_window_set_overlay_scrolling (GTK_SCROLLED_WINDOW (scrolled_window), FALSE); g_object_set (scrolled_window, "expand", TRUE, NULL); gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET (content->view)); gtk_container_add (GTK_CONTAINER (content), scrolled_window); gtk_widget_show_all (GTK_WIDGET (content)); } static GspellAppContent * gspell_app_content_new (const GspellLanguage *lang) { GspellAppContent *content; GspellChecker *checker; content = g_object_new (GSPELL_TYPE_APP_CONTENT, NULL); if (lang != NULL) { checker = get_spell_checker (content); gspell_checker_set_language (checker, lang); } return content; } static gint app_command_line_cb (GApplication *app, GApplicationCommandLine *command_line, gpointer user_data) { gint argc; gchar **argv; const GspellLanguage *lang = NULL; GtkWidget *window; GspellAppContent *content; argv = g_application_command_line_get_arguments (command_line, &argc); if (argc > 1) { const gchar *lang_code; /* Last parameter */ lang_code = argv[argc-1]; if (g_ascii_strcasecmp (lang_code, "fr") == 0) { /* Just for me, because I'm lazy and I prefer to type * just fr. -- swilmet */ lang_code = "fr_BE"; } lang = gspell_language_lookup (lang_code); if (lang == NULL) { g_printerr ("No language found for language code “%s”.\n", lang_code); } } window = gtk_application_window_new (GTK_APPLICATION (app)); gtk_window_set_default_size (GTK_WINDOW (window), 800, 600); content = gspell_app_content_new (lang); gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (content)); gtk_widget_show (window); g_strfreev (argv); return 0; } static gchar * get_locale_directory (void) { return g_build_filename (GSPELL_DATADIR, "locale", NULL); } static void setup_i18n (void) { gchar *locale_dir; setlocale (LC_ALL, ""); locale_dir = get_locale_directory (); bindtextdomain (GETTEXT_PACKAGE, locale_dir); g_free (locale_dir); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); } static void print_available_language_codes (void) { const GList *available_languages; const GList *l; g_print ("Available language codes: "); available_languages = gspell_language_get_available (); if (available_languages == NULL) { g_print ("none\n"); return; } for (l = available_languages; l != NULL; l = l->next) { const GspellLanguage *language = l->data; g_print ("%s", gspell_language_get_code (language)); if (l->next != NULL) { g_print (", "); } } g_print ("\n"); } int main (int argc, char **argv) { GtkApplication *app; int ret; setup_i18n (); g_set_prgname ("gspell-app"); print_available_language_codes (); app = gtk_application_new ("org.gnome.gspell-app", G_APPLICATION_HANDLES_COMMAND_LINE); g_signal_connect (app, "command-line", G_CALLBACK (app_command_line_cb), NULL); ret = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app); return ret; } /* ex:set ts=8 noet: */