annotate src/gtkspell.c @ 2906:538c58b43eff

[gaim-migrate @ 2919] save save me from this wandered around the town all the thousand things i might miss and you think we'll suffer much think we'll close our eyes just to see the light pass us by with tomorrow coming hope that i don't let you down again said i'm so glad to be here does it mean a thing if only i could breathe what you breathe if only i could see what you see sit we'll take our time watching the flowers grow all the friends we've known say goodbye and you did you suffer much did you close your eyes just to see the night rush on by gathered all around you hope that we don't let you down again i said i'm so glad to be here does it mean a thing if only i could breathe what you breathe if only i could see what you see i said i'm so glad to be here does it mean a thing if only i could breathe what you breathe if only i could see what you see if only i could just believe a thing --Moist, "Breathe" (as transcribed by http://www.veddma.com/veddma/moist.htm) Patches from: Ari Pollak Ben Miller Mark Doliner Sean Egan Vincas Ciziunas Thanks everyone. Somewhere in the middle of all of this it started to get really tedious and annoying. I think it's getting close to the point where I quit. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Fri, 21 Dec 2001 10:23:04 +0000
parents 4c6ad3d9db3f
children da324fe688b3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1 /* gtkspell - a spell-checking addon for GtkText
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2 * Copyright (c) 2000 Evan Martin.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
3 * vim: ts=4 sw=4
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
4 * This library is free software; you can redistribute it and/or
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
5 * modify it under the terms of the GNU Lesser General Public
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
6 * License as published by the Free Software Foundation; either
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
7 * version 2 of the License, or (at your option) any later version.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
8 *
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
9 * This library is distributed in the hope that it will be useful,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
12 * Lesser General Public License for more details.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
13 *
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
14 * You should have received a copy of the GNU Lesser General Public
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
15 * License along with this library; if not, write to the Free Software
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
17 */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
18
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
19 #include <gtk/gtk.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
20
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
21 #include <sys/types.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
22 #include <sys/wait.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
23 #include <sys/time.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
24 #include <unistd.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
25 #include <stdio.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
26 #include <signal.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
27 #include <ctype.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
28 #include <string.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
29 #include <stdlib.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
30 #include <errno.h>
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
31
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
32 /* TODO:
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
33 * handle dictionary changes
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
34 * asynchronous lookups
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
35 */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
36
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
37 /* size of the text buffer used in various word-processing routines. */
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
38 /* #define BUFSIZE 1024 */
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
39 /* number of suggestions to display on each menu. */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
40 #define MENUCOUNT 10
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
41 #define BUGEMAIL "gtkspell-devel@lists.sourceforge.net"
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
42
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
43 /* because we keep only one copy of the spell program running,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
44 * all ispell-related variables can be static.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
45 */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
46 static pid_t spell_pid = -1;
1496
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
47 static int fd_write[2] = {0}, fd_read[2] = {0};
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
48 static int signal_set_up = 0;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
49
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
50 /* FIXME? */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
51 static GdkColor highlight = { 0, 255*256, 0, 0 };
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
52
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
53 static void entry_insert_cb(GtkText *gtktext,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
54 gchar *newtext, guint len, guint *ppos, gpointer d);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
55 static void set_up_signal();
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
56
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
57 int gtkspell_running() {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
58 return (spell_pid > 0);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
59 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
60
1794
60b3fd819cce [gaim-migrate @ 1804]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1496
diff changeset
61 /*
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
62 static void error_print(const char *fmt, ...) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
63 va_list ap;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
64 va_start(ap, fmt);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
65 fprintf(stderr, "gtkspell: ");
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
66 vfprintf(stderr, fmt, ap);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
67 va_end(ap);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
68 }
1794
60b3fd819cce [gaim-migrate @ 1804]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1496
diff changeset
69 */
1815
f15d449b3167 [gaim-migrate @ 1825]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1794
diff changeset
70 extern void debug_printf(char *, ...);
1794
60b3fd819cce [gaim-migrate @ 1804]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1496
diff changeset
71 #define error_print debug_printf
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
72
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
73 /* functions to interface with pipe */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
74 static void writetext(char *text) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
75 write(fd_write[1], text, strlen(text));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
76 }
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
77
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
78 static char *readline() {
2670
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
79 static gchar *buf = NULL;
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
80 char *end;
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
81 char *ret;
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
82 char *tmp;
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
83
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
84 /* read until we get a newline */
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
85 while (!buf || (end = strchr(buf, '\n')) == NULL) {
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
86 char space[1024];
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
87 int ret = read(fd_read[0], space, 1023);
2727
4c6ad3d9db3f [gaim-migrate @ 2740]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2725
diff changeset
88 if (ret <= 0) {
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
89 error_print("read: %s\n", strerror(errno));
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
90 return NULL;
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
91 }
2670
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
92 space[ret] = 0;
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
93 if (buf) {
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
94 tmp = buf;
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
95 buf = g_strconcat(tmp, space, NULL);
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
96 g_free(tmp);
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
97 } else
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
98 buf = g_strdup(space);
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
99 }
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
100
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
101 /* we got a newline, and end points to it.
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
102 * copy out the data, reset buf, return */
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
103
2670
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
104 if (end[1] == 0) {
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
105 /* only one line is in the buffer */
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
106 ret = buf;
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
107 buf = NULL;
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
108 return ret;
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
109 }
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
110
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
111 ret = g_strndup(buf, end - buf + 1);
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
112 tmp = buf;
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
113 buf = g_strdup(end + 1);
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
114 g_free(tmp);
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
115
f6f2871d77c2 [gaim-migrate @ 2683]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2517
diff changeset
116 return ret;
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
117 }
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
118
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
119 static char *readresponse() {
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
120 char *r1, *r2, *result;
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
121
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
122 r1 = readline();
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
123 if (!r1)
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
124 return NULL;
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
125 if (*r1 == '\n') {
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
126 g_strchomp(r1);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
127 return r1;
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
128 }
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
129 r2 = readline();
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
130 if (!r2) {
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
131 g_free(r1);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
132 return NULL;
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
133 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
134
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
135 while (r2 && *r2 != '\n') {
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
136 char *tmp = r1;
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
137 r1 = g_strconcat(tmp, r2, NULL);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
138 g_free(tmp);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
139 g_free(r2);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
140 r2 = readline();
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
141 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
142
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
143 if (!r2) {
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
144 g_free(r1);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
145 return NULL;
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
146 }
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
147
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
148 result = g_strconcat(r1, r2, NULL);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
149 g_free(r1);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
150 g_free(r2);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
151 g_strchomp(result);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
152 return result;
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
153 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
154
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
155
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
156 void gtkspell_stop() {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
157 if (gtkspell_running()) {
1415
3dfd2a83fb5e [gaim-migrate @ 1425]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1127
diff changeset
158 kill(spell_pid, SIGHUP);
1496
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
159 spell_pid = 0;
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
160 close(fd_read[0]);
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
161 close(fd_write[1]);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
162 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
163 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
164
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
165 int gtkspell_start(char *path, char * args[]) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
166 int fd_error[2];
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
167
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
168 if (gtkspell_running()) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
169 error_print("gtkspell_start called while already running.\n");
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
170 gtkspell_stop();
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
171 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
172
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
173 if (!signal_set_up) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
174 set_up_signal();
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
175 signal_set_up = 1;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
176 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
177
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
178 pipe(fd_write);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
179 pipe(fd_read);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
180 pipe(fd_error);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
181
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
182 spell_pid = fork();
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
183 if (spell_pid < 0) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
184 error_print("fork: %s\n", strerror(errno));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
185 return -1;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
186 } else if (spell_pid == 0) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
187 dup2(fd_write[0], 0);
1496
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
188 close(fd_write[0]);
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
189 close(fd_write[1]);
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
190
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
191 dup2(fd_read[1], 1);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
192 close(fd_read[0]);
1496
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
193 close(fd_read[1]);
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
194
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
195 dup2(fd_error[1], 2);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
196 close(fd_error[0]);
1496
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
197 close(fd_error[1]);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
198
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
199 if (path == NULL) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
200 if (execvp(args[0], args) < 0)
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
201 error_print("execvp('%s'): %s\n", args[0], strerror(errno));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
202 } else {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
203 if (execv(path, args) < 0)
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
204 error_print("execv('%s'): %s\n", path, strerror(errno));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
205 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
206 /* if we get here, we failed.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
207 * send some text on the pipe to indicate status.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
208 */
1496
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
209 write(0, "!", 1); /* stdout _is_ the pipe. */
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
210
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
211 _exit(0);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
212 } else {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
213 /* there are at least two ways to fail:
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
214 * - the exec() can fail
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
215 * - the exec() can succeed, but the program can dump the help screen
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
216 * we must check for both.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
217 */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
218 fd_set rfds;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
219 struct timeval tv;
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
220 char *buf;
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
221
1496
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
222 close(fd_write[0]);
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
223 close(fd_read[1]);
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
224
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
225 FD_ZERO(&rfds);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
226 FD_SET(fd_error[0], &rfds);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
227 FD_SET(fd_read[0], &rfds);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
228 tv.tv_sec = 2;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
229 tv.tv_usec = 0;
1496
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
230
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
231 if (select(MAX(fd_error[0], fd_read[0])+1,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
232 &rfds, NULL, NULL, &tv) < 0) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
233 /* FIXME: is this needed? */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
234 error_print("Timed out waiting for spell command.\n");
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
235 gtkspell_stop();
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
236 return -1;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
237 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
238
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
239 if (FD_ISSET(fd_error[0], &rfds)) { /* stderr readable? */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
240 error_print("Spell command printed on stderr -- probably failed.\n");
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
241 gtkspell_stop();
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
242 return -1;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
243 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
244
1496
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
245 /* we're done with stderr, now. */
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
246 close(fd_error[0]);
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
247 close(fd_error[1]);
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
248
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
249 /* otherwise, fd_read[0] is set. */
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
250 buf = readline();
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
251
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
252 /* ispell should print something like this:
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
253 * @(#) International Ispell Version 3.1.20 10/10/95
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
254 * if it doesn't, it's an error. */
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
255 if (!buf || buf[0] != '@') {
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
256 if (buf)
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
257 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
258 gtkspell_stop();
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
259 return -1;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
260 }
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
261 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
262 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
263
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
264 /* put ispell into terse mode.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
265 * this makes it not respond on correctly spelled words. */
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
266 writetext("!\n");
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
267 return 0;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
268 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
269
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
270 static GList* misspelled_suggest(char *word) {
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
271 char *buf;
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
272 char *newword;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
273 GList *l = NULL;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
274 int count;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
275
2461
0edec72bc72f [gaim-migrate @ 2474]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2457
diff changeset
276 if (!word)
0edec72bc72f [gaim-migrate @ 2474]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2457
diff changeset
277 return NULL;
0edec72bc72f [gaim-migrate @ 2474]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2457
diff changeset
278
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
279 buf = g_strdup_printf("^%s\n", word); /* guard against ispell control chars */
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
280 writetext(buf);
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
281 g_free(buf);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
282 buf = readresponse();
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
283
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
284 if (!buf)
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
285 return NULL;
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
286
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
287 switch (buf[0]) { /* first char is ispell command. */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
288 case 0: /* no response: word is ok. */
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
289 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
290 return NULL;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
291 case '&': /* misspelled, with suggestions */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
292 /* & <orig> <count> <ofs>: <miss>, <miss>, <guess>, ... */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
293 strtok(buf, " "); /* & */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
294 newword = strtok(NULL, " "); /* orig */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
295 l = g_list_append(l, g_strdup(newword));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
296 newword = strtok(NULL, " "); /* count */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
297 count = atoi(newword);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
298 strtok(NULL, " "); /* ofs: */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
299
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
300 while ((newword = strtok(NULL, ",")) != NULL) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
301 int len = strlen(newword);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
302 if (newword[len-1] == ' ' || newword[len-1] == '\n')
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
303 newword[len-1] = 0;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
304 if (count == 0) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
305 g_list_append(l, NULL); /* signal the "suggestions" */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
306 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
307 /* add it to the list, skipping the initial space. */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
308 l = g_list_append(l,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
309 g_strdup(newword[0] == ' ' ? newword+1 : newword));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
310
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
311 count--;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
312 }
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
313 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
314 return l;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
315
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
316 case '#': /* misspelled, no suggestions */
1467
7f7857c5036e [gaim-migrate @ 1477]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1415
diff changeset
317 case '?': /* ispell is guessing. */
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
318 /* # <orig> <ofs> */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
319 strtok(buf, " "); /* & */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
320 newword = strtok(NULL, " "); /* orig */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
321 l = g_list_append(l, g_strdup(newword));
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
322 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
323 return l;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
324 default:
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
325 error_print("Unsupported spell command '%c'.\n"
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
326 "This is a bug; mail " BUGEMAIL " about it.\n", buf[0]);
1467
7f7857c5036e [gaim-migrate @ 1477]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1415
diff changeset
327 error_print("Input [%s]\nOutput [%s]\n", word, buf);
7f7857c5036e [gaim-migrate @ 1477]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1415
diff changeset
328
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
329 }
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
330 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
331 return NULL;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
332 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
333
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
334 static int misspelled_test(char *word) {
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
335 char *buf;
2517
9cee43e4903d [gaim-migrate @ 2530]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2461
diff changeset
336
9cee43e4903d [gaim-migrate @ 2530]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2461
diff changeset
337 if (word == NULL)
9cee43e4903d [gaim-migrate @ 2530]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2461
diff changeset
338 return 0;
9cee43e4903d [gaim-migrate @ 2530]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2461
diff changeset
339
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
340 buf = g_strdup_printf("^%s\n", word); /* guard against ispell control chars */
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
341 writetext(buf);
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
342 g_free(buf);
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
343 buf = readresponse();
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
344
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
345 if (!buf)
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
346 return 0;
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
347
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
348 if (buf[0] == 0) {
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
349 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
350 return 0;
1467
7f7857c5036e [gaim-migrate @ 1477]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1415
diff changeset
351 } else if (buf[0] == '&' || buf[0] == '#' || buf[0] == '?') {
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
352 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
353 return 1;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
354 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
355
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
356 error_print("Unsupported spell command '%c'.\n"
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
357 "This is a bug; mail " BUGEMAIL " about it.\n", buf[0]);
1467
7f7857c5036e [gaim-migrate @ 1477]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1415
diff changeset
358 error_print("Input [%s]\nOutput [%s]\n", word, buf);
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
359 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
360 return -1;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
361 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
362
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
363 static gboolean iswordsep(char c) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
364 return !isalpha(c) && c != '\'';
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
365 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
366
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
367 static gboolean get_word_from_pos(GtkText* gtktext, int pos, char** buf,
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
368 int *pstart, int *pend) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
369 gint start, end;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
370
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
371 if (iswordsep(GTK_TEXT_INDEX(gtktext, pos))) return FALSE;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
372
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
373 for (start = pos; start >= 0; --start) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
374 if (iswordsep(GTK_TEXT_INDEX(gtktext, start))) break;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
375 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
376 start++;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
377
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
378 for (end = pos; end <= gtk_text_get_length(gtktext); end++) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
379 if (iswordsep(GTK_TEXT_INDEX(gtktext, end))) break;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
380 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
381
2457
e6b9246b33fd [gaim-migrate @ 2470]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2456
diff changeset
382 if (buf && (end - start + 1 > 0)) {
e6b9246b33fd [gaim-migrate @ 2470]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2456
diff changeset
383 *buf = g_malloc(end - start + 1);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
384 for (pos = start; pos < end; pos++)
2457
e6b9246b33fd [gaim-migrate @ 2470]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2456
diff changeset
385 (*buf)[pos-start] = GTK_TEXT_INDEX(gtktext, pos);
e6b9246b33fd [gaim-migrate @ 2470]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2456
diff changeset
386 (*buf)[pos-start] = 0;
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
387 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
388
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
389 if (pstart) *pstart = start;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
390 if (pend) *pend = end;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
391
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
392 return TRUE;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
393 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
394
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
395 static gboolean get_curword(GtkText* gtktext, char** buf,
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
396 int *pstart, int *pend) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
397 int pos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
398 return get_word_from_pos(gtktext, pos, buf, pstart, pend);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
399 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
400
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
401 static void change_color(GtkText *gtktext,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
402 int start, int end, GdkColor *color) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
403 char *newtext = gtk_editable_get_chars(GTK_EDITABLE(gtktext), start, end);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
404 gtk_text_freeze(gtktext);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
405 gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
406 GTK_SIGNAL_FUNC(entry_insert_cb), NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
407
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
408 gtk_text_set_point(gtktext, start);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
409 gtk_text_forward_delete(gtktext, end-start);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
410
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
411 if (newtext && end-start > 0)
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
412 gtk_text_insert(gtktext, NULL, color, NULL, newtext, end-start);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
413
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
414 gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
415 GTK_SIGNAL_FUNC(entry_insert_cb), NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
416 gtk_text_thaw(gtktext);
1415
3dfd2a83fb5e [gaim-migrate @ 1425]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1127
diff changeset
417 g_free(newtext);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
418 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
419
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
420 static gboolean check_at(GtkText *gtktext, int from_pos) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
421 int start, end;
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
422 char *buf = NULL;
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
423
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
424 if (!get_word_from_pos(gtktext, from_pos, &buf, &start, &end)) {
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
425 if (buf)
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
426 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
427 return FALSE;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
428 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
429
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
430 if (misspelled_test(buf)) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
431 if (highlight.pixel == 0) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
432 /* add an entry for the highlight in the color map. */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
433 GdkColormap *gc = gtk_widget_get_colormap(GTK_WIDGET(gtktext));
2725
f3c094e78609 [gaim-migrate @ 2738]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2670
diff changeset
434 gdk_colormap_alloc_color(gc, &highlight, FALSE, TRUE);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
435 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
436 change_color(gtktext, start, end, &highlight);
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
437 if (buf)
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
438 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
439 return TRUE;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
440 } else {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
441 change_color(gtktext, start, end,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
442 &(GTK_WIDGET(gtktext)->style->fg[0]));
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
443 if (buf)
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
444 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
445 return FALSE;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
446 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
447 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
448
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
449 void gtkspell_check_all(GtkText *gtktext) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
450 guint origpos;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
451 guint pos = 0;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
452 guint len;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
453 float adj_value;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
454
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
455 if (!gtkspell_running()) return;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
456
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
457 len = gtk_text_get_length(gtktext);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
458
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
459 adj_value = gtktext->vadj->value;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
460 gtk_text_freeze(gtktext);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
461 origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
462 while (pos < len) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
463 while (pos < len && iswordsep(GTK_TEXT_INDEX(gtktext, pos)))
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
464 pos++;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
465 while (pos < len && !iswordsep(GTK_TEXT_INDEX(gtktext, pos)))
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
466 pos++;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
467 if (pos > 0)
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
468 check_at(gtktext, pos-1);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
469 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
470 gtk_text_thaw(gtktext);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
471 gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
472 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
473
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
474 static void entry_insert_cb(GtkText *gtktext,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
475 gchar *newtext, guint len, guint *ppos, gpointer d) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
476 int origpos;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
477
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
478 if (!gtkspell_running()) return;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
479
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
480 gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
481 GTK_SIGNAL_FUNC(entry_insert_cb),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
482 NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
483 gtk_text_insert(GTK_TEXT(gtktext), NULL,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
484 &(GTK_WIDGET(gtktext)->style->fg[0]), NULL, newtext, len);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
485 gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
486 GTK_SIGNAL_FUNC(entry_insert_cb),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
487 NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
488 gtk_signal_emit_stop_by_name(GTK_OBJECT(gtktext), "insert-text");
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
489 *ppos += len;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
490
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
491 origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
492
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
493 if (iswordsep(newtext[0])) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
494 /* did we just end a word? */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
495 if (*ppos >= 2) check_at(gtktext, *ppos-2);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
496
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
497 /* did we just split a word? */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
498 if (*ppos < gtk_text_get_length(gtktext))
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
499 check_at(gtktext, *ppos+1);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
500 } else {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
501 /* check as they type, *except* if they're typing at the end (the most
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
502 * common case.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
503 */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
504 if (*ppos < gtk_text_get_length(gtktext) &&
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
505 !iswordsep(GTK_TEXT_INDEX(gtktext, *ppos)))
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
506 check_at(gtktext, *ppos-1);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
507 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
508
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
509 gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
1496
d33bf6548543 [gaim-migrate @ 1506]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1467
diff changeset
510 gtk_editable_select_region(GTK_EDITABLE(gtktext), origpos, origpos);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
511 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
512
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
513 static void entry_delete_cb(GtkText *gtktext,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
514 gint start, gint end, gpointer d) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
515 int origpos;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
516
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
517 if (!gtkspell_running()) return;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
518
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
519 origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
520 check_at(gtktext, start-1);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
521 gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
522 gtk_editable_select_region(GTK_EDITABLE(gtktext), origpos, origpos);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
523 /* this is to *UNDO* the selection, in case they were holding shift
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
524 * while hitting backspace. */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
525 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
526
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
527 static void replace_word(GtkWidget *w, gpointer d) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
528 int start, end;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
529 char *newword;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
530
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
531 /* we don't save their position,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
532 * because the cursor is moved by the click. */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
533
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
534 gtk_text_freeze(GTK_TEXT(d));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
535
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
536 gtk_label_get(GTK_LABEL(GTK_BIN(w)->child), &newword);
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
537 get_curword(GTK_TEXT(d), NULL, &start, &end);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
538
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
539 gtk_text_set_point(GTK_TEXT(d), end);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
540 gtk_text_backward_delete(GTK_TEXT(d), end-start);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
541 gtk_text_insert(GTK_TEXT(d), NULL, NULL, NULL, newword, strlen(newword));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
542
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
543 gtk_text_thaw(GTK_TEXT(d));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
544 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
545
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
546 static GtkMenu *make_menu(GList *l, GtkText *gtktext) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
547 GtkWidget *menu, *item;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
548 char *caption;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
549 menu = gtk_menu_new(); {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
550 caption = g_strdup_printf("Not in dictionary: %s", (char*)l->data);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
551 item = gtk_menu_item_new_with_label(caption);
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
552 g_free(caption);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
553 /* I'd like to make it so this item is never selectable, like
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
554 * the menu titles in the GNOME panel... unfortunately, the GNOME
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
555 * panel creates their own custom widget to do this! */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
556 gtk_widget_show(item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
557 gtk_menu_append(GTK_MENU(menu), item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
558
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
559 item = gtk_menu_item_new();
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
560 gtk_widget_show(item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
561 gtk_menu_append(GTK_MENU(menu), item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
562
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
563 l = l->next;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
564 if (l == NULL) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
565 item = gtk_menu_item_new_with_label("(no suggestions)");
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
566 gtk_widget_show(item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
567 gtk_menu_append(GTK_MENU(menu), item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
568 } else {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
569 GtkWidget *curmenu = menu;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
570 int count = 0;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
571 do {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
572 if (l->data == NULL && l->next != NULL) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
573 count = 0;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
574 curmenu = gtk_menu_new();
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
575 item = gtk_menu_item_new_with_label("Other Possibilities...");
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
576 gtk_widget_show(item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
577 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), curmenu);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
578 gtk_menu_append(GTK_MENU(curmenu), item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
579 l = l->next;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
580 } else if (count > MENUCOUNT) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
581 count -= MENUCOUNT;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
582 item = gtk_menu_item_new_with_label("More...");
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
583 gtk_widget_show(item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
584 gtk_menu_append(GTK_MENU(curmenu), item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
585 curmenu = gtk_menu_new();
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
586 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), curmenu);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
587 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
588 item = gtk_menu_item_new_with_label((char*)l->data);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
589 gtk_signal_connect(GTK_OBJECT(item), "activate",
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
590 GTK_SIGNAL_FUNC(replace_word), gtktext);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
591 gtk_widget_show(item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
592 gtk_menu_append(GTK_MENU(curmenu), item);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
593 count++;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
594 } while ((l = l->next) != NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
595 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
596 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
597 return GTK_MENU(menu);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
598 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
599
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
600 static void popup_menu(GtkText *gtktext, GdkEventButton *eb) {
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
601 char *buf = NULL;
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
602 GList *list, *l;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
603
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
604 get_curword(gtktext, &buf, NULL, NULL);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
605
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
606 list = misspelled_suggest(buf);
2454
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
607 if (buf)
64e20158271e [gaim-migrate @ 2467]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1815
diff changeset
608 g_free(buf);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
609 if (list != NULL) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
610 gtk_menu_popup(make_menu(list, gtktext), NULL, NULL, NULL, NULL,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
611 eb->button, eb->time);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
612 for (l = list; l != NULL; l = l->next)
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
613 g_free(l->data);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
614 g_list_free(list);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
615 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
616 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
617
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
618 /* ok, this is pretty wacky:
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
619 * we need to let the right-mouse-click go through, so it moves the cursor,
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
620 * but we *can't* let it go through, because GtkText interprets rightclicks as
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
621 * weird selection modifiers.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
622 *
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
623 * so what do we do? forge rightclicks as leftclicks, then popup the menu.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
624 * HACK HACK HACK.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
625 */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
626 static gint button_press_intercept_cb(GtkText *gtktext, GdkEvent *e, gpointer d) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
627 GdkEventButton *eb;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
628 gboolean retval;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
629
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
630 if (!gtkspell_running()) return FALSE;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
631
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
632 if (e->type != GDK_BUTTON_PRESS) return FALSE;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
633 eb = (GdkEventButton*) e;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
634
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
635 if (eb->button != 3) return FALSE;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
636
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
637 /* forge the leftclick */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
638 eb->button = 1;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
639
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
640 gtk_signal_handler_block_by_func(GTK_OBJECT(gtktext),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
641 GTK_SIGNAL_FUNC(button_press_intercept_cb), d);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
642 gtk_signal_emit_by_name(GTK_OBJECT(gtktext), "button-press-event",
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
643 e, &retval);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
644 gtk_signal_handler_unblock_by_func(GTK_OBJECT(gtktext),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
645 GTK_SIGNAL_FUNC(button_press_intercept_cb), d);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
646 gtk_signal_emit_stop_by_name(GTK_OBJECT(gtktext), "button-press-event");
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
647
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
648 /* now do the menu wackiness */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
649 popup_menu(gtktext, eb);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
650 return TRUE;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
651 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
652
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
653 void gtkspell_uncheck_all(GtkText *gtktext) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
654 int origpos;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
655 char *text;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
656 float adj_value;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
657
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
658 adj_value = gtktext->vadj->value;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
659 gtk_text_freeze(gtktext);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
660 origpos = gtk_editable_get_position(GTK_EDITABLE(gtktext));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
661 text = gtk_editable_get_chars(GTK_EDITABLE(gtktext), 0, -1);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
662 gtk_text_set_point(gtktext, 0);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
663 gtk_text_forward_delete(gtktext, gtk_text_get_length(gtktext));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
664 gtk_text_insert(gtktext, NULL, NULL, NULL, text, strlen(text));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
665 gtk_text_thaw(gtktext);
1794
60b3fd819cce [gaim-migrate @ 1804]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1496
diff changeset
666 g_free(text);
1117
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
667
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
668 gtk_editable_set_position(GTK_EDITABLE(gtktext), origpos);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
669 gtk_adjustment_set_value(gtktext->vadj, adj_value);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
670 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
671
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
672 void gtkspell_attach(GtkText *gtktext) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
673 gtk_signal_connect(GTK_OBJECT(gtktext), "insert-text",
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
674 GTK_SIGNAL_FUNC(entry_insert_cb), NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
675 gtk_signal_connect_after(GTK_OBJECT(gtktext), "delete-text",
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
676 GTK_SIGNAL_FUNC(entry_delete_cb), NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
677 gtk_signal_connect(GTK_OBJECT(gtktext), "button-press-event",
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
678 GTK_SIGNAL_FUNC(button_press_intercept_cb), NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
679 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
680
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
681 void gtkspell_detach(GtkText *gtktext) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
682 gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
683 GTK_SIGNAL_FUNC(entry_insert_cb), NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
684 gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
685 GTK_SIGNAL_FUNC(entry_delete_cb), NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
686 gtk_signal_disconnect_by_func(GTK_OBJECT(gtktext),
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
687 GTK_SIGNAL_FUNC(button_press_intercept_cb), NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
688
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
689 gtkspell_uncheck_all(gtktext);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
690 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
691
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
692 static void sigchld(int param) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
693 if (gtkspell_running() &&
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
694 (waitpid(spell_pid, NULL, WNOHANG) == spell_pid)) {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
695 spell_pid = 0;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
696 } else {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
697 /* a default SIGCHLD handler.
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
698 * what else to do here? */
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
699 waitpid(-1, NULL, WNOHANG);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
700 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
701 }
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
702
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
703 static void set_up_signal() {
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
704 struct sigaction sigact;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
705 memset(&sigact, 0, sizeof(struct sigaction));
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
706
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
707 sigact.sa_handler = sigchld;
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
708 sigaction(SIGCHLD, &sigact, NULL);
f3e0f41beddb [gaim-migrate @ 1127]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
709 }