static void gtkaspell_checkers_error_message (gchar *message);
/* Callbacks */
+static gboolean key_press_cb (GtkWidget *text_view,
+ GdkEventKey *event,
+ GtkAspell *gtkaspell);
static void entry_insert_cb (GtkTextBuffer *textbuf,
GtkTextIter *iter,
gchar *newtext,
static void reset_theword_data (GtkAspell *gtkaspell);
static void free_checkers (gpointer elt,
gpointer data);
-static gint find_gtkaspeller (gconstpointer aa,
- gconstpointer bb);
static void destroy_menu(GtkWidget *widget, gpointer user_data);
allocate_color(gtkaspell, misspelled_color);
+ g_signal_connect(G_OBJECT(gtktext), "key_press_event",
+ G_CALLBACK(key_press_cb), gtkaspell);
g_signal_connect_after(G_OBJECT(buffer), "insert-text",
G_CALLBACK(entry_insert_cb), gtkaspell);
g_signal_connect_after(G_OBJECT(buffer), "delete-range",
{
GtkTextView *gtktext = gtkaspell->gtktext;
+ g_signal_handlers_disconnect_by_func(G_OBJECT(gtktext),
+ G_CALLBACK(key_press_cb),
+ gtkaspell);
g_signal_handlers_disconnect_by_func(G_OBJECT(gtktext),
G_CALLBACK(entry_insert_cb),
gtkaspell);
gtkaspell->dict_changed_cb(gtkaspell->menu_changed_data);
}
+static gboolean key_press_cb (GtkWidget *text_view,
+ GdkEventKey *event,
+ GtkAspell *gtkaspell)
+{
+ gint pos;
+
+ cm_return_val_if_fail(gtkaspell->gtkaspeller->speller, FALSE);
+
+ if (!gtkaspell->check_while_typing)
+ return FALSE;
+
+ switch (event->keyval) {
+ case GDK_KEY_Home:
+ case GDK_KEY_Left:
+ case GDK_KEY_Up:
+ case GDK_KEY_Right:
+ case GDK_KEY_Down:
+ case GDK_KEY_Page_Up:
+ case GDK_KEY_Page_Down:
+ case GDK_KEY_End:
+ case GDK_KEY_Begin:
+ pos = get_textview_buffer_offset(GTK_TEXT_VIEW(text_view));
+ if (pos > 0)
+ check_at(gtkaspell, pos - 1);
+ else
+ check_at(gtkaspell, pos);
+ break;
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
static void entry_insert_cb(GtkTextBuffer *textbuf,
GtkTextIter *iter,
gchar *newtext,
GtkAspell *gtkaspell)
{
int origpos;
- gint start, end;
+ gint start;
cm_return_if_fail(gtkaspell->gtkaspeller->speller);
return;
start = gtk_text_iter_get_offset(startiter);
- end = gtk_text_iter_get_offset(enditer);
origpos = get_textview_buffer_offset(gtkaspell->gtktext);
if (start) {
check_at(gtkaspell, start - 1);
/* Checker creation */
static GtkAspeller *gtkaspeller_new(Dictionary *dictionary)
{
- GSList *exist;
GtkAspeller *gtkaspeller = NULL;
GtkAspeller *tmp;
Dictionary *dict;
tmp = g_new0(GtkAspeller, 1);
tmp->dictionary = dict;
- exist = g_slist_find_custom(gtkaspellcheckers->checkers, tmp,
- find_gtkaspeller);
-
g_free(tmp);
if ((gtkaspeller = gtkaspeller_real_new(dict)) != NULL) {
{
gint start, end;
char buf[GTKASPELLWORDSIZE];
- GtkTextView *gtktext;
cm_return_val_if_fail(from_pos >= 0, FALSE);
- gtktext = gtkaspell->gtktext;
-
if (!get_word_from_pos(gtkaspell, from_pos, buf, sizeof(buf),
&start, &end))
return FALSE;
return;
gtktext = gtkaspell->gtktext;
+ g_signal_handlers_block_by_func(G_OBJECT(gtktext),
+ G_CALLBACK(key_press_cb),
+ gtkaspell);
g_signal_handlers_block_by_func(G_OBJECT(gtktext),
G_CALLBACK(entry_insert_cb),
gtkaspell);
return;
gtktext = gtkaspell->gtktext;
+ g_signal_handlers_unblock_by_func(G_OBJECT(gtktext),
+ G_CALLBACK(key_press_cb),
+ gtkaspell);
g_signal_handlers_unblock_by_func(G_OBJECT(gtktext),
G_CALLBACK(entry_insert_cb),
gtkaspell);
static void replace_real_word(GtkAspell *gtkaspell, const gchar *newword)
{
- int oldlen, newlen, wordlen;
+ int oldlen, newlen;
gint origpos;
gint pos;
GtkTextView *gtktext;
origpos = gtkaspell->orig_pos;
pos = origpos;
oldlen = gtkaspell->end_pos - gtkaspell->start_pos;
- wordlen = strlen(gtkaspell->theword);
newlen = strlen(newword); /* FIXME: multybyte characters? */
- g_signal_handlers_block_by_func(G_OBJECT(gtktext),
- G_CALLBACK(entry_insert_cb),
- gtkaspell);
- g_signal_handlers_block_by_func(G_OBJECT(gtktext),
- G_CALLBACK(entry_delete_cb),
- gtkaspell);
+ gtkaspell_block_check(gtkaspell);
gtk_text_buffer_get_iter_at_offset(textbuf, &startiter,
gtkaspell->start_pos);
g_signal_emit_by_name(G_OBJECT(textbuf), "insert-text",
&startiter, newword, newlen, gtkaspell);
- g_signal_handlers_unblock_by_func(G_OBJECT(gtktext),
- G_CALLBACK(entry_insert_cb),
- gtkaspell);
- g_signal_handlers_unblock_by_func(G_OBJECT(gtktext),
- G_CALLBACK(entry_delete_cb),
- gtkaspell);
+ gtkaspell_unblock_check(gtkaspell);
/* Put the point and the position where we clicked with the mouse
* It seems to be a hack, as I must thaw,freeze,thaw the widget
/* Accept this word for this session */
static void add_word_to_session_cb(GtkWidget *w, gpointer data)
{
- GtkTextView *gtktext;
GtkAspell *gtkaspell = (GtkAspell *) data;
- gtktext = gtkaspell->gtktext;
-
enchant_dict_add_to_session(gtkaspell->gtkaspeller->speller, gtkaspell->theword, strlen(gtkaspell->theword));
static PangoFontDescription *font_desc;
GtkWidget *dialog;
GtkWidget *label;
- GtkWidget *w_hbox;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *entry;
thelabel = g_strdup_printf(_("<span weight=\"bold\" "
"size=\"larger\">Replace \"%s\" with: </span>"),
utf8buf);
- /* for title label */
- w_hbox = gtk_hbox_new(FALSE, 0);
icon = gtk_image_new_from_stock(GTK_STOCK_DIALOG_QUESTION,
GTK_ICON_SIZE_DIALOG);
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
- hbox = gtk_hbox_new(TRUE, 0);
-
gtkut_stock_button_set_create(&confirm_area,
&cancel_button, GTK_STOCK_CANCEL,
&ok_button, GTK_STOCK_OK,
if (gtkaspellcheckers->dictionary_list == NULL)
gtkaspell_get_dictionary_list(FALSE);
- tmp = gtkaspellcheckers->dictionary_list;
-
menu = gtk_menu_new();
curmenu = menu;
{
GtkWidget *item, *submenu;
char *caption;
- GtkTextView *gtktext;
GtkAccelGroup *accel;
GList *l = gtkaspell->suggestions_list;
gchar *utf8buf;
GSList *list = NULL;
- gtktext = gtkaspell->gtktext;
if (l == NULL)
return NULL;
static void set_point_continue(GtkAspell *gtkaspell)
{
- GtkTextView *gtktext;
-
- gtktext = gtkaspell->gtktext;
-
gtkaspell->ctx.set_position(gtkaspell->ctx.data, gtkaspell->orig_pos);
if (gtkaspell->continue_check)
gtkaspeller_real_delete(gtkaspeller);
}
-static gint find_gtkaspeller(gconstpointer aa, gconstpointer bb)
-{
- Dictionary *a = ((GtkAspeller *) aa)->dictionary;
- Dictionary *b = ((GtkAspeller *) bb)->dictionary;
-
- if (a && b && a->fullname && b->fullname)
- return strcmp(a->fullname, b->fullname);
-
- return 1;
-}
-
gchar *gtkaspell_get_default_dictionary(GtkAspell *gtkaspell)
{
if (gtkaspell && gtkaspell->gtkaspeller &&