Mercurial > pidgin.yaz
annotate plugins/notify.c @ 4344:d6f1086d52a6
[gaim-migrate @ 4609]
A few small changes...
The "orphans" groups should stop reappearing every time you sign
online. Twas a case of too much error checking.
Buddies, permits, and denies with empty names will all be deleted
automatically by the cleaning function. This should never really
happen, but somehow one of my accounts had some empty-named permit
buddies, so I threw it in here.
I also took out some BR tags before some HR tags. I really really
really think it looks better this way. Feel free to disagree.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 19 Jan 2003 07:35:18 +0000 |
parents | fac89c0d55c2 |
children | 5fb47ec9bfe4 |
rev | line source |
---|---|
3392 | 1 /* Rewritten by Etan Reisner <deryni@eden.rutgers.edu> |
3374 | 2 * |
3 * Added config dialog | |
4 * Added control over notification method | |
5 * Added control over when to release notification | |
4035 | 6 * |
7 * Added option to get notification for chats also | |
8 * Cleaned up code | |
9 * Added option to notify on click as it's own option | |
10 * rather then as what happens when on focus isn't clicked | |
11 * Added apply button to change the denotification methods for | |
12 * open conversation windows | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
13 * Fixed apply to conversations, count now keeps count across applies |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
14 * Fixed(?) memory leak, and in the process fixed some stupidities |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
15 * Hit enter when done editing the title string entry box to save it |
3392 | 16 * |
17 * Thanks to Carles Pina i Estany <carles@pinux.info> | |
18 * for count of new messages option | |
19 */ | |
20 | |
4202
59751fe608c5
[gaim-migrate @ 4438]
Christian Hammond <chipx86@chipx86.com>
parents:
4165
diff
changeset
|
21 #include "config.h" |
59751fe608c5
[gaim-migrate @ 4438]
Christian Hammond <chipx86@chipx86.com>
parents:
4165
diff
changeset
|
22 |
3710 | 23 #ifndef GAIM_PLUGINS |
24 #define GAIM_PLUGINS | |
25 #endif | |
3374 | 26 |
191 | 27 #include "gaim.h" |
3428 | 28 #include <string.h> |
29 #include <ctype.h> | |
30 #include <stdlib.h> | |
191 | 31 #include <gtk/gtk.h> |
3385 | 32 #include <X11/Xlib.h> |
3374 | 33 #include <X11/Xutil.h> |
3392 | 34 #include <X11/Xatom.h> |
3374 | 35 #include <gdk/gdkx.h> |
36 | |
3710 | 37 guint type = 1; |
38 #define TYPE_IM 0x00000001 | |
39 #define TYPE_CHAT 0x00000002 | |
40 | |
3392 | 41 guint choice = 1; |
42 #define NOTIFY_FOCUS 0x00000001 | |
43 #define NOTIFY_TYPE 0x00000002 | |
44 #define NOTIFY_IN_FOCUS 0x00000004 | |
3710 | 45 #define NOTIFY_CLICK 0x00000008 |
3374 | 46 |
3392 | 47 guint method = 1; |
48 #define METHOD_STRING 0x00000001 | |
49 #define METHOD_QUOTE 0x00000002 | |
50 #define METHOD_URGENT 0x00000004 | |
51 #define METHOD_COUNT 0x00000008 | |
191 | 52 |
53 void *handle; | |
3565 | 54 GtkWidget *Entry; |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
55 gchar *title_string; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
56 int Number = 0; |
191 | 57 |
3374 | 58 /* predefine some functions, less warnings */ |
59 void options(GtkWidget *widget, gpointer data); | |
4047 | 60 /* this returns an int so that typing events don't get stopped here */ |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
61 int un_star(GtkWidget *widget, gpointer data); |
3428 | 62 int counter (char *buf, int *length); |
4035 | 63 /*string functions */ |
64 void string_add(GtkWidget *widget); | |
65 gboolean string_remove(GtkWidget *widget); | |
66 /* count functions */ | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
67 void count_add(GtkWidget *widget, int number); |
4035 | 68 gboolean count_remove(GtkWidget *widget); |
69 /* quote functions */ | |
70 void quote_add(GtkWidget *widget); | |
71 gboolean quote_remove(GtkWidget *widget); | |
72 /* urgent functions */ | |
73 void urgent_add(struct conversation *c); | |
74 gboolean urgent_remove(struct conversation *c); | |
3374 | 75 |
3710 | 76 struct conversation *find_chat(struct gaim_connection *gc, int id) { |
77 GList *cnv = chats; | |
78 struct conversation *c; | |
79 | |
80 while (cnv) { | |
81 c = (struct conversation *) cnv->data; | |
82 | |
83 if (c && (c->gc == gc) && c->is_chat && (c->id == id)) | |
84 return c; | |
1047
ece2d1543b20
[gaim-migrate @ 1057]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1000
diff
changeset
|
85 |
3710 | 86 cnv = cnv->next; |
1047
ece2d1543b20
[gaim-migrate @ 1057]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1000
diff
changeset
|
87 } |
3710 | 88 return NULL; |
89 } | |
191 | 90 |
3710 | 91 int notify(struct conversation *cnv) { |
92 Window focus_return; | |
4035 | 93 int revert_to_return; |
191 | 94 |
3374 | 95 XGetInputFocus(GDK_WINDOW_XDISPLAY(cnv->window->window), &focus_return, &revert_to_return); |
96 | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
97 if ((choice & NOTIFY_IN_FOCUS) || |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
98 focus_return != GDK_WINDOW_XWINDOW(cnv->window->window)) { |
4035 | 99 if (method & METHOD_STRING) |
100 string_add(cnv->window); | |
101 if (method & METHOD_COUNT) | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
102 count_add(cnv->window, 0); |
4035 | 103 if (method & METHOD_QUOTE) |
104 quote_add(cnv->window); | |
105 if (method & METHOD_URGENT) | |
106 urgent_add(cnv); | |
3374 | 107 } |
108 return 0; | |
109 } | |
110 | |
4035 | 111 guint unnotify(struct conversation *c, gboolean clean) { |
112 guint option = 0; | |
4043 | 113 /* The top level ifs check whether we are either cleaning all methods, |
114 * or whether we have that method is currently selected. | |
115 * If we do then they are cleaned | |
116 * | |
117 * The second level ifs check if we removed something, | |
118 * and if that method is currently selected. | |
119 * If we did and it is then set option so that it can be re-added */ | |
4035 | 120 if (clean || (method & METHOD_QUOTE)) |
4043 | 121 if (quote_remove(c->window) && (method & METHOD_QUOTE)) |
4035 | 122 option ^= METHOD_QUOTE; |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
123 |
4035 | 124 if (clean || (method & METHOD_COUNT)) |
4043 | 125 if (count_remove(c->window) && (method & METHOD_COUNT)) |
4035 | 126 option ^= METHOD_COUNT; |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
127 |
4035 | 128 if (clean || (method & METHOD_STRING)) |
4043 | 129 if (string_remove(c->window) && (method & METHOD_STRING)) |
4035 | 130 option ^= METHOD_STRING; |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
131 |
4035 | 132 if (clean || (method & METHOD_URGENT)) |
4043 | 133 if (urgent_remove(c) && (method & METHOD_URGENT)) |
4035 | 134 option ^= METHOD_URGENT; |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
135 |
4035 | 136 return option; |
3374 | 137 } |
138 | |
3710 | 139 void chat_recv_im(struct gaim_connection *gc, int id, char **who, char **text) { |
140 struct conversation *c = find_chat(gc, id); | |
141 | |
142 if (c && (type & TYPE_CHAT)) | |
143 notify(c); | |
144 return; | |
145 } | |
146 | |
147 void chat_sent_im(struct gaim_connection *gc, int id, char **text) { | |
148 struct conversation *c = find_chat(gc, id); | |
149 | |
150 if (c && (type & TYPE_CHAT)) | |
4035 | 151 unnotify(c, FALSE); |
3710 | 152 return; |
153 } | |
154 | |
155 int im_recv_im(struct gaim_connection *gc, char **who, char **what, void *m) { | |
156 struct conversation *c = find_conversation(*who); | |
157 | |
158 if (c && (type & TYPE_IM)) | |
159 notify(c); | |
160 return 0; | |
161 } | |
162 | |
163 int im_sent_im(struct gaim_connection *gc, char *who, char **what, void *m) { | |
3374 | 164 struct conversation *c = find_conversation(who); |
165 | |
3710 | 166 if (c && (type & TYPE_IM)) |
4035 | 167 unnotify(c, FALSE); |
3710 | 168 return 0; |
169 } | |
3392 | 170 |
3710 | 171 int attach_signals(struct conversation *c) { |
3392 | 172 if (choice & NOTIFY_FOCUS) { |
4035 | 173 g_signal_connect(G_OBJECT(c->window), "focus-in-event", G_CALLBACK(un_star), NULL); |
3374 | 174 } |
3710 | 175 |
176 if (choice & NOTIFY_CLICK) { | |
4035 | 177 g_signal_connect(G_OBJECT(c->window), "button_press_event", G_CALLBACK(un_star), NULL); |
178 | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
179 g_signal_connect_swapped(G_OBJECT(c->text), "button_press_event", G_CALLBACK(un_star), G_OBJECT(c->window)); |
4035 | 180 |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
181 g_signal_connect_swapped(G_OBJECT(c->entry), "button_press_event", G_CALLBACK(un_star), G_OBJECT(c->window)); |
3374 | 182 } |
183 | |
3392 | 184 if (choice & NOTIFY_TYPE) { |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
185 g_signal_connect_swapped(G_OBJECT(c->entry), "key-press-event", G_CALLBACK(un_star), G_OBJECT(c->window)); |
191 | 186 } |
4035 | 187 |
4043 | 188 g_object_set_data(G_OBJECT(c->window), "user_data", c); |
4035 | 189 g_object_set_data(G_OBJECT(c->window), "notify_data", GUINT_TO_POINTER(choice)); |
3428 | 190 return 0; |
191 | 191 } |
192 | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
193 void detach_signals(struct conversation *c) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
194 guint options = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(c->window), "notify_data")); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
195 |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
196 if (options & NOTIFY_FOCUS) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
197 g_signal_handlers_disconnect_by_func(G_OBJECT(c->window), un_star, NULL); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
198 } |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
199 if (options & NOTIFY_CLICK) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
200 g_signal_handlers_disconnect_by_func(G_OBJECT(c->window), un_star, NULL); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
201 g_signal_handlers_disconnect_by_func(G_OBJECT(c->text), un_star, c->window); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
202 g_signal_handlers_disconnect_by_func(G_OBJECT(c->entry), un_star, c->window); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
203 } |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
204 |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
205 if (options & NOTIFY_TYPE) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
206 g_signal_handlers_disconnect_by_func(G_OBJECT(c->entry), un_star, c->window); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
207 } |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
208 } |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
209 |
3710 | 210 void new_conv(char *who) { |
4035 | 211 struct conversation *c = find_conversation(who); |
3710 | 212 |
4035 | 213 if (c && (type & TYPE_IM)) |
3710 | 214 attach_signals(c); |
215 return; | |
216 } | |
217 | |
218 void chat_join(struct gaim_connection *gc, int id, char *room) { | |
219 struct conversation *c = find_chat(gc, id); | |
220 | |
4043 | 221 if (c && (type & TYPE_CHAT)) |
3710 | 222 attach_signals(c); |
223 return; | |
224 } | |
225 | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
226 int un_star(GtkWidget *widget, gpointer data) { |
4043 | 227 struct conversation *c = g_object_get_data(G_OBJECT(widget), "user_data"); |
3374 | 228 |
229 if (method & METHOD_QUOTE) | |
230 quote_remove(widget); | |
3392 | 231 if (method & METHOD_COUNT) |
232 count_remove(widget); | |
3374 | 233 if (method & METHOD_STRING) |
234 string_remove(widget); | |
4043 | 235 if (c && method & METHOD_URGENT) |
3374 | 236 urgent_remove(c); |
4047 | 237 return 0; |
3374 | 238 } |
239 | |
3392 | 240 /* This function returns the number in [ ]'s or 0 */ |
241 int counter (char *buf, int *length) { | |
242 char temp[256]; | |
243 int i = 1; | |
244 *length = 0; | |
245 | |
246 while (isdigit(buf[i]) && i<sizeof(buf)) { | |
247 temp[i-1] = buf[i]; | |
248 (*length)++; | |
249 i++; | |
250 } | |
251 temp[i] = '\0'; | |
4035 | 252 |
3392 | 253 if (buf[i] != ']') { |
254 *length = 0; | |
255 return (0); | |
256 } | |
257 | |
258 return (atoi(temp)); | |
259 } | |
260 | |
4035 | 261 void string_add(GtkWidget *widget) { |
262 char buf[256]; | |
263 GtkWindow *win = GTK_WINDOW(widget); | |
264 | |
265 strncpy(buf, win->title, sizeof(buf)); | |
266 if (!strstr(buf, title_string)) { | |
267 g_snprintf(buf, sizeof(buf), "%s%s", title_string, win->title); | |
268 gtk_window_set_title(win, buf); | |
269 } | |
270 } | |
271 | |
272 gboolean string_remove(GtkWidget *widget) { | |
191 | 273 char buf[256]; |
3374 | 274 GtkWindow *win = GTK_WINDOW(widget); |
275 | |
3392 | 276 strncpy(buf, win->title, sizeof(buf)); |
3374 | 277 if (strstr(buf, title_string)) { |
278 g_snprintf(buf, sizeof(buf), "%s", &win->title[strlen(title_string)]); | |
279 gtk_window_set_title(win, buf); | |
4035 | 280 return TRUE; |
3374 | 281 } |
4035 | 282 return FALSE; |
3374 | 283 } |
284 | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
285 void count_add(GtkWidget *widget, int number) { |
4035 | 286 char buf[256]; |
287 int c, length; | |
288 GtkWindow *win = GTK_WINDOW(widget); | |
289 | |
290 strncpy(buf, win->title, sizeof(buf)); | |
291 c = counter(buf, &length); | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
292 if (number) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
293 g_snprintf(buf, sizeof(buf), "[%d] %s", number, win->title); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
294 } else if (!c) { |
4035 | 295 g_snprintf(buf, sizeof(buf), "[1] %s", win->title); |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
296 } else if (!g_strncasecmp(buf, "[", 1)) { |
4035 | 297 g_snprintf(buf, sizeof(buf), "[%d] %s", c+1, &win->title[3+length]); |
298 } | |
299 gtk_window_set_title(win, buf); | |
300 } | |
301 | |
302 gboolean count_remove(GtkWidget *widget) { | |
3392 | 303 char buf[256]; |
304 GtkWindow *win = GTK_WINDOW(widget); | |
305 int length; | |
306 | |
307 strncpy(buf, win->title, sizeof(buf)); | |
308 if (!g_strncasecmp(buf, "[", 1)) { | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
309 Number = counter(buf, &length); |
3392 | 310 g_snprintf(buf, sizeof(buf), "%s", &win->title[3+length]); |
311 gtk_window_set_title(win, buf); | |
4035 | 312 return TRUE; |
3392 | 313 } |
4035 | 314 return FALSE; |
3392 | 315 } |
316 | |
4035 | 317 void quote_add(GtkWidget *widget) { |
318 char buf[256]; | |
319 GtkWindow *win = GTK_WINDOW(widget); | |
320 | |
321 strncpy(buf, win->title, sizeof(buf)); | |
322 if (g_strncasecmp(buf, "\"", 1)) { | |
323 g_snprintf(buf, sizeof(buf), "\"%s\"", win->title); | |
324 gtk_window_set_title(win, buf); | |
325 } | |
326 } | |
327 | |
328 gboolean quote_remove(GtkWidget *widget) { | |
3374 | 329 char buf[256]; |
330 GtkWindow *win = GTK_WINDOW(widget); | |
191 | 331 |
3392 | 332 strncpy(buf, win->title, sizeof(buf)); |
3374 | 333 if (!g_strncasecmp(buf, "\"", 1)) { |
334 g_snprintf(buf, strlen(buf) - 1, "%s", &win->title[1]); | |
191 | 335 gtk_window_set_title(win, buf); |
4035 | 336 return TRUE; |
191 | 337 } |
4035 | 338 return FALSE; |
3374 | 339 } |
340 | |
4035 | 341 void urgent_add(struct conversation *c) { |
342 XWMHints *hints = XGetWMHints(GDK_WINDOW_XDISPLAY(c->window->window), GDK_WINDOW_XWINDOW(c->window->window)); | |
343 hints->flags |= XUrgencyHint; | |
344 XSetWMHints(GDK_WINDOW_XDISPLAY(c->window->window), GDK_WINDOW_XWINDOW(c->window->window), hints); | |
4218 | 345 XFree(hints); |
4035 | 346 } |
347 | |
348 gboolean urgent_remove(struct conversation *c) { | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
349 if ((c->is_chat && (chat_options & OPT_CHAT_ONE_WINDOW)) || (!c->is_chat && (im_options & OPT_IM_ONE_WINDOW))) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
350 if (c->is_chat) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
351 struct conversation *c = (struct conversation *)chats->data; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
352 GdkWindow *win = c->window->window; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
353 |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
354 XWMHints *hints = XGetWMHints(GDK_WINDOW_XDISPLAY(win), GDK_WINDOW_XWINDOW(win)); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
355 if (hints->flags & XUrgencyHint) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
356 hints->flags &= ~XUrgencyHint; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
357 XSetWMHints(GDK_WINDOW_XDISPLAY(c->window->window), GDK_WINDOW_XWINDOW(c->window->window), hints); |
4218 | 358 XFree(hints); |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
359 return TRUE; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
360 } |
4218 | 361 XFree(hints); |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
362 return FALSE; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
363 } else { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
364 struct conversation *c = (struct conversation *)conversations->data; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
365 GdkWindow *win = c->window->window; |
3374 | 366 |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
367 XWMHints *hints = XGetWMHints(GDK_WINDOW_XDISPLAY(win), GDK_WINDOW_XWINDOW(win)); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
368 if (hints->flags & XUrgencyHint) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
369 hints->flags &= ~XUrgencyHint; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
370 XSetWMHints(GDK_WINDOW_XDISPLAY(c->window->window), GDK_WINDOW_XWINDOW(c->window->window), hints); |
4218 | 371 XFree(hints); |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
372 return TRUE; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
373 } |
4218 | 374 XFree(hints); |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
375 return FALSE; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
376 } |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
377 } else { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
378 XWMHints *hints = XGetWMHints(GDK_WINDOW_XDISPLAY(c->window->window), GDK_WINDOW_XWINDOW(c->window->window)); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
379 if (hints->flags & XUrgencyHint) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
380 hints->flags &= ~XUrgencyHint; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
381 XSetWMHints(GDK_WINDOW_XDISPLAY(c->window->window), GDK_WINDOW_XWINDOW(c->window->window), hints); |
4218 | 382 XFree(hints); |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
383 return TRUE; |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
384 } |
4218 | 385 XFree(hints); |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
386 return FALSE; |
4035 | 387 } |
3374 | 388 } |
389 | |
390 void save_notify_prefs() { | |
3392 | 391 gchar buf[1000]; |
3374 | 392 FILE *fp; |
393 | |
394 snprintf(buf, 1000, "%s/.gaim/.notify", getenv("HOME")); | |
395 if (!(fp = fopen(buf, "w"))) { | |
3561 | 396 do_error_dialog(_("Unable to write to config file"), _("Notify plugin"), GAIM_ERROR); |
3374 | 397 return; |
398 } | |
399 | |
3710 | 400 fprintf(fp, "%d=TYPE\n", type); |
3392 | 401 fprintf(fp, "%d=CHOICE\n", choice); |
402 fprintf(fp, "%d=METHOD\n", method); | |
403 fprintf(fp, "%s=STRING\n", title_string); | |
3374 | 404 fclose(fp); |
405 } | |
406 | |
407 void load_notify_prefs() { | |
408 gchar buf[1000]; | |
409 gchar **parsed; | |
410 FILE *fp; | |
411 | |
412 g_snprintf(buf, sizeof(buf), "%s/.gaim/.notify", getenv("HOME")); | |
413 if (!(fp = fopen(buf, "r"))) | |
414 return; | |
415 | |
416 while (fgets(buf, 1000, fp) != NULL) { | |
417 parsed = g_strsplit(g_strchomp(buf), "=", 2); | |
418 if (parsed[0] && parsed[1]) { | |
3710 | 419 if (!strcmp(parsed[1], "TYPE")) |
420 type = atoi(parsed[0]); | |
3392 | 421 if (!strcmp(parsed[1], "CHOICE")) |
422 choice = atoi(parsed[0]); | |
423 if (!strcmp(parsed[1], "METHOD")) | |
424 method = atoi(parsed[0]); | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
425 if (!strcmp(parsed[1], "STRING")) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
426 if (title_string != NULL) |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
427 g_free(title_string); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
428 title_string = g_strdup(parsed[0]); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
429 } |
3374 | 430 } |
3392 | 431 g_strfreev(parsed); |
3374 | 432 } |
433 fclose(fp); | |
434 return; | |
435 } | |
436 | |
437 void options(GtkWidget *widget, gpointer data) { | |
4035 | 438 gint option = GPOINTER_TO_INT(data); |
3374 | 439 |
440 if (option == 0) | |
3392 | 441 choice ^= NOTIFY_FOCUS; |
3374 | 442 else if (option == 1) |
3710 | 443 choice ^= NOTIFY_CLICK; |
444 else if (option == 2) | |
3392 | 445 choice ^= NOTIFY_TYPE; |
3710 | 446 else if (option == 3) { |
3374 | 447 method ^= METHOD_STRING; |
448 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) | |
449 gtk_widget_set_sensitive(Entry, TRUE); | |
450 else | |
451 gtk_widget_set_sensitive(Entry, FALSE); | |
452 } | |
3710 | 453 else if (option == 4) |
3374 | 454 method ^= METHOD_QUOTE; |
3710 | 455 else if (option == 5) |
3374 | 456 method ^= METHOD_URGENT; |
3710 | 457 else if (option == 6) |
3392 | 458 choice ^= NOTIFY_IN_FOCUS; |
3710 | 459 else if (option == 7) |
3392 | 460 method ^= METHOD_COUNT; |
3710 | 461 else if (option == 8) |
462 type ^= TYPE_IM; | |
463 else if (option == 9) | |
464 type ^= TYPE_CHAT; | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
465 else if (option == 10) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
466 /* I made an option for this as at least a way to have it save correctly |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
467 * I'd much rather there were better ways, and I don't want to save this |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
468 * no matter which pref is changed, that's too much of a hack */ |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
469 if (title_string != NULL) { |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
470 g_free(title_string); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
471 title_string = g_strdup(gtk_entry_get_text(GTK_ENTRY(Entry))); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
472 } |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
473 } |
3710 | 474 |
475 save_notify_prefs(); | |
3374 | 476 } |
477 | |
4035 | 478 void apply_options(GtkWidget *widget, gpointer data) { |
479 GList *cnv = conversations; | |
480 | |
481 while (cnv) { | |
482 guint notification; | |
483 struct conversation *c = (struct conversation *) cnv->data; | |
484 | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
485 /* remove old notification signals */ |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
486 detach_signals(c); |
4035 | 487 |
488 /* clean off all notification markings */ | |
489 notification = unnotify(c, TRUE); | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
490 |
4035 | 491 /* re-add appropriate notification methods cleaned above */ |
4043 | 492 if (notification & METHOD_STRING) /* re-add string */ |
493 string_add(c->window); | |
4035 | 494 if (notification & METHOD_QUOTE) /* re-add quote */ |
495 quote_add(c->window); | |
496 if (notification & METHOD_COUNT) /* re-add count */ | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
497 count_add(c->window, Number); |
4035 | 498 if (notification & METHOD_URGENT) /* re-add urgent */ |
499 urgent_add(c); | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
500 |
4035 | 501 /* attach new unnotification signals */ |
502 attach_signals(c); | |
503 | |
504 cnv = cnv->next; | |
505 } | |
506 | |
507 return; | |
508 } | |
509 | |
1047
ece2d1543b20
[gaim-migrate @ 1057]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1000
diff
changeset
|
510 char *gaim_plugin_init(GModule *hndl) { |
191 | 511 handle = hndl; |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
512 title_string = g_strdup("(*) "); |
191 | 513 |
3374 | 514 load_notify_prefs(); |
515 | |
3710 | 516 gaim_signal_connect(handle, event_im_recv, im_recv_im, NULL); |
517 gaim_signal_connect(handle, event_chat_recv, chat_recv_im, NULL); | |
518 gaim_signal_connect(handle, event_im_send, im_sent_im, NULL); | |
519 gaim_signal_connect(handle, event_chat_send, chat_sent_im, NULL); | |
3374 | 520 gaim_signal_connect(handle, event_new_conversation, new_conv, NULL); |
3710 | 521 gaim_signal_connect(handle, event_chat_join, chat_join, NULL); |
1052
25f121faa75e
[gaim-migrate @ 1062]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1047
diff
changeset
|
522 return NULL; |
191 | 523 } |
524 | |
3392 | 525 void gaim_plugin_remove() { |
526 GList *c = conversations; | |
527 | |
528 while (c) { | |
529 struct conversation *cnv = (struct conversation *)c->data; | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
530 |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
531 detach_signals(cnv); |
3710 | 532 un_star(cnv->window, NULL); |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
533 |
3710 | 534 c = c->next; |
3392 | 535 } |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
536 |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
537 /* this might be a hack I'm not sure, I don't think so but... */ |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
538 g_free(title_string); |
3392 | 539 } |
540 | |
3551 | 541 struct gaim_plugin_description desc; |
542 struct gaim_plugin_description *gaim_plugin_desc() { | |
543 desc.api_version = PLUGIN_API_VERSION; | |
544 desc.name = g_strdup("Message Notification"); | |
545 desc.version = g_strdup(VERSION); | |
546 desc.description = g_strdup("Provides a variety of ways of notifying you of unread messages."); | |
547 desc.authors = g_strdup("Etan Reisner <deryni@eden.rutgers.edu>"); | |
548 desc.url = g_strdup(WEBSITE); | |
549 return &desc; | |
550 } | |
551 | |
191 | 552 char *name() { |
553 return "Visual Notification"; | |
554 } | |
555 | |
556 char *description() { | |
557 return "Puts an asterisk in the title bar of all conversations" | |
558 " where you have not responded to a message yet."; | |
559 } | |
3374 | 560 |
3565 | 561 GtkWidget *gaim_plugin_config_gtk() { |
562 GtkWidget *ret; | |
563 GtkWidget *vbox, *hbox; | |
4035 | 564 GtkWidget *toggle, *button; |
3565 | 565 ret = gtk_vbox_new(FALSE, 18); |
566 gtk_container_set_border_width (GTK_CONTAINER (ret), 12); | |
3392 | 567 |
3710 | 568 vbox = make_frame(ret, _("Notify For")); |
569 toggle = gtk_check_button_new_with_mnemonic(_("_IM windows")); | |
570 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); | |
571 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), type & TYPE_IM); | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
572 g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(options), GINT_TO_POINTER(8)); |
3710 | 573 |
574 toggle = gtk_check_button_new_with_mnemonic(_("_Chat windows")); | |
575 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); | |
576 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), type & TYPE_CHAT); | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
577 g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(options), GINT_TO_POINTER(9)); |
3710 | 578 |
579 /*--------------*/ | |
3565 | 580 vbox = make_frame(ret, _("Notification Methods")); |
581 hbox = gtk_hbox_new(FALSE, 18); | |
582 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
583 toggle = gtk_check_button_new_with_mnemonic(_("Prepend _string into window title (hit enter to save):")); |
3565 | 584 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), method & METHOD_STRING); |
4035 | 585 g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(options), GINT_TO_POINTER(3)); |
3565 | 586 gtk_box_pack_start(GTK_BOX(hbox), toggle, FALSE, FALSE, 0); |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
587 Entry = gtk_entry_new(); |
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
588 gtk_entry_set_max_length(GTK_ENTRY(Entry), 10); |
3565 | 589 gtk_widget_set_sensitive(GTK_WIDGET(Entry), method & METHOD_STRING); |
590 gtk_box_pack_start(GTK_BOX(hbox), Entry, FALSE, FALSE, 0); | |
3392 | 591 gtk_entry_set_text(GTK_ENTRY(Entry), title_string); |
4203
ec6d0c5e5c23
[gaim-migrate @ 4439]
Christian Hammond <chipx86@chipx86.com>
parents:
4202
diff
changeset
|
592 g_signal_connect(G_OBJECT(Entry), "activate", G_CALLBACK(options), GINT_TO_POINTER(10)); |
3374 | 593 |
3710 | 594 toggle = gtk_check_button_new_with_mnemonic(_("_Quote window title")); |
3565 | 595 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); |
596 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), method & METHOD_QUOTE); | |
4035 | 597 g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(options), GINT_TO_POINTER(4)); |
3374 | 598 |
3565 | 599 toggle = gtk_check_button_new_with_mnemonic(_("Set Window Manager \"_URGENT\" Hint")); |
600 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); | |
601 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), method & METHOD_URGENT); | |
4035 | 602 g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(options), GINT_TO_POINTER(5)); |
603 | |
3710 | 604 toggle = gtk_check_button_new_with_mnemonic(_("Insert c_ount of new messages into window title")); |
3565 | 605 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), method & METHOD_COUNT); |
606 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); | |
4035 | 607 g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(options), GINT_TO_POINTER(7)); |
3710 | 608 |
609 toggle = gtk_check_button_new_with_mnemonic(_("_Notify even if conversation is in focus")); | |
610 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), choice & NOTIFY_IN_FOCUS); | |
611 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); | |
4035 | 612 g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(options), GINT_TO_POINTER(6)); |
3392 | 613 |
3565 | 614 /*--------------*/ |
615 vbox = make_frame(ret, _("Notification Removal")); | |
3710 | 616 toggle = gtk_check_button_new_with_mnemonic(_("Remove when conversation window gains _focus")); |
3565 | 617 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); |
618 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), choice & NOTIFY_FOCUS); | |
4035 | 619 g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(options), GINT_TO_POINTER(0)); |
3374 | 620 |
3710 | 621 toggle = gtk_check_button_new_with_mnemonic(_("Remove when conversation window _receives click")); |
622 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); | |
623 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), choice & NOTIFY_CLICK); | |
4035 | 624 g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(options), GINT_TO_POINTER(1)); |
3710 | 625 |
3565 | 626 toggle = gtk_check_button_new_with_mnemonic(_("Remove when _typing in conversation window")); |
627 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); | |
628 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), choice & NOTIFY_TYPE); | |
4035 | 629 g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(options), GINT_TO_POINTER(2)); |
630 | |
631 button = gtk_button_new_with_mnemonic(_("Appl_y")); | |
632 gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5); | |
633 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(apply_options), NULL); | |
3565 | 634 |
635 gtk_widget_show_all(ret); | |
636 return ret; | |
3374 | 637 } |