static gboolean get_word_from_pos(GtkText* gtktext, int pos, char* buf, int *pstart, int *pend) { gint start, end; if (iswordsep(GTK_TEXT_INDEX(gtktext, pos))) return FALSE; for (start = pos; start >= 0; --start) { if (iswordsep(GTK_TEXT_INDEX(gtktext, start))) break; } start++; for (end = pos; end <= gtk_text_get_length(gtktext); end++) { if (iswordsep(GTK_TEXT_INDEX(gtktext, end))) break; } if (buf) { for (pos = start; pos < end; pos++) buf[pos-start] = GTK_TEXT_INDEX(gtktext, pos); buf[pos-start] = 0; } if (pstart) *pstart = start; if (pend) *pend = end; return TRUE; }
void gtkurl_check_all(GtkText *gtktext) { guint origpos; guint pos = 0; guint len; float adj_value; len = gtk_text_get_length(gtktext); adj_value = gtktext->vadj->value; gtk_text_freeze(gtktext); origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext)); while (pos < len) { while (pos < len && iswordsep(GTK_TEXT_INDEX(gtktext, pos))) pos++; while (pos < len && !iswordsep(GTK_TEXT_INDEX(gtktext, pos))) pos++; if (pos > 0) check_at(gtktext, pos-1); } gtk_text_thaw(gtktext); gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos); }
static gchar *get_word_from_pos(GtkText* gtktext, gint pos, gint *pstart, gint *pend) { GString *word = g_string_new(""); gint start, end; gchar ch; if (iswordsep(GTK_TEXT_INDEX(gtktext, pos))) return(NULL); /* Get start and end position from the word */ for (start = pos; start >= 0; --start) if (iswordsep(GTK_TEXT_INDEX(gtktext, start))) break; start++; for (end = pos; end < gtk_text_get_length(gtktext); end++) if (iswordsep(GTK_TEXT_INDEX(gtktext, end)) ) break; /* Be sure to not include punctation marks etc. */ for ( ;end>start; end-- ) { ch = GTK_TEXT_INDEX(gtktext, end-1); if( isalpha(ch) || isdigit(ch) || ch == ':' ) break; } /* Get the word (everyting between start and end */ for (pos = start; pos < end; pos++) g_string_append_c( word, GTK_TEXT_INDEX(gtktext, pos) ); if (pstart) *pstart = start; if (pend) *pend = end; return(word->str); }
static void entry_insert_cb(GtkText *gtktext, gchar *newtext, guint len, guint *ppos, gpointer d) { gint origpos; gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext), GTK_SIGNAL_FUNC(entry_insert_cb), NULL ); gtk_text_insert(GTK_TEXT(gtktext), NULL, &(GTK_WIDGET(gtktext)->style->fg[0]), NULL, newtext, len); gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext), GTK_SIGNAL_FUNC(entry_insert_cb), NULL); gtk_signal_emit_stop_by_name(GTK_OBJECT(gtktext), "insert-text"); *ppos += len; origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext)); if (iswordsep(newtext[0])) { /* did we just end a word? */ if (*ppos >= 2) check_at(gtktext, *ppos-2); /* did we just split a word? */ if (*ppos < gtk_text_get_length(gtktext)) check_at(gtktext, *ppos+1); } else { /* check as they type, *except* if they're typing at the end (the most * common case. */ if (*ppos < gtk_text_get_length(gtktext) && !iswordsep(GTK_TEXT_INDEX(gtktext, *ppos))) check_at(gtktext, *ppos-1); } gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos); gtk_editable_select_region(GTK_EDITABLE(gtktext), origpos, origpos); }
void nh_message_putstr(const char *str) { int i; int len; char *buf; GtkText *t; #ifdef FROZEN_INSERT static int freeze_count=0; #endif if (!message_text) return; t = GTK_TEXT(message_text); len = strlen(str); buf = (char *)alloc(len + 2); sprintf(buf, "\n%s", str); #ifdef FROZEN_INSERT /* ALI: gimpwin 20001226 looks very bad if you update a text widget without * freezing it (the text is displayed half-scrolled, with lines overlapping * each other). This is not ideal (the text is redrawn each thaw), but it * is an improvement. Due to a bug in gimpwin we can't trim text if we've * frozen the widget, thus every so often we don't freeze but trim instead. */ if (++freeze_count >= 50) /* Trim text every 50 inserts */ freeze_count = 0; else gtk_text_freeze(t); #endif if (nh_status_in_trouble()) i = CLR_RED; else i = MAP_BLACK; gtk_text_insert(t, NULL, &nh_color[i], &nh_color[MAP_WHITE], buf, len + 1); len = gtk_text_get_length(t); #ifdef FROZEN_INSERT if (!freeze_count && len > NH_TEXT_REMEMBER) { #else if (len > NH_TEXT_REMEMBER) { #endif gtk_text_freeze(t); for(i = 0; i < len && len > NH_TEXT_REMEMBER; i++) if (GTK_TEXT_INDEX(t, i) == '\n') { i++; gtk_text_set_point(t, i); gtk_text_backward_delete(t, i); len -= i; } gtk_text_set_point(t, len); gtk_text_thaw(t); } #ifdef FROZEN_INSERT /* ALI: t->vadj->upper would be more correct, but causes gimpwin to crash */ if (freeze_count) { gtk_adjustment_set_value(t->vadj, t->vadj->upper - 1); gtk_text_thaw(t); } #endif free(buf); } #endif /* USE_TEXTVIEW */ int GTK_doprev_message() { return 0; } void nh_message_destroy(void) { message_text = NULL; }