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