Yattm - unified GTK instant-messaging client | |
[Generated for version 0.2-17 - Mon Jan 6 19:01:23 GMT+1 2003] |
#include "intl.h"
#include <gtk/gtk.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
Include dependency graph for gtkspell.c:
Go to the source code of this file.
Defines | |
#define | BUFSIZE 1024 |
#define | MENUCOUNT 20 |
#define | BUGEMAIL "gtkspell-devel@lists.sourceforge.net" |
Functions | |
void | entry_insert_cb (GtkText *gtktext, gchar *newtext, guint len, guint *ppos, gpointer d) |
void | set_up_signal () |
int | gtkspell_running () |
void | error_print (const char *fmt,...) |
void | writetext (char *text) |
int | readpipe (char *buf, int bufsize) |
int | readline (char *buf) |
int | readresponse (char *buf) |
void | gtkspell_stop () |
int | gtkspell_start (char *path, char *args[]) |
GList * | misspelled_suggest (char *word) |
int | misspelled_test (char *word) |
gboolean | iswordsep (char c) |
gboolean | get_word_from_pos (GtkText *gtktext, int pos, char *buf, int *pstart, int *pend) |
gboolean | get_curword (GtkText *gtktext, char *buf, int *pstart, int *pend) |
void | change_color (GtkText *gtktext, int start, int end, GdkColor *color) |
gboolean | check_at (GtkText *gtktext, int from_pos) |
void | gtkspell_check_all (GtkText *gtktext) |
void | entry_delete_cb (GtkText *gtktext, gint start, gint end, gpointer d) |
void | replace_word (GtkWidget *w, gpointer d) |
GtkMenu * | make_menu (GList *l, GtkText *gtktext) |
void | popup_menu (GtkText *gtktext, GdkEventButton *eb) |
gint | button_press_intercept_cb (GtkText *gtktext, GdkEvent *e, gpointer d) |
void | gtkspell_uncheck_all (GtkText *gtktext) |
void | gtkspell_attach (GtkText *gtktext) |
void | gtkspell_detach (GtkText *gtktext) |
void | sigchld (int param) |
Variables | |
pid_t | spell_pid = -1 |
int | fd_write [2] |
int | fd_read [2] |
int | signal_set_up = 0 |
GdkColor | highlight = { 0, 255*256, 0, 0 } |
|
Definition at line 44 of file gtkspell.c. Referenced by check_at(), gtkspell_start(), misspelled_suggest(), misspelled_test(), popup_menu(), readline(), readresponse(), and replace_word(). |
|
Definition at line 47 of file gtkspell.c. Referenced by misspelled_suggest(), and misspelled_test(). |
|
Definition at line 46 of file gtkspell.c. Referenced by make_menu(). |
|
Definition at line 545 of file gtkspell.c. References button_press_intercept_cb(), gtkspell_running(), and popup_menu(). Referenced by button_press_intercept_cb(), gtkspell_attach(), and gtkspell_detach().
00545 { 00546 GdkEventButton *eb; 00547 gboolean retval; 00548 00549 if (!gtkspell_running()) return FALSE; 00550 00551 if (e->type != GDK_BUTTON_PRESS) return FALSE; 00552 eb = (GdkEventButton*) e; 00553 00554 if (eb->button != 3) return FALSE; 00555 00556 /* forge the leftclick */ 00557 eb->button = 1; 00558 00559 gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext), 00560 GTK_SIGNAL_FUNC(button_press_intercept_cb), d); 00561 gtk_signal_emit_by_name(GTK_OBJECT(gtktext), "button-press-event", 00562 e, &retval); 00563 gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext), 00564 GTK_SIGNAL_FUNC(button_press_intercept_cb), d); 00565 gtk_signal_emit_stop_by_name(GTK_OBJECT(gtktext), "button-press-event"); 00566 00567 /* now do the menu wackiness */ 00568 popup_menu(gtktext, eb); 00569 return TRUE; 00570 } |
|
Definition at line 323 of file gtkspell.c. References entry_insert_cb(). Referenced by check_at().
00324 { 00325 char *newtext = gtk_editable_get_chars(GTK_EDITABLE(gtktext), start, end); 00326 gtk_text_freeze(gtktext); 00327 gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext), 00328 GTK_SIGNAL_FUNC(entry_insert_cb), NULL); 00329 00330 gtk_text_set_point(gtktext, start); 00331 00332 if(newtext && end-start > 0) 00333 { 00334 gtk_text_forward_delete(gtktext, end-start); 00335 gtk_text_insert(gtktext, NULL, color, NULL, newtext, end-start); 00336 } 00337 00338 gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext), 00339 GTK_SIGNAL_FUNC(entry_insert_cb), NULL); 00340 gtk_text_thaw(gtktext); 00341 g_free(newtext); 00342 } |
|
Definition at line 344 of file gtkspell.c. References BUFSIZE, change_color(), get_word_from_pos(), highlight, and misspelled_test(). Referenced by entry_delete_cb(), entry_insert_cb(), and gtkspell_check_all().
00344 { 00345 int start, end; 00346 char buf[BUFSIZE]; 00347 00348 if (!get_word_from_pos(gtktext, from_pos, buf, &start, &end)) { 00349 return FALSE; 00350 } 00351 00352 if (misspelled_test(buf)) { 00353 if (highlight.pixel == 0) { 00354 /* add an entry for the highlight in the color map. */ 00355 GdkColormap *gc = gtk_widget_get_colormap(GTK_WIDGET(gtktext)); 00356 gdk_colormap_alloc_color(gc, &highlight, FALSE, TRUE);; 00357 } 00358 change_color(gtktext, start, end, &highlight); 00359 return TRUE; 00360 } else { 00361 change_color(gtktext, start, end, 00362 &(GTK_WIDGET(gtktext)->style->fg[0])); 00363 return FALSE; 00364 } 00365 } |
|
Definition at line 430 of file gtkspell.c. References check_at(), and gtkspell_running(). Referenced by gtkspell_attach(), and gtkspell_detach().
00431 { 00432 int origpos; 00433 00434 if (!gtkspell_running()) return; 00435 00436 origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext)); 00437 check_at(gtktext, start-1); 00438 gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos); 00439 gtk_editable_select_region(GTK_EDITABLE(gtktext), origpos, origpos); 00440 /* this is to *UNDO* the selection, in case they were holding shift 00441 * while hitting backspace. */ 00442 } |
|
Definition at line 392 of file gtkspell.c. References check_at(), entry_insert_cb(), gtkspell_running(), and iswordsep(). Referenced by change_color(), entry_insert_cb(), gtkspell_attach(), and gtkspell_detach().
00393 { 00394 int origpos; 00395 00396 if (!gtkspell_running()) return; 00397 00398 gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext), 00399 GTK_SIGNAL_FUNC(entry_insert_cb), 00400 NULL); 00401 gtk_text_insert(GTK_TEXT(gtktext), NULL, 00402 &(GTK_WIDGET(gtktext)->style->fg[0]), NULL, newtext, len); 00403 gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext), 00404 GTK_SIGNAL_FUNC(entry_insert_cb), 00405 NULL); 00406 gtk_signal_emit_stop_by_name(GTK_OBJECT(gtktext), "insert-text"); 00407 *ppos += len; 00408 00409 origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext)); 00410 00411 if (iswordsep(newtext[0])) { 00412 /* did we just end a word? */ 00413 if (*ppos >= 2) check_at(gtktext, *ppos-2); 00414 00415 /* did we just split a word? */ 00416 if (*ppos < gtk_text_get_length(gtktext)) 00417 check_at(gtktext, *ppos+1); 00418 } else { 00419 /* check as they type, *except* if they're typing at the end (the most 00420 * common case. 00421 */ 00422 if (*ppos < gtk_text_get_length(gtktext) && 00423 !iswordsep(GTK_TEXT_INDEX(gtktext, *ppos))) 00424 check_at(gtktext, *ppos-1); 00425 } 00426 00427 gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos); 00428 } |
|
Definition at line 67 of file gtkspell.c. Referenced by gtkspell_start(), misspelled_suggest(), misspelled_test(), and readpipe().
00067 {
00068 va_list ap;
00069 va_start(ap, fmt);
00070 fprintf(stderr, "gtkspell: ");
00071 vfprintf(stderr, fmt, ap);
00072 va_end(ap);
00073 }
|
|
Definition at line 317 of file gtkspell.c. References get_word_from_pos(). Referenced by popup_menu(), and replace_word().
00318 { 00319 int pos = gtk_editable_get_position(GTK_EDITABLE(gtktext)); 00320 return get_word_from_pos(gtktext, pos, buf, pstart, pend); 00321 } |
|
Definition at line 290 of file gtkspell.c. References iswordsep(). Referenced by check_at(), and get_curword().
00291 { 00292 gint start, end; 00293 00294 if (iswordsep(GTK_TEXT_INDEX(gtktext, pos))) return FALSE; 00295 00296 for (start = pos; start >= 0; --start) { 00297 if (iswordsep(GTK_TEXT_INDEX(gtktext, start))) break; 00298 } 00299 start++; 00300 00301 for (end = pos; end <= gtk_text_get_length(gtktext); end++) { 00302 if (iswordsep(GTK_TEXT_INDEX(gtktext, end))) break; 00303 } 00304 00305 if (buf) { 00306 for (pos = start; pos < end; pos++) 00307 buf[pos-start] = GTK_TEXT_INDEX(gtktext, pos); 00308 buf[pos-start] = 0; 00309 } 00310 00311 if (pstart) *pstart = start; 00312 if (pend) *pend = end; 00313 00314 return TRUE; 00315 } |
|
Definition at line 590 of file gtkspell.c. References button_press_intercept_cb(), entry_delete_cb(), and entry_insert_cb(). Referenced by eb_chat_window_new().
00590 { 00591 gtk_signal_connect(GTK_OBJECT(gtktext), "insert-text", 00592 GTK_SIGNAL_FUNC(entry_insert_cb), NULL); 00593 gtk_signal_connect_after(GTK_OBJECT(gtktext), "delete-text", 00594 GTK_SIGNAL_FUNC(entry_delete_cb), NULL); 00595 gtk_signal_connect(GTK_OBJECT(gtktext), "button-press-event", 00596 GTK_SIGNAL_FUNC(button_press_intercept_cb), NULL); 00597 } |
|
Definition at line 367 of file gtkspell.c. References check_at(), gtkspell_running(), and iswordsep().
00367 { 00368 guint origpos; 00369 guint pos = 0; 00370 guint len; 00371 float adj_value; 00372 00373 if (!gtkspell_running()) return; 00374 00375 len = gtk_text_get_length(gtktext); 00376 00377 adj_value = gtktext->vadj->value; 00378 gtk_text_freeze(gtktext); 00379 origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext)); 00380 while (pos < len) { 00381 while (pos < len && iswordsep(GTK_TEXT_INDEX(gtktext, pos))) 00382 pos++; 00383 while (pos < len && !iswordsep(GTK_TEXT_INDEX(gtktext, pos))) 00384 pos++; 00385 if (pos > 0) 00386 check_at(gtktext, pos-1); 00387 } 00388 gtk_text_thaw(gtktext); 00389 gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos); 00390 } |
|
Definition at line 599 of file gtkspell.c. References button_press_intercept_cb(), entry_delete_cb(), entry_insert_cb(), and gtkspell_uncheck_all().
00599 { 00600 gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext), 00601 GTK_SIGNAL_FUNC(entry_insert_cb), NULL); 00602 gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext), 00603 GTK_SIGNAL_FUNC(entry_delete_cb), NULL); 00604 gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext), 00605 GTK_SIGNAL_FUNC(button_press_intercept_cb), NULL); 00606 00607 gtkspell_uncheck_all(gtktext); 00608 } |
|
Definition at line 63 of file gtkspell.c. References spell_pid. Referenced by button_press_intercept_cb(), destroy(), eb_chat_window_new(), entry_delete_cb(), entry_insert_cb(), gtkspell_check_all(), gtkspell_start(), gtkspell_stop(), and sigchld().
00063 { 00064 return (spell_pid > 0); 00065 } |
|
Definition at line 127 of file gtkspell.c. References BUFSIZE, error_print(), fd_read, fd_write, gtkspell_running(), gtkspell_stop(), readline(), set_up_signal(), signal_set_up, spell_pid, and writetext(). Referenced by eb_chat_window_new().
00127 { 00128 #ifndef __MINGW32__ 00129 int fd_error[2]; 00130 char buf[BUFSIZE]; 00131 00132 if (gtkspell_running()) { 00133 error_print("gtkspell_start called while already running.\n"); 00134 gtkspell_stop(); 00135 } 00136 00137 if (!signal_set_up) { 00138 set_up_signal(); 00139 signal_set_up = 1; 00140 } 00141 00142 pipe(fd_write); 00143 pipe(fd_read); 00144 pipe(fd_error); 00145 00146 spell_pid = fork(); 00147 if (spell_pid < 0) { 00148 error_print("fork: %s\n", strerror(errno)); 00149 return -1; 00150 } else if (spell_pid == 0) { 00151 dup2(fd_write[0], 0); 00152 dup2(fd_read[1], 1); 00153 dup2(fd_error[1], 2); 00154 close(fd_read[0]); 00155 close(fd_error[0]); 00156 close(fd_write[1]); 00157 00158 if (path == NULL) { 00159 if (execvp(args[0], args) < 0) 00160 error_print("execvp('%s'): %s\n", args[0], strerror(errno)); 00161 } else { 00162 if (execv(path, args) < 0) 00163 error_print("execv('%s'): %s\n", path, strerror(errno)); 00164 } 00165 /* if we get here, we failed. 00166 * send some text on the pipe to indicate status. 00167 */ 00168 write(fd_read[1], "!", 1); 00169 00170 _exit(0); 00171 } else { 00172 /* there are at least two ways to fail: 00173 * - the exec() can fail 00174 * - the exec() can succeed, but the program can dump the help screen 00175 * we must check for both. 00176 */ 00177 00178 #if HAVE_POLL_H 00179 struct pollfd fds[2]; 00180 00181 fds[0].fd = fd_error[0]; 00182 fds[0].events = POLLIN | POLLERR; 00183 fds[1].fd = fd_read[0]; 00184 fds[1].events = POLLIN | POLLERR; 00185 if (poll(fds, 2, 2000) <= 0) { 00186 /* FIXME: is this needed? */ 00187 error_print("Timed out waiting for spell command.\n"); 00188 gtkspell_stop(); 00189 return -1; 00190 } 00191 00192 00193 if (fds[0].revents) { /* stderr readable? */ 00194 error_print("Spell command printed on stderr -- probably failed.\n"); 00195 gtkspell_stop(); 00196 return -1; 00197 } 00198 00199 #endif 00200 00201 readline(buf); 00202 /* ispell should print something like this: 00203 * @(#) International Ispell Version 3.1.20 10/10/95 00204 * if it doesn't, it's an error. */ 00205 if (buf[0] != '@') { 00206 gtkspell_stop(); 00207 return -1; 00208 } 00209 } 00210 00211 /* put ispell into terse mode. 00212 * this makes it not respond on correctly spelled words. */ 00213 sprintf(buf, "!\n"); 00214 writetext(buf); 00215 #endif 00216 return 0; 00217 } |
|
Definition at line 118 of file gtkspell.c. References gtkspell_running(), and spell_pid. Referenced by destroy(), and gtkspell_start().
00118 { 00119 #ifndef __MINGW32__ 00120 if (gtkspell_running()) { 00121 kill(spell_pid, SIGQUIT); /* FIXME: is this the correct signal? */ 00122 spell_pid = -1; 00123 } 00124 #endif 00125 } |
|
Definition at line 572 of file gtkspell.c. Referenced by gtkspell_detach().
00572 { 00573 int origpos; 00574 char *text; 00575 float adj_value; 00576 00577 adj_value = gtktext->vadj->value; 00578 gtk_text_freeze(gtktext); 00579 origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext)); 00580 text = gtk_editable_get_chars(GTK_EDITABLE(gtktext), 0, -1); 00581 gtk_text_set_point(gtktext, 0); 00582 gtk_text_forward_delete(gtktext, gtk_text_get_length(gtktext)); 00583 gtk_text_insert(gtktext, NULL, NULL, NULL, text, strlen(text)); 00584 gtk_text_thaw(gtktext); 00585 00586 gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos); 00587 gtk_adjustment_set_value(gtktext->vadj, adj_value); 00588 } |
|
Definition at line 286 of file gtkspell.c. Referenced by entry_insert_cb(), get_word_from_pos(), and gtkspell_check_all().
00286 { 00287 return !isalpha(c) && c != '\''; 00288 } |
|
Definition at line 468 of file gtkspell.c. References MENUCOUNT, and replace_word(). Referenced by popup_menu().
00468 { 00469 GtkWidget *menu, *item; 00470 char *caption; 00471 menu = gtk_menu_new(); { 00472 caption = g_strdup_printf("Not in dictionary: %s", (char*)l->data); 00473 item = gtk_menu_item_new_with_label(caption); 00474 /* I'd like to make it so this item is never selectable, like 00475 * the menu titles in the GNOME panel... unfortunately, the GNOME 00476 * panel creates their own custom widget to do this! */ 00477 gtk_widget_show(item); 00478 gtk_menu_append(GTK_MENU(menu), item); 00479 00480 item = gtk_menu_item_new(); 00481 gtk_widget_show(item); 00482 gtk_menu_append(GTK_MENU(menu), item); 00483 00484 l = l->next; 00485 if (l == NULL) { 00486 item = gtk_menu_item_new_with_label("(no suggestions)"); 00487 gtk_widget_show(item); 00488 gtk_menu_append(GTK_MENU(menu), item); 00489 } else { 00490 GtkWidget *curmenu = menu; 00491 int count = 0; 00492 do { 00493 if (l->data == NULL && l->next != NULL) { 00494 count = 0; 00495 curmenu = gtk_menu_new(); 00496 item = gtk_menu_item_new_with_label("Other Possibilities..."); 00497 gtk_widget_show(item); 00498 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), curmenu); 00499 gtk_menu_append(GTK_MENU(curmenu), item); 00500 l = l->next; 00501 } else if (count > MENUCOUNT) { 00502 count -= MENUCOUNT; 00503 item = gtk_menu_item_new_with_label("More..."); 00504 gtk_widget_show(item); 00505 gtk_menu_append(GTK_MENU(curmenu), item); 00506 curmenu = gtk_menu_new(); 00507 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), curmenu); 00508 } 00509 item = gtk_menu_item_new_with_label((char*)l->data); 00510 gtk_signal_connect(GTK_OBJECT(item), "activate", 00511 GTK_SIGNAL_FUNC(replace_word), gtktext); 00512 gtk_widget_show(item); 00513 gtk_menu_append(GTK_MENU(curmenu), item); 00514 count++; 00515 } while ((l = l->next) != NULL); 00516 } 00517 } 00518 return GTK_MENU(menu); 00519 } |
|
Definition at line 219 of file gtkspell.c. References BUFSIZE, BUGEMAIL, error_print(), readresponse(), and writetext(). Referenced by popup_menu().
00219 { 00220 char buf[BUFSIZE]; 00221 char *newword; 00222 GList *l = NULL; 00223 int count; 00224 00225 sprintf(buf, "^%s\n", word); /* guard against ispell control chars */ 00226 writetext(buf); 00227 readresponse(buf); 00228 00229 switch (buf[0]) { /* first char is ispell command. */ 00230 case 0: /* no response: word is ok. */ 00231 return NULL; 00232 case '&': /* misspelled, with suggestions */ 00233 /* & <orig> <count> <ofs>: <miss>, <miss>, <guess>, ... */ 00234 strtok(buf, " "); /* & */ 00235 newword = strtok(NULL, " "); /* orig */ 00236 l = g_list_append(l, g_strdup(newword)); 00237 newword = strtok(NULL, " "); /* count */ 00238 count = atoi(newword); 00239 strtok(NULL, " "); /* ofs: */ 00240 00241 while ((newword = strtok(NULL, ",")) != NULL) { 00242 int len = strlen(newword); 00243 if (newword[len-1] == ' ' || newword[len-1] == '\n') 00244 newword[len-1] = 0; 00245 if (count == 0) { 00246 g_list_append(l, NULL); /* signal the "suggestions" */ 00247 } 00248 /* add it to the list, skipping the initial space. */ 00249 l = g_list_append(l, 00250 g_strdup(newword[0] == ' ' ? newword+1 : newword)); 00251 00252 count--; 00253 } 00254 return l; 00255 00256 case '#': /* misspelled, no suggestions */ 00257 /* # <orig> <ofs> */ 00258 strtok(buf, " "); /* & */ 00259 newword = strtok(NULL, " "); /* orig */ 00260 l = g_list_append(l, g_strdup(newword)); 00261 return l; 00262 default: 00263 error_print("Unsupported spell command '%c'.\n" 00264 "This is a bug; mail " BUGEMAIL " about it.\n", buf[0]); 00265 } 00266 return NULL; 00267 } |
|
Definition at line 269 of file gtkspell.c. References BUFSIZE, BUGEMAIL, error_print(), readresponse(), and writetext(). Referenced by check_at().
00269 { 00270 char buf[BUFSIZE]; 00271 sprintf(buf, "^%s\n", word); /* guard against ispell control chars */ 00272 writetext(buf); 00273 readresponse(buf); 00274 00275 if (buf[0] == 0) { 00276 return 0; 00277 } else if (buf[0] == '&' || buf[0] == '#') { 00278 return 1; 00279 } 00280 00281 error_print("Unsupported spell command '%c'.\n" 00282 "This is a bug; mail " BUGEMAIL " about it.\n", buf[0]); 00283 return -1; 00284 } |
|
Definition at line 521 of file gtkspell.c. References BUFSIZE, get_curword(), make_menu(), and misspelled_suggest(). Referenced by button_press_intercept_cb().
00521 { 00522 char buf[BUFSIZE]; 00523 GList *list, *l; 00524 00525 get_curword(gtktext, buf, NULL, NULL); 00526 00527 list = misspelled_suggest(buf); 00528 if (list != NULL) { 00529 gtk_menu_popup(make_menu(list, gtktext), NULL, NULL, NULL, NULL, 00530 eb->button, eb->time); 00531 for (l = list; l != NULL; l = l->next) 00532 g_free(l->data); 00533 g_list_free(list); 00534 } 00535 } |
|
Definition at line 95 of file gtkspell.c. References BUFSIZE, and readpipe(). Referenced by gtkspell_start().
|
|
Definition at line 79 of file gtkspell.c. References error_print(), and fd_read. Referenced by readline(), and readresponse().
00079 { 00080 int len; 00081 len = read(fd_read[0], buf, bufsize-1); 00082 if (len < 0) { 00083 error_print("read: %s\n", strerror(errno)); 00084 return -1; 00085 } else if (len == 0) { 00086 error_print("pipe closed.\n"); 00087 return -1; 00088 } else if (len == bufsize-1) { 00089 error_print("buffer overflowed?\n"); 00090 } 00091 00092 buf[len] = 0; 00093 return len; 00094 } |
|
Definition at line 99 of file gtkspell.c. References BUFSIZE, and readpipe(). Referenced by misspelled_suggest(), and misspelled_test().
00099 { 00100 int len; 00101 len = readpipe(buf, BUFSIZE); 00102 00103 /* all ispell responses of any reasonable length should end in \n\n. 00104 * depending on the speed of the spell checker, this may require more 00105 * reading. */ 00106 if (len >= 2 && (buf[len-1] != '\n' || buf[len-2] != '\n')) { 00107 len += readpipe(buf+len, BUFSIZE-len); 00108 } 00109 00110 /* now we can remove all of the the trailing newlines. */ 00111 while (len > 0 && buf[len-1] == '\n') 00112 buf[--len] = 0; 00113 00114 return len; 00115 } |
|
Definition at line 444 of file gtkspell.c. References BUFSIZE, and get_curword(). Referenced by make_menu().
00444 { 00445 int start, end, newword_len; 00446 char *newword; 00447 char buf[BUFSIZE]; 00448 00449 /* we don't save their position, 00450 * because the cursor is moved by the click. */ 00451 00452 gtk_text_freeze(GTK_TEXT(d)); 00453 00454 gtk_label_get(GTK_LABEL(GTK_BIN(w)->child), &newword); 00455 get_curword(GTK_TEXT(d), buf, &start, &end); 00456 00457 newword_len = strlen(newword); 00458 00459 gtk_text_set_point(GTK_TEXT(d), end); 00460 gtk_text_backward_delete(GTK_TEXT(d), end-start); 00461 gtk_text_insert(GTK_TEXT(d), NULL, NULL, NULL, newword, newword_len); 00462 00463 gtk_text_thaw(GTK_TEXT(d)); 00464 00465 gtk_editable_set_position(GTK_EDITABLE(d), start+newword_len); 00466 } |
|
Definition at line 623 of file gtkspell.c. References sigchld(). Referenced by gtkspell_start().
00623 { 00624 #ifndef __MINGW32__ 00625 struct sigaction sigact; 00626 memset(&sigact, 0, sizeof(struct sigaction)); 00627 00628 sigact.sa_handler = sigchld; 00629 sigaction(SIGCHLD, &sigact, NULL); 00630 #endif 00631 } |
|
Definition at line 610 of file gtkspell.c. References gtkspell_running(), and spell_pid. Referenced by set_up_signal().
00610 { 00611 #ifndef __MINGW32__ 00612 if (gtkspell_running() && 00613 (waitpid(spell_pid, NULL, WNOHANG) == spell_pid)) { 00614 spell_pid = 0; 00615 } else { 00616 /* a default SIGCHLD handler. 00617 * what else to do here? */ 00618 waitpid(-1, NULL, WNOHANG); 00619 } 00620 #endif 00621 } |
|
Definition at line 76 of file gtkspell.c. References fd_write. Referenced by gtkspell_start(), misspelled_suggest(), and misspelled_test().
00076 { 00077 write(fd_write[1], text, strlen(text)); 00078 } |
|
Definition at line 53 of file gtkspell.c. Referenced by gtkspell_start(), and readpipe(). |
|
Definition at line 53 of file gtkspell.c. Referenced by gtkspell_start(), and writetext(). |
|
Definition at line 57 of file gtkspell.c. Referenced by check_at(). |
|
Definition at line 54 of file gtkspell.c. Referenced by gtkspell_start(). |
|
Definition at line 52 of file gtkspell.c. Referenced by gtkspell_running(), gtkspell_start(), gtkspell_stop(), and sigchld(). |