Blame gspell-app/gspell-app.c

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: */