Mercurial > pidgin.yaz
annotate src/gtkconv.c @ 5105:4cfc49e31c2e
[gaim-migrate @ 5468]
David Brigada (jsi) writes:
" This patch changes GTK_WRAP_WORD to GTK_WRAP_WORD_CHAR
throughout the sources. That fixes a bug where long
single-word input into GtkTextViews and similar would
cause the textview to expand, causing the window to
expand. This fix depends on a patch to GTK+ that is in
current CVS but not yet released. To address the
backwards-compatibility issue, GTK_WRAP_WORD_CHAR is
#defined to GTK_WRAP_WORD when not defined by GTK+'s
header files.
The only problem I can forsee is binary compatibility;
if Gaim is compiled under a GTK+ CVS (or a future
release) environment, and then run under a GTK+ 2.2.1
or earlier environment, behavior is undefined; the text
area will probably not wrap at all. However, source
compatibility is maintained."
basically, gaim will start wrapping text in any version of gtk2 that supports it,
and should work exactly the same in any version that still has the bug.
many thanks to David for his hard work.
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Fri, 11 Apr 2003 04:23:55 +0000 |
parents | bfcf72c5a930 |
children | 7b218dde1d73 |
rev | line source |
---|---|
4359 | 1 /* |
2 * gaim | |
3 * | |
4 * Copyright (C) 2002-2003, Christian Hammond <chipx86@gnupdate.org> | |
5 * | |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
21 #ifdef HAVE_CONFIG_H | |
22 #include <config.h> | |
23 #endif | |
24 #include <string.h> | |
25 #ifndef _WIN32 | |
26 #include <sys/time.h> | |
27 #include <unistd.h> | |
28 #include <gdk/gdkx.h> | |
29 #include <X11/Xlib.h> | |
30 #endif /*_WIN32*/ | |
31 #include <sys/types.h> | |
32 #include <sys/stat.h> | |
33 #include <stdio.h> | |
34 #include <stdlib.h> | |
35 #include <errno.h> | |
36 #include <ctype.h> | |
37 #include <gtk/gtk.h> | |
38 #ifdef USE_GTKSPELL | |
39 #include <gtkspell/gtkspell.h> | |
40 #endif | |
41 #include "gtkimhtml.h" | |
42 #include <gdk/gdkkeysyms.h> | |
43 #include "prpl.h" | |
44 #include "gtkimhtml.h" | |
45 #include "dnd-hints.h" | |
4561 | 46 #include "sound.h" |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
47 #include "gtklist.h" |
4359 | 48 |
4373
dcc6c130c6d9
[gaim-migrate @ 4639]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4370
diff
changeset
|
49 #ifdef _WIN32 |
dcc6c130c6d9
[gaim-migrate @ 4639]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4370
diff
changeset
|
50 #include "win32dep.h" |
4859
a9a831508b43
[gaim-migrate @ 5186]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4851
diff
changeset
|
51 #include "wspell.h" |
4373
dcc6c130c6d9
[gaim-migrate @ 4639]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4370
diff
changeset
|
52 #endif |
dcc6c130c6d9
[gaim-migrate @ 4639]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4370
diff
changeset
|
53 |
4359 | 54 static char nick_colors[][8] = { |
55 "#ba55d3", /* Medium Orchid */ | |
56 "#ee82ee", /* Violet */ | |
57 "#c715b4", /* Medium Violet Red */ | |
58 "#ff69b4", /* Hot Pink */ | |
59 "#ff6347", /* Tomato */ | |
60 "#fa8c00", /* Dark Orange */ | |
61 "#fa8072", /* Salmon */ | |
62 "#b22222", /* Fire Brick */ | |
63 "#f4a460", /* Sandy Brown */ | |
64 "#cd5c5c", /* Indian Red */ | |
65 "#bc8f8f", /* Rosy Brown */ | |
66 "#f0e68c", /* Khaki */ | |
67 "#bdb76b", /* Dark Khaki */ | |
68 "#228b22", /* Forest Green */ | |
69 "#9acd32", /* Yellow Green */ | |
70 "#32cd32", /* Lime Green */ | |
71 "#3cb371", /* Medium Sea Green */ | |
72 "#2e8b57", /* Sea Green */ | |
73 "#8fbc8f", /* Dark Sea Green */ | |
74 "#66cdaa", /* Medium Aquamarine */ | |
75 "#5f9ea0", /* Cadet Blue */ | |
76 "#48d1cc", /* Medium Turquoise */ | |
77 "#00ced1", /* Dark Turquoise */ | |
78 "#4682b4", /* Stell Blue */ | |
79 "#00bfff", /* Deep Sky Blue */ | |
80 "#1690ff", /* Dodger Blue */ | |
81 "#4169ff", /* Royal Blue */ | |
82 "#6a5acd", /* Slate Blue */ | |
83 "#6495ed", /* Cornflower Blue */ | |
84 "#708090", /* Slate gray */ | |
85 "#ffdead", /* Navajo White */ | |
86 }; | |
87 #define NUM_NICK_COLORS (sizeof(nick_colors) / sizeof(*nick_colors)) | |
88 | |
89 #define SCALE(x) \ | |
90 ((gdk_pixbuf_animation_get_width(x) <= 48 && \ | |
91 gdk_pixbuf_animation_get_height(x) <= 48) ? 48 : 50) | |
92 | |
93 struct InviteBuddyInfo | |
94 { | |
95 GtkWidget *window; | |
96 | |
97 GtkWidget *entry; | |
98 GtkWidget *message; | |
99 | |
100 struct gaim_conversation *conv; | |
101 }; | |
102 | |
103 char fontface[128] = { 0 }; | |
104 int fontsize = 3; | |
105 | |
106 static GtkWidget *invite_dialog = NULL; | |
107 | |
108 /* Prototypes. <-- because Paco-Paco hates this comment. */ | |
109 static void check_everything(GtkTextBuffer *buffer); | |
4685 | 110 static void set_toggle(GtkWidget *tb, gboolean active); |
4359 | 111 static void move_next_tab(struct gaim_conversation *conv); |
112 static void do_bold(GtkWidget *bold, struct gaim_gtk_conversation *gtkconv); | |
113 static void do_italic(GtkWidget *italic, struct gaim_gtk_conversation *gtkconv); | |
114 static void do_underline(GtkWidget *underline, struct gaim_gtk_conversation *gtkconv); | |
115 static void do_small(GtkWidget *small, struct gaim_gtk_conversation *gtkconv); | |
116 static void do_normal(GtkWidget *small, struct gaim_gtk_conversation *gtkconv); | |
117 static void do_big(GtkWidget *small, struct gaim_gtk_conversation *gtkconv); | |
118 static void toggle_font(GtkWidget *font, struct gaim_conversation *conv); | |
119 static void toggle_fg_color(GtkWidget *color, struct gaim_conversation *conv); | |
120 static void toggle_bg_color(GtkWidget *color, struct gaim_conversation *conv); | |
121 static void got_typing_keypress(struct gaim_conversation *conv, gboolean first); | |
122 static GList *generate_invite_user_names(struct gaim_connection *gc); | |
123 static void add_chat_buddy_common(struct gaim_conversation *conv, | |
124 const char *name, int pos); | |
125 static void tab_complete(struct gaim_conversation *conv); | |
4736 | 126 static void update_typing_icon(struct gaim_conversation *conv); |
4685 | 127 static gboolean update_send_as_selection(struct gaim_window *win); |
4602
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
128 static char *item_factory_translate_func (const char *path, gpointer func_data); |
4359 | 129 |
130 /************************************************************************** | |
131 * Callbacks | |
132 **************************************************************************/ | |
133 static void | |
134 do_insert_image_cb(GObject *obj, GtkWidget *wid) | |
135 { | |
136 struct gaim_conversation *conv; | |
137 struct gaim_gtk_conversation *gtkconv; | |
138 struct gaim_im *im; | |
139 const char *name; | |
140 const char *filename; | |
141 char *buf; | |
142 struct stat st; | |
143 int id; | |
144 | |
145 conv = g_object_get_data(obj, "user_data"); | |
146 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
147 im = GAIM_IM(conv); | |
148 name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wid)); | |
149 id = g_slist_length(im->images) + 1; | |
150 | |
151 if (file_is_dir(name, wid)) | |
152 return; | |
153 | |
154 gtk_widget_destroy(wid); | |
155 | |
156 if (!name) | |
157 return; | |
158 | |
159 if (stat(name, &st) != 0) { | |
160 debug_printf("Could not stat %s\n", name); | |
161 return; | |
162 } | |
163 | |
164 filename = name; | |
165 while (strchr(filename, '/')) | |
166 filename = strchr(filename, '/') + 1; | |
167 | |
168 buf = g_strdup_printf("<IMG SRC=\"file://%s\" ID=\"%d\" DATASIZE=\"%d\">", | |
169 filename, id, (int)st.st_size); | |
170 im->images = g_slist_append(im->images, g_strdup(name)); | |
171 gtk_text_buffer_insert_at_cursor(GTK_TEXT_BUFFER(gtkconv->entry_buffer), | |
172 buf, -1); | |
173 g_free(buf); | |
5046 | 174 |
175 set_toggle(gtkconv->toolbar.image, FALSE); | |
4359 | 176 } |
177 | |
178 static gint | |
179 close_win_cb(GtkWidget *w, GdkEventAny *e, gpointer d) | |
180 { | |
181 struct gaim_window *win = (struct gaim_window *)d; | |
182 | |
183 gaim_window_destroy(win); | |
4361
25d5b2a7545f
[gaim-migrate @ 4627]
Christian Hammond <chipx86@chipx86.com>
parents:
4360
diff
changeset
|
184 |
25d5b2a7545f
[gaim-migrate @ 4627]
Christian Hammond <chipx86@chipx86.com>
parents:
4360
diff
changeset
|
185 return TRUE; |
4359 | 186 } |
187 | |
188 static gint | |
189 close_conv_cb(GtkWidget *w, gpointer d) | |
190 { | |
191 struct gaim_conversation *conv = (struct gaim_conversation *)d; | |
192 | |
193 gaim_conversation_destroy(conv); | |
4361
25d5b2a7545f
[gaim-migrate @ 4627]
Christian Hammond <chipx86@chipx86.com>
parents:
4360
diff
changeset
|
194 |
25d5b2a7545f
[gaim-migrate @ 4627]
Christian Hammond <chipx86@chipx86.com>
parents:
4360
diff
changeset
|
195 return TRUE; |
4359 | 196 } |
197 | |
198 static void | |
199 insert_image_cb(GtkWidget *save, struct gaim_conversation *conv) | |
200 { | |
201 struct gaim_gtk_conversation *gtkconv; | |
202 char buf[BUF_LONG]; | |
203 GtkWidget *window; | |
204 | |
205 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
206 | |
5046 | 207 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.image))) { |
208 window = gtk_file_selection_new(_("Gaim - Insert Image")); | |
209 g_snprintf(buf, sizeof(buf), "%s" G_DIR_SEPARATOR_S, gaim_home_dir()); | |
210 gtk_file_selection_set_filename(GTK_FILE_SELECTION(window), buf); | |
211 | |
212 g_object_set_data(G_OBJECT(GTK_FILE_SELECTION(window)->ok_button), | |
213 "user_data", conv); | |
214 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(window)->ok_button), | |
215 "clicked", G_CALLBACK(do_insert_image_cb), window); | |
216 g_signal_connect_swapped( | |
217 G_OBJECT(GTK_FILE_SELECTION(window)->cancel_button), | |
218 "clicked", G_CALLBACK(gtk_widget_destroy), window); | |
219 | |
220 gtk_widget_show(window); | |
221 } else { | |
222 gtk_widget_grab_focus(gtkconv->entry); | |
223 } | |
4359 | 224 } |
225 | |
5046 | 226 static void |
4359 | 227 insert_link_cb(GtkWidget *w, struct gaim_conversation *conv) |
228 { | |
229 struct gaim_gtk_conversation *gtkconv; | |
230 | |
231 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
232 | |
233 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtkconv->toolbar.link))) | |
234 show_insert_link(gtkconv->toolbar.link, conv); | |
235 else if (gtkconv->dialogs.link) | |
236 cancel_link(gtkconv->toolbar.link, conv); | |
237 else | |
238 gaim_gtk_advance_past(gtkconv, "<A HREF>", "</A>"); | |
239 | |
240 gtk_widget_grab_focus(gtkconv->entry); | |
241 } | |
242 | |
243 static void | |
244 insert_smiley_cb(GtkWidget *smiley, struct gaim_conversation *conv) | |
245 { | |
246 struct gaim_gtk_conversation *gtkconv; | |
247 | |
248 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
249 | |
250 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(smiley))) | |
251 show_smiley_dialog(conv, smiley); | |
252 else if (gtkconv->dialogs.smiley) | |
253 close_smiley_dialog(smiley, conv); | |
254 | |
255 gtk_widget_grab_focus(gtkconv->entry); | |
256 } | |
257 | |
258 static void | |
259 menu_save_as_cb(gpointer data, guint action, GtkWidget *widget) | |
260 { | |
261 struct gaim_window *win = (struct gaim_window *)data; | |
262 | |
263 save_convo(NULL, gaim_window_get_active_conversation(win)); | |
264 } | |
265 | |
266 static void | |
267 menu_view_history_cb(gpointer data, guint action, GtkWidget *widget) | |
268 { | |
269 struct gaim_window *win = (struct gaim_window *)data; | |
4387
a3fd5fe57a0b
[gaim-migrate @ 4653]
Christian Hammond <chipx86@chipx86.com>
parents:
4383
diff
changeset
|
270 struct gaim_conversation *conv; |
a3fd5fe57a0b
[gaim-migrate @ 4653]
Christian Hammond <chipx86@chipx86.com>
parents:
4383
diff
changeset
|
271 |
a3fd5fe57a0b
[gaim-migrate @ 4653]
Christian Hammond <chipx86@chipx86.com>
parents:
4383
diff
changeset
|
272 conv = gaim_window_get_active_conversation(win); |
a3fd5fe57a0b
[gaim-migrate @ 4653]
Christian Hammond <chipx86@chipx86.com>
parents:
4383
diff
changeset
|
273 |
a3fd5fe57a0b
[gaim-migrate @ 4653]
Christian Hammond <chipx86@chipx86.com>
parents:
4383
diff
changeset
|
274 conv_show_log(NULL, (char *)gaim_conversation_get_name(conv)); |
4359 | 275 } |
276 static void | |
277 menu_insert_link_cb(gpointer data, guint action, GtkWidget *widget) | |
278 { | |
279 struct gaim_window *win = (struct gaim_window *)data; | |
280 struct gaim_conversation *conv; | |
281 struct gaim_gtk_conversation *gtkconv; | |
282 | |
283 conv = gaim_window_get_active_conversation(win); | |
284 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
285 | |
286 show_insert_link(gtkconv->toolbar.link, conv); | |
287 } | |
288 | |
289 static void | |
290 menu_insert_image_cb(gpointer data, guint action, GtkWidget *widget) | |
291 { | |
292 struct gaim_window *win = (struct gaim_window *)data; | |
293 | |
294 insert_image_cb(NULL, gaim_window_get_active_conversation(win)); | |
295 } | |
296 | |
297 static void | |
298 menu_close_conv_cb(gpointer data, guint action, GtkWidget *widget) | |
299 { | |
300 struct gaim_window *win = (struct gaim_window *)data; | |
301 | |
302 close_conv_cb(NULL, gaim_window_get_active_conversation(win)); | |
303 } | |
304 | |
305 static void | |
306 menu_logging_cb(gpointer data, guint action, GtkWidget *widget) | |
307 { | |
308 struct gaim_window *win = (struct gaim_window *)data; | |
309 struct gaim_conversation *conv; | |
310 | |
311 conv = gaim_window_get_active_conversation(win); | |
312 | |
313 gaim_conversation_set_logging(conv, !gaim_conversation_is_logging(conv)); | |
314 } | |
315 | |
316 static void | |
317 menu_sounds_cb(gpointer data, guint action, GtkWidget *widget) | |
318 { | |
319 struct gaim_window *win = (struct gaim_window *)data; | |
320 struct gaim_conversation *conv; | |
321 struct gaim_gtk_conversation *gtkconv; | |
322 | |
4803
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
323 conv = gaim_window_get_active_conversation(win); |
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
324 |
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
325 if (!conv) |
4359 | 326 return; |
327 | |
328 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
329 | |
330 gtkconv->make_sound = !gtkconv->make_sound; | |
331 } | |
332 | |
333 static gboolean | |
334 entry_key_pressed_cb_1(GtkTextBuffer *buffer) | |
335 { | |
336 check_everything(buffer); | |
337 | |
338 return FALSE; | |
339 } | |
340 | |
341 static void | |
342 send_cb(GtkWidget *widget, struct gaim_conversation *conv) | |
343 { | |
344 struct gaim_gtk_conversation *gtkconv; | |
345 char *buf, *buf2; | |
346 GtkTextIter start_iter, end_iter; | |
347 int limit; | |
4505 | 348 struct gaim_connection *gc = gaim_conversation_get_gc(conv); |
4359 | 349 |
350 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
351 | |
352 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, &start_iter); | |
353 gtk_text_buffer_get_end_iter(gtkconv->entry_buffer, &end_iter); | |
354 buf2 = gtk_text_buffer_get_text(gtkconv->entry_buffer, | |
355 &start_iter, &end_iter, FALSE); | |
356 | |
4685 | 357 set_toggle(gtkconv->toolbar.bold, FALSE); |
358 set_toggle(gtkconv->toolbar.italic, FALSE); | |
359 set_toggle(gtkconv->toolbar.underline, FALSE); | |
5049 | 360 set_toggle(gtkconv->toolbar.larger_size, FALSE); |
4685 | 361 set_toggle(gtkconv->toolbar.normal_size, FALSE); |
5049 | 362 set_toggle(gtkconv->toolbar.smaller_size,FALSE); |
4685 | 363 set_toggle(gtkconv->toolbar.font, FALSE); |
364 set_toggle(gtkconv->toolbar.fgcolor, FALSE); | |
365 set_toggle(gtkconv->toolbar.bgcolor, FALSE); | |
366 set_toggle(gtkconv->toolbar.link, FALSE); | |
4359 | 367 |
368 gtk_widget_grab_focus(gtkconv->entry); | |
369 | |
370 limit = 32 * 1024; /* This will be done again in gaim_im_send. *shrug* */ | |
371 | |
372 buf = g_malloc(limit); | |
373 strncpy(buf, buf2, limit); | |
374 | |
375 g_free(buf2); | |
376 | |
377 if (strlen(buf) == 0) { | |
378 g_free(buf); | |
379 | |
380 return; | |
381 } | |
382 | |
383 buf2 = g_malloc(limit); | |
384 | |
4505 | 385 if (gc && gc->flags & OPT_CONN_HTML) { |
4359 | 386 if (font_options & OPT_FONT_BOLD) { |
387 g_snprintf(buf2, limit, "<B>%s</B>", buf); | |
388 strcpy(buf, buf2); | |
389 } | |
390 | |
391 if (font_options & OPT_FONT_ITALIC) { | |
392 g_snprintf(buf2, limit, "<I>%s</I>", buf); | |
393 strcpy(buf, buf2); | |
394 } | |
395 | |
396 if (font_options & OPT_FONT_UNDERLINE) { | |
397 g_snprintf(buf2, limit, "<U>%s</U>", buf); | |
398 strcpy(buf, buf2); | |
399 } | |
400 | |
401 if (font_options & OPT_FONT_STRIKE) { | |
402 g_snprintf(buf2, limit, "<STRIKE>%s</STRIKE>", buf); | |
403 strcpy(buf, buf2); | |
404 } | |
405 | |
406 if ((font_options & OPT_FONT_FACE) || gtkconv->has_font) { | |
407 g_snprintf(buf2, limit, | |
408 "<FONT FACE=\"%s\">%s</FONT>", gtkconv->fontface, buf); | |
409 strcpy(buf, buf2); | |
410 } | |
411 | |
412 if (font_options & OPT_FONT_SIZE) { | |
413 g_snprintf(buf2, limit, | |
414 "<FONT SIZE=\"%d\">%s</FONT>", fontsize, buf); | |
415 strcpy(buf, buf2); | |
416 } | |
417 | |
4421 | 418 if (font_options & OPT_FONT_FGCOL) { |
4359 | 419 g_snprintf(buf2, limit, |
420 "<FONT COLOR=\"#%02X%02X%02X\">%s</FONT>", | |
421 gtkconv->fg_color.red / 256, | |
422 gtkconv->fg_color.green / 256, | |
423 gtkconv->fg_color.blue / 256, buf); | |
424 strcpy(buf, buf2); | |
425 } | |
426 | |
4421 | 427 if (font_options & OPT_FONT_BGCOL) { |
4359 | 428 g_snprintf(buf2, limit, |
429 "<BODY BGCOLOR=\"#%02X%02X%02X\">%s</BODY>", | |
4421 | 430 gtkconv->bg_color.red / 256, |
431 gtkconv->bg_color.green / 256, | |
432 gtkconv->bg_color.blue / 256, buf); | |
4359 | 433 strcpy(buf, buf2); |
434 } | |
435 } | |
436 | |
437 g_free(buf2); | |
438 | |
439 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) | |
440 gaim_im_send(GAIM_IM(conv), buf); | |
441 else | |
442 gaim_chat_send(GAIM_CHAT(conv), buf); | |
443 | |
444 g_free(buf); | |
445 | |
446 gtk_text_buffer_set_text(gtkconv->entry_buffer, "", -1); | |
447 } | |
448 | |
449 static void | |
450 add_cb(GtkWidget *widget, struct gaim_conversation *conv) | |
451 { | |
452 struct gaim_connection *gc; | |
453 struct buddy *b; | |
454 const char *name; | |
455 | |
456 gc = gaim_conversation_get_gc(conv); | |
457 name = gaim_conversation_get_name(conv); | |
4687 | 458 b = gaim_find_buddy(gc->account, name); |
4359 | 459 |
460 if (b != NULL) | |
461 show_confirm_del(gc, (char *)name); | |
462 else if (gc != NULL) | |
463 show_add_buddy(gc, (char *)name, NULL, NULL); | |
464 | |
465 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); | |
466 } | |
467 | |
468 static void | |
469 info_cb(GtkWidget *widget, struct gaim_conversation *conv) | |
470 { | |
471 struct gaim_gtk_conversation *gtkconv; | |
472 | |
473 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
474 | |
475 if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) { | |
476 struct gaim_gtk_chat_pane *gtkchat; | |
477 GtkTreeIter iter; | |
478 GtkTreeModel *model; | |
479 GtkTreeSelection *sel; | |
480 const char *name; | |
481 | |
482 gtkchat = gtkconv->u.chat; | |
483 | |
484 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); | |
485 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list)); | |
486 | |
487 if (gtk_tree_selection_get_selected(sel, NULL, &iter)) | |
488 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 1, &name, -1); | |
489 else | |
490 return; | |
491 | |
492 serv_get_info(gaim_conversation_get_gc(conv), (char *)name); | |
493 } | |
494 else { | |
495 serv_get_info(gaim_conversation_get_gc(conv), | |
496 (char *)gaim_conversation_get_name(conv)); | |
497 | |
498 gtk_widget_grab_focus(gtkconv->entry); | |
499 } | |
500 } | |
501 | |
502 static void | |
503 warn_cb(GtkWidget *widget, struct gaim_conversation *conv) | |
504 { | |
505 show_warn_dialog(gaim_conversation_get_gc(conv), | |
506 (char *)gaim_conversation_get_name(conv)); | |
507 | |
508 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); | |
509 } | |
510 | |
511 static void | |
512 block_cb(GtkWidget *widget, struct gaim_conversation *conv) | |
513 { | |
514 struct gaim_connection *gc; | |
515 | |
516 gc = gaim_conversation_get_gc(conv); | |
517 | |
518 if (gc != NULL) | |
519 show_add_perm(gc, (char *)gaim_conversation_get_name(conv), FALSE); | |
520 | |
521 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); | |
522 } | |
523 | |
524 void | |
525 im_cb(GtkWidget *widget, struct gaim_conversation *conv) | |
526 { | |
527 struct gaim_conversation *conv2; | |
528 struct gaim_gtk_conversation *gtkconv; | |
529 struct gaim_gtk_chat_pane *gtkchat; | |
4491 | 530 struct gaim_account *account; |
4359 | 531 GtkTreeIter iter; |
532 GtkTreeModel *model; | |
533 GtkTreeSelection *sel; | |
534 const char *name; | |
535 | |
536 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
537 gtkchat = gtkconv->u.chat; | |
538 | |
539 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); | |
540 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list)); | |
541 | |
542 if (gtk_tree_selection_get_selected(sel, NULL, &iter)) | |
543 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 1, &name, -1); | |
544 else | |
545 return; | |
546 | |
547 if (*name == '@') name++; | |
4621
69f028a6f357
[gaim-migrate @ 4912]
Christian Hammond <chipx86@chipx86.com>
parents:
4608
diff
changeset
|
548 if (*name == '%') name++; |
4359 | 549 if (*name == '+') name++; |
550 | |
4491 | 551 account = gaim_conversation_get_account(conv); |
4476
62c1e5e656d0
[gaim-migrate @ 4751]
Christian Hammond <chipx86@chipx86.com>
parents:
4466
diff
changeset
|
552 |
4359 | 553 conv2 = gaim_find_conversation(name); |
554 | |
4476
62c1e5e656d0
[gaim-migrate @ 4751]
Christian Hammond <chipx86@chipx86.com>
parents:
4466
diff
changeset
|
555 if (conv2 != NULL) { |
4359 | 556 gaim_window_raise(gaim_conversation_get_window(conv2)); |
4491 | 557 gaim_conversation_set_account(conv2, account); |
4476
62c1e5e656d0
[gaim-migrate @ 4751]
Christian Hammond <chipx86@chipx86.com>
parents:
4466
diff
changeset
|
558 } |
4359 | 559 else |
4491 | 560 conv2 = gaim_conversation_new(GAIM_CONV_IM, account, name); |
4359 | 561 } |
562 | |
563 static void | |
564 ignore_cb(GtkWidget *w, struct gaim_conversation *conv) | |
565 { | |
566 struct gaim_gtk_conversation *gtkconv; | |
567 struct gaim_gtk_chat_pane *gtkchat; | |
568 struct gaim_chat *chat; | |
569 GtkTreeIter iter; | |
570 GtkTreeModel *model; | |
571 GtkTreeSelection *sel; | |
572 const char *name; | |
573 int pos; | |
574 | |
575 chat = GAIM_CHAT(conv); | |
576 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
577 gtkchat = gtkconv->u.chat; | |
578 | |
579 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); | |
580 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list)); | |
581 | |
582 if (gtk_tree_selection_get_selected(sel, NULL, &iter)) { | |
583 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 1, &name, -1); | |
584 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
585 } | |
586 else | |
587 return; | |
588 | |
589 pos = g_list_index(gaim_chat_get_users(chat), name); | |
590 | |
591 if (gaim_chat_is_user_ignored(chat, name)) | |
592 gaim_chat_unignore(chat, name); | |
593 else | |
594 gaim_chat_ignore(chat, name); | |
595 | |
596 add_chat_buddy_common(conv, name, pos); | |
597 } | |
598 | |
599 static void | |
600 menu_im_cb(GtkWidget *w, struct gaim_conversation *conv) | |
601 { | |
602 const char *who; | |
603 struct gaim_conversation *conv2; | |
4491 | 604 struct gaim_account *account; |
4359 | 605 |
606 who = g_object_get_data(G_OBJECT(w), "user_data"); | |
607 | |
4491 | 608 account = gaim_conversation_get_account(conv); |
4476
62c1e5e656d0
[gaim-migrate @ 4751]
Christian Hammond <chipx86@chipx86.com>
parents:
4466
diff
changeset
|
609 |
4359 | 610 conv2 = gaim_find_conversation(who); |
611 | |
612 if (conv2 != NULL) | |
613 gaim_window_show(gaim_conversation_get_window(conv2)); | |
4476
62c1e5e656d0
[gaim-migrate @ 4751]
Christian Hammond <chipx86@chipx86.com>
parents:
4466
diff
changeset
|
614 else |
4491 | 615 conv2 = gaim_conversation_new(GAIM_CONV_IM, account, who); |
4359 | 616 } |
617 | |
618 static void | |
619 menu_info_cb(GtkWidget *w, struct gaim_conversation *conv) | |
620 { | |
621 struct gaim_connection *gc; | |
622 char *who; | |
623 | |
624 gc = gaim_conversation_get_gc(conv); | |
625 who = g_object_get_data(G_OBJECT(w), "user_data"); | |
626 | |
627 if (gc != NULL) { | |
628 /* | |
629 * If there are special needs for getting info on users in | |
630 * buddy chat "rooms"... | |
631 */ | |
632 if (gc->prpl->get_cb_info != NULL) | |
633 gc->prpl->get_cb_info(gc, gaim_chat_get_id(GAIM_CHAT(conv)), who); | |
634 else | |
635 gc->prpl->get_info(gc, who); | |
636 } | |
637 } | |
638 | |
639 static void | |
640 menu_away_cb(GtkWidget *w, struct gaim_conversation *conv) | |
641 { | |
642 struct gaim_connection *gc; | |
643 char *who; | |
644 | |
645 gc = gaim_conversation_get_gc(conv); | |
646 who = g_object_get_data(G_OBJECT(w), "user_data"); | |
647 | |
648 if (gc != NULL) { | |
649 /* | |
650 * May want to expand this to work similarly to menu_info_cb? | |
651 */ | |
652 | |
653 if (gc->prpl->get_cb_away != NULL) | |
654 gc->prpl->get_cb_away(gc, gaim_chat_get_id(GAIM_CHAT(conv)), who); | |
655 } | |
656 } | |
657 | |
658 static void | |
659 menu_add_cb(GtkWidget *w, struct gaim_conversation *conv) | |
660 { | |
661 struct gaim_connection *gc; | |
662 struct buddy *b; | |
663 char *name; | |
664 | |
665 gc = gaim_conversation_get_gc(conv); | |
666 name = g_object_get_data(G_OBJECT(w), "user_data"); | |
4687 | 667 b = gaim_find_buddy(gc->account, name); |
4359 | 668 |
669 if (b != NULL) | |
670 show_confirm_del(gc, name); | |
671 else if (gc != NULL) | |
672 show_add_buddy(gc, name, NULL, NULL); | |
673 | |
674 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); | |
675 } | |
676 | |
677 static gint | |
678 right_click_chat_cb(GtkWidget *widget, GdkEventButton *event, | |
679 struct gaim_conversation *conv) | |
680 { | |
681 struct gaim_gtk_conversation *gtkconv; | |
682 struct gaim_gtk_chat_pane *gtkchat; | |
683 struct gaim_connection *gc; | |
4491 | 684 struct gaim_account *account; |
4359 | 685 GtkTreePath *path; |
686 GtkTreeIter iter; | |
687 GtkTreeModel *model; | |
688 GtkTreeViewColumn *column; | |
689 gchar *who; | |
690 int x, y; | |
691 | |
692 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
693 gtkchat = gtkconv->u.chat; | |
4491 | 694 account = gaim_conversation_get_account(conv); |
695 gc = account->gc; | |
4359 | 696 |
697 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); | |
4685 | 698 |
4359 | 699 gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(gtkchat->list), |
700 event->x, event->y, &path, &column, &x, &y); | |
701 | |
702 if (path == NULL) | |
703 return FALSE; | |
704 | |
705 gtk_tree_selection_select_path(GTK_TREE_SELECTION( | |
706 gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list))), path); | |
707 | |
708 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path); | |
709 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 1, &who, -1); | |
710 | |
4621
69f028a6f357
[gaim-migrate @ 4912]
Christian Hammond <chipx86@chipx86.com>
parents:
4608
diff
changeset
|
711 if (*who == '@') who++; |
69f028a6f357
[gaim-migrate @ 4912]
Christian Hammond <chipx86@chipx86.com>
parents:
4608
diff
changeset
|
712 if (*who == '%') who++; |
69f028a6f357
[gaim-migrate @ 4912]
Christian Hammond <chipx86@chipx86.com>
parents:
4608
diff
changeset
|
713 if (*who == '+') who++; |
69f028a6f357
[gaim-migrate @ 4912]
Christian Hammond <chipx86@chipx86.com>
parents:
4608
diff
changeset
|
714 |
4359 | 715 if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { |
716 struct gaim_conversation *c; | |
717 | |
718 if ((c = gaim_find_conversation(who)) == NULL) | |
4491 | 719 c = gaim_conversation_new(GAIM_CONV_IM, account, who); |
4476
62c1e5e656d0
[gaim-migrate @ 4751]
Christian Hammond <chipx86@chipx86.com>
parents:
4466
diff
changeset
|
720 else |
4491 | 721 gaim_conversation_set_account(c, account); |
4359 | 722 } |
723 else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { | |
724 static GtkWidget *menu = NULL; | |
725 GtkWidget *button; | |
726 | |
727 /* | |
728 * If a menu already exists, destroy it before creating a new one, | |
729 * thus freeing-up the memory it occupied. | |
730 */ | |
731 | |
732 if (menu) | |
733 gtk_widget_destroy(menu); | |
734 | |
735 menu = gtk_menu_new(); | |
736 | |
737 button = gtk_menu_item_new_with_label(_("IM")); | |
738 g_signal_connect(G_OBJECT(button), "activate", | |
739 G_CALLBACK(menu_im_cb), conv); | |
740 g_object_set_data(G_OBJECT(button), "user_data", who); | |
4635 | 741 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); |
4359 | 742 gtk_widget_show(button); |
743 | |
744 if (gaim_chat_is_user_ignored(GAIM_CHAT(conv), who)) | |
745 button = gtk_menu_item_new_with_label(_("Un-Ignore")); | |
746 else | |
747 button = gtk_menu_item_new_with_label(_("Ignore")); | |
748 | |
749 g_signal_connect(G_OBJECT(button), "activate", | |
750 G_CALLBACK(ignore_cb), conv); | |
751 g_object_set_data(G_OBJECT(button), "user_data", who); | |
4635 | 752 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); |
4359 | 753 gtk_widget_show(button); |
754 | |
755 if (gc && gc->prpl->get_info) { | |
756 button = gtk_menu_item_new_with_label(_("Info")); | |
757 g_signal_connect(G_OBJECT(button), "activate", | |
758 G_CALLBACK(menu_info_cb), conv); | |
759 g_object_set_data(G_OBJECT(button), "user_data", who); | |
4635 | 760 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); |
4359 | 761 gtk_widget_show(button); |
762 } | |
763 | |
764 if (gc && gc->prpl->get_cb_away) { | |
765 button = gtk_menu_item_new_with_label(_("Get Away Msg")); | |
766 g_signal_connect(G_OBJECT(button), "activate", | |
767 G_CALLBACK(menu_away_cb), conv); | |
768 g_object_set_data(G_OBJECT(button), "user_data", who); | |
4635 | 769 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); |
4359 | 770 gtk_widget_show(button); |
771 } | |
772 | |
773 /* Added by Jonas <jonas@birme.se> */ | |
774 if (gc) { | |
4687 | 775 if (gaim_find_buddy(gc->account, who)) |
4359 | 776 button = gtk_menu_item_new_with_label(_("Remove")); |
777 else | |
778 button = gtk_menu_item_new_with_label(_("Add")); | |
779 | |
780 g_signal_connect(G_OBJECT(button), "activate", | |
781 G_CALLBACK(menu_add_cb), conv); | |
782 | |
783 g_object_set_data(G_OBJECT(button), "user_data", who); | |
4635 | 784 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); |
4359 | 785 gtk_widget_show(button); |
786 } | |
787 /* End Jonas */ | |
4635 | 788 |
4359 | 789 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, |
790 event->button, event->time); | |
791 } | |
792 | |
793 return TRUE; | |
794 } | |
795 | |
796 static void | |
797 do_invite(GtkWidget *w, int resp, struct InviteBuddyInfo *info) | |
798 { | |
799 const char *buddy, *message; | |
800 struct gaim_gtk_conversation *gtkconv; | |
801 | |
802 gtkconv = GAIM_GTK_CONVERSATION(info->conv); | |
803 | |
804 if (resp == GTK_RESPONSE_OK) { | |
805 buddy = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(info->entry)->entry)); | |
806 message = gtk_entry_get_text(GTK_ENTRY(info->message)); | |
807 | |
4793 | 808 if (!g_ascii_strcasecmp(buddy, "")) { |
4359 | 809 g_free(info); |
810 | |
811 return; | |
812 } | |
813 | |
814 serv_chat_invite(gaim_conversation_get_gc(info->conv), | |
815 gaim_chat_get_id(GAIM_CHAT(info->conv)), | |
816 message, buddy); | |
817 } | |
818 | |
819 gtk_widget_destroy(invite_dialog); | |
820 invite_dialog = NULL; | |
821 | |
822 g_free(info); | |
823 } | |
824 | |
825 static void | |
826 invite_cb(GtkWidget *widget, struct gaim_conversation *conv) | |
827 { | |
828 struct InviteBuddyInfo *info = NULL; | |
829 | |
830 if (invite_dialog == NULL) { | |
831 struct gaim_connection *gc; | |
832 struct gaim_window *win; | |
833 struct gaim_gtk_window *gtkwin; | |
834 GtkWidget *label; | |
835 GtkWidget *vbox, *hbox; | |
836 GtkWidget *table; | |
837 GtkWidget *img; | |
838 | |
5024 | 839 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG); |
4359 | 840 |
841 info = g_new0(struct InviteBuddyInfo, 1); | |
842 info->conv = conv; | |
843 | |
844 gc = gaim_conversation_get_gc(conv); | |
845 win = gaim_conversation_get_window(conv); | |
846 gtkwin = GAIM_GTK_WINDOW(win); | |
847 | |
848 /* Create the new dialog. */ | |
849 invite_dialog = gtk_dialog_new_with_buttons( | |
850 _("Gaim - Invite Buddy Into Chat Room"), | |
851 GTK_WINDOW(gtkwin->window), | |
852 GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
853 GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); | |
854 | |
855 gtk_dialog_set_default_response(GTK_DIALOG(invite_dialog), | |
856 GTK_RESPONSE_OK); | |
857 gtk_container_set_border_width(GTK_CONTAINER(invite_dialog), 6); | |
858 gtk_window_set_resizable(GTK_WINDOW(invite_dialog), FALSE); | |
859 gtk_dialog_set_has_separator(GTK_DIALOG(invite_dialog), FALSE); | |
860 | |
861 /* Setup the outside spacing. */ | |
862 vbox = GTK_DIALOG(invite_dialog)->vbox; | |
863 | |
864 gtk_box_set_spacing(GTK_BOX(vbox), 12); | |
865 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); | |
866 | |
867 /* Setup the inner hbox and put the dialog's icon in it. */ | |
868 hbox = gtk_hbox_new(FALSE, 12); | |
869 gtk_container_add(GTK_CONTAINER(vbox), hbox); | |
870 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
871 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
872 | |
873 /* Setup the right vbox. */ | |
874 vbox = gtk_vbox_new(FALSE, 0); | |
875 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
876 | |
877 /* Put our happy label in it. */ | |
878 label = gtk_label_new(_("Please enter the name of the user you wish " | |
879 "to invite, along with an optional invite " | |
880 "message.")); | |
881 gtk_widget_set_size_request(label, 350, -1); | |
882 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
883 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
884 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
885 | |
886 /* hbox for the table, and to give it some spacing on the left. */ | |
887 hbox = gtk_hbox_new(FALSE, 6); | |
888 gtk_container_add(GTK_CONTAINER(vbox), hbox); | |
889 | |
890 /* Setup the table we're going to use to lay stuff out. */ | |
891 table = gtk_table_new(2, 2, FALSE); | |
892 gtk_table_set_row_spacings(GTK_TABLE(table), 6); | |
893 gtk_table_set_col_spacings(GTK_TABLE(table), 6); | |
894 gtk_container_set_border_width(GTK_CONTAINER(table), 12); | |
895 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); | |
896 | |
897 /* Now the Buddy label */ | |
898 label = gtk_label_new(NULL); | |
899 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Buddy:")); | |
900 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
901 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); | |
902 | |
903 /* Now the Buddy drop-down entry field. */ | |
904 info->entry = gtk_combo_new(); | |
905 gtk_combo_set_case_sensitive(GTK_COMBO(info->entry), FALSE); | |
906 gtk_entry_set_activates_default( | |
907 GTK_ENTRY(GTK_COMBO(info->entry)->entry), TRUE); | |
908 | |
909 gtk_table_attach_defaults(GTK_TABLE(table), info->entry, 1, 2, 0, 1); | |
910 gtk_label_set_mnemonic_widget(GTK_LABEL(label), info->entry); | |
911 | |
912 /* Fill in the names. */ | |
913 gtk_combo_set_popdown_strings(GTK_COMBO(info->entry), | |
914 generate_invite_user_names(gc)); | |
915 | |
916 | |
917 /* Now the label for "Message" */ | |
918 label = gtk_label_new(NULL); | |
919 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Message:")); | |
920 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
921 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); | |
922 | |
923 | |
924 /* And finally, the Message entry field. */ | |
925 info->message = gtk_entry_new(); | |
926 gtk_entry_set_activates_default(GTK_ENTRY(info->message), TRUE); | |
927 | |
928 gtk_table_attach_defaults(GTK_TABLE(table), info->message, 1, 2, 1, 2); | |
929 gtk_label_set_mnemonic_widget(GTK_LABEL(label), info->message); | |
930 | |
931 /* Connect the signals. */ | |
932 g_signal_connect(G_OBJECT(invite_dialog), "response", | |
933 G_CALLBACK(do_invite), info); | |
934 } | |
935 | |
936 gtk_widget_show_all(invite_dialog); | |
937 | |
938 if (info != NULL) | |
939 gtk_widget_grab_focus(GTK_COMBO(info->entry)->entry); | |
940 } | |
941 | |
942 static gboolean | |
943 entry_key_pressed_cb_2(GtkWidget *entry, GdkEventKey *event, gpointer data) | |
944 { | |
945 struct gaim_window *win; | |
946 struct gaim_conversation *conv; | |
947 struct gaim_gtk_conversation *gtkconv; | |
4362 | 948 struct gaim_gtk_window *gtkwin; |
4359 | 949 |
950 conv = (struct gaim_conversation *)data; | |
951 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
952 win = gaim_conversation_get_window(conv); | |
4362 | 953 gtkwin = GAIM_GTK_WINDOW(win); |
4359 | 954 |
955 if (event->keyval == GDK_Escape) { | |
956 if (convo_options & OPT_CONVO_ESC_CAN_CLOSE) { | |
957 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
958 gaim_conversation_destroy(conv); | |
959 } | |
960 } | |
961 else if (event->keyval == GDK_Page_Up) { | |
962 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
963 | |
964 if (!(event->state & GDK_CONTROL_MASK)) | |
965 gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml)); | |
966 } | |
967 else if (event->keyval == GDK_Page_Down) { | |
968 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
969 | |
970 if (!(event->state & GDK_CONTROL_MASK)) | |
971 gtk_imhtml_page_down(GTK_IMHTML(gtkconv->imhtml)); | |
972 } | |
973 else if ((event->keyval == GDK_F2) && | |
974 (convo_options & OPT_CONVO_F2_TOGGLES)) { | |
975 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), | |
976 !GTK_IMHTML(gtkconv->imhtml)->comments); | |
977 } | |
978 else if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter) { | |
979 if ((event->state & GDK_CONTROL_MASK) && | |
980 (convo_options & OPT_CONVO_CTL_ENTER)) { | |
981 | |
982 send_cb(NULL, conv); | |
983 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
984 | |
985 return TRUE; | |
986 } | |
987 else if (!(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) && | |
988 (convo_options & OPT_CONVO_ENTER_SENDS)) { | |
989 | |
990 send_cb(NULL, conv); | |
991 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
992 | |
993 return TRUE; | |
994 } | |
995 | |
996 return FALSE; | |
997 } | |
998 else if ((event->state & GDK_CONTROL_MASK) && (event->keyval == 'm')) { | |
999 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
1000 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, "\n", 1); | |
1001 } | |
1002 else if (event->state & GDK_CONTROL_MASK) { | |
1003 switch (event->keyval) { | |
1004 case GDK_Up: | |
1005 if (!conv->send_history) | |
1006 break; | |
1007 | |
1008 if (!conv->send_history->prev) { | |
1009 GtkTextIter start, end; | |
1010 | |
1011 if (conv->send_history->data) | |
1012 g_free(conv->send_history->data); | |
1013 | |
1014 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, | |
1015 &start); | |
1016 gtk_text_buffer_get_end_iter(gtkconv->entry_buffer, &end); | |
1017 | |
1018 conv->send_history->data = | |
1019 gtk_text_buffer_get_text(gtkconv->entry_buffer, | |
1020 &start, &end, FALSE); | |
1021 } | |
1022 | |
1023 if (conv->send_history->next && | |
1024 conv->send_history->next->data) { | |
1025 | |
1026 conv->send_history = conv->send_history->next; | |
1027 gtk_text_buffer_set_text(gtkconv->entry_buffer, | |
1028 conv->send_history->data, -1); | |
1029 } | |
1030 | |
1031 break; | |
1032 | |
1033 case GDK_Down: | |
1034 if (!conv->send_history) | |
1035 break; | |
1036 | |
1037 if (conv->send_history->prev) { | |
1038 conv->send_history = conv->send_history->prev; | |
1039 | |
1040 if (conv->send_history->data) | |
1041 gtk_text_buffer_set_text(gtkconv->entry_buffer, | |
1042 conv->send_history->data, -1); | |
1043 } | |
1044 | |
1045 break; | |
1046 } | |
1047 | |
1048 if (convo_options & OPT_CONVO_CTL_CHARS) { | |
1049 switch (event->keyval) { | |
1050 case 'i': | |
1051 case 'I': | |
4685 | 1052 set_toggle(gtkconv->toolbar.italic, |
4359 | 1053 !gtk_toggle_button_get_active( |
1054 GTK_TOGGLE_BUTTON(gtkconv->toolbar.italic))); | |
1055 | |
1056 g_signal_stop_emission_by_name(G_OBJECT(entry), | |
1057 "key_press_event"); | |
1058 break; | |
1059 | |
1060 case 'u': /* ctrl-u is GDK_Clear, which clears the line. */ | |
1061 case 'U': | |
4685 | 1062 set_toggle(gtkconv->toolbar.underline, |
4359 | 1063 !gtk_toggle_button_get_active( |
1064 GTK_TOGGLE_BUTTON(gtkconv->toolbar.underline))); | |
1065 | |
1066 g_signal_stop_emission_by_name(G_OBJECT(entry), | |
1067 "key_press_event"); | |
1068 break; | |
1069 | |
1070 case 'b': /* ctrl-b is GDK_Left, which moves backwards. */ | |
1071 case 'B': | |
4685 | 1072 set_toggle(gtkconv->toolbar.bold, |
4359 | 1073 !gtk_toggle_button_get_active( |
1074 GTK_TOGGLE_BUTTON(gtkconv->toolbar.bold))); | |
1075 | |
1076 g_signal_stop_emission_by_name(G_OBJECT(entry), | |
1077 "key_press_event"); | |
1078 break; | |
1079 | |
1080 case '-': | |
1081 do_small(NULL, gtkconv); | |
1082 | |
1083 g_signal_stop_emission_by_name(G_OBJECT(entry), | |
1084 "key_press_event"); | |
1085 break; | |
1086 | |
1087 case '=': | |
1088 case '+': | |
1089 do_big(NULL, gtkconv); | |
1090 | |
1091 g_signal_stop_emission_by_name(G_OBJECT(entry), | |
1092 "key_press_event"); | |
1093 break; | |
1094 | |
1095 case '0': | |
4685 | 1096 set_toggle(gtkconv->toolbar.normal_size, |
1097 !gtk_toggle_button_get_active( | |
1098 GTK_TOGGLE_BUTTON(gtkconv->toolbar.normal_size))); | |
4359 | 1099 |
1100 g_signal_stop_emission_by_name(G_OBJECT(entry), | |
1101 "key_press_event"); | |
1102 break; | |
1103 | |
1104 case 'f': | |
1105 case 'F': | |
4685 | 1106 set_toggle(gtkconv->toolbar.font, |
4359 | 1107 !gtk_toggle_button_get_active( |
4685 | 1108 GTK_TOGGLE_BUTTON(gtkconv->toolbar.font))); |
4359 | 1109 |
1110 g_signal_stop_emission_by_name(G_OBJECT(entry), | |
1111 "key_press_event"); | |
1112 break; | |
1113 } | |
1114 } | |
1115 | |
1116 if (convo_options & OPT_CONVO_CTL_SMILEYS) { | |
1117 char buf[7]; | |
1118 | |
1119 *buf = '\0'; | |
1120 | |
1121 switch (event->keyval) { | |
1122 case '1': strcpy(buf, ":-)"); break; | |
1123 case '2': strcpy(buf, ":-("); break; | |
1124 case '3': strcpy(buf, ";-)"); break; | |
1125 case '4': strcpy(buf, ":-P"); break; | |
1126 case '5': strcpy(buf, "=-O"); break; | |
1127 case '6': strcpy(buf, ":-*"); break; | |
1128 case '7': strcpy(buf, ">:o"); break; | |
1129 case '8': strcpy(buf, "8-)"); break; | |
1130 case '!': strcpy(buf, ":-$"); break; | |
1131 case '@': strcpy(buf, ":-!"); break; | |
1132 case '#': strcpy(buf, ":-["); break; | |
1133 case '$': strcpy(buf, "O:-)"); break; | |
1134 case '%': strcpy(buf, ":-/"); break; | |
1135 case '^': strcpy(buf, ":'("); break; | |
1136 case '&': strcpy(buf, ":-X"); break; | |
1137 case '*': strcpy(buf, ":-D"); break; | |
1138 default: break; | |
1139 } | |
1140 | |
1141 if (*buf) { | |
1142 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, | |
1143 buf, -1); | |
1144 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
1145 } | |
1146 } | |
1147 | |
1148 if (event->keyval == 'l') { | |
1149 gtk_imhtml_clear(GTK_IMHTML(gtkconv->imhtml)); | |
1150 g_string_free(conv->history, TRUE); | |
1151 conv->history = g_string_new(""); | |
1152 } | |
1153 else if ((event->keyval == 'w') && | |
1154 (convo_options & OPT_CONVO_CTL_W_CLOSES)) { | |
1155 | |
1156 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
1157 gaim_conversation_destroy(conv); | |
1158 return TRUE; | |
1159 } | |
1160 else if (event->keyval == 'n') { | |
1161 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
1162 | |
1163 show_im_dialog(); | |
1164 } | |
1165 else if (event->keyval == 'z') { | |
1166 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
1167 | |
4361
25d5b2a7545f
[gaim-migrate @ 4627]
Christian Hammond <chipx86@chipx86.com>
parents:
4360
diff
changeset
|
1168 #ifndef _WIN32 |
4359 | 1169 XIconifyWindow(GDK_DISPLAY(), |
1170 GDK_WINDOW_XWINDOW(gtkwin->window->window), | |
4362 | 1171 ((_XPrivDisplay)GDK_DISPLAY())->default_screen); |
4359 | 1172 #endif |
1173 } | |
1174 else if (event->keyval == '[') { | |
1175 gaim_window_switch_conversation(win, | |
1176 gaim_conversation_get_index(conv) - 1); | |
1177 | |
1178 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
1179 } | |
1180 else if (event->keyval == ']') { | |
1181 gaim_window_switch_conversation(win, | |
1182 gaim_conversation_get_index(conv) + 1); | |
1183 | |
1184 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
1185 } | |
1186 else if (event->keyval == GDK_Tab) { | |
1187 move_next_tab(conv); | |
1188 | |
1189 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
1190 | |
1191 return TRUE; | |
1192 } | |
1193 } | |
1194 else if ((event->keyval == GDK_Tab) && | |
1195 gaim_conversation_get_type(conv) == GAIM_CONV_CHAT && | |
1196 (chat_options & OPT_CHAT_TAB_COMPLETE)) { | |
1197 | |
1198 tab_complete(conv); | |
1199 | |
1200 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
1201 | |
1202 return TRUE; | |
1203 } | |
1204 else if ((event->state & GDK_MOD1_MASK) && | |
1205 event->keyval > '0' && event->keyval <= '9') { | |
1206 | |
1207 gaim_window_switch_conversation(win, event->keyval - '1'); | |
1208 | |
1209 g_signal_stop_emission_by_name(G_OBJECT(entry), "key_press_event"); | |
1210 } | |
1211 | |
1212 return FALSE; | |
1213 } | |
1214 | |
1215 /* | |
1216 * NOTE: | |
1217 * This guy just kills a single right click from being propagated any | |
1218 * further. I have no idea *why* we need this, but we do ... It | |
1219 * prevents right clicks on the GtkTextView in a convo dialog from | |
1220 * going all the way down to the notebook. I suspect a bug in | |
1221 * GtkTextView, but I'm not ready to point any fingers yet. | |
1222 */ | |
1223 static gboolean | |
1224 entry_stop_rclick_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) | |
1225 { | |
1226 if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { | |
1227 /* Right single click */ | |
1228 g_signal_stop_emission_by_name(G_OBJECT(widget), "button_press_event"); | |
1229 | |
1230 return TRUE; | |
1231 } | |
1232 | |
1233 return FALSE; | |
1234 } | |
1235 | |
1236 static void | |
4673 | 1237 menu_conv_sel_send_cb(GObject *m, gpointer data) |
4359 | 1238 { |
1239 struct gaim_window *win = g_object_get_data(m, "user_data"); | |
4673 | 1240 struct gaim_account *account = g_object_get_data(m, "gaim_account"); |
4359 | 1241 struct gaim_conversation *conv; |
1242 | |
1243 conv = gaim_window_get_active_conversation(win); | |
1244 | |
4491 | 1245 gaim_conversation_set_account(conv, account); |
4359 | 1246 } |
1247 | |
1248 static void | |
1249 insert_text_cb(GtkTextBuffer *textbuffer, GtkTextIter *position, | |
1250 gchar *new_text, gint new_text_length, gpointer user_data) | |
1251 { | |
1252 struct gaim_conversation *conv = (struct gaim_conversation *)user_data; | |
1253 | |
1254 if (conv == NULL) | |
1255 return; | |
1256 | |
1257 if (misc_options & OPT_MISC_STEALTH_TYPING) | |
1258 return; | |
1259 | |
1260 got_typing_keypress(conv, (gtk_text_iter_is_start(position) && | |
1261 gtk_text_iter_is_end(position))); | |
1262 } | |
1263 | |
1264 static void | |
1265 delete_text_cb(GtkTextBuffer *textbuffer, GtkTextIter *start_pos, | |
1266 GtkTextIter *end_pos, gpointer user_data) | |
1267 { | |
1268 struct gaim_conversation *conv = (struct gaim_conversation *)user_data; | |
1269 struct gaim_im *im; | |
1270 | |
1271 if (conv == NULL) | |
1272 return; | |
1273 | |
1274 if (misc_options & OPT_MISC_STEALTH_TYPING) | |
1275 return; | |
1276 | |
1277 im = GAIM_IM(conv); | |
1278 | |
1279 if (gtk_text_iter_is_start(start_pos) && gtk_text_iter_is_end(end_pos)) { | |
1280 | |
1281 /* We deleted all the text, so turn off typing. */ | |
1282 if (gaim_im_get_type_again_timeout(im)) | |
1283 gaim_im_stop_type_again_timeout(im); | |
1284 | |
1285 /* XXX The (char *) should go away! Somebody add consts to stuff! */ | |
1286 serv_send_typing(gaim_conversation_get_gc(conv), | |
1287 (char *)gaim_conversation_get_name(conv), | |
1288 NOT_TYPING); | |
1289 } | |
1290 else { | |
1291 /* We're deleting, but not all of it, so it counts as typing. */ | |
1292 got_typing_keypress(conv, FALSE); | |
1293 } | |
1294 } | |
1295 | |
1296 static void | |
1297 notebook_init_grab(struct gaim_gtk_window *gtkwin, GtkWidget *widget) | |
1298 { | |
1299 static GdkCursor *cursor = NULL; | |
1300 | |
1301 gtkwin->in_drag = TRUE; | |
1302 | |
1303 if (gtkwin->drag_leave_signal) { | |
1304 g_signal_handler_disconnect(G_OBJECT(widget), | |
1305 gtkwin->drag_leave_signal); | |
1306 | |
1307 gtkwin->drag_leave_signal = 0; | |
1308 } | |
1309 | |
1310 if (cursor == NULL) | |
1311 cursor = gdk_cursor_new(GDK_FLEUR); | |
1312 | |
1313 /* Grab the pointer */ | |
1314 gtk_grab_add(gtkwin->notebook); | |
4803
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
1315 |
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
1316 if (!gdk_pointer_is_grabbed()) |
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
1317 gdk_pointer_grab(gtkwin->notebook->window, FALSE, |
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
1318 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, |
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
1319 NULL, cursor, GDK_CURRENT_TIME); |
4359 | 1320 } |
1321 | |
1322 static gboolean | |
1323 notebook_motion_cb(GtkWidget *widget, GdkEventButton *e, | |
1324 struct gaim_window *win) | |
1325 { | |
1326 struct gaim_gtk_window *gtkwin; | |
1327 | |
1328 gtkwin = GAIM_GTK_WINDOW(win); | |
1329 | |
1330 /* | |
1331 * Make sure the user moved the mouse far enough for the | |
1332 * drag to be initiated. | |
1333 */ | |
1334 if (gtkwin->in_predrag) { | |
1335 if (e->x_root < gtkwin->drag_min_x || | |
1336 e->x_root >= gtkwin->drag_max_x || | |
1337 e->y_root < gtkwin->drag_min_y || | |
1338 e->y_root >= gtkwin->drag_max_y) { | |
1339 | |
1340 gtkwin->in_predrag = FALSE; | |
1341 notebook_init_grab(gtkwin, widget); | |
1342 } | |
1343 } | |
1344 else { /* Otherwise, draw the arrows. */ | |
1345 struct gaim_window *dest_win; | |
1346 struct gaim_gtk_window *dest_gtkwin; | |
1347 GtkNotebook *dest_notebook; | |
1348 GtkWidget *tab, *last_vis_tab = NULL; | |
1349 gint nb_x, nb_y, page_num, i, last_vis_tab_loc = -1; | |
1350 gint arrow1_x, arrow1_y, arrow2_x, arrow2_y; | |
1351 gboolean horiz_tabs = FALSE, tab_found = FALSE; | |
1352 GList *l; | |
1353 | |
1354 /* Get the window that the cursor is over. */ | |
1355 dest_win = gaim_gtkwin_get_at_xy(e->x_root, e->y_root); | |
1356 | |
1357 if (dest_win == NULL) { | |
1358 dnd_hints_hide_all(); | |
1359 | |
1360 return TRUE; | |
1361 } | |
1362 | |
1363 dest_gtkwin = GAIM_GTK_WINDOW(dest_win); | |
1364 | |
1365 dest_notebook = GTK_NOTEBOOK(dest_gtkwin->notebook); | |
1366 | |
1367 gdk_window_get_origin(GTK_WIDGET(dest_notebook)->window, &nb_x, &nb_y); | |
1368 | |
1369 arrow1_x = arrow2_x = nb_x; | |
1370 arrow1_y = arrow2_y = nb_y; | |
1371 | |
1372 page_num = gaim_gtkconv_get_dest_tab_at_xy(dest_win, | |
1373 e->x_root, e->y_root); | |
1374 | |
1375 if (gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_TOP || | |
1376 gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_BOTTOM) { | |
1377 | |
1378 horiz_tabs = TRUE; | |
1379 } | |
1380 | |
1381 /* Find out where to put the arrows. */ | |
1382 for (l = gaim_window_get_conversations(dest_win), i = 0; | |
1383 l != NULL; | |
1384 l = l->next, i++) { | |
1385 | |
1386 struct gaim_conversation *conv = l->data; | |
1387 | |
1388 tab = GAIM_GTK_CONVERSATION(conv)->tabby; | |
1389 | |
1390 /* | |
1391 * If this is the correct tab, record the positions | |
1392 * for the arrows. | |
1393 */ | |
1394 if (i == page_num) { | |
1395 if (horiz_tabs) { | |
1396 arrow1_x = arrow2_x = nb_x + tab->allocation.x; | |
1397 arrow1_y = nb_y + tab->allocation.y; | |
1398 arrow2_y = nb_y + tab->allocation.y + | |
1399 tab->allocation.height; | |
1400 } | |
1401 else { | |
1402 arrow1_x = nb_x + tab->allocation.x; | |
1403 arrow2_x = nb_x + tab->allocation.x + | |
1404 tab->allocation.width; | |
1405 arrow1_y = arrow2_y = nb_y + tab->allocation.y; | |
1406 } | |
1407 | |
1408 tab_found = TRUE; | |
1409 break; | |
1410 } | |
1411 else { /* Keep track of the right-most tab that we see. */ | |
1412 if (horiz_tabs && tab->allocation.x > last_vis_tab_loc) { | |
1413 last_vis_tab = tab; | |
1414 last_vis_tab_loc = tab->allocation.x; | |
1415 } | |
1416 else if (!horiz_tabs && tab->allocation.y > last_vis_tab_loc) { | |
1417 last_vis_tab = tab; | |
1418 last_vis_tab_loc = tab->allocation.y; | |
1419 } | |
1420 } | |
1421 } | |
1422 | |
1423 /* | |
1424 * If we didn't find the tab, then we'll just place the | |
1425 * arrows to the right/bottom of the last visible tab. | |
1426 */ | |
1427 if (!tab_found && last_vis_tab) { | |
1428 if (horiz_tabs) { | |
1429 arrow1_x = arrow2_x = nb_x + last_vis_tab->allocation.x + | |
1430 last_vis_tab->allocation.width; | |
1431 arrow1_y = nb_y + last_vis_tab->allocation.y; | |
1432 arrow2_y = nb_y + last_vis_tab->allocation.y + | |
1433 last_vis_tab->allocation.height; | |
1434 } | |
1435 else { | |
1436 arrow1_x = nb_x + last_vis_tab->allocation.x; | |
1437 arrow2_x = nb_x + last_vis_tab->allocation.x + | |
1438 last_vis_tab->allocation.width; | |
1439 arrow1_y = arrow2_y = nb_y + last_vis_tab->allocation.y + | |
1440 last_vis_tab->allocation.height; | |
1441 } | |
1442 } | |
1443 | |
1444 if (horiz_tabs) { | |
1445 dnd_hints_show(HINT_ARROW_DOWN, arrow1_x, arrow1_y); | |
1446 dnd_hints_show(HINT_ARROW_UP, arrow2_x, arrow2_y); | |
1447 } | |
1448 else { | |
1449 dnd_hints_show(HINT_ARROW_RIGHT, arrow1_x, arrow1_y); | |
1450 dnd_hints_show(HINT_ARROW_LEFT, arrow2_x, arrow2_y); | |
1451 } | |
1452 } | |
1453 | |
1454 return TRUE; | |
1455 } | |
1456 | |
1457 static gboolean | |
1458 notebook_leave_cb(GtkWidget *widget, GdkEventCrossing *e, | |
1459 struct gaim_window *win) | |
1460 { | |
1461 struct gaim_gtk_window *gtkwin; | |
1462 | |
1463 gtkwin = GAIM_GTK_WINDOW(win); | |
1464 | |
1465 if (gtkwin->in_drag) | |
1466 return FALSE; | |
1467 | |
1468 if (e->x_root < gtkwin->drag_min_x || | |
1469 e->x_root >= gtkwin->drag_max_x || | |
1470 e->y_root < gtkwin->drag_min_y || | |
1471 e->y_root >= gtkwin->drag_max_y) { | |
1472 | |
1473 gtkwin->in_predrag = FALSE; | |
1474 notebook_init_grab(gtkwin, widget); | |
1475 } | |
1476 | |
1477 return TRUE; | |
1478 } | |
1479 | |
1480 /* | |
1481 * THANK YOU GALEON! | |
1482 */ | |
1483 static gboolean | |
1484 notebook_press_cb(GtkWidget *widget, GdkEventButton *e, | |
1485 struct gaim_window *win) | |
1486 { | |
1487 struct gaim_gtk_window *gtkwin; | |
1488 gint nb_x, nb_y, x_rel, y_rel; | |
1489 GList *l; | |
1490 int tab_clicked; | |
1491 | |
1492 if (e->button != 1 || e->type != GDK_BUTTON_PRESS) | |
1493 return FALSE; | |
1494 | |
1495 gtkwin = GAIM_GTK_WINDOW(win); | |
1496 | |
1497 if (gtkwin->in_drag) { | |
1498 debug_printf("Already in the middle of a window " | |
4803
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
1499 "drag at tab_press_cb\n"); |
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
1500 return TRUE; |
4359 | 1501 } |
1502 | |
1503 /* | |
1504 * Make sure a tab was actually clicked. The arrow buttons | |
1505 * mess things up. | |
1506 */ | |
1507 tab_clicked = gaim_gtkconv_get_tab_at_xy(win, e->x_root, e->y_root); | |
1508 | |
1509 if (tab_clicked == -1) | |
1510 return FALSE; | |
1511 | |
1512 /* | |
1513 * Get the relative position of the press event, with regards to | |
1514 * the position of the notebook. | |
1515 */ | |
1516 gdk_window_get_origin(gtkwin->notebook->window, &nb_x, &nb_y); | |
1517 | |
1518 x_rel = e->x_root - nb_x; | |
1519 y_rel = e->y_root - nb_y; | |
1520 | |
1521 /* Reset the min/max x/y */ | |
1522 gtkwin->drag_min_x = 0; | |
1523 gtkwin->drag_min_y = 0; | |
1524 gtkwin->drag_max_x = 0; | |
1525 gtkwin->drag_max_y = 0; | |
1526 | |
1527 /* Find out which tab was dragged. */ | |
1528 for (l = gaim_window_get_conversations(win); l != NULL; l = l->next) { | |
1529 struct gaim_conversation *conv = l->data; | |
1530 GtkWidget *tab = GAIM_GTK_CONVERSATION(conv)->tabby; | |
1531 | |
1532 if (!GTK_WIDGET_VISIBLE(tab)) | |
1533 continue; | |
1534 | |
1535 if (tab->allocation.x > x_rel || tab->allocation.y > y_rel) | |
1536 break; | |
1537 | |
1538 /* Save the borders of the tab. */ | |
1539 gtkwin->drag_min_x = tab->allocation.x + nb_x; | |
1540 gtkwin->drag_min_y = tab->allocation.y + nb_y; | |
1541 gtkwin->drag_max_x = tab->allocation.width + gtkwin->drag_min_x; | |
1542 gtkwin->drag_max_y = tab->allocation.height + gtkwin->drag_min_y; | |
1543 } | |
1544 | |
1545 /* Make sure the click occurred in the tab. */ | |
1546 if (e->x_root < gtkwin->drag_min_x || | |
1547 e->x_root >= gtkwin->drag_max_x || | |
1548 e->y_root < gtkwin->drag_min_y || | |
1549 e->y_root >= gtkwin->drag_max_y) { | |
1550 | |
1551 return FALSE; | |
1552 } | |
1553 | |
1554 gtkwin->in_predrag = TRUE; | |
1555 | |
1556 /* Connect the new motion signals. */ | |
1557 gtkwin->drag_motion_signal = | |
1558 g_signal_connect(G_OBJECT(widget), "motion_notify_event", | |
1559 G_CALLBACK(notebook_motion_cb), win); | |
1560 | |
1561 gtkwin->drag_leave_signal = | |
1562 g_signal_connect(G_OBJECT(widget), "leave_notify_event", | |
1563 G_CALLBACK(notebook_leave_cb), win); | |
1564 | |
1565 return FALSE; | |
1566 } | |
1567 | |
1568 static gboolean | |
1569 notebook_release_cb(GtkWidget *widget, GdkEventButton *e, | |
1570 struct gaim_window *win) | |
1571 { | |
1572 struct gaim_window *dest_win; | |
1573 struct gaim_gtk_window *gtkwin; | |
1574 struct gaim_gtk_window *dest_gtkwin; | |
1575 struct gaim_conversation *conv; | |
1576 GtkNotebook *dest_notebook; | |
1577 gint dest_page_num; | |
1578 | |
1579 /* | |
1580 * Don't check to make sure that the event's window matches the | |
1581 * widget's, because we may be getting an event passed on from the | |
1582 * close button. | |
1583 */ | |
1584 if (e->button != 1 && e->type != GDK_BUTTON_RELEASE) | |
1585 return FALSE; | |
1586 | |
1587 if (gdk_pointer_is_grabbed()) { | |
1588 gdk_pointer_ungrab(GDK_CURRENT_TIME); | |
1589 gtk_grab_remove(widget); | |
1590 } | |
1591 | |
1592 gtkwin = GAIM_GTK_WINDOW(win); | |
1593 | |
4803
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
1594 if (!gtkwin->in_predrag && !gtkwin->in_drag) |
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
1595 return FALSE; |
4359 | 1596 |
1597 /* Disconnect the motion signal. */ | |
1598 if (gtkwin->drag_motion_signal) { | |
1599 g_signal_handler_disconnect(G_OBJECT(widget), | |
1600 gtkwin->drag_motion_signal); | |
1601 | |
1602 gtkwin->drag_motion_signal = 0; | |
1603 } | |
1604 | |
1605 /* | |
1606 * If we're in a pre-drag, we'll also need to disconnect the leave | |
1607 * signal. | |
1608 */ | |
1609 if (gtkwin->in_predrag) { | |
1610 gtkwin->in_predrag = FALSE; | |
1611 | |
1612 if (gtkwin->drag_leave_signal) { | |
1613 g_signal_handler_disconnect(G_OBJECT(widget), | |
1614 gtkwin->drag_leave_signal); | |
1615 | |
1616 gtkwin->drag_leave_signal = 0; | |
1617 } | |
1618 } | |
1619 | |
1620 /* If we're not in drag... */ | |
1621 /* We're perfectly normal people! */ | |
4803
6f04901ef729
[gaim-migrate @ 5123]
Christian Hammond <chipx86@chipx86.com>
parents:
4793
diff
changeset
|
1622 if (!gtkwin->in_drag) |
4359 | 1623 return FALSE; |
1624 | |
1625 gtkwin->in_drag = FALSE; | |
1626 | |
1627 dnd_hints_hide_all(); | |
1628 | |
4369
7e1fb422e5fd
[gaim-migrate @ 4635]
Christian Hammond <chipx86@chipx86.com>
parents:
4368
diff
changeset
|
1629 dest_win = gaim_gtkwin_get_at_xy(e->x_root, e->y_root); |
4359 | 1630 |
1631 conv = gaim_window_get_active_conversation(win); | |
1632 | |
1633 if (dest_win == NULL) { | |
1634 if (gaim_window_get_conversation_count(win) < 2) | |
1635 return FALSE; | |
1636 | |
1637 if (gaim_window_get_conversation_count(win) > 1) { | |
1638 /* Make a new window to stick this to. */ | |
1639 struct gaim_window *new_win; | |
4748
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1640 struct gaim_gtk_window *new_gtkwin; |
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1641 gint win_width, win_height; |
4359 | 1642 |
1643 new_win = gaim_window_new(); | |
1644 gaim_window_remove_conversation(win, | |
1645 gaim_conversation_get_index(conv)); | |
1646 gaim_window_add_conversation(new_win, conv); | |
4748
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1647 |
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1648 new_gtkwin = GAIM_GTK_WINDOW(new_win); |
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1649 |
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1650 gtk_window_get_size(GTK_WINDOW(new_gtkwin->window), |
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1651 &win_width, &win_height); |
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1652 |
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1653 gtk_window_move(GTK_WINDOW(new_gtkwin->window), |
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1654 e->x_root - (win_width / 2), |
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1655 e->y_root - (win_height / 2)); |
d3c09ddfd3aa
[gaim-migrate @ 5063]
Christian Hammond <chipx86@chipx86.com>
parents:
4736
diff
changeset
|
1656 |
4359 | 1657 gaim_window_show(new_win); |
1658 } | |
1659 | |
1660 return TRUE; | |
1661 } | |
1662 | |
4369
7e1fb422e5fd
[gaim-migrate @ 4635]
Christian Hammond <chipx86@chipx86.com>
parents:
4368
diff
changeset
|
1663 dest_gtkwin = GAIM_GTK_WINDOW(dest_win); |
7e1fb422e5fd
[gaim-migrate @ 4635]
Christian Hammond <chipx86@chipx86.com>
parents:
4368
diff
changeset
|
1664 |
4359 | 1665 /* Get the destination notebook. */ |
1666 dest_notebook = GTK_NOTEBOOK(gtkwin->notebook); | |
1667 | |
1668 /* Get the destination page number. */ | |
1669 dest_page_num = gaim_gtkconv_get_dest_tab_at_xy(dest_win, | |
1670 e->x_root, e->y_root); | |
1671 | |
1672 if (win == dest_win) { | |
1673 gaim_window_move_conversation(win, | |
1674 gaim_conversation_get_index(conv), dest_page_num); | |
1675 } | |
1676 else { | |
1677 size_t pos; | |
1678 | |
1679 gaim_window_remove_conversation(win, | |
1680 gaim_conversation_get_index(conv)); | |
1681 | |
1682 pos = gaim_window_add_conversation(dest_win, conv); | |
1683 | |
1684 gaim_window_move_conversation(dest_win, pos, dest_page_num); | |
1685 | |
1686 gaim_window_switch_conversation(dest_win, dest_page_num); | |
1687 } | |
1688 | |
1689 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); | |
1690 | |
1691 return TRUE; | |
1692 } | |
1693 | |
1694 static void | |
1695 switch_conv_cb(GtkNotebook *notebook, GtkWidget *page, gint page_num, | |
1696 gpointer user_data) | |
1697 { | |
1698 struct gaim_window *win; | |
1699 struct gaim_conversation *conv; | |
1700 struct gaim_gtk_conversation *gtkconv; | |
1701 struct gaim_gtk_window *gtkwin; | |
1702 struct gaim_connection *gc; | |
1703 | |
1704 win = (struct gaim_window *)user_data; | |
1705 | |
4598
a064e437d5eb
[gaim-migrate @ 4883]
Christian Hammond <chipx86@chipx86.com>
parents:
4596
diff
changeset
|
1706 conv = gaim_window_get_conversation_at(win, page_num); |
a064e437d5eb
[gaim-migrate @ 4883]
Christian Hammond <chipx86@chipx86.com>
parents:
4596
diff
changeset
|
1707 |
a064e437d5eb
[gaim-migrate @ 4883]
Christian Hammond <chipx86@chipx86.com>
parents:
4596
diff
changeset
|
1708 if (conv == NULL) |
a064e437d5eb
[gaim-migrate @ 4883]
Christian Hammond <chipx86@chipx86.com>
parents:
4596
diff
changeset
|
1709 return; |
a064e437d5eb
[gaim-migrate @ 4883]
Christian Hammond <chipx86@chipx86.com>
parents:
4596
diff
changeset
|
1710 |
4359 | 1711 gc = gaim_conversation_get_gc(conv); |
1712 gtkwin = GAIM_GTK_WINDOW(win); | |
1713 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1714 | |
1715 gaim_conversation_set_unseen(conv, GAIM_UNSEEN_NONE); | |
1716 | |
4364
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
1717 if (gc != NULL) { |
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
1718 gtk_widget_set_sensitive(gtkwin->menu.insert_link, TRUE); |
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
1719 } |
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
1720 |
4359 | 1721 /* Update the menubar */ |
1722 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { | |
1723 gtk_widget_set_sensitive(gtkwin->menu.view_history, TRUE); | |
1724 gtk_widget_set_sensitive(gtkwin->menu.insert_image, | |
1725 (gc && gc->prpl->options & OPT_PROTO_IM_IMAGE)); | |
1726 | |
1727 if (gtkwin->menu.send_as != NULL) | |
4685 | 1728 g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); |
4359 | 1729 } |
1730 else { | |
1731 gtk_widget_set_sensitive(gtkwin->menu.view_history, FALSE); | |
1732 gtk_widget_set_sensitive(gtkwin->menu.insert_image, FALSE); | |
1733 | |
1734 if (gtkwin->menu.send_as != NULL) | |
1735 gtk_widget_hide(gtkwin->menu.send_as); | |
1736 } | |
1737 | |
4736 | 1738 update_typing_icon(conv); |
1739 | |
4359 | 1740 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkwin->menu.logging), |
1741 gaim_conversation_is_logging(conv)); | |
1742 | |
1743 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkwin->menu.sounds), | |
1744 gtkconv->make_sound); | |
1745 | |
1746 gtk_widget_grab_focus(gtkconv->entry); | |
4681 | 1747 |
4965 | 1748 gtk_window_set_title(GTK_WINDOW(gtkwin->window), |
1749 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label))); | |
4359 | 1750 } |
1751 | |
1752 /************************************************************************** | |
1753 * Utility functions | |
1754 **************************************************************************/ | |
1755 static void | |
1756 do_bold(GtkWidget *bold, struct gaim_gtk_conversation *gtkconv) | |
1757 { | |
1758 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bold))) | |
1759 gaim_gtk_surround(gtkconv, "<B>", "</B>"); | |
1760 else | |
1761 gaim_gtk_advance_past(gtkconv, "<B>", "</B>"); | |
1762 | |
1763 gtk_widget_grab_focus(gtkconv->entry); | |
1764 } | |
1765 | |
1766 static void | |
1767 do_italic(GtkWidget *italic, struct gaim_gtk_conversation *gtkconv) | |
1768 { | |
1769 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(italic))) | |
1770 gaim_gtk_surround(gtkconv, "<I>", "</I>"); | |
1771 else | |
1772 gaim_gtk_advance_past(gtkconv, "<I>", "</I>"); | |
1773 | |
1774 gtk_widget_grab_focus(gtkconv->entry); | |
1775 } | |
1776 | |
1777 static void | |
1778 do_underline(GtkWidget *underline, struct gaim_gtk_conversation *gtkconv) | |
1779 { | |
1780 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(underline))) | |
1781 gaim_gtk_surround(gtkconv, "<U>", "</U>"); | |
1782 else | |
1783 gaim_gtk_advance_past(gtkconv, "<U>", "</U>"); | |
1784 | |
1785 gtk_widget_grab_focus(gtkconv->entry); | |
1786 } | |
1787 | |
1788 static void | |
1789 do_small(GtkWidget *small, struct gaim_gtk_conversation *gtkconv) | |
1790 { | |
5049 | 1791 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(small))) |
1792 gaim_gtk_surround(gtkconv, "<FONT SIZE=\"1\">", "</FONT>"); | |
1793 else | |
1794 gaim_gtk_advance_past(gtkconv, "<FONT SIZE=\"1\">", "</FONT>"); | |
4359 | 1795 |
1796 gtk_widget_grab_focus(gtkconv->entry); | |
1797 } | |
1798 | |
1799 static void | |
5049 | 1800 do_normal(GtkWidget *normal, struct gaim_gtk_conversation *gtkconv) |
4359 | 1801 { |
5049 | 1802 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(normal))) |
1803 gaim_gtk_surround(gtkconv, "<FONT SIZE=\"3\">", "</FONT>"); | |
1804 else | |
1805 gaim_gtk_advance_past(gtkconv, "<FONT SIZE=\"3\">", "</FONT>"); | |
4359 | 1806 |
1807 gtk_widget_grab_focus(gtkconv->entry); | |
1808 } | |
1809 | |
1810 static void | |
5049 | 1811 do_big(GtkWidget *large, struct gaim_gtk_conversation *gtkconv) |
4359 | 1812 { |
5049 | 1813 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(large))) |
1814 gaim_gtk_surround(gtkconv, "<FONT SIZE=\"5\">", "</FONT>"); | |
1815 else | |
1816 gaim_gtk_advance_past(gtkconv, "<FONT SIZE=\"5\">", "</FONT>"); | |
4359 | 1817 |
1818 gtk_widget_grab_focus(gtkconv->entry); | |
1819 } | |
1820 | |
1821 static void | |
1822 toggle_font(GtkWidget *font, struct gaim_conversation *conv) | |
1823 { | |
1824 struct gaim_gtk_conversation *gtkconv; | |
1825 | |
1826 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1827 | |
1828 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(font))) | |
1829 show_font_dialog(conv, font); | |
1830 else if (gtkconv->dialogs.fg_color != NULL) | |
1831 cancel_font(font, conv); | |
1832 else | |
1833 gaim_gtk_advance_past(gtkconv, "<FONT FACE>", "</FONT>"); | |
1834 } | |
1835 | |
1836 static void | |
1837 toggle_fg_color(GtkWidget *color, struct gaim_conversation *conv) | |
1838 { | |
1839 struct gaim_gtk_conversation *gtkconv; | |
1840 | |
1841 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1842 | |
1843 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(color))) | |
1844 show_fgcolor_dialog(conv, color); | |
1845 else if (gtkconv->dialogs.fg_color != NULL) | |
1846 cancel_fgcolor(color, conv); | |
1847 else | |
1848 gaim_gtk_advance_past(gtkconv, "<FONT COLOR>", "</FONT>"); | |
1849 } | |
1850 | |
1851 static void | |
1852 toggle_bg_color(GtkWidget *color, struct gaim_conversation *conv) | |
1853 { | |
1854 struct gaim_gtk_conversation *gtkconv; | |
1855 | |
1856 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1857 | |
1858 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(color))) | |
1859 show_bgcolor_dialog(conv, color); | |
1860 else if (gtkconv->dialogs.bg_color != NULL) | |
1861 cancel_bgcolor(color, conv); | |
1862 else | |
1863 gaim_gtk_advance_past(gtkconv, "<BODY BGCOLOR>", "</BODY>"); | |
1864 } | |
1865 | |
1866 static void | |
1867 check_everything(GtkTextBuffer *buffer) | |
1868 { | |
1869 struct gaim_conversation *conv; | |
1870 struct gaim_gtk_conversation *gtkconv; | |
1871 | |
1872 conv = (struct gaim_conversation *)g_object_get_data(G_OBJECT(buffer), | |
1873 "user_data"); | |
1874 | |
1875 if (conv == NULL) | |
1876 return; | |
1877 | |
1878 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1879 | |
1880 /* CONV TODO */ | |
1881 } | |
1882 | |
1883 static void | |
4685 | 1884 set_toggle(GtkWidget *tb, gboolean active) |
4359 | 1885 { |
1886 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tb), active); | |
1887 } | |
1888 | |
1889 static void | |
1890 got_typing_keypress(struct gaim_conversation *conv, gboolean first) | |
1891 { | |
1892 struct gaim_im *im; | |
4685 | 1893 |
4359 | 1894 /* |
1895 * We know we got something, so we at least have to make sure we don't | |
1896 * send TYPED any time soon. | |
1897 */ | |
1898 | |
1899 im = GAIM_IM(conv); | |
1900 | |
1901 if (gaim_im_get_type_again_timeout(im)) | |
1902 gaim_im_stop_type_again_timeout(im); | |
1903 | |
1904 gaim_im_start_type_again_timeout(im); | |
1905 | |
1906 if (first || (gaim_im_get_type_again(im) != 0 && | |
1907 time(NULL) > gaim_im_get_type_again(im))) { | |
1908 | |
1909 int timeout = serv_send_typing(gaim_conversation_get_gc(conv), | |
1910 (char *)gaim_conversation_get_name(conv), | |
1911 TYPING); | |
1912 | |
1913 if (timeout) | |
1914 gaim_im_set_type_again(im, time(NULL) + timeout); | |
1915 else | |
1916 gaim_im_set_type_again(im, 0); | |
1917 } | |
1918 } | |
1919 | |
4736 | 1920 static void |
1921 update_typing_icon(struct gaim_conversation *conv) | |
1922 { | |
1923 struct gaim_gtk_window *gtkwin; | |
1924 struct gaim_im *im = NULL; | |
4757 | 1925 struct gaim_gtk_conversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
4736 | 1926 |
1927 gtkwin = GAIM_GTK_WINDOW(gaim_conversation_get_window(conv)); | |
1928 | |
1929 if(gaim_conversation_get_type(conv) == GAIM_CONV_IM) | |
1930 im = GAIM_IM(conv); | |
1931 | |
1932 if(gtkwin->menu.typing_icon) { | |
1933 gtk_widget_destroy(gtkwin->menu.typing_icon); | |
1934 gtkwin->menu.typing_icon = NULL; | |
1935 } | |
1936 if(im && gaim_im_get_typing_state(im) == TYPING) { | |
1937 gtkwin->menu.typing_icon = gtk_image_menu_item_new(); | |
1938 gtk_image_menu_item_set_image( | |
1939 GTK_IMAGE_MENU_ITEM(gtkwin->menu.typing_icon), | |
1940 gtk_image_new_from_stock(GAIM_STOCK_TYPING, | |
1941 GTK_ICON_SIZE_MENU)); | |
4757 | 1942 gtk_tooltips_set_tip(gtkconv->tooltips, gtkwin->menu.typing_icon, |
4736 | 1943 _("User is typing..."), NULL); |
1944 } else if(im && gaim_im_get_typing_state(im) == TYPED) { | |
1945 gtkwin->menu.typing_icon = gtk_image_menu_item_new(); | |
1946 gtk_image_menu_item_set_image( | |
1947 GTK_IMAGE_MENU_ITEM(gtkwin->menu.typing_icon), | |
1948 gtk_image_new_from_stock(GAIM_STOCK_TYPED, | |
1949 GTK_ICON_SIZE_MENU)); | |
4757 | 1950 gtk_tooltips_set_tip(gtkconv->tooltips, gtkwin->menu.typing_icon, |
4736 | 1951 _("User has typed something and paused"), NULL); |
1952 } | |
1953 | |
1954 if(gtkwin->menu.typing_icon) { | |
1955 gtk_menu_item_set_right_justified( | |
1956 GTK_MENU_ITEM(gtkwin->menu.typing_icon), TRUE); | |
1957 gtk_widget_show_all(gtkwin->menu.typing_icon); | |
1958 gtk_menu_shell_append(GTK_MENU_SHELL(gtkwin->menu.menubar), | |
1959 gtkwin->menu.typing_icon); | |
1960 } | |
1961 } | |
1962 | |
4685 | 1963 static gboolean |
4359 | 1964 update_send_as_selection(struct gaim_window *win) |
1965 { | |
4491 | 1966 struct gaim_account *account; |
4359 | 1967 struct gaim_conversation *conv; |
1968 struct gaim_gtk_window *gtkwin; | |
1969 GtkWidget *menu; | |
1970 GList *child; | |
1971 | |
4849 | 1972 if (g_list_find(gaim_get_windows(), win) == NULL) |
1973 return FALSE; | |
1974 | |
4359 | 1975 conv = gaim_window_get_active_conversation(win); |
1976 | |
4786 | 1977 |
4359 | 1978 if (conv == NULL) |
4685 | 1979 return FALSE; |
4359 | 1980 |
4491 | 1981 account = gaim_conversation_get_account(conv); |
4359 | 1982 gtkwin = GAIM_GTK_WINDOW(win); |
1983 | |
4491 | 1984 if (account == NULL) |
4685 | 1985 return FALSE; |
4466
473de7371a97
[gaim-migrate @ 4741]
Christian Hammond <chipx86@chipx86.com>
parents:
4465
diff
changeset
|
1986 |
4364
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
1987 if (gtkwin->menu.send_as == NULL) |
4685 | 1988 return FALSE; |
4364
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
1989 |
4359 | 1990 gtk_widget_show(gtkwin->menu.send_as); |
1991 | |
1992 menu = gtk_menu_item_get_submenu( | |
1993 GTK_MENU_ITEM(gtkwin->menu.send_as)); | |
1994 | |
1995 for (child = gtk_container_get_children(GTK_CONTAINER(menu)); | |
1996 child != NULL; | |
1997 child = child->next) { | |
1998 | |
1999 GtkWidget *item = child->data; | |
4673 | 2000 struct gaim_account *item_account = g_object_get_data(G_OBJECT(item), |
2001 "gaim_account"); | |
2002 | |
2003 if (account == item_account) { | |
4359 | 2004 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); |
2005 break; | |
2006 } | |
2007 } | |
4685 | 2008 return FALSE; |
4359 | 2009 } |
2010 | |
2011 static void | |
4360
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
2012 generate_send_as_items(struct gaim_window *win, |
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
2013 struct gaim_conversation *deleted_conv) |
4359 | 2014 { |
2015 struct gaim_gtk_window *gtkwin; | |
2016 GtkWidget *menu; | |
2017 GtkWidget *menuitem; | |
2018 GSList *gcs; | |
2019 GList *convs; | |
2020 GSList *group = NULL; | |
2021 gboolean first_offline = TRUE; | |
2022 gboolean found_online = FALSE; | |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2023 GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
4359 | 2024 |
2025 gtkwin = GAIM_GTK_WINDOW(win); | |
2026 | |
2027 if (gtkwin->menu.send_as != NULL) | |
2028 gtk_widget_destroy(gtkwin->menu.send_as); | |
2029 | |
2030 /* See if we have > 1 connection active. */ | |
2031 if (g_slist_length(connections) < 2) { | |
2032 /* Now make sure we don't have any Offline entries. */ | |
2033 gboolean found_offline = FALSE; | |
2034 | |
2035 for (convs = gaim_get_conversations(); | |
2036 convs != NULL; | |
2037 convs = convs->next) { | |
2038 | |
2039 struct gaim_conversation *conv; | |
4491 | 2040 struct gaim_account *account; |
2041 | |
4359 | 2042 conv = (struct gaim_conversation *)convs->data; |
4491 | 2043 account = gaim_conversation_get_account(conv); |
2044 | |
2045 if (account->gc == NULL) { | |
4359 | 2046 found_offline = TRUE; |
2047 break; | |
2048 } | |
2049 } | |
2050 | |
2051 if (!found_offline) { | |
2052 gtkwin->menu.send_as = NULL; | |
2053 return; | |
2054 } | |
2055 } | |
2056 | |
2057 /* Build the Send As menu */ | |
2058 gtkwin->menu.send_as = gtk_menu_item_new_with_mnemonic(_("_Send As")); | |
2059 gtk_widget_show(gtkwin->menu.send_as); | |
2060 | |
2061 menu = gtk_menu_new(); | |
2062 | |
2063 gtk_menu_shell_append(GTK_MENU_SHELL(gtkwin->menu.menubar), | |
2064 gtkwin->menu.send_as); | |
2065 gtk_menu_item_set_submenu(GTK_MENU_ITEM(gtkwin->menu.send_as), menu); | |
2066 | |
2067 gtk_widget_show(menu); | |
2068 | |
2069 /* Fill it with entries. */ | |
2070 for (gcs = connections; gcs != NULL; gcs = gcs->next) { | |
4668
6e7196dcfd37
[gaim-migrate @ 4979]
Christian Hammond <chipx86@chipx86.com>
parents:
4640
diff
changeset
|
2071 |
4359 | 2072 struct gaim_connection *gc; |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2073 GtkWidget *box; |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2074 GtkWidget *label; |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2075 GtkWidget *image; |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2076 GdkPixbuf *pixbuf, *scale; |
4359 | 2077 |
2078 found_online = TRUE; | |
2079 | |
2080 gc = (struct gaim_connection *)gcs->data; | |
2081 | |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2082 /* Create a pixmap for the protocol icon. */ |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2083 pixbuf = create_prpl_icon(gc->account); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2084 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR); |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2085 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2086 /* Now convert it to GtkImage */ |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2087 if (pixbuf == NULL) |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2088 image = gtk_image_new(); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2089 else |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2090 image = gtk_image_new_from_pixbuf(scale); |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2091 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2092 gtk_size_group_add_widget(sg, image); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2093 |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2094 g_object_unref(G_OBJECT(scale)); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2095 g_object_unref(G_OBJECT(pixbuf)); |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2096 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2097 /* Make our menu item */ |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2098 menuitem = gtk_radio_menu_item_new_with_label(group, gc->username); |
4793 | 2099 group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); |
4359 | 2100 |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2101 /* Do some evil, see some evil, speak some evil. */ |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2102 box = gtk_hbox_new(FALSE, 0); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2103 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2104 label = gtk_bin_get_child(GTK_BIN(menuitem)); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2105 g_object_ref(label); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2106 gtk_container_remove(GTK_CONTAINER(menuitem), label); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2107 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2108 gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2109 gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 4); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2110 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2111 g_object_unref(label); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2112 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2113 gtk_container_add(GTK_CONTAINER(menuitem), box); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2114 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2115 gtk_widget_show(label); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2116 gtk_widget_show(image); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2117 gtk_widget_show(box); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2118 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2119 /* Set our data and callbacks. */ |
4359 | 2120 g_object_set_data(G_OBJECT(menuitem), "user_data", win); |
4673 | 2121 g_object_set_data(G_OBJECT(menuitem), "gaim_account", gc->account); |
4359 | 2122 |
4786 | 2123 g_signal_connect(G_OBJECT(menuitem), "activate", |
4673 | 2124 G_CALLBACK(menu_conv_sel_send_cb), NULL); |
4359 | 2125 |
2126 gtk_widget_show(menuitem); | |
2127 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | |
2128 } | |
2129 | |
2130 /* | |
2131 * Fill it with any accounts that still has an open (yet disabled) window | |
2132 * (signed off accounts with a window open). | |
2133 */ | |
2134 for (convs = gaim_get_conversations(); | |
2135 convs != NULL; | |
2136 convs = convs->next) { | |
2137 | |
2138 struct gaim_conversation *conv; | |
4491 | 2139 struct gaim_account *account; |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2140 GtkWidget *box; |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2141 GtkWidget *label; |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2142 GtkWidget *image; |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2143 GdkPixbuf *pixbuf, *scale; |
4359 | 2144 |
2145 conv = (struct gaim_conversation *)convs->data; | |
4360
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
2146 |
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
2147 if (conv == deleted_conv) |
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
2148 continue; |
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
2149 |
4491 | 2150 account = gaim_conversation_get_account(conv); |
2151 | |
4786 | 2152 |
4491 | 2153 if (account->gc == NULL) { |
4359 | 2154 if (first_offline && found_online) { |
2155 menuitem = gtk_separator_menu_item_new(); | |
2156 gtk_widget_show(menuitem); | |
2157 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | |
2158 | |
2159 first_offline = FALSE; | |
2160 } | |
2161 | |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2162 /* Create a pixmap for the protocol icon. */ |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2163 pixbuf = create_prpl_icon(account); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2164 scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2165 GDK_INTERP_BILINEAR); |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2166 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2167 /* Now convert it to GtkImage */ |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2168 if (pixbuf == NULL) |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2169 image = gtk_image_new(); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2170 else |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2171 image = gtk_image_new_from_pixbuf(scale); |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2172 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2173 gtk_size_group_add_widget(sg, image); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2174 |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2175 if (scale != NULL) g_object_unref(scale); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2176 if (pixbuf != NULL) g_object_unref(pixbuf); |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2177 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2178 /* Make our menu item */ |
4359 | 2179 menuitem = gtk_radio_menu_item_new_with_label(group, |
4491 | 2180 account->username); |
4793 | 2181 group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); |
4359 | 2182 |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2183 /* Do some evil, see some evil, speak some evil. */ |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2184 box = gtk_hbox_new(FALSE, 0); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2185 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2186 label = gtk_bin_get_child(GTK_BIN(menuitem)); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2187 g_object_ref(label); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2188 gtk_container_remove(GTK_CONTAINER(menuitem), label); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2189 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2190 gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2191 gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 4); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2192 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2193 g_object_unref(label); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2194 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2195 gtk_container_add(GTK_CONTAINER(menuitem), box); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2196 |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2197 gtk_widget_show(label); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2198 gtk_widget_show(image); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2199 gtk_widget_show(box); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2200 |
4359 | 2201 gtk_widget_set_sensitive(menuitem, FALSE); |
4786 | 2202 g_object_set_data(G_OBJECT(menuitem), "user_data", win); |
4674 | 2203 g_object_set_data(G_OBJECT(menuitem), "gaim_account", account); |
4359 | 2204 |
4786 | 2205 g_signal_connect(G_OBJECT(menuitem), "activate", |
2206 G_CALLBACK(menu_conv_sel_send_cb), NULL); | |
2207 | |
4359 | 2208 gtk_widget_show(menuitem); |
2209 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | |
2210 } | |
2211 } | |
2212 | |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2213 g_object_unref(sg); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2214 |
4359 | 2215 gtk_widget_show(gtkwin->menu.send_as); |
2216 update_send_as_selection(win); | |
2217 } | |
2218 | |
2219 static GList * | |
2220 generate_invite_user_names(struct gaim_connection *gc) | |
2221 { | |
4785 | 2222 GaimBlistNode *gnode,*bnode; |
4359 | 2223 struct group *g; |
2224 struct buddy *buddy; | |
2225 static GList *tmp = NULL; | |
2226 | |
2227 if (tmp) | |
2228 g_list_free(tmp); | |
2229 | |
2230 tmp = g_list_append(NULL, ""); | |
2231 | |
2232 if (gc != NULL) { | |
4785 | 2233 for(gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
2234 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
2235 continue; | |
2236 g = (struct group *)gnode; | |
2237 for(bnode = gnode->child; bnode; bnode = bnode->next) { | |
2238 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
2239 continue; | |
2240 buddy = (struct buddy *)bnode; | |
2241 | |
5068 | 2242 if (buddy->account == gc->account && GAIM_BUDDY_IS_ONLINE(buddy)) |
4359 | 2243 tmp = g_list_append(tmp, buddy->name); |
2244 } | |
2245 } | |
2246 } | |
2247 | |
2248 return tmp; | |
2249 } | |
2250 | |
2251 static void | |
2252 add_chat_buddy_common(struct gaim_conversation *conv, const char *name, | |
2253 int pos) | |
2254 { | |
2255 struct gaim_gtk_conversation *gtkconv; | |
2256 struct gaim_gtk_chat_pane *gtkchat; | |
2257 struct gaim_chat *chat; | |
2258 GtkTreeIter iter; | |
2259 GtkListStore *ls; | |
2260 | |
2261 chat = GAIM_CHAT(conv); | |
2262 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2263 gtkchat = gtkconv->u.chat; | |
2264 | |
2265 ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list))); | |
2266 | |
2267 gtk_list_store_append(ls, &iter); | |
2268 gtk_list_store_set(ls, &iter, 0, | |
2269 (gaim_chat_is_user_ignored(chat, name) ? "X" : " "), | |
2270 1, name, -1); | |
2271 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), 1, | |
2272 GTK_SORT_ASCENDING); | |
2273 } | |
2274 | |
2275 static void | |
2276 tab_complete(struct gaim_conversation *conv) | |
2277 { | |
2278 struct gaim_gtk_conversation *gtkconv; | |
2279 struct gaim_chat *chat; | |
2280 GtkTextIter cursor, word_start, start_buffer; | |
2281 int start; | |
2282 int most_matched = -1; | |
2283 char *entered, *partial = NULL; | |
2284 char *text; | |
2285 GList *matches = NULL; | |
2286 GList *nicks = NULL; | |
2287 | |
2288 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2289 chat = GAIM_CHAT(conv); | |
2290 | |
2291 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, &start_buffer); | |
2292 gtk_text_buffer_get_iter_at_mark(gtkconv->entry_buffer, &cursor, | |
2293 gtk_text_buffer_get_insert(gtkconv->entry_buffer)); | |
2294 | |
2295 word_start = cursor; | |
2296 | |
2297 /* if there's nothing there just return */ | |
2298 if (!gtk_text_iter_compare(&cursor, &start_buffer)) | |
2299 return; | |
2300 | |
2301 text = gtk_text_buffer_get_text(gtkconv->entry_buffer, &start_buffer, | |
2302 &cursor, FALSE); | |
2303 | |
2304 /* if we're at the end of ": " we need to move back 2 spaces */ | |
2305 start = strlen(text) - 1; | |
2306 | |
2307 if (strlen(text) >= 2 && !strncmp(&text[start-1], ": ", 2)) | |
2308 gtk_text_iter_backward_chars(&word_start, 2); | |
2309 | |
2310 /* find the start of the word that we're tabbing */ | |
2311 while (start >= 0 && text[start] != ' ') { | |
2312 gtk_text_iter_backward_char(&word_start); | |
2313 start--; | |
2314 } | |
2315 | |
2316 g_free(text); | |
2317 | |
2318 entered = gtk_text_buffer_get_text(gtkconv->entry_buffer, &word_start, | |
2319 &cursor, FALSE); | |
2320 | |
2321 if (chat_options & OPT_CHAT_OLD_STYLE_TAB) { | |
2322 if (strlen(entered) >= 2 && | |
2323 !strncmp(": ", entered + strlen(entered) - 2, 2)) { | |
2324 | |
2325 entered[strlen(entered) - 2] = 0; | |
2326 } | |
2327 } | |
2328 | |
2329 if (!strlen(entered)) { | |
2330 g_free(entered); | |
2331 return; | |
2332 } | |
2333 | |
2334 for (nicks = gaim_chat_get_users(chat); | |
2335 nicks != NULL; | |
2336 nicks = nicks->next) { | |
2337 | |
2338 char *nick = nicks->data; | |
2339 /* this checks to see if the current nick could be a completion */ | |
4793 | 2340 if (g_ascii_strncasecmp(nick, entered, strlen(entered))) { |
4621
69f028a6f357
[gaim-migrate @ 4912]
Christian Hammond <chipx86@chipx86.com>
parents:
4608
diff
changeset
|
2341 if (*nick != '+' && *nick != '@' && *nick != '%') |
4359 | 2342 continue; |
2343 | |
4793 | 2344 if (g_ascii_strncasecmp(nick + 1, entered, strlen(entered))) { |
4359 | 2345 if (nick[0] != '@' || nick[1] != '+') |
2346 continue; | |
2347 | |
4793 | 2348 if (g_ascii_strncasecmp(nick + 2, entered, strlen(entered))) |
4359 | 2349 continue; |
2350 else | |
2351 nick += 2; | |
2352 } | |
2353 else | |
2354 nick++; | |
2355 } | |
2356 | |
2357 /* if we're here, it's a possible completion */ | |
2358 | |
2359 /* if we're doing old-style, just fill in the completion */ | |
2360 if (chat_options & OPT_CHAT_OLD_STYLE_TAB) { | |
2361 gtk_text_buffer_delete(gtkconv->entry_buffer, | |
2362 &word_start, &cursor); | |
2363 | |
2364 if (strlen(nick) == strlen(entered)) { | |
2365 nicks = (nicks->next | |
2366 ? nicks->next | |
2367 : gaim_chat_get_users(chat)); | |
2368 | |
2369 nick = nicks->data; | |
2370 | |
2371 if (*nick == '@') nick++; | |
4621
69f028a6f357
[gaim-migrate @ 4912]
Christian Hammond <chipx86@chipx86.com>
parents:
4608
diff
changeset
|
2372 if (*nick == '%') nick++; |
4359 | 2373 if (*nick == '+') nick++; |
2374 } | |
2375 | |
2376 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, | |
2377 &start_buffer); | |
2378 gtk_text_buffer_get_iter_at_mark(gtkconv->entry_buffer, &cursor, | |
2379 gtk_text_buffer_get_insert(gtkconv->entry_buffer)); | |
2380 | |
2381 if (!gtk_text_iter_compare(&cursor, &start_buffer)) { | |
2382 char *tmp = g_strdup_printf("%s: ", nick); | |
2383 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, | |
2384 tmp, -1); | |
2385 g_free(tmp); | |
2386 } | |
2387 else | |
2388 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, | |
2389 nick, -1); | |
2390 | |
2391 g_free(entered); | |
2392 | |
2393 return; | |
2394 } | |
2395 | |
2396 /* we're only here if we're doing new style */ | |
2397 if (most_matched == -1) { | |
2398 /* | |
2399 * this will only get called once, since from now | |
2400 * on most_matched is >= 0 | |
2401 */ | |
2402 most_matched = strlen(nick); | |
2403 partial = g_strdup(nick); | |
2404 } | |
2405 else if (most_matched) { | |
4793 | 2406 while (g_ascii_strncasecmp(nick, partial, most_matched)) |
4359 | 2407 most_matched--; |
2408 | |
2409 partial[most_matched] = 0; | |
2410 } | |
2411 | |
2412 matches = g_list_append(matches, nick); | |
2413 } | |
2414 | |
2415 /* we're only here if we're doing new style */ | |
2416 | |
2417 /* if there weren't any matches, return */ | |
2418 if (!matches) { | |
2419 /* if matches isn't set partials won't be either */ | |
2420 g_free(entered); | |
2421 return; | |
2422 } | |
2423 | |
2424 gtk_text_buffer_delete(gtkconv->entry_buffer, &word_start, &cursor); | |
2425 | |
2426 if (!matches->next) { | |
2427 /* there was only one match. fill it in. */ | |
2428 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, &start_buffer); | |
2429 gtk_text_buffer_get_iter_at_mark(gtkconv->entry_buffer, &cursor, | |
2430 gtk_text_buffer_get_insert(gtkconv->entry_buffer)); | |
2431 | |
2432 if (!gtk_text_iter_compare(&cursor, &start_buffer)) { | |
2433 char *tmp = g_strdup_printf("%s: ", (char *)matches->data); | |
2434 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, tmp, -1); | |
2435 g_free(tmp); | |
2436 } | |
2437 else | |
2438 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, | |
2439 matches->data, -1); | |
2440 | |
2441 matches = g_list_remove(matches, matches->data); | |
2442 } | |
2443 else { | |
2444 /* | |
2445 * there were lots of matches, fill in as much as possible | |
2446 * and display all of them | |
2447 */ | |
2448 char *addthis = g_malloc0(1); | |
2449 | |
2450 while (matches) { | |
2451 char *tmp = addthis; | |
2452 addthis = g_strconcat(tmp, matches->data, " ", NULL); | |
2453 g_free(tmp); | |
2454 matches = g_list_remove(matches, matches->data); | |
2455 } | |
2456 | |
2457 gaim_conversation_write(conv, NULL, addthis, -1, WFLAG_NOLOG, | |
2458 time(NULL)); | |
2459 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, partial, -1); | |
2460 g_free(addthis); | |
2461 } | |
2462 | |
2463 g_free(entered); | |
2464 g_free(partial); | |
2465 } | |
2466 | |
2467 static gboolean | |
2468 meify(char *message, size_t len) | |
2469 { | |
2470 /* | |
2471 * Read /me-ify: If the message (post-HTML) starts with /me, | |
2472 * remove the "/me " part of it (including that space) and return TRUE. | |
2473 */ | |
2474 char *c; | |
2475 gboolean inside_html = 0; | |
2476 | |
2477 if (message == NULL) | |
2478 return FALSE; /* Umm.. this would be very bad if this happens. */ | |
2479 | |
2480 if (len == -1) | |
2481 len = strlen(message); | |
2482 | |
2483 for (c = message; *c != '\0'; c++, len--) { | |
2484 if (inside_html) { | |
2485 if (*c == '>') | |
2486 inside_html = FALSE; | |
2487 } | |
2488 else { | |
2489 if (*c == '<') | |
2490 inside_html = TRUE; | |
2491 else | |
2492 break; | |
2493 } | |
2494 } | |
2495 | |
4793 | 2496 if (*c != '\0' && !g_ascii_strncasecmp(c, "/me ", 4)) { |
4359 | 2497 memmove(c, c + 4, len - 3); |
2498 | |
2499 return TRUE; | |
2500 } | |
2501 | |
2502 return FALSE; | |
2503 } | |
2504 | |
2505 static GtkItemFactoryEntry menu_items[] = | |
2506 { | |
2507 /* Conversation menu */ | |
4596 | 2508 { N_("/_Conversation"), NULL, NULL, 0, "<Branch>" }, |
2509 { N_("/Conversation/_Save As..."), NULL, menu_save_as_cb, 0, | |
4359 | 2510 "<StockItem>", GTK_STOCK_SAVE_AS }, |
4596 | 2511 { N_("/Conversation/View _History..."), NULL, menu_view_history_cb, 0, NULL }, |
4359 | 2512 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>" }, |
4596 | 2513 { N_("/Conversation/Insert _URL..."), NULL, menu_insert_link_cb, 0, |
4359 | 2514 "<StockItem>", GAIM_STOCK_LINK }, |
4596 | 2515 { N_("/Conversation/Insert _Image..."), NULL, menu_insert_image_cb, 0, |
4359 | 2516 "<StockItem>", GAIM_STOCK_IMAGE }, |
2517 { "/Conversation/sep2", NULL, NULL, 0, "<Separator>" }, | |
4596 | 2518 { N_("/Conversation/_Close"), NULL, menu_close_conv_cb, 0, |
4359 | 2519 "<StockItem>", GTK_STOCK_CLOSE }, |
2520 | |
2521 /* Options */ | |
4596 | 2522 { N_("/_Options"), NULL, NULL, 0, "<Branch>" }, |
2523 { N_("/Options/Enable _Logging"), NULL, menu_logging_cb, 0, "<CheckItem>" }, | |
2524 { N_("/Options/Enable _Sounds"), NULL, menu_sounds_cb, 0, "<CheckItem>" }, | |
4359 | 2525 }; |
2526 | |
4602
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2527 static const int menu_item_count = |
4359 | 2528 sizeof(menu_items) / sizeof(*menu_items); |
2529 | |
4602
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2530 static char * |
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2531 item_factory_translate_func (const char *path, gpointer func_data) |
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2532 { |
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2533 return _(path); |
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2534 } |
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2535 |
4359 | 2536 static GtkWidget * |
2537 setup_menubar(struct gaim_window *win) | |
2538 { | |
2539 struct gaim_gtk_window *gtkwin; | |
2540 gtkwin = GAIM_GTK_WINDOW(win); | |
2541 | |
4630 | 2542 gtkwin->menu.item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, |
2543 "<main>", NULL); | |
2544 | |
2545 gtk_item_factory_set_translate_func (gtkwin->menu.item_factory, | |
4602
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2546 item_factory_translate_func, |
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2547 NULL, NULL); |
4630 | 2548 |
2549 gtk_item_factory_create_items(gtkwin->menu.item_factory, menu_item_count, | |
4359 | 2550 menu_items, win); |
2551 | |
4630 | 2552 gtkwin->menu.menubar = gtk_item_factory_get_widget(gtkwin->menu.item_factory, |
2553 "<main>"); | |
2554 gtkwin->menu.view_history = gtk_item_factory_get_widget(gtkwin->menu.item_factory, | |
4834 | 2555 N_("/Conversation/View History...")); |
4630 | 2556 gtkwin->menu.insert_link = gtk_item_factory_get_widget(gtkwin->menu.item_factory, |
4834 | 2557 N_("/Conversation/Insert URL...")); |
4630 | 2558 gtkwin->menu.insert_image = gtk_item_factory_get_widget(gtkwin->menu.item_factory, |
4834 | 2559 N_("/Conversation/Insert Image...")); |
4630 | 2560 gtkwin->menu.logging = gtk_item_factory_get_widget(gtkwin->menu.item_factory, |
4834 | 2561 N_("/Options/Enable Logging")); |
4630 | 2562 gtkwin->menu.sounds = gtk_item_factory_get_widget(gtkwin->menu.item_factory, |
4834 | 2563 N_("/Options/Enable Sounds")); |
4359 | 2564 |
4360
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
2565 generate_send_as_items(win, NULL); |
4359 | 2566 |
2567 gtk_widget_show(gtkwin->menu.menubar); | |
4931 | 2568 |
2569 return gtkwin->menu.menubar; | |
4359 | 2570 } |
2571 | |
2572 static void | |
2573 setup_im_buttons(struct gaim_conversation *conv, GtkWidget *parent) | |
2574 { | |
2575 struct gaim_connection *gc; | |
2576 struct gaim_gtk_conversation *gtkconv; | |
2577 struct gaim_gtk_im_pane *gtkim; | |
2578 GaimConversationType type = GAIM_CONV_IM; | |
2579 | |
2580 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2581 gtkim = gtkconv->u.im; | |
2582 gc = gaim_conversation_get_gc(conv); | |
2583 | |
2584 /* From right to left... */ | |
2585 | |
2586 /* Send button */ | |
2587 gtkconv->send = gaim_gtk_change_text(_("Send"), gtkconv->send, | |
2588 GAIM_STOCK_SEND, type); | |
2589 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->send, _("Send"), NULL); | |
2590 | |
2591 gtk_box_pack_end(GTK_BOX(parent), gtkconv->send, FALSE, FALSE, 0); | |
2592 | |
2593 /* Separator */ | |
2594 if (gtkim->sep2 != NULL) | |
2595 gtk_widget_destroy(gtkim->sep2); | |
2596 | |
2597 gtkim->sep2 = gtk_vseparator_new(); | |
2598 gtk_box_pack_end(GTK_BOX(parent), gtkim->sep2, FALSE, TRUE, 0); | |
2599 gtk_widget_show(gtkim->sep2); | |
2600 | |
2601 /* Now, um, just kind of all over the place. Huh? */ | |
2602 | |
2603 /* Add button */ | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2604 if (gaim_find_buddy(gaim_conversation_get_account(conv), |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2605 gaim_conversation_get_name(conv)) == NULL) { |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2606 |
4359 | 2607 gtkim->add = gaim_gtk_change_text(_("Add"), gtkim->add, |
2608 GTK_STOCK_ADD, type); | |
2609 gtk_tooltips_set_tip(gtkconv->tooltips, gtkim->add, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2610 _("Add the user to your buddy list"), NULL); |
4359 | 2611 } |
2612 else { | |
2613 gtkim->add = gaim_gtk_change_text(_("Remove"), gtkim->add, | |
2614 GTK_STOCK_REMOVE, type); | |
2615 gtk_tooltips_set_tip(gtkconv->tooltips, gtkim->add, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2616 _("Remove the user from your buddy list"), NULL); |
4359 | 2617 } |
2618 | |
2619 gtk_box_pack_start(GTK_BOX(parent), gtkim->add, | |
2620 FALSE, FALSE, 0); | |
2621 | |
2622 /* Warn button */ | |
2623 gtkim->warn = gaim_gtk_change_text(_("Warn"), gtkim->warn, | |
2624 GAIM_STOCK_WARN, type); | |
2625 gtk_box_pack_start(GTK_BOX(parent), gtkim->warn, FALSE, FALSE, 0); | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2626 gtk_tooltips_set_tip(gtkconv->tooltips, gtkim->warn, |
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2627 _("Warn the user"), NULL); |
4359 | 2628 |
2629 /* Info button */ | |
2630 gtkconv->info = gaim_gtk_change_text(_("Info"), gtkconv->info, | |
2631 GAIM_STOCK_INFO, type); | |
2632 gtk_box_pack_start(GTK_BOX(parent), gtkconv->info, FALSE, FALSE, 0); | |
2633 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->info, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2634 _("Get the user's information"), NULL); |
4359 | 2635 |
2636 /* Block button */ | |
2637 gtkim->block = gaim_gtk_change_text(_("Block"), gtkim->block, | |
2638 GAIM_STOCK_BLOCK, type); | |
2639 gtk_box_pack_start(GTK_BOX(parent), gtkim->block, FALSE, FALSE, 0); | |
2640 gtk_tooltips_set_tip(gtkconv->tooltips, gtkim->block, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2641 _("Block the user"), NULL); |
4359 | 2642 |
2643 gtk_button_set_relief(GTK_BUTTON(gtkconv->info), GTK_RELIEF_NONE); | |
2644 gtk_button_set_relief(GTK_BUTTON(gtkim->add), GTK_RELIEF_NONE); | |
2645 gtk_button_set_relief(GTK_BUTTON(gtkim->warn), GTK_RELIEF_NONE); | |
2646 gtk_button_set_relief(GTK_BUTTON(gtkconv->send), GTK_RELIEF_NONE); | |
2647 gtk_button_set_relief(GTK_BUTTON(gtkim->block), GTK_RELIEF_NONE); | |
2648 | |
2649 gtk_size_group_add_widget(gtkconv->sg, gtkconv->info); | |
2650 gtk_size_group_add_widget(gtkconv->sg, gtkim->add); | |
2651 gtk_size_group_add_widget(gtkconv->sg, gtkim->warn); | |
2652 gtk_size_group_add_widget(gtkconv->sg, gtkconv->send); | |
2653 gtk_size_group_add_widget(gtkconv->sg, gtkim->block); | |
2654 | |
2655 gtk_box_reorder_child(GTK_BOX(parent), gtkim->warn, 1); | |
2656 gtk_box_reorder_child(GTK_BOX(parent), gtkim->block, 2); | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2657 gtk_box_reorder_child(GTK_BOX(parent), gtkim->add, 3); |
4359 | 2658 gtk_box_reorder_child(GTK_BOX(parent), gtkconv->info, 4); |
2659 | |
2660 gaim_gtkconv_update_buttons_by_protocol(conv); | |
2661 | |
2662 g_signal_connect(G_OBJECT(gtkconv->send), "clicked", | |
2663 G_CALLBACK(send_cb), conv); | |
2664 g_signal_connect(G_OBJECT(gtkconv->info), "clicked", | |
2665 G_CALLBACK(info_cb), conv); | |
2666 g_signal_connect(G_OBJECT(gtkim->warn), "clicked", | |
2667 G_CALLBACK(warn_cb), conv); | |
2668 g_signal_connect(G_OBJECT(gtkim->block), "clicked", | |
2669 G_CALLBACK(block_cb), conv); | |
2670 } | |
2671 | |
2672 static void | |
2673 setup_chat_buttons(struct gaim_conversation *conv, GtkWidget *parent) | |
2674 { | |
2675 struct gaim_connection *gc; | |
2676 struct gaim_gtk_conversation *gtkconv; | |
2677 struct gaim_gtk_chat_pane *gtkchat; | |
2678 struct gaim_gtk_window *gtkwin; | |
2679 GtkWidget *sep; | |
2680 | |
2681 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2682 gtkchat = gtkconv->u.chat; | |
2683 gtkwin = GAIM_GTK_WINDOW(gaim_conversation_get_window(conv)); | |
2684 gc = gaim_conversation_get_gc(conv); | |
2685 | |
2686 /* Send button */ | |
2687 gtkconv->send = gaim_gtk_change_text(_("Send"), gtkconv->send, | |
2688 GAIM_STOCK_SEND, GAIM_CONV_CHAT); | |
2689 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->send, _("Send"), NULL); | |
2690 | |
2691 gtk_box_pack_end(GTK_BOX(parent), gtkconv->send, FALSE, FALSE, 0); | |
2692 | |
2693 /* Separator */ | |
2694 sep = gtk_vseparator_new(); | |
2695 gtk_box_pack_end(GTK_BOX(parent), sep, FALSE, TRUE, 0); | |
2696 gtk_widget_show(sep); | |
2697 | |
2698 /* Invite */ | |
2699 gtkchat->invite = gaim_gtk_change_text(_("Invite"), gtkchat->invite, | |
2700 GAIM_STOCK_INVITE, GAIM_CONV_CHAT); | |
2701 gtk_tooltips_set_tip(gtkconv->tooltips, gtkchat->invite, | |
2702 _("Invite a user"), NULL); | |
2703 gtk_box_pack_end(GTK_BOX(parent), gtkchat->invite, FALSE, FALSE, 0); | |
2704 | |
2705 /* Set the relief on these. */ | |
2706 gtk_button_set_relief(GTK_BUTTON(gtkchat->invite), GTK_RELIEF_NONE); | |
2707 gtk_button_set_relief(GTK_BUTTON(gtkconv->send), GTK_RELIEF_NONE); | |
2708 | |
2709 /* Callbacks */ | |
2710 g_signal_connect(G_OBJECT(gtkconv->send), "clicked", | |
2711 G_CALLBACK(send_cb), conv); | |
2712 g_signal_connect(G_OBJECT(gtkchat->invite), "clicked", | |
2713 G_CALLBACK(invite_cb), conv); | |
2714 } | |
2715 | |
2716 static GtkWidget * | |
2717 build_conv_toolbar(struct gaim_conversation *conv) | |
2718 { | |
2719 struct gaim_gtk_conversation *gtkconv; | |
2720 GtkWidget *vbox; | |
2721 GtkWidget *hbox; | |
2722 GtkWidget *button; | |
2723 GtkWidget *sep; | |
2724 GtkSizeGroup *sg; | |
2725 | |
2726 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2727 | |
2728 sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); | |
2729 | |
2730 vbox = gtk_vbox_new(FALSE, 0); | |
2731 sep = gtk_hseparator_new(); | |
2732 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
2733 | |
2734 hbox = gtk_hbox_new(FALSE, 5); | |
2735 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
2736 | |
2737 /* Bold */ | |
2738 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_BOLD); | |
2739 gtk_size_group_add_widget(sg, button); | |
2740 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2741 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Bold"), NULL); | |
2742 | |
2743 g_signal_connect(G_OBJECT(button), "clicked", | |
2744 G_CALLBACK(do_bold), gtkconv); | |
2745 | |
2746 gtkconv->toolbar.bold = button; | |
2747 | |
2748 /* Italic */ | |
2749 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_ITALIC); | |
2750 gtk_size_group_add_widget(sg, button); | |
2751 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2752 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Italic"), NULL); | |
2753 | |
2754 g_signal_connect(G_OBJECT(button), "clicked", | |
2755 G_CALLBACK(do_italic), gtkconv); | |
2756 | |
2757 gtkconv->toolbar.italic = button; | |
2758 | |
2759 /* Underline */ | |
2760 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_UNDERLINE); | |
2761 gtk_size_group_add_widget(sg, button); | |
2762 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2763 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Underline"), NULL); | |
2764 | |
2765 g_signal_connect(G_OBJECT(button), "clicked", | |
2766 G_CALLBACK(do_underline), gtkconv); | |
2767 | |
2768 gtkconv->toolbar.underline = button; | |
2769 | |
2770 /* Sep */ | |
2771 sep = gtk_vseparator_new(); | |
2772 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | |
2773 | |
2774 /* Increase font size */ | |
2775 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_BIGGER); | |
2776 gtk_size_group_add_widget(sg, button); | |
2777 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2778 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2779 _("Larger font size"), NULL); | |
2780 | |
2781 g_signal_connect(G_OBJECT(button), "clicked", | |
2782 G_CALLBACK(do_big), gtkconv); | |
2783 | |
5049 | 2784 gtkconv->toolbar.larger_size = button; |
2785 | |
4359 | 2786 /* Normal font size */ |
2787 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_NORMAL); | |
2788 gtk_size_group_add_widget(sg, button); | |
2789 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2790 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2791 _("Normal font size"), NULL); | |
2792 | |
2793 g_signal_connect(G_OBJECT(button), "clicked", | |
2794 G_CALLBACK(do_normal), gtkconv); | |
2795 | |
2796 gtkconv->toolbar.normal_size = button; | |
2797 | |
2798 /* Decrease font size */ | |
2799 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_SMALLER); | |
2800 gtk_size_group_add_widget(sg, button); | |
2801 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2802 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2803 _("Smaller font size"), NULL); | |
2804 | |
2805 g_signal_connect(G_OBJECT(button), "clicked", | |
2806 G_CALLBACK(do_small), gtkconv); | |
2807 | |
5049 | 2808 gtkconv->toolbar.smaller_size = button; |
2809 | |
4359 | 2810 /* Sep */ |
2811 sep = gtk_vseparator_new(); | |
2812 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | |
2813 | |
4685 | 2814 /* Font Face */ |
2815 | |
2816 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_SELECT_FONT); | |
2817 gtk_size_group_add_widget(sg, button); | |
2818 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2819 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2820 _("Font Face"), NULL); | |
2821 | |
2822 g_signal_connect(G_OBJECT(button), "clicked", | |
2823 G_CALLBACK(toggle_font), conv); | |
2824 | |
2825 gtkconv->toolbar.font = button; | |
2826 | |
4359 | 2827 /* Foreground Color */ |
2828 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_FGCOLOR); | |
2829 gtk_size_group_add_widget(sg, button); | |
2830 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2831 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2832 _("Foreground font color"), NULL); | |
2833 | |
2834 g_signal_connect(G_OBJECT(button), "clicked", | |
2835 G_CALLBACK(toggle_fg_color), conv); | |
2836 | |
2837 gtkconv->toolbar.fgcolor = button; | |
2838 | |
2839 /* Background Color */ | |
2840 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_BGCOLOR); | |
2841 gtk_size_group_add_widget(sg, button); | |
2842 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2843 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2844 _("Background color"), NULL); | |
2845 | |
2846 g_signal_connect(G_OBJECT(button), "clicked", | |
2847 G_CALLBACK(toggle_bg_color), conv); | |
2848 | |
2849 gtkconv->toolbar.bgcolor = button; | |
2850 | |
2851 /* Sep */ | |
2852 sep = gtk_vseparator_new(); | |
2853 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | |
2854 | |
2855 /* Insert IM Image */ | |
2856 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_IMAGE); | |
2857 gtk_size_group_add_widget(sg, button); | |
2858 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2859 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Insert image"), NULL); | |
2860 | |
2861 g_signal_connect(G_OBJECT(button), "clicked", | |
2862 G_CALLBACK(insert_image_cb), conv); | |
2863 | |
2864 gtkconv->toolbar.image = button; | |
2865 | |
2866 /* Insert Link */ | |
2867 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_LINK); | |
2868 gtk_size_group_add_widget(sg, button); | |
2869 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2870 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Insert link"), NULL); | |
2871 | |
2872 g_signal_connect(G_OBJECT(button), "clicked", | |
2873 G_CALLBACK(insert_link_cb), conv); | |
2874 | |
2875 gtkconv->toolbar.link = button; | |
2876 | |
2877 /* Insert Smiley */ | |
2878 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_SMILEY); | |
2879 gtk_size_group_add_widget(sg, button); | |
2880 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2881 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Insert smiley"), NULL); | |
2882 | |
2883 g_signal_connect(G_OBJECT(button), "clicked", | |
2884 G_CALLBACK(insert_smiley_cb), conv); | |
2885 | |
2886 gtkconv->toolbar.smiley = button; | |
2887 | |
2888 | |
2889 sep = gtk_hseparator_new(); | |
2890 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
2891 | |
2892 gtk_widget_show_all(vbox); | |
2893 | |
2894 return vbox; | |
2895 } | |
2896 | |
2897 static GtkWidget * | |
2898 setup_chat_pane(struct gaim_conversation *conv) | |
2899 { | |
2900 struct gaim_gtk_conversation *gtkconv; | |
2901 struct gaim_gtk_chat_pane *gtkchat; | |
2902 struct gaim_connection *gc; | |
2903 GtkWidget *vpaned, *hpaned; | |
2904 GtkWidget *vbox, *hbox; | |
2905 GtkWidget *lbox, *bbox; | |
2906 GtkWidget *label; | |
2907 GtkWidget *sw2; | |
2908 GtkWidget *list; | |
2909 GtkWidget *button; | |
2910 GtkWidget *frame; | |
2911 GtkListStore *ls; | |
2912 GtkCellRenderer *rend; | |
2913 GtkTreeViewColumn *col; | |
2914 | |
2915 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2916 gtkchat = gtkconv->u.chat; | |
2917 gc = gaim_conversation_get_gc(conv); | |
2918 | |
2919 /* Setup the outer pane. */ | |
2920 vpaned = gtk_vpaned_new(); | |
2921 gtk_widget_show(vpaned); | |
2922 | |
2923 /* Setup the top part of the pane. */ | |
2924 vbox = gtk_vbox_new(FALSE, 5); | |
2925 gtk_paned_pack1(GTK_PANED(vpaned), vbox, TRUE, FALSE); | |
2926 gtk_widget_show(vbox); | |
2927 | |
2928 if (gc->prpl->options & OPT_PROTO_CHAT_TOPIC) | |
2929 { | |
2930 hbox = gtk_hbox_new(FALSE, 0); | |
2931 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); | |
2932 gtk_widget_show(hbox); | |
2933 | |
2934 label = gtk_label_new(_("Topic:")); | |
2935 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); | |
2936 gtk_widget_show(label); | |
2937 | |
2938 gtkchat->topic_text = gtk_entry_new(); | |
4635 | 2939 gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE); |
4359 | 2940 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 5); |
2941 gtk_widget_show(gtkchat->topic_text); | |
2942 } | |
2943 | |
2944 /* Setup the horizontal pane. */ | |
2945 hpaned = gtk_hpaned_new(); | |
2946 gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 5); | |
2947 gtk_widget_show(hpaned); | |
2948 | |
2949 /* Setup the scrolled window to put gtkimhtml in. */ | |
2950 gtkconv->sw = gtk_scrolled_window_new(NULL, NULL); | |
2951 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gtkconv->sw), | |
2952 GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
2953 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(gtkconv->sw), | |
2954 GTK_SHADOW_IN); | |
2955 gtk_paned_pack1(GTK_PANED(hpaned), gtkconv->sw, TRUE, TRUE); | |
2956 | |
2957 gtk_widget_set_size_request(gtkconv->sw, | |
2958 buddy_chat_size.width, buddy_chat_size.height); | |
2959 gtk_widget_show(gtkconv->sw); | |
2960 | |
2961 /* Setup gtkihmtml. */ | |
2962 gtkconv->imhtml = gtk_imhtml_new(NULL, NULL); | |
2963 gtk_container_add(GTK_CONTAINER(gtkconv->sw), gtkconv->imhtml); | |
2964 | |
2965 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), | |
2966 (convo_options & OPT_CONVO_SHOW_TIME)); | |
2967 | |
2968 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event", | |
2969 G_CALLBACK(entry_stop_rclick_cb), NULL); | |
2970 | |
2971 gaim_setup_imhtml(gtkconv->imhtml); | |
2972 | |
2973 gtk_widget_show(gtkconv->imhtml); | |
2974 | |
2975 /* Build the right pane. */ | |
2976 lbox = gtk_vbox_new(FALSE, 5); | |
4409
0521eec12c33
[gaim-migrate @ 4682]
Christian Hammond <chipx86@chipx86.com>
parents:
4398
diff
changeset
|
2977 gtk_paned_pack2(GTK_PANED(hpaned), lbox, FALSE, TRUE); |
4359 | 2978 gtk_widget_show(lbox); |
2979 | |
2980 /* Setup the label telling how many people are in the room. */ | |
2981 gtkchat->count = gtk_label_new(_("0 people in room")); | |
2982 gtk_box_pack_start(GTK_BOX(lbox), gtkchat->count, FALSE, FALSE, 0); | |
2983 gtk_widget_show(gtkchat->count); | |
2984 | |
2985 /* Setup the list of users. */ | |
2986 sw2 = gtk_scrolled_window_new(NULL, NULL); | |
2987 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw2), | |
2988 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); | |
2989 gtk_box_pack_start(GTK_BOX(lbox), sw2, TRUE, TRUE, 0); | |
2990 gtk_widget_show(sw2); | |
2991 | |
2992 ls = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); | |
2993 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), 1, | |
2994 GTK_SORT_ASCENDING); | |
2995 | |
2996 list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls)); | |
2997 | |
2998 rend = gtk_cell_renderer_text_new(); | |
2999 col = gtk_tree_view_column_new_with_attributes(NULL, rend, | |
3000 "text", 0, NULL); | |
3001 gtk_tree_view_column_set_clickable(GTK_TREE_VIEW_COLUMN(col), TRUE); | |
3002 | |
3003 g_signal_connect(G_OBJECT(list), "button_press_event", | |
3004 G_CALLBACK(right_click_chat_cb), conv); | |
3005 | |
3006 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); | |
3007 | |
3008 col = gtk_tree_view_column_new_with_attributes(NULL, rend, | |
3009 "text", 1, NULL); | |
3010 gtk_tree_view_column_set_clickable(GTK_TREE_VIEW_COLUMN(col), TRUE); | |
3011 | |
3012 #if 0 | |
3013 g_signal_connect(G_OBJECT(list), "button_press_event", | |
3014 G_CALLBACK(right_click_chat), conv); | |
3015 #endif | |
3016 | |
3017 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); | |
3018 | |
3019 gtk_widget_set_size_request(list, 150, -1); | |
3020 | |
3021 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE); | |
3022 gtk_widget_show(list); | |
3023 | |
3024 gtkchat->list = list; | |
3025 | |
3026 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw2), list); | |
3027 | |
3028 /* Setup the user list toolbar. */ | |
3029 bbox = gtk_hbox_new(TRUE, 5); | |
3030 gtk_box_pack_start(GTK_BOX(lbox), bbox, FALSE, FALSE, 0); | |
3031 gtk_widget_show(bbox); | |
3032 | |
3033 /* IM */ | |
3034 button = gaim_pixbuf_button_from_stock(NULL, GTK_STOCK_REDO, | |
3035 GAIM_BUTTON_VERTICAL); | |
3036 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
3037 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
3038 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("IM the user"), NULL); |
4359 | 3039 g_signal_connect(G_OBJECT(button), "clicked", |
3040 G_CALLBACK(im_cb), conv); | |
3041 | |
3042 gtk_widget_show(button); | |
3043 | |
3044 /* Ignore */ | |
3045 button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_IGNORE, | |
3046 GAIM_BUTTON_VERTICAL); | |
3047 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
3048 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
3049 gtk_tooltips_set_tip(gtkconv->tooltips, button, |
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
3050 _("Ignore the user"), NULL); |
4359 | 3051 g_signal_connect(G_OBJECT(button), "clicked", |
3052 G_CALLBACK(ignore_cb), conv); | |
3053 gtk_widget_show(button); | |
3054 | |
3055 /* Info */ | |
3056 button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_INFO, | |
3057 GAIM_BUTTON_VERTICAL); | |
3058 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
3059 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
3060 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
3061 _("Get the user's information"), NULL); |
4359 | 3062 g_signal_connect(G_OBJECT(button), "clicked", |
3063 G_CALLBACK(info_cb), conv); | |
3064 | |
3065 gtk_widget_show(button); | |
3066 | |
3067 gtkconv->info = button; | |
3068 | |
4963
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3069 /* Build the toolbar. */ |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3070 vbox = gtk_vbox_new(FALSE, 5); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3071 gtk_paned_pack2(GTK_PANED(vpaned), vbox, FALSE, FALSE); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3072 gtk_widget_show(vbox); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3073 |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3074 gtkconv->toolbar.toolbar = build_conv_toolbar(conv); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3075 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->toolbar.toolbar, |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3076 FALSE, FALSE, 0); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3077 |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3078 /* Setup the entry widget. */ |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3079 frame = gtk_frame_new(NULL); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3080 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3081 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3082 gtk_widget_show(frame); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3083 |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3084 gtkconv->entry_buffer = gtk_text_buffer_new(NULL); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3085 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", conv); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3086 gtkconv->entry = gtk_text_view_new_with_buffer(gtkconv->entry_buffer); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3087 |
5105 | 3088 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), GTK_WRAP_WORD_CHAR); |
4963
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3089 gtk_widget_set_size_request(gtkconv->entry, -1, |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3090 MAX(buddy_chat_size.entry_height, 25)); |
4359 | 3091 |
3092 /* Connect the signal handlers. */ | |
3093 g_signal_connect_swapped(G_OBJECT(gtkconv->entry), "key_press_event", | |
3094 G_CALLBACK(entry_key_pressed_cb_1), | |
3095 gtkconv->entry_buffer); | |
3096 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", | |
3097 G_CALLBACK(entry_stop_rclick_cb), NULL); | |
3098 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", | |
3099 G_CALLBACK(entry_key_pressed_cb_2), conv); | |
3100 | |
3101 #ifdef USE_GTKSPELL | |
3102 if (convo_options & OPT_CONVO_CHECK_SPELLING) | |
3103 gtkspell_new_attach(GTK_TEXT_VIEW(gtkconv->entry), NULL, NULL); | |
3104 #endif | |
3105 | |
3106 gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(gtkconv->entry)); | |
3107 gtk_widget_show(gtkconv->entry); | |
3108 | |
3109 /* Setup the bottom button box. */ | |
3110 gtkconv->bbox = gtk_hbox_new(FALSE, 5); | |
3111 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->bbox, FALSE, FALSE, 0); | |
3112 gtk_widget_show(gtkconv->bbox); | |
3113 | |
3114 setup_chat_buttons(conv, gtkconv->bbox); | |
3115 | |
3116 return vpaned; | |
3117 } | |
3118 | |
3119 static GtkWidget * | |
3120 setup_im_pane(struct gaim_conversation *conv) | |
3121 { | |
3122 struct gaim_gtk_conversation *gtkconv; | |
3123 struct gaim_gtk_im_pane *gtkim; | |
3124 GtkWidget *paned; | |
3125 GtkWidget *vbox; | |
3126 GtkWidget *vbox2; | |
3127 GtkWidget *frame; | |
3128 | |
3129 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3130 gtkim = gtkconv->u.im; | |
3131 | |
3132 /* Setup the outer pane. */ | |
3133 paned = gtk_vpaned_new(); | |
3134 gtk_widget_show(paned); | |
3135 | |
3136 /* Setup the top part of the pane. */ | |
3137 vbox = gtk_vbox_new(FALSE, 5); | |
4409
0521eec12c33
[gaim-migrate @ 4682]
Christian Hammond <chipx86@chipx86.com>
parents:
4398
diff
changeset
|
3138 gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE); |
4359 | 3139 gtk_widget_show(vbox); |
3140 | |
3141 /* Setup the gtkimhtml widget. */ | |
3142 gtkconv->sw = gtk_scrolled_window_new(NULL, NULL); | |
3143 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gtkconv->sw), | |
3144 GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
3145 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(gtkconv->sw), | |
3146 GTK_SHADOW_IN); | |
4963
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3147 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->sw, TRUE, TRUE, 0); |
4851 | 3148 |
4359 | 3149 gtk_widget_set_size_request(gtkconv->sw, conv_size.width, conv_size.height); |
3150 gtk_widget_show(gtkconv->sw); | |
3151 | |
3152 gtkconv->imhtml = gtk_imhtml_new(NULL, NULL); | |
3153 gtk_container_add(GTK_CONTAINER(gtkconv->sw), gtkconv->imhtml); | |
3154 | |
3155 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event", | |
3156 G_CALLBACK(entry_stop_rclick_cb), NULL); | |
3157 | |
3158 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), | |
3159 (convo_options & OPT_CONVO_SHOW_TIME)); | |
3160 | |
3161 gaim_setup_imhtml(gtkconv->imhtml); | |
3162 | |
3163 gtk_widget_show(gtkconv->imhtml); | |
3164 | |
4963
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3165 vbox2 = gtk_vbox_new(FALSE, 5); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3166 gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, FALSE); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3167 gtk_widget_show(vbox2); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3168 |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3169 /* Build the toolbar. */ |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3170 gtkconv->toolbar.toolbar = build_conv_toolbar(conv); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3171 gtk_box_pack_start(GTK_BOX(vbox2), gtkconv->toolbar.toolbar, |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3172 FALSE, FALSE, 0); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3173 |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3174 /* Setup the entry widget. */ |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3175 frame = gtk_frame_new(NULL); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3176 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3177 gtk_box_pack_start(GTK_BOX(vbox2), frame, TRUE, TRUE, 0); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3178 gtk_widget_show(frame); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3179 |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3180 gtkconv->entry_buffer = gtk_text_buffer_new(NULL); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3181 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", conv); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3182 gtkconv->entry = gtk_text_view_new_with_buffer(gtkconv->entry_buffer); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3183 |
5105 | 3184 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), GTK_WRAP_WORD_CHAR); |
4963
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3185 gtk_widget_set_size_request(gtkconv->entry, -1, |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3186 MAX(conv_size.entry_height, 25)); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3187 |
4359 | 3188 /* Connect the signal handlers. */ |
3189 g_signal_connect_swapped(G_OBJECT(gtkconv->entry), "key_press_event", | |
3190 G_CALLBACK(entry_key_pressed_cb_1), | |
3191 gtkconv->entry_buffer); | |
3192 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", | |
3193 G_CALLBACK(entry_key_pressed_cb_2), conv); | |
3194 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", | |
3195 G_CALLBACK(entry_stop_rclick_cb), NULL); | |
3196 | |
3197 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "insert_text", | |
3198 G_CALLBACK(insert_text_cb), conv); | |
3199 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "delete_range", | |
3200 G_CALLBACK(delete_text_cb), conv); | |
3201 | |
3202 #ifdef USE_GTKSPELL | |
3203 if (convo_options & OPT_CONVO_CHECK_SPELLING) | |
3204 gtkspell_new_attach(GTK_TEXT_VIEW(gtkconv->entry), NULL, NULL); | |
3205 #endif | |
3206 | |
3207 gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(gtkconv->entry)); | |
3208 gtk_widget_show(gtkconv->entry); | |
3209 | |
3210 gtkconv->bbox = gtk_hbox_new(FALSE, 5); | |
3211 gtk_box_pack_start(GTK_BOX(vbox2), gtkconv->bbox, FALSE, FALSE, 0); | |
3212 gtk_widget_show(gtkconv->bbox); | |
3213 | |
3214 setup_im_buttons(conv, gtkconv->bbox); | |
3215 | |
3216 return paned; | |
3217 } | |
3218 | |
3219 static void | |
3220 move_next_tab(struct gaim_conversation *conv) | |
3221 { | |
3222 struct gaim_conversation *next_conv = NULL; | |
3223 struct gaim_window *win; | |
3224 GList *l; | |
3225 int index, i; | |
3226 | |
3227 win = gaim_conversation_get_window(conv); | |
3228 index = gaim_conversation_get_index(conv); | |
3229 | |
3230 /* First check the tabs after this position. */ | |
3231 for (l = g_list_nth(gaim_window_get_conversations(win), index); | |
3232 l != NULL; | |
3233 l = l->next) { | |
3234 | |
3235 next_conv = (struct gaim_conversation *)l->data; | |
3236 | |
3237 if (gaim_conversation_get_unseen(next_conv) > 0) | |
3238 break; | |
3239 | |
3240 next_conv = NULL; | |
3241 } | |
3242 | |
3243 if (next_conv == NULL) { | |
3244 | |
3245 /* Now check before this position. */ | |
3246 for (l = gaim_window_get_conversations(win), i = 0; | |
3247 l != NULL && i < index; | |
3248 l = l->next) { | |
3249 | |
3250 next_conv = (struct gaim_conversation *)l->data; | |
3251 | |
3252 if (gaim_conversation_get_unseen(next_conv) > 0) | |
3253 break; | |
3254 | |
3255 next_conv = NULL; | |
3256 } | |
3257 | |
3258 if (next_conv == NULL) { | |
3259 /* Okay, just grab the next conversation tab. */ | |
3260 if (index == gaim_window_get_conversation_count(win) - 1) | |
3261 next_conv = gaim_window_get_conversation_at(win, 0); | |
3262 else | |
3263 next_conv = gaim_window_get_conversation_at(win, index + 1); | |
3264 } | |
3265 } | |
3266 | |
3267 if (next_conv != NULL && next_conv != conv) { | |
3268 gaim_window_switch_conversation(win, | |
3269 gaim_conversation_get_index(next_conv)); | |
3270 } | |
3271 } | |
3272 | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3273 static void |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3274 conv_dnd_recv(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3275 GtkSelectionData *sd, guint info, guint t, |
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3276 struct gaim_conversation *conv) |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3277 { |
4781 | 3278 struct gaim_window *win = conv->window; |
3279 struct gaim_conversation *c; | |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3280 |
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3281 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) { |
4781 | 3282 GaimBlistNode *n = NULL; |
3283 memcpy(&n, sd->data, sizeof(n)); | |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3284 |
4781 | 3285 if (!GAIM_BLIST_NODE_IS_BUDDY(n)) |
3286 return; | |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3287 |
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3288 c = gaim_conversation_new(GAIM_CONV_IM, |
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3289 ((struct buddy *)n)->account, |
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3290 ((struct buddy *)n)->name); |
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3291 |
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3292 gaim_window_add_conversation(win, c); |
4702 | 3293 } |
3294 | |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3295 /* do_error_dialog("MWAHAHAHA! I AM A TROLL! I AM GOING TO EAT YOU!", |
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3296 NULL, GAIM_WARNING); */ |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3297 } |
4359 | 3298 |
3299 /************************************************************************** | |
3300 * GTK+ window ops | |
3301 **************************************************************************/ | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3302 static struct gaim_conversation_ui_ops * |
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3303 gaim_gtk_get_conversation_ui_ops(void) |
4359 | 3304 { |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3305 return gaim_get_gtk_conversation_ui_ops(); |
4359 | 3306 } |
3307 | |
3308 static void | |
3309 gaim_gtk_new_window(struct gaim_window *win) | |
3310 { | |
3311 struct gaim_gtk_window *gtkwin; | |
3312 GtkPositionType pos; | |
3313 GtkWidget *testidea; | |
3314 GtkWidget *menubar; | |
3315 | |
3316 gtkwin = g_malloc0(sizeof(struct gaim_gtk_window)); | |
3317 | |
3318 win->ui_data = gtkwin; | |
3319 | |
3320 /* Create the window. */ | |
3321 gtkwin->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
3322 gtk_window_set_role(GTK_WINDOW(gtkwin->window), "conversation"); | |
4635 | 3323 gtk_window_set_resizable(GTK_WINDOW(gtkwin->window), TRUE); |
4510
4c394222c732
[gaim-migrate @ 4786]
Christian Hammond <chipx86@chipx86.com>
parents:
4505
diff
changeset
|
3324 gtk_container_set_border_width(GTK_CONTAINER(gtkwin->window), 0); |
4359 | 3325 gtk_widget_realize(gtkwin->window); |
3326 | |
3327 g_signal_connect(G_OBJECT(gtkwin->window), "delete_event", | |
3328 G_CALLBACK(close_win_cb), win); | |
3329 | |
3330 /* Create the notebook. */ | |
3331 gtkwin->notebook = gtk_notebook_new(); | |
3332 | |
3333 pos = ((im_options & OPT_IM_SIDE_TAB) | |
3334 ? ((im_options & OPT_IM_BR_TAB) ? GTK_POS_RIGHT : GTK_POS_LEFT) | |
3335 : ((im_options & OPT_IM_BR_TAB) ? GTK_POS_BOTTOM : GTK_POS_TOP)); | |
3336 | |
3337 #if 0 | |
3338 gtk_notebook_set_tab_hborder(GTK_NOTEBOOK(gtkwin->notebook), 0); | |
3339 gtk_notebook_set_tab_vborder(GTK_NOTEBOOK(gtkwin->notebook), 0); | |
3340 #endif | |
3341 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(gtkwin->notebook), pos); | |
3342 gtk_notebook_set_scrollable(GTK_NOTEBOOK(gtkwin->notebook), TRUE); | |
3343 gtk_notebook_popup_enable(GTK_NOTEBOOK(gtkwin->notebook)); | |
4818 | 3344 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkwin->notebook), FALSE); |
3345 | |
4359 | 3346 gtk_widget_show(gtkwin->notebook); |
3347 | |
3348 g_signal_connect_after(G_OBJECT(gtkwin->notebook), "switch_page", | |
3349 G_CALLBACK(switch_conv_cb), win); | |
3350 | |
3351 /* Setup the tab drag and drop signals. */ | |
4486 | 3352 gtk_widget_add_events(gtkwin->notebook, |
3353 GDK_BUTTON1_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); | |
3354 g_signal_connect(G_OBJECT(gtkwin->notebook), "button_press_event", | |
4572
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3355 G_CALLBACK(notebook_press_cb), win); |
4486 | 3356 g_signal_connect(G_OBJECT(gtkwin->notebook), "button_release_event", |
4572
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3357 G_CALLBACK(notebook_release_cb), win); |
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3358 |
4359 | 3359 testidea = gtk_vbox_new(FALSE, 0); |
4572
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3360 |
4359 | 3361 /* Setup the menubar. */ |
3362 menubar = setup_menubar(win); | |
3363 gtk_box_pack_start(GTK_BOX(testidea), menubar, FALSE, TRUE, 0); | |
3364 | |
3365 gtk_box_pack_start(GTK_BOX(testidea), gtkwin->notebook, TRUE, TRUE, 0); | |
3366 | |
3367 gtk_container_add(GTK_CONTAINER(gtkwin->window), testidea); | |
3368 | |
3369 gtk_widget_show(testidea); | |
3370 } | |
3371 | |
3372 static void | |
3373 gaim_gtk_destroy_window(struct gaim_window *win) | |
3374 { | |
3375 struct gaim_gtk_window *gtkwin = GAIM_GTK_WINDOW(win); | |
3376 | |
3377 gtk_widget_destroy(gtkwin->window); | |
3378 | |
4630 | 3379 g_object_unref(G_OBJECT(gtkwin->menu.item_factory)); |
3380 | |
4359 | 3381 g_free(gtkwin); |
3382 win->ui_data = NULL; | |
3383 } | |
3384 | |
3385 static void | |
3386 gaim_gtk_show(struct gaim_window *win) | |
3387 { | |
3388 struct gaim_gtk_window *gtkwin = GAIM_GTK_WINDOW(win); | |
3389 | |
3390 gtk_widget_show(gtkwin->window); | |
3391 } | |
3392 | |
3393 static void | |
3394 gaim_gtk_hide(struct gaim_window *win) | |
3395 { | |
3396 struct gaim_gtk_window *gtkwin = GAIM_GTK_WINDOW(win); | |
3397 | |
3398 gtk_widget_hide(gtkwin->window); | |
3399 } | |
3400 | |
3401 static void | |
3402 gaim_gtk_raise(struct gaim_window *win) | |
3403 { | |
3404 struct gaim_gtk_window *gtkwin = GAIM_GTK_WINDOW(win); | |
3405 | |
5103 | 3406 gtk_window_deiconify(GTK_WINDOW(gtkwin->window)); |
4526 | 3407 gdk_window_raise(gtkwin->window->window); |
4359 | 3408 } |
3409 | |
3410 static void | |
3411 gaim_gtk_flash(struct gaim_window *win) | |
3412 { | |
3413 #ifdef _WIN32 | |
3414 struct gaim_gtk_window *gtkwin = GAIM_GTK_WINDOW(win); | |
3415 | |
3416 wgaim_im_blink(gtkwin->window); | |
3417 #endif | |
3418 } | |
3419 | |
3420 static void | |
3421 gaim_gtk_switch_conversation(struct gaim_window *win, unsigned int index) | |
3422 { | |
3423 struct gaim_gtk_window *gtkwin; | |
3424 | |
3425 gtkwin = GAIM_GTK_WINDOW(win); | |
3426 | |
3427 gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkwin->notebook), index); | |
3428 } | |
3429 | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3430 static const GtkTargetEntry te[] = |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3431 { |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3432 {"text/plain", 0, 0}, |
4702 | 3433 {"text/uri-list", 0, 1}, |
4781 | 3434 {"GAIM_BLIST_NODE", 0, 2}, |
4702 | 3435 {"STRING", 0, 3} |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3436 }; |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3437 |
4359 | 3438 static void |
3439 gaim_gtk_add_conversation(struct gaim_window *win, | |
3440 struct gaim_conversation *conv) | |
3441 { | |
3442 struct gaim_gtk_window *gtkwin; | |
3443 struct gaim_gtk_conversation *gtkconv; | |
3444 GtkWidget *pane = NULL; | |
3445 GtkWidget *tab_cont; | |
3446 GtkWidget *tabby; | |
3447 gboolean new_ui; | |
4383
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3448 GaimConversationType conv_type; |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3449 const char *name; |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3450 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3451 name = gaim_conversation_get_name(conv); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3452 conv_type = gaim_conversation_get_type(conv); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3453 gtkwin = GAIM_GTK_WINDOW(win); |
4359 | 3454 |
3455 if (conv->ui_data != NULL) { | |
3456 gtkconv = (struct gaim_gtk_conversation *)conv->ui_data; | |
3457 | |
3458 tab_cont = gtkconv->tab_cont; | |
3459 | |
3460 new_ui = FALSE; | |
3461 } | |
3462 else { | |
3463 gtkconv = g_malloc0(sizeof(struct gaim_gtk_conversation)); | |
3464 conv->ui_data = gtkconv; | |
3465 | |
3466 /* Setup some initial variables. */ | |
3467 gtkconv->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | |
3468 gtkconv->tooltips = gtk_tooltips_new(); | |
3469 | |
4421 | 3470 /* Setup the foreground and background colors */ |
3471 gaim_gtkconv_update_font_colors(conv); | |
3472 | |
4438
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
3473 /* Setup the font face */ |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
3474 gaim_gtkconv_update_font_face(conv); |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
3475 |
4383
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3476 if (conv_type == GAIM_CONV_CHAT) { |
4359 | 3477 gtkconv->u.chat = g_malloc0(sizeof(struct gaim_gtk_chat_pane)); |
3478 | |
3479 pane = setup_chat_pane(conv); | |
3480 } | |
4383
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3481 else if (conv_type == GAIM_CONV_IM) { |
4359 | 3482 gtkconv->u.im = g_malloc0(sizeof(struct gaim_gtk_im_pane)); |
3483 gtkconv->u.im->a_virgin = TRUE; | |
3484 | |
3485 pane = setup_im_pane(conv); | |
3486 } | |
3487 | |
3488 if (pane == NULL) { | |
4572
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3489 if (conv_type == GAIM_CONV_CHAT) g_free(gtkconv->u.chat); |
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3490 else if (conv_type == GAIM_CONV_IM) g_free(gtkconv->u.im); |
4359 | 3491 |
3492 g_free(gtkconv); | |
3493 conv->ui_data = NULL; | |
3494 | |
3495 return; | |
3496 } | |
3497 | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3498 /* Setup drag-and-drop */ |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3499 gtk_drag_dest_set(pane, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3500 GTK_DEST_DEFAULT_MOTION | |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3501 GTK_DEST_DEFAULT_DROP, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3502 te, sizeof(te) / sizeof(GtkTargetEntry), |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3503 GDK_ACTION_COPY); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3504 gtk_drag_dest_set(gtkconv->imhtml, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3505 GTK_DEST_DEFAULT_MOTION | |
4702 | 3506 GTK_DEST_DEFAULT_DROP, |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3507 te, sizeof(te) / sizeof(GtkTargetEntry), |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3508 GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3509 gtk_drag_dest_set(gtkconv->entry, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3510 GTK_DEST_DEFAULT_MOTION | |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3511 GTK_DEST_DEFAULT_DROP, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3512 te, sizeof(te) / sizeof(GtkTargetEntry), |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3513 GDK_ACTION_COPY); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3514 |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3515 g_signal_connect(G_OBJECT(pane), "drag_data_received", |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3516 G_CALLBACK(conv_dnd_recv), conv); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3517 g_signal_connect(G_OBJECT(gtkconv->imhtml), "drag_data_received", |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3518 G_CALLBACK(conv_dnd_recv), conv); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3519 #if 0 |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3520 g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3521 G_CALLBACK(conv_dnd_recv), conv); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3522 #endif |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3523 |
4383
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3524 /* |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3525 * Write the New Conversation log string. |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3526 * |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3527 * This should probably be elsewhere, but then, logging should |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3528 * be moved out in some way, either via plugin or via a new API. |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3529 */ |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3530 if (gaim_conversation_is_logging(conv) && |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3531 conv_type != GAIM_CONV_MISC) { |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3532 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3533 FILE *fd; |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3534 char filename[256]; |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3535 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3536 g_snprintf(filename, sizeof(filename), "%s%s", name, |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3537 (conv_type == GAIM_CONV_CHAT ? ".chat" : "")); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3538 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3539 fd = open_log_file(filename, (conv_type == GAIM_CONV_CHAT)); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3540 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3541 if (fd) { |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3542 if (!(logging_options & OPT_LOG_STRIP_HTML)) |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3543 fprintf(fd, |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3544 "<HR><BR><H3 Align=Center> " |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3545 "---- New Conversation @ %s ----</H3><BR>\n", |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3546 full_date()); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3547 else |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3548 fprintf(fd, "---- New Conversation @ %s ----\n", |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3549 full_date()); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3550 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3551 fclose(fd); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3552 } |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3553 } |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3554 |
4359 | 3555 /* Setup the container for the tab. */ |
3556 gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, 5); | |
3557 gtk_container_set_border_width(GTK_CONTAINER(tab_cont), 5); | |
3558 gtk_container_add(GTK_CONTAINER(tab_cont), pane); | |
3559 gtk_widget_show(pane); | |
3560 | |
3561 new_ui = TRUE; | |
4636 | 3562 |
4359 | 3563 gtkconv->make_sound = TRUE; |
3564 } | |
3565 | |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3566 g_signal_connect_swapped(G_OBJECT(pane), "focus", |
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3567 G_CALLBACK(gtk_widget_grab_focus), gtkconv->entry); |
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3568 |
4359 | 3569 gtkconv->tabby = tabby = gtk_hbox_new(FALSE, 5); |
3570 | |
3571 /* Close button. */ | |
3572 gtkconv->close = gtk_button_new(); | |
3573 gtk_widget_set_size_request(GTK_WIDGET(gtkconv->close), 16, 16); | |
3574 gtk_container_add(GTK_CONTAINER(gtkconv->close), | |
4445 | 3575 gtk_image_new_from_stock(GTK_STOCK_CLOSE, |
3576 GTK_ICON_SIZE_MENU)); | |
4359 | 3577 gtk_button_set_relief(GTK_BUTTON(gtkconv->close), GTK_RELIEF_NONE); |
3578 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->close, | |
4572
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3579 _("Close conversation"), NULL); |
4359 | 3580 |
3581 g_signal_connect(G_OBJECT(gtkconv->close), "clicked", | |
4571
51e988d015ed
[gaim-migrate @ 4852]
Christian Hammond <chipx86@chipx86.com>
parents:
4561
diff
changeset
|
3582 G_CALLBACK(close_conv_cb), conv); |
4359 | 3583 |
3584 /* Tab label. */ | |
3585 gtkconv->tab_label = gtk_label_new(gaim_conversation_get_title(conv)); | |
3586 #if 0 | |
3587 gtk_misc_set_alignment(GTK_MISC(gtkconv->tab_label), 0.00, 0.5); | |
3588 gtk_misc_set_padding(GTK_MISC(gtkconv->tab_label), 4, 0); | |
3589 #endif | |
3590 | |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3591 |
4359 | 3592 /* Pack it all together. */ |
3593 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->tab_label, TRUE, TRUE, 0); | |
4445 | 3594 gtk_widget_show(gtkconv->tab_label); |
3595 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); | |
3596 if (!(convo_options & OPT_CONVO_NO_X_ON_TAB)) | |
3597 gtk_widget_show_all(gtkconv->close); | |
3598 gtk_widget_show(tabby); | |
4359 | 3599 |
3600 | |
3601 /* Add this pane to the conversations notebook. */ | |
3602 gtk_notebook_append_page(GTK_NOTEBOOK(gtkwin->notebook), tab_cont, tabby); | |
3603 gtk_notebook_set_menu_label_text(GTK_NOTEBOOK(gtkwin->notebook), tab_cont, | |
3604 gaim_conversation_get_title(conv)); | |
3605 | |
3606 gtk_widget_show(tab_cont); | |
3607 | |
4818 | 3608 if (gaim_window_get_conversation_count(win) == 1) { |
3609 /* Er, bug in notebooks? Switch to the page manually. */ | |
4359 | 3610 gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkwin->notebook), 0); |
4851 | 3611 |
3612 if(conv_type == GAIM_CONV_IM) { | |
3613 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkwin->notebook), | |
3614 (im_options & OPT_IM_ONE_WINDOW)); | |
3615 } else if(conv_type == GAIM_CONV_CHAT) { | |
3616 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkwin->notebook), | |
3617 (chat_options & OPT_CHAT_ONE_WINDOW)); | |
3618 } | |
4818 | 3619 } else { |
3620 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkwin->notebook), TRUE); | |
3621 } | |
4359 | 3622 |
3623 if ((gtk_notebook_get_current_page(GTK_NOTEBOOK(gtkwin->notebook)) == 0) || | |
3624 (conv == g_list_nth_data(gaim_window_get_conversations(win), 0))) { | |
3625 | |
3626 gtk_widget_grab_focus(gtkconv->entry); | |
3627 } | |
3628 | |
3629 gaim_gtkconv_update_buddy_icon(conv); | |
3630 | |
3631 if (!new_ui) | |
3632 g_object_unref(gtkconv->tab_cont); | |
3633 | |
3634 if (gaim_window_get_conversation_count(win) == 1) | |
4685 | 3635 g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); |
4359 | 3636 } |
3637 | |
3638 static void | |
3639 gaim_gtk_remove_conversation(struct gaim_window *win, | |
3640 struct gaim_conversation *conv) | |
3641 { | |
3642 struct gaim_gtk_window *gtkwin; | |
3643 struct gaim_gtk_conversation *gtkconv; | |
3644 unsigned int index; | |
4818 | 3645 GaimConversationType conv_type; |
3646 | |
3647 conv_type = gaim_conversation_get_type(conv); | |
4359 | 3648 index = gaim_conversation_get_index(conv); |
3649 | |
3650 gtkwin = GAIM_GTK_WINDOW(win); | |
3651 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3652 | |
3653 g_object_ref(gtkconv->tab_cont); | |
3654 gtk_object_sink(GTK_OBJECT(gtkconv->tab_cont)); | |
3655 | |
3656 gtk_notebook_remove_page(GTK_NOTEBOOK(gtkwin->notebook), index); | |
3657 | |
4818 | 3658 /* go back to tabless if need be */ |
3659 if (gaim_window_get_conversation_count(win) <= 2) { | |
3660 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkwin->notebook), | |
3661 ((conv_type == GAIM_CONV_IM && im_options & OPT_IM_ONE_WINDOW) || | |
3662 (conv_type == GAIM_CONV_CHAT && im_options & OPT_CHAT_ONE_WINDOW))); | |
3663 } | |
3664 | |
3665 | |
4359 | 3666 /* If this window is setup with an inactive gc, regenerate the menu. */ |
4818 | 3667 if (conv_type == GAIM_CONV_IM && |
4359 | 3668 gaim_conversation_get_gc(conv) == NULL) { |
3669 | |
4360
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
3670 generate_send_as_items(win, conv); |
4359 | 3671 } |
3672 } | |
3673 | |
3674 static void | |
3675 gaim_gtk_move_conversation(struct gaim_window *win, | |
3676 struct gaim_conversation *conv, | |
3677 unsigned int new_index) | |
3678 { | |
3679 struct gaim_gtk_window *gtkwin; | |
3680 struct gaim_gtk_conversation *gtkconv; | |
3681 | |
3682 gtkwin = GAIM_GTK_WINDOW(win); | |
3683 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3684 | |
4415
c90039137172
[gaim-migrate @ 4688]
Christian Hammond <chipx86@chipx86.com>
parents:
4409
diff
changeset
|
3685 if (new_index > gaim_conversation_get_index(conv)) |
c90039137172
[gaim-migrate @ 4688]
Christian Hammond <chipx86@chipx86.com>
parents:
4409
diff
changeset
|
3686 new_index--; |
c90039137172
[gaim-migrate @ 4688]
Christian Hammond <chipx86@chipx86.com>
parents:
4409
diff
changeset
|
3687 |
4359 | 3688 gtk_notebook_reorder_child(GTK_NOTEBOOK(gtkwin->notebook), |
3689 gtkconv->tab_cont, new_index); | |
3690 } | |
3691 | |
3692 static int | |
3693 gaim_gtk_get_active_index(const struct gaim_window *win) | |
3694 { | |
3695 struct gaim_gtk_window *gtkwin; | |
3696 | |
3697 gtkwin = GAIM_GTK_WINDOW(win); | |
3698 | |
3699 return gtk_notebook_get_current_page(GTK_NOTEBOOK(gtkwin->notebook)); | |
3700 } | |
3701 | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3702 static struct gaim_window_ui_ops window_ui_ops = |
4359 | 3703 { |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3704 gaim_gtk_get_conversation_ui_ops, |
4359 | 3705 gaim_gtk_new_window, |
3706 gaim_gtk_destroy_window, | |
3707 gaim_gtk_show, | |
3708 gaim_gtk_hide, | |
3709 gaim_gtk_raise, | |
3710 gaim_gtk_flash, | |
3711 gaim_gtk_switch_conversation, | |
3712 gaim_gtk_add_conversation, | |
3713 gaim_gtk_remove_conversation, | |
3714 gaim_gtk_move_conversation, | |
3715 gaim_gtk_get_active_index | |
3716 }; | |
3717 | |
3718 static void | |
3719 update_convo_add_button(struct gaim_conversation *conv) | |
3720 { | |
3721 struct gaim_gtk_conversation *gtkconv; | |
3722 struct gaim_connection *gc; | |
3723 GaimConversationType type; | |
3724 GtkWidget *parent; | |
3725 | |
3726 type = gaim_conversation_get_type(conv); | |
3727 gc = gaim_conversation_get_gc(conv); | |
3728 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3729 parent = gtk_widget_get_parent(gtkconv->u.im->add); | |
3730 | |
4687 | 3731 if (gaim_find_buddy(gc->account, gaim_conversation_get_name(conv))) { |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3732 gtkconv->u.im->add = |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3733 gaim_gtk_change_text(_("Remove"), gtkconv->u.im->add, |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3734 GTK_STOCK_REMOVE, type); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3735 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->u.im->add, |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3736 _("Remove the user from your buddy list"), NULL); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3737 |
4359 | 3738 gtk_widget_set_sensitive(gtkconv->u.im->add, |
3739 (gc != NULL && gc->prpl->remove_buddy != NULL)); | |
3740 } else { | |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3741 gtkconv->u.im->add = |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3742 gaim_gtk_change_text(_("Add"), gtkconv->u.im->add, |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3743 GTK_STOCK_ADD, type); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3744 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->u.im->add, |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3745 _("Add the user to your buddy list"), NULL); |
4359 | 3746 |
3747 gtk_widget_set_sensitive(gtkconv->u.im->add, | |
3748 (gc != NULL && gc->prpl->add_buddy != NULL)); | |
3749 } | |
3750 | |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3751 g_signal_connect(G_OBJECT(gtkconv->u.im->add), "clicked", |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3752 G_CALLBACK(add_cb), conv); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3753 |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3754 gtk_box_pack_start(GTK_BOX(parent), gtkconv->u.im->add, |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3755 FALSE, FALSE, 0); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3756 gtk_box_reorder_child(GTK_BOX(parent), gtkconv->u.im->add, 3); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3757 gtk_button_set_relief(GTK_BUTTON(gtkconv->u.im->add), GTK_RELIEF_NONE); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3758 gtk_size_group_add_widget(gtkconv->sg, gtkconv->u.im->add); |
4359 | 3759 } |
3760 | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3761 struct gaim_window_ui_ops * |
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3762 gaim_get_gtk_window_ui_ops(void) |
4359 | 3763 { |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3764 return &window_ui_ops; |
4359 | 3765 } |
3766 | |
3767 /************************************************************************** | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3768 * Conversation UI operations |
4359 | 3769 **************************************************************************/ |
3770 static void | |
3771 gaim_gtkconv_destroy(struct gaim_conversation *conv) | |
3772 { | |
3773 struct gaim_gtk_conversation *gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3774 | |
3775 if (gtkconv->dialogs.fg_color != NULL) | |
3776 gtk_widget_destroy(gtkconv->dialogs.fg_color); | |
3777 | |
3778 if (gtkconv->dialogs.bg_color != NULL) | |
3779 gtk_widget_destroy(gtkconv->dialogs.bg_color); | |
3780 | |
3781 if (gtkconv->dialogs.font != NULL) | |
3782 gtk_widget_destroy(gtkconv->dialogs.font); | |
3783 | |
3784 if (gtkconv->dialogs.smiley != NULL) | |
3785 gtk_widget_destroy(gtkconv->dialogs.smiley); | |
3786 | |
3787 if (gtkconv->dialogs.link != NULL) | |
3788 gtk_widget_destroy(gtkconv->dialogs.link); | |
3789 | |
3790 if (gtkconv->dialogs.log != NULL) | |
3791 gtk_widget_destroy(gtkconv->dialogs.log); | |
3792 | |
4571
51e988d015ed
[gaim-migrate @ 4852]
Christian Hammond <chipx86@chipx86.com>
parents:
4561
diff
changeset
|
3793 gtk_widget_destroy(gtkconv->tab_cont); |
4892 | 3794 g_object_unref(gtkconv->tab_cont); |
4571
51e988d015ed
[gaim-migrate @ 4852]
Christian Hammond <chipx86@chipx86.com>
parents:
4561
diff
changeset
|
3795 |
4359 | 3796 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { |
4755 | 3797 if (gtkconv->u.im->icon_timer != 0) |
3798 g_source_remove(gtkconv->u.im->icon_timer); | |
3799 | |
4359 | 3800 if (gtkconv->u.im->save_icon != NULL) |
3801 gtk_widget_destroy(gtkconv->u.im->save_icon); | |
3802 | |
3803 if (gtkconv->u.im->anim != NULL) | |
4793 | 3804 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); |
4359 | 3805 |
3806 g_free(gtkconv->u.im); | |
3807 } | |
3808 else if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) { | |
3809 g_free(gtkconv->u.chat); | |
3810 } | |
3811 | |
4633 | 3812 gtk_object_sink(GTK_OBJECT(gtkconv->tooltips)); |
3813 | |
4359 | 3814 g_free(gtkconv); |
3815 } | |
3816 | |
3817 static void | |
3818 gaim_gtkconv_write_im(struct gaim_conversation *conv, const char *who, | |
3819 const char *message, size_t len, int flags, time_t mtime) | |
3820 { | |
3821 struct gaim_gtk_conversation *gtkconv; | |
3822 | |
3823 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3824 | |
4382
76223649765b
[gaim-migrate @ 4648]
Christian Hammond <chipx86@chipx86.com>
parents:
4378
diff
changeset
|
3825 /* Play a sound, if specified in prefs. */ |
4359 | 3826 if (gtkconv->make_sound) { |
3827 if (flags & WFLAG_RECV) { | |
3828 if (gtkconv->u.im->a_virgin && | |
3829 (sound_options & OPT_SOUND_FIRST_RCV)) { | |
3830 | |
4561 | 3831 gaim_sound_play_event(GAIM_SOUND_FIRST_RECEIVE); |
4359 | 3832 } |
3833 else | |
4561 | 3834 gaim_sound_play_event(GAIM_SOUND_RECEIVE); |
4359 | 3835 } |
3836 else { | |
4561 | 3837 gaim_sound_play_event(GAIM_SOUND_SEND); |
4359 | 3838 } |
3839 } | |
3840 | |
3841 gtkconv->u.im->a_virgin = FALSE; | |
3842 | |
3843 gaim_conversation_write(conv, who, message, len, flags, mtime); | |
3844 } | |
3845 | |
3846 static void | |
3847 gaim_gtkconv_write_chat(struct gaim_conversation *conv, const char *who, | |
3848 const char *message, int flags, time_t mtime) | |
3849 { | |
3850 struct gaim_gtk_conversation *gtkconv; | |
3851 | |
3852 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3853 | |
4382
76223649765b
[gaim-migrate @ 4648]
Christian Hammond <chipx86@chipx86.com>
parents:
4378
diff
changeset
|
3854 /* Play a sound, if specified in prefs. */ |
4359 | 3855 if (gtkconv->make_sound) { |
3856 if (!(flags & WFLAG_WHISPER) && (flags & WFLAG_SEND)) | |
4561 | 3857 gaim_sound_play_event(GAIM_SOUND_CHAT_YOU_SAY); |
4359 | 3858 else if (flags & WFLAG_RECV) { |
3859 if ((flags & WFLAG_NICK) && (sound_options & OPT_SOUND_CHAT_NICK)) | |
4561 | 3860 gaim_sound_play_event(GAIM_SOUND_CHAT_NICK); |
4359 | 3861 else |
4561 | 3862 gaim_sound_play_event(GAIM_SOUND_CHAT_SAY); |
4359 | 3863 } |
3864 } | |
3865 | |
3866 if (chat_options & OPT_CHAT_COLORIZE) | |
3867 flags |= WFLAG_COLORIZE; | |
3868 | |
3869 gaim_conversation_write(conv, who, message, -1, flags, mtime); | |
3870 } | |
3871 | |
3872 static void | |
3873 gaim_gtkconv_write_conv(struct gaim_conversation *conv, const char *who, | |
3874 const char *message, size_t length, int flags, | |
3875 time_t mtime) | |
3876 { | |
3877 struct gaim_gtk_conversation *gtkconv; | |
3878 struct gaim_connection *gc; | |
3879 int gtk_font_options = 0; | |
3880 GString *log_str; | |
3881 FILE *fd; | |
3882 char buf[BUF_LONG]; | |
3883 char buf2[BUF_LONG]; | |
3884 char mdate[64]; | |
3885 char color[10]; | |
3886 char *str; | |
3887 char *with_font_tag; | |
4896 | 3888 char *sml_attrib = NULL; |
4895 | 3889 |
3890 if(length == -1) | |
3891 length = strlen(message) + 1; | |
3892 | |
4359 | 3893 gtkconv = GAIM_GTK_CONVERSATION(conv); |
3894 gc = gaim_conversation_get_gc(conv); | |
3895 | |
3896 strftime(mdate, sizeof(mdate), "%H:%M:%S", localtime(&mtime)); | |
3897 | |
4896 | 3898 if(gc) |
3899 sml_attrib = g_strdup_printf("sml=\"%s\"", gc->prpl->name); | |
3900 | |
4359 | 3901 gtk_font_options ^= GTK_IMHTML_NO_COMMENTS; |
3902 | |
3903 if (convo_options & OPT_CONVO_IGNORE_COLOUR) | |
3904 gtk_font_options ^= GTK_IMHTML_NO_COLOURS; | |
3905 | |
3906 if (convo_options & OPT_CONVO_IGNORE_FONTS) | |
3907 gtk_font_options ^= GTK_IMHTML_NO_FONTS; | |
3908 | |
3909 if (convo_options & OPT_CONVO_IGNORE_SIZES) | |
3910 gtk_font_options ^= GTK_IMHTML_NO_SIZES; | |
3911 | |
3912 if (!(logging_options & OPT_LOG_STRIP_HTML)) | |
3913 gtk_font_options ^= GTK_IMHTML_RETURN_LOG; | |
3914 | |
3915 if (flags & WFLAG_SYSTEM) { | |
3916 if (convo_options & OPT_CONVO_SHOW_TIME) | |
3917 g_snprintf(buf, BUF_LONG, "<FONT SIZE=\"2\">(%s) </FONT><B>%s</B>", | |
3918 mdate, message); | |
3919 else | |
3920 g_snprintf(buf, BUF_LONG, "<B>%s</B>", message); | |
3921 | |
3922 g_snprintf(buf2, sizeof(buf2), | |
3923 "<FONT SIZE=\"2\"><!--(%s) --></FONT><B>%s</B><BR>", | |
3924 mdate, message); | |
3925 | |
3926 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, -1, 0); | |
3927 | |
3928 if (logging_options & OPT_LOG_STRIP_HTML) { | |
3929 char *t1 = strip_html(buf); | |
3930 | |
3931 conv->history = g_string_append(conv->history, t1); | |
3932 conv->history = g_string_append(conv->history, "\n"); | |
3933 | |
3934 g_free(t1); | |
3935 } | |
3936 else { | |
3937 conv->history = g_string_append(conv->history, buf); | |
3938 conv->history = g_string_append(conv->history, "<BR>\n"); | |
3939 } | |
3940 | |
3941 if (!(flags & WFLAG_NOLOG) && gaim_conversation_is_logging(conv)) { | |
3942 | |
3943 char *t1; | |
3944 char nm[256]; | |
3945 | |
3946 if (logging_options & OPT_LOG_STRIP_HTML) | |
3947 t1 = strip_html(buf); | |
3948 else | |
3949 t1 = buf; | |
3950 | |
3951 if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) | |
3952 g_snprintf(nm, sizeof(nm), "%s.chat", | |
3953 gaim_conversation_get_name(conv)); | |
3954 else | |
3955 strncpy(nm, gaim_conversation_get_name(conv), sizeof(nm)); | |
3956 | |
3957 fd = open_log_file(nm, | |
3958 (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT)); | |
3959 | |
3960 if (fd) { | |
3961 if (logging_options & OPT_LOG_STRIP_HTML) | |
3962 fprintf(fd, "%s\n", t1); | |
3963 else | |
3964 fprintf(fd, "%s<BR>\n", t1); | |
3965 | |
3966 fclose(fd); | |
3967 } | |
3968 | |
3969 if (logging_options & OPT_LOG_STRIP_HTML) | |
3970 g_free(t1); | |
3971 } | |
3972 } | |
3973 else if (flags & WFLAG_NOLOG) { | |
3974 g_snprintf(buf, BUF_LONG, | |
3975 "<B><FONT COLOR=\"#777777\">%s</FONT></B><BR>", | |
3976 message); | |
3977 | |
3978 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf, -1, 0); | |
3979 } | |
3980 else { | |
4895 | 3981 char *new_message = g_memdup(message, length); |
3982 | |
4359 | 3983 if (flags & WFLAG_WHISPER) { |
3984 str = g_malloc(1024); | |
3985 | |
3986 /* If we're whispering, it's not an autoresponse. */ | |
3987 if (meify(new_message, length)) { | |
3988 g_snprintf(str, 1024, "***%s", who); | |
3989 strcpy(color, "#6C2585"); | |
3990 } | |
3991 else { | |
3992 g_snprintf(str, 1024, "*%s*:", who); | |
3993 strcpy(color, "#00FF00"); | |
3994 } | |
3995 } | |
3996 else { | |
3997 if (meify(new_message, length)) { | |
3998 str = g_malloc(1024); | |
3999 | |
4000 if (flags & WFLAG_AUTO) | |
4001 g_snprintf(str, 1024, "%s ***%s", AUTO_RESPONSE, who); | |
4002 else | |
4003 g_snprintf(str, 1024, "***%s", who); | |
4004 | |
4005 if (flags & WFLAG_NICK) | |
4006 strcpy(color, "#AF7F00"); | |
4007 else | |
4008 strcpy(color, "#062585"); | |
4009 } | |
4010 else { | |
4011 str = g_malloc(1024); | |
4012 | |
4013 if (flags & WFLAG_AUTO) | |
4014 g_snprintf(str, 1024, "%s %s", who, AUTO_RESPONSE); | |
4015 else | |
4016 g_snprintf(str, 1024, "%s:", who); | |
4017 | |
4018 if (flags & WFLAG_NICK) | |
4019 strcpy(color, "#AF7F00"); | |
4020 else if (flags & WFLAG_RECV) { | |
4021 if (flags & WFLAG_COLORIZE) { | |
4022 const char *u; | |
4023 int m = 0; | |
4024 | |
4025 for (u = who; *u != '\0'; u++) | |
4026 m += *u; | |
4027 | |
4028 m = m % NUM_NICK_COLORS; | |
4029 | |
4030 strcpy(color, nick_colors[m]); | |
4031 } | |
4032 else | |
4033 strcpy(color, "#A82F2F"); | |
4034 } | |
4035 else if (flags & WFLAG_SEND) | |
4036 strcpy(color, "#16569E"); | |
4037 } | |
4038 } | |
4039 | |
4040 if (convo_options & OPT_CONVO_SHOW_TIME) | |
4041 g_snprintf(buf, BUF_LONG, | |
4896 | 4042 "<FONT COLOR=\"%s\" %s><FONT SIZE=\"2\">(%s) </FONT>" |
4043 "<B>%s</B></FONT> ", color, | |
4044 sml_attrib ? sml_attrib : "", mdate, str); | |
4359 | 4045 else |
4046 g_snprintf(buf, BUF_LONG, | |
4896 | 4047 "<FONT COLOR=\"%s\" %s><B>%s</B></FONT> ", color, |
4048 sml_attrib ? sml_attrib : "", str); | |
4359 | 4049 |
4050 g_snprintf(buf2, BUF_LONG, | |
4896 | 4051 "<FONT COLOR=\"%s\" %s><FONT SIZE=\"2\"><!--(%s) --></FONT>" |
4359 | 4052 "<B>%s</B></FONT> ", |
4896 | 4053 color, sml_attrib ? sml_attrib : "", mdate, str); |
4359 | 4054 |
4055 g_free(str); | |
4056 | |
4057 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, -1, 0); | |
4058 | |
4895 | 4059 if(gc){ |
4896 | 4060 char *pre = g_strdup_printf("<font %s>", sml_attrib ? sml_attrib : ""); |
4895 | 4061 char *post = "</font>"; |
4062 int pre_len = strlen(pre); | |
4063 int post_len = strlen(post); | |
4064 | |
4065 with_font_tag = g_malloc(length + pre_len + post_len + 1); | |
4066 | |
4067 strcpy(with_font_tag, pre); | |
4068 memcpy(with_font_tag + pre_len, new_message, length); | |
4069 strcpy(with_font_tag + pre_len + length, post); | |
4070 | |
4071 length += pre_len + post_len; | |
4072 g_free(pre); | |
4073 } | |
4608 | 4074 else |
4895 | 4075 with_font_tag = g_memdup(new_message, length); |
4359 | 4076 |
4077 log_str = gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), | |
4895 | 4078 with_font_tag, length, gtk_font_options); |
4359 | 4079 |
4080 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), "<BR>", -1, 0); | |
4081 | |
4082 /* XXX This needs to be updated for the new length argument. */ | |
4083 if (logging_options & OPT_LOG_STRIP_HTML) { | |
4084 char *t1, *t2; | |
4085 | |
4086 t1 = strip_html(buf); | |
4087 t2 = strip_html(new_message); | |
4088 | |
4089 conv->history = g_string_append(conv->history, t1); | |
4090 conv->history = g_string_append(conv->history, t2); | |
4091 conv->history = g_string_append(conv->history, "\n"); | |
4092 | |
4093 g_free(t1); | |
4094 g_free(t2); | |
4095 } | |
4096 else { | |
4097 char *t1, *t2; | |
4098 | |
4099 t1 = html_logize(buf); | |
4100 t2 = html_logize(new_message); | |
4101 | |
4102 conv->history = g_string_append(conv->history, t1); | |
4103 conv->history = g_string_append(conv->history, t2); | |
4104 conv->history = g_string_append(conv->history, "\n"); | |
4105 conv->history = g_string_append(conv->history, log_str->str); | |
4106 conv->history = g_string_append(conv->history, "<BR>\n"); | |
4107 | |
4108 g_free(t1); | |
4109 g_free(t2); | |
4110 } | |
4111 | |
4112 /* XXX This needs to be updated for the new length argument. */ | |
4113 if (gaim_conversation_is_logging(conv)) { | |
4114 char *t1, *t2; | |
4115 char nm[256]; | |
4116 | |
4117 if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) | |
4118 g_snprintf(nm, sizeof(nm), "%s.chat", | |
4119 gaim_conversation_get_name(conv)); | |
4120 else | |
4121 strncpy(nm, gaim_conversation_get_name(conv), sizeof(nm)); | |
4122 | |
4123 if (logging_options & OPT_LOG_STRIP_HTML) { | |
4124 t1 = strip_html(buf); | |
4125 t2 = strip_html(with_font_tag); | |
4126 } | |
4127 else { | |
4128 t1 = html_logize(buf); | |
4129 t2 = html_logize(with_font_tag); | |
4130 } | |
4131 | |
4132 fd = open_log_file(nm, | |
4133 (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT)); | |
4134 | |
4135 if (fd) { | |
4136 if (logging_options & OPT_LOG_STRIP_HTML) | |
4137 fprintf(fd, "%s%s\n", t1, t2); | |
4138 else { | |
4139 fprintf(fd, "%s%s%s<BR>\n", t1, t2, log_str->str); | |
4140 g_string_free(log_str, TRUE); | |
4141 } | |
4142 | |
4143 fclose(fd); | |
4144 } | |
4145 | |
4146 g_free(t1); | |
4147 g_free(t2); | |
4148 } | |
4149 | |
4150 g_free(with_font_tag); | |
4151 g_free(new_message); | |
4152 } | |
5012 | 4153 if(sml_attrib) |
4154 g_free(sml_attrib); | |
4359 | 4155 } |
4156 | |
4157 static void | |
4158 gaim_gtkconv_chat_add_user(struct gaim_conversation *conv, const char *user) | |
4159 { | |
4160 struct gaim_chat *chat; | |
4161 struct gaim_gtk_conversation *gtkconv; | |
4162 struct gaim_gtk_chat_pane *gtkchat; | |
4163 char tmp[BUF_LONG]; | |
4164 int num_users; | |
4165 int pos; | |
4166 | |
4167 chat = GAIM_CHAT(conv); | |
4168 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4169 gtkchat = gtkconv->u.chat; | |
4170 | |
4171 num_users = g_list_length(gaim_chat_get_users(chat)); | |
4172 | |
4173 g_snprintf(tmp, sizeof(tmp), | |
4174 ngettext("%d person in room", "%d people in room", | |
4175 num_users), | |
4176 num_users); | |
4177 | |
4178 gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); | |
4179 | |
4180 if (gtkconv->make_sound) | |
4561 | 4181 gaim_sound_play_event(GAIM_SOUND_CHAT_JOIN); |
4359 | 4182 |
4183 pos = g_list_index(gaim_chat_get_users(chat), user); | |
4184 | |
4185 add_chat_buddy_common(conv, user, pos); | |
4186 } | |
4187 | |
4188 static void | |
4189 gaim_gtkconv_chat_rename_user(struct gaim_conversation *conv, | |
4190 const char *old_name, const char *new_name) | |
4191 { | |
4192 struct gaim_chat *chat; | |
4193 struct gaim_gtk_conversation *gtkconv; | |
4194 struct gaim_gtk_chat_pane *gtkchat; | |
4195 GtkTreeIter iter; | |
4196 GtkTreeModel *model; | |
4197 GList *names; | |
4198 int pos; | |
4199 int f = 1; | |
4200 | |
4201 chat = GAIM_CHAT(conv); | |
4202 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4203 gtkchat = gtkconv->u.chat; | |
4204 | |
4205 for (names = gaim_chat_get_users(chat); | |
4206 names != NULL; | |
4207 names = names->next) { | |
4208 | |
4209 char *u = (char *)names->data; | |
4210 | |
4793 | 4211 if (!gaim_utf8_strcasecmp(u, old_name)) { |
4359 | 4212 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
4213 | |
4214 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) | |
4215 break; | |
4216 | |
4217 while (f != 0) { | |
4218 char *val; | |
4219 | |
4220 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 1, &val, -1); | |
4221 | |
4793 | 4222 if (!gaim_utf8_strcasecmp(old_name, val)) { |
4359 | 4223 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); |
4640 | 4224 break; |
4225 } | |
4359 | 4226 |
4227 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4228 | |
4229 g_free(val); | |
4230 } | |
4231 | |
4232 break; | |
4233 } | |
4234 } | |
4235 | |
4236 if (!names) | |
4237 return; | |
4238 | |
4239 pos = g_list_index(gaim_chat_get_users(chat), new_name); | |
4240 | |
4241 add_chat_buddy_common(conv, new_name, pos); | |
4242 } | |
4243 | |
4244 static void | |
4245 gaim_gtkconv_chat_remove_user(struct gaim_conversation *conv, const char *user) | |
4246 { | |
4247 struct gaim_chat *chat; | |
4248 struct gaim_gtk_conversation *gtkconv; | |
4249 struct gaim_gtk_chat_pane *gtkchat; | |
4250 GtkTreeIter iter; | |
4251 GtkTreeModel *model; | |
4252 GList *names; | |
4253 char tmp[BUF_LONG]; | |
4254 int num_users; | |
4255 int f = 1; | |
4256 | |
4257 chat = GAIM_CHAT(conv); | |
4258 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4259 gtkchat = gtkconv->u.chat; | |
4260 | |
4261 num_users = g_list_length(gaim_chat_get_users(chat)) - 1; | |
4262 | |
4263 for (names = gaim_chat_get_users(chat); | |
4264 names != NULL; | |
4265 names = names->next) { | |
4266 | |
4267 char *u = (char *)names->data; | |
4268 | |
4793 | 4269 if (!gaim_utf8_strcasecmp(u, user)) { |
4359 | 4270 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
4271 | |
4272 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) | |
4273 break; | |
4274 | |
4275 while (f != 0) { | |
4276 char *val; | |
4277 | |
4278 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 1, &val, -1); | |
4279 | |
4793 | 4280 if (!gaim_utf8_strcasecmp(user, val)) |
4359 | 4281 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); |
4282 | |
4283 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4284 | |
4285 g_free(val); | |
4286 } | |
4287 | |
4288 break; | |
4289 } | |
4290 } | |
4291 | |
4292 if (names == NULL) | |
4293 return; | |
4294 | |
4295 g_snprintf(tmp, sizeof(tmp), | |
4296 ngettext("%d person in room", "%d people in room", | |
4297 num_users), num_users); | |
4298 | |
4299 gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); | |
4300 | |
4301 if (gtkconv->make_sound) | |
4561 | 4302 gaim_sound_play_event(GAIM_SOUND_CHAT_LEAVE); |
4359 | 4303 } |
4304 | |
4305 static void | |
4306 gaim_gtkconv_set_title(struct gaim_conversation *conv, const char *title) | |
4307 { | |
4308 struct gaim_gtk_conversation *gtkconv; | |
4681 | 4309 struct gaim_window *win; |
4310 struct gaim_gtk_window *gtkwin; | |
4311 | |
4312 win = gaim_conversation_get_window(conv); | |
4313 gtkwin = GAIM_GTK_WINDOW(win); | |
4359 | 4314 gtkconv = GAIM_GTK_CONVERSATION(conv); |
4315 | |
4316 gtk_label_set_text(GTK_LABEL(gtkconv->tab_label), title); | |
4681 | 4317 |
4318 if(conv == gaim_window_get_active_conversation(win)) | |
4319 gtk_window_set_title(GTK_WINDOW(gtkwin->window), title); | |
4359 | 4320 } |
4321 | |
4322 static void | |
4323 gaim_gtkconv_updated(struct gaim_conversation *conv, GaimConvUpdateType type) | |
4324 { | |
4325 struct gaim_window *win; | |
4736 | 4326 struct gaim_gtk_window *gtkwin; |
4359 | 4327 struct gaim_gtk_conversation *gtkconv; |
4328 struct gaim_gtk_chat_pane *gtkchat; | |
4329 struct gaim_chat *chat; | |
4330 | |
4331 win = gaim_conversation_get_window(conv); | |
4736 | 4332 gtkwin = GAIM_GTK_WINDOW(win); |
4359 | 4333 gtkconv = GAIM_GTK_CONVERSATION(conv); |
4334 | |
4491 | 4335 if (type == GAIM_CONV_UPDATE_ACCOUNT) { |
4359 | 4336 gaim_conversation_autoset_title(conv); |
4337 gaim_gtkconv_update_buddy_icon(conv); | |
4338 gaim_gtkconv_update_buttons_by_protocol(conv); | |
4339 | |
4685 | 4340 g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); |
4359 | 4341 |
4342 smiley_themeize(gtkconv->imhtml); | |
4343 } | |
4344 else if (type == GAIM_CONV_UPDATE_TYPING || | |
4345 type == GAIM_CONV_UPDATE_UNSEEN) { | |
4346 GtkStyle *style; | |
4347 struct gaim_im *im = NULL; | |
4348 | |
4736 | 4349 |
4359 | 4350 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) |
4351 im = GAIM_IM(conv); | |
4352 | |
4353 style = gtk_style_new(); | |
4354 | |
4355 if (!GTK_WIDGET_REALIZED(gtkconv->tab_label)) | |
4356 gtk_widget_realize(gtkconv->tab_label); | |
4357 | |
4757 | 4358 pango_font_description_free(style->font_desc); |
4635 | 4359 style->font_desc = pango_font_description_copy( |
4360 gtk_widget_get_style(gtkconv->tab_label)->font_desc); | |
4359 | 4361 |
4362 if (im != NULL && gaim_im_get_typing_state(im) == TYPING) { | |
4577 | 4363 style->fg[GTK_STATE_NORMAL].red = 0x4646; |
4364 style->fg[GTK_STATE_NORMAL].green = 0xA0A0; | |
4365 style->fg[GTK_STATE_NORMAL].blue = 0x4646; | |
4366 style->fg[GTK_STATE_ACTIVE] = style->fg[GTK_STATE_NORMAL]; | |
4359 | 4367 } |
4368 else if (im != NULL && gaim_im_get_typing_state(im) == TYPED) { | |
4577 | 4369 style->fg[GTK_STATE_NORMAL].red = 0xD1D1; |
4370 style->fg[GTK_STATE_NORMAL].green = 0x9494; | |
4371 style->fg[GTK_STATE_NORMAL].blue = 0x0C0C; | |
4372 style->fg[GTK_STATE_ACTIVE] = style->fg[GTK_STATE_NORMAL]; | |
4359 | 4373 } |
4374 else if (gaim_conversation_get_unseen(conv) == GAIM_UNSEEN_NICK) { | |
4577 | 4375 style->fg[GTK_STATE_ACTIVE].red = 0x3131; |
4376 style->fg[GTK_STATE_ACTIVE].green = 0x4E4E; | |
4377 style->fg[GTK_STATE_ACTIVE].blue = 0x6C6C; | |
4578 | 4378 style->fg[GTK_STATE_NORMAL] = style->fg[GTK_STATE_ACTIVE]; |
4359 | 4379 } |
4380 else if (gaim_conversation_get_unseen(conv) == GAIM_UNSEEN_TEXT) { | |
4577 | 4381 style->fg[GTK_STATE_ACTIVE].red = 0xDFDF; |
4382 style->fg[GTK_STATE_ACTIVE].green = 0x4242; | |
4383 style->fg[GTK_STATE_ACTIVE].blue = 0x1E1E; | |
4578 | 4384 style->fg[GTK_STATE_NORMAL] = style->fg[GTK_STATE_ACTIVE]; |
4359 | 4385 } |
4386 | |
4387 gtk_widget_set_style(gtkconv->tab_label, style); | |
4635 | 4388 g_object_unref(G_OBJECT(style)); |
4736 | 4389 |
4812 | 4390 if(conv == gaim_window_get_active_conversation(win)) { |
4736 | 4391 update_typing_icon(conv); |
4392 } | |
4393 | |
4359 | 4394 } |
4395 else if (type == GAIM_CONV_UPDATE_TOPIC) { | |
4396 chat = GAIM_CHAT(conv); | |
4397 gtkchat = gtkconv->u.chat; | |
4398 | |
4399 gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), | |
4400 gaim_chat_get_topic(chat)); | |
4401 } | |
4402 else if (type == GAIM_CONV_ACCOUNT_ONLINE || | |
4403 type == GAIM_CONV_ACCOUNT_OFFLINE) { | |
4404 | |
4360
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
4405 generate_send_as_items(win, NULL); |
4359 | 4406 } |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
4407 else if(type == GAIM_CONV_UPDATE_ADD || |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
4408 type == GAIM_CONV_UPDATE_REMOVE) { |
4736 | 4409 |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
4410 update_convo_add_button(conv); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
4411 } |
4359 | 4412 } |
4413 | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
4414 static struct gaim_conversation_ui_ops conversation_ui_ops = |
4359 | 4415 { |
4416 gaim_gtkconv_destroy, /* destroy_conversation */ | |
4417 gaim_gtkconv_write_chat, /* write_chat */ | |
4418 gaim_gtkconv_write_im, /* write_im */ | |
4419 gaim_gtkconv_write_conv, /* write_conv */ | |
4420 gaim_gtkconv_chat_add_user, /* chat_add_user */ | |
4421 gaim_gtkconv_chat_rename_user, /* chat_rename_user */ | |
4422 gaim_gtkconv_chat_remove_user, /* chat_remove_user */ | |
4423 gaim_gtkconv_set_title, /* set_title */ | |
4424 NULL, /* update_progress */ | |
4425 gaim_gtkconv_updated /* updated */ | |
4426 }; | |
4427 | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
4428 struct gaim_conversation_ui_ops * |
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
4429 gaim_get_gtk_conversation_ui_ops(void) |
4359 | 4430 { |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
4431 return &conversation_ui_ops; |
4359 | 4432 } |
4433 | |
4434 /************************************************************************** | |
4435 * Public conversation utility functions | |
4436 **************************************************************************/ | |
4437 void | |
4438 gaim_gtkconv_toggle_smileys(void) | |
4439 { | |
4440 GList *cl; | |
4441 struct gaim_conversation *conv; | |
4442 struct gaim_gtk_conversation *gtkconv; | |
4443 | |
4444 for (cl = gaim_get_conversations(); cl != NULL; cl = cl->next) { | |
4445 | |
4446 conv = (struct gaim_conversation *)cl->data; | |
4447 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4448 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4449 continue; |
4450 | |
4451 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4452 | |
4453 gtk_imhtml_show_smileys(GTK_IMHTML(gtkconv->imhtml), | |
4454 (convo_options & OPT_CONVO_SHOW_SMILEY)); | |
4455 } | |
4456 } | |
4457 | |
4458 void | |
4459 gaim_gtkconv_toggle_timestamps(void) | |
4460 { | |
4461 GList *cl; | |
4462 struct gaim_conversation *conv; | |
4463 struct gaim_gtk_conversation *gtkconv; | |
4464 | |
4465 for (cl = gaim_get_conversations(); cl != NULL; cl = cl->next) { | |
4466 | |
4467 conv = (struct gaim_conversation *)cl->data; | |
4468 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4469 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4470 continue; |
4471 | |
4472 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4473 | |
4474 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), | |
4475 (convo_options & OPT_CONVO_SHOW_TIME)); | |
4476 } | |
4477 } | |
4478 | |
4479 void | |
4480 gaim_gtkconv_toggle_spellchk(void) | |
4481 { | |
4482 #ifdef USE_GTKSPELL | |
4483 GList *cl; | |
4484 struct gaim_conversation *conv; | |
4485 struct gaim_gtk_conversation *gtkconv; | |
4486 GtkSpell *spell; | |
4487 | |
4859
a9a831508b43
[gaim-migrate @ 5186]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4851
diff
changeset
|
4488 debug_printf("gaim_gtkconv_toggle_spellchk\n"); |
4359 | 4489 for (cl = gaim_get_conversations(); cl != NULL; cl = cl->next) { |
4490 | |
4491 conv = (struct gaim_conversation *)cl->data; | |
4492 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4493 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4494 continue; |
4495 | |
4496 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4497 | |
4498 if (convo_options & OPT_CONVO_CHECK_SPELLING) | |
4499 gtkspell_new_attach(GTK_TEXT_VIEW(gtkconv->entry), NULL, NULL); | |
4500 else { | |
4501 spell = gtkspell_get_from_text_view(GTK_TEXT_VIEW(gtkconv->entry)); | |
4502 gtkspell_detach(spell); | |
4503 } | |
4504 } | |
4505 #endif | |
4506 } | |
4507 | |
4445 | 4508 void |
4509 gaim_gtkconv_toggle_close_buttons(void) | |
4510 { | |
4511 GList *cl; | |
4512 struct gaim_conversation *conv; | |
4513 struct gaim_gtk_conversation *gtkconv; | |
4514 | |
4515 for (cl = gaim_get_conversations(); cl != NULL; cl = cl->next) { | |
4516 conv = (struct gaim_conversation *)cl->data; | |
4517 if (!GAIM_IS_GTK_CONVERSATION(conv)) | |
4518 continue; | |
4519 | |
4520 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4521 | |
4522 if (convo_options & OPT_CONVO_NO_X_ON_TAB) | |
4523 gtk_widget_hide(gtkconv->close); | |
4524 else | |
4525 gtk_widget_show_all(gtkconv->close); | |
4526 } | |
4527 } | |
4528 | |
4359 | 4529 static void |
4530 remove_icon(struct gaim_gtk_conversation *gtkconv) | |
4531 { | |
4532 if (gtkconv == NULL) | |
4533 return; | |
4534 | |
4535 if (gtkconv->u.im->icon != NULL) | |
4536 gtk_container_remove(GTK_CONTAINER(gtkconv->bbox), | |
4537 gtkconv->u.im->icon->parent->parent); | |
4538 | |
4539 if (gtkconv->u.im->anim != NULL) | |
4793 | 4540 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); |
4359 | 4541 |
4542 if (gtkconv->u.im->icon_timer != 0) | |
4543 g_source_remove(gtkconv->u.im->icon_timer); | |
4544 | |
4545 if (gtkconv->u.im->iter != NULL) | |
4546 g_object_unref(G_OBJECT(gtkconv->u.im->iter)); | |
4547 | |
4548 gtkconv->u.im->icon_timer = 0; | |
4549 gtkconv->u.im->icon = NULL; | |
4550 gtkconv->u.im->anim = NULL; | |
4551 gtkconv->u.im->iter = NULL; | |
4552 } | |
4553 | |
4554 static gboolean | |
4555 redraw_icon(gpointer data) | |
4556 { | |
4557 struct gaim_conversation *conv = (struct gaim_conversation *)data; | |
4558 struct gaim_gtk_conversation *gtkconv; | |
4559 | |
4560 GdkPixbuf *buf; | |
4561 GdkPixbuf *scale; | |
4562 GdkPixmap *pm; | |
4563 GdkBitmap *bm; | |
4564 gint delay; | |
4565 | |
4566 if (!g_list_find(gaim_get_ims(), conv)) { | |
4567 debug_printf("I think this is a bug.\n"); | |
4568 return FALSE; | |
4569 } | |
4570 | |
4571 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4572 | |
4573 gdk_pixbuf_animation_iter_advance(gtkconv->u.im->iter, NULL); | |
4574 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter); | |
4575 | |
4576 scale = gdk_pixbuf_scale_simple(buf, | |
4577 MAX(gdk_pixbuf_get_width(buf) * SCALE(gtkconv->u.im->anim) / | |
4578 gdk_pixbuf_animation_get_width(gtkconv->u.im->anim), 1), | |
4579 MAX(gdk_pixbuf_get_height(buf) * SCALE(gtkconv->u.im->anim) / | |
4580 gdk_pixbuf_animation_get_height(gtkconv->u.im->anim), 1), | |
4581 GDK_INTERP_NEAREST); | |
4582 | |
4583 gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 100); | |
4793 | 4584 g_object_unref(G_OBJECT(scale)); |
4635 | 4585 gtk_image_set_from_pixmap(GTK_IMAGE(gtkconv->u.im->icon), pm, bm); |
4793 | 4586 g_object_unref(G_OBJECT(pm)); |
4359 | 4587 gtk_widget_queue_draw(gtkconv->u.im->icon); |
4588 | |
4589 if (bm) | |
4793 | 4590 g_object_unref(G_OBJECT(bm)); |
4359 | 4591 |
4592 delay = gdk_pixbuf_animation_iter_get_delay_time(gtkconv->u.im->iter) / 10; | |
4593 | |
4594 gtkconv->u.im->icon_timer = g_timeout_add(delay * 10, redraw_icon, conv); | |
4595 | |
4596 return FALSE; | |
4597 } | |
4598 | |
4599 static void | |
4600 start_anim(GtkObject *obj, struct gaim_conversation *conv) | |
4601 { | |
4602 struct gaim_gtk_conversation *gtkconv; | |
4603 int delay; | |
4604 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4605 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4606 return; |
4607 | |
4608 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4609 | |
4610 delay = gdk_pixbuf_animation_iter_get_delay_time(gtkconv->u.im->iter) / 10; | |
4611 | |
4612 if (gtkconv->u.im->anim) | |
4613 gtkconv->u.im->icon_timer = g_timeout_add(delay * 10, redraw_icon, | |
4614 conv); | |
4615 } | |
4616 | |
4617 static void | |
4618 stop_anim(GtkObject *obj, struct gaim_conversation *conv) | |
4619 { | |
4620 struct gaim_gtk_conversation *gtkconv; | |
4621 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4622 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4623 return; |
4624 | |
4625 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4626 | |
4627 if (gtkconv->u.im->icon_timer != 0) | |
4628 g_source_remove(gtkconv->u.im->icon_timer); | |
4629 | |
4630 gtkconv->u.im->icon_timer = 0; | |
4631 } | |
4632 | |
4633 static gboolean | |
4634 icon_menu(GtkObject *obj, GdkEventButton *e, struct gaim_conversation *conv) | |
4635 { | |
4636 struct gaim_gtk_conversation *gtkconv; | |
4637 static GtkWidget *menu = NULL; | |
4638 GtkWidget *button; | |
4639 | |
4640 if (e->button != 3 || e->type != GDK_BUTTON_PRESS) | |
4641 return FALSE; | |
4642 | |
4643 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4644 | |
4645 /* | |
4646 * If a menu already exists, destroy it before creating a new one, | |
4647 * thus freeing-up the memory it occupied. | |
4648 */ | |
4649 if (menu != NULL) | |
4650 gtk_widget_destroy(menu); | |
4651 | |
4652 menu = gtk_menu_new(); | |
4653 | |
4654 if (gtkconv->u.im->icon_timer) { | |
4655 button = gtk_menu_item_new_with_label(_("Disable Animation")); | |
4656 g_signal_connect(GTK_OBJECT(button), "activate", | |
4657 G_CALLBACK(stop_anim), conv); | |
4658 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); | |
4659 gtk_widget_show(button); | |
4660 } | |
4661 else if (gtkconv->u.im->anim && | |
4662 !(gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim))) | |
4663 { | |
4664 button = gtk_menu_item_new_with_label(_("Enable Animation")); | |
4665 g_signal_connect(GTK_OBJECT(button), "activate", | |
4666 G_CALLBACK(start_anim), conv); | |
4667 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); | |
4668 gtk_widget_show(button); | |
4669 } | |
4670 | |
4671 button = gtk_menu_item_new_with_label(_("Hide Icon")); | |
4672 g_signal_connect_swapped(GTK_OBJECT(button), "activate", | |
4515
9b9737a00a96
[gaim-migrate @ 4793]
Christian Hammond <chipx86@chipx86.com>
parents:
4513
diff
changeset
|
4673 G_CALLBACK(remove_icon), gtkconv); |
4359 | 4674 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); |
4675 gtk_widget_show(button); | |
4676 | |
4677 button = gtk_menu_item_new_with_label(_("Save Icon As...")); | |
4678 g_signal_connect(GTK_OBJECT(button), "activate", | |
4679 G_CALLBACK(gaim_gtk_save_icon_dialog), conv); | |
4680 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); | |
4681 gtk_widget_show(button); | |
4682 | |
4683 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); | |
4684 | |
4685 return TRUE; | |
4686 } | |
4687 | |
4688 void | |
4689 gaim_gtkconv_update_buddy_icon(struct gaim_conversation *conv) | |
4690 { | |
4691 struct gaim_gtk_conversation *gtkconv; | |
4692 | |
4693 char filename[256]; | |
4694 FILE *file; | |
4695 GError *err = NULL; | |
4696 | |
4757 | 4697 struct buddy *buddy; |
4698 | |
4359 | 4699 void *data; |
4700 int len, delay; | |
4701 | |
4702 GdkPixbuf *buf; | |
4703 | |
4704 GtkWidget *event; | |
4705 GtkWidget *frame; | |
4706 GdkPixbuf *scale; | |
4707 GdkPixmap *pm; | |
4708 GdkBitmap *bm; | |
4709 int sf = 0; | |
4710 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4711 if (conv == NULL || !GAIM_IS_GTK_CONVERSATION(conv) || |
4359 | 4712 gaim_conversation_get_type(conv) != GAIM_CONV_IM) { |
4713 | |
4714 return; | |
4715 } | |
4716 | |
4717 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4718 | |
4719 remove_icon(gtkconv); | |
4720 | |
4721 if (im_options & OPT_IM_HIDE_ICONS) | |
4722 return; | |
4723 | |
4724 if (gaim_conversation_get_gc(conv) == NULL) | |
4725 return; | |
4726 | |
4793 | 4727 if(gtkconv->u.im->anim) |
4728 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); | |
4729 | |
4757 | 4730 if((buddy = gaim_find_buddy(gaim_conversation_get_account(conv), |
4731 gaim_conversation_get_name(conv))) != NULL) { | |
4732 char *file = gaim_buddy_get_setting(buddy, "buddy_icon"); | |
4733 if(file) { | |
4734 gtkconv->u.im->anim = gdk_pixbuf_animation_new_from_file(file, &err); | |
4735 g_free(file); | |
4736 } | |
4737 } else { | |
4738 data = get_icon_data(gaim_conversation_get_gc(conv), | |
4739 normalize(gaim_conversation_get_name(conv)), | |
4740 &len); | |
4741 | |
4742 if (!data) | |
4743 return; | |
4744 | |
4745 /* this is such an evil hack, i don't know why i'm even considering it. | |
4746 * we'll do it differently when gdk-pixbuf-loader isn't leaky anymore. */ | |
4747 g_snprintf(filename, sizeof(filename), | |
4748 "%s" G_DIR_SEPARATOR_S "gaimicon-%s.%d", | |
4749 g_get_tmp_dir(), gaim_conversation_get_name(conv), getpid()); | |
4750 | |
4751 if (!(file = fopen(filename, "wb"))) | |
4752 return; | |
4753 | |
4754 fwrite(data, 1, len, file); | |
4755 fclose(file); | |
4756 | |
4757 gtkconv->u.im->anim = gdk_pixbuf_animation_new_from_file(filename, &err); | |
4758 /* make sure we remove the file as soon as possible */ | |
4759 unlink(filename); | |
4760 } | |
4359 | 4761 |
4762 if (err) { | |
4763 debug_printf("Buddy icon error: %s\n", err->message); | |
4764 g_error_free(err); | |
4765 } | |
4766 | |
4767 | |
4768 if (!gtkconv->u.im->anim) | |
4769 return; | |
4770 | |
4793 | 4771 if(gtkconv->u.im->iter) |
4772 g_object_unref(G_OBJECT(gtkconv->u.im->iter)); | |
4773 | |
4359 | 4774 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) { |
4775 gtkconv->u.im->iter = NULL; | |
4776 delay = 0; | |
4777 buf = gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); | |
4778 } else { | |
4779 gtkconv->u.im->iter = | |
4780 gdk_pixbuf_animation_get_iter(gtkconv->u.im->anim, NULL); | |
4781 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter); | |
4782 delay = gdk_pixbuf_animation_iter_get_delay_time(gtkconv->u.im->iter); | |
4783 delay = delay / 10; | |
4784 } | |
4785 | |
4786 sf = SCALE(gtkconv->u.im->anim); | |
4787 scale = gdk_pixbuf_scale_simple(buf, | |
4788 MAX(gdk_pixbuf_get_width(buf) * sf / | |
4789 gdk_pixbuf_animation_get_width(gtkconv->u.im->anim), 1), | |
4790 MAX(gdk_pixbuf_get_height(buf) * sf / | |
4791 gdk_pixbuf_animation_get_height(gtkconv->u.im->anim), 1), | |
4792 GDK_INTERP_NEAREST); | |
4793 | |
4794 if (delay) | |
4795 gtkconv->u.im->icon_timer = g_timeout_add(delay * 10, redraw_icon, | |
4796 conv); | |
4797 | |
4798 gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 100); | |
4793 | 4799 g_object_unref(G_OBJECT(scale)); |
4359 | 4800 |
4801 frame = gtk_frame_new(NULL); | |
4802 gtk_frame_set_shadow_type(GTK_FRAME(frame), | |
4803 (bm ? GTK_SHADOW_NONE : GTK_SHADOW_IN)); | |
4804 gtk_box_pack_start(GTK_BOX(gtkconv->bbox), frame, FALSE, FALSE, 5); | |
4805 gtk_box_reorder_child(GTK_BOX(gtkconv->bbox), frame, 0); | |
4806 gtk_widget_show(frame); | |
4807 | |
4808 event = gtk_event_box_new(); | |
4809 gtk_container_add(GTK_CONTAINER(frame), event); | |
4810 g_signal_connect(GTK_OBJECT(event), "button-press-event", | |
4811 G_CALLBACK(icon_menu), conv); | |
4812 gtk_widget_show(event); | |
4813 | |
4635 | 4814 gtkconv->u.im->icon = gtk_image_new_from_pixmap(pm, bm); |
4359 | 4815 gtk_widget_set_size_request(gtkconv->u.im->icon, sf, sf); |
4816 gtk_container_add(GTK_CONTAINER(event), gtkconv->u.im->icon); | |
4817 gtk_widget_show(gtkconv->u.im->icon); | |
4818 | |
4819 if(im_options & OPT_IM_NO_ANIMATION) | |
4820 stop_anim(NULL, conv); | |
4821 | |
4793 | 4822 g_object_unref(G_OBJECT(pm)); |
4359 | 4823 |
4824 if (bm) | |
4793 | 4825 g_object_unref(G_OBJECT(bm)); |
4359 | 4826 } |
4827 | |
4828 void | |
4829 gaim_gtkconv_hide_buddy_icons(void) | |
4830 { | |
4831 gaim_conversation_foreach(gaim_gtkconv_update_buddy_icon); | |
4832 } | |
4833 | |
4834 void | |
4835 gaim_gtkconv_set_anim(void) | |
4836 { | |
4837 GList *l; | |
4838 | |
4839 if (im_options & OPT_IM_HIDE_ICONS) | |
4840 return; | |
4841 | |
4842 if (im_options & OPT_IM_NO_ANIMATION) { | |
4843 for (l = gaim_get_ims(); l != NULL; l = l->next) | |
4844 stop_anim(NULL, (struct gaim_conversation *)l->data); | |
4845 } else { | |
4846 for (l = gaim_get_ims(); l != NULL; l = l->next) | |
4847 start_anim(NULL, (struct gaim_conversation *)l->data); | |
4848 } | |
4849 } | |
4850 | |
4851 void | |
4852 gaim_gtkconv_update_font_buttons(void) | |
4853 { | |
4854 GList *l; | |
4855 struct gaim_conversation *conv; | |
4856 struct gaim_gtk_conversation *gtkconv; | |
4857 | |
4858 for (l = gaim_get_ims(); l != NULL; l = l->next) { | |
4859 conv = (struct gaim_conversation *)l->data; | |
4860 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4861 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4862 continue; |
4863 | |
4864 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4865 | |
4866 if (gtkconv->toolbar.bold != NULL) | |
4867 gtk_widget_set_sensitive(gtkconv->toolbar.bold, | |
4868 (!(font_options & OPT_FONT_BOLD))); | |
4869 | |
4870 if (gtkconv->toolbar.italic != NULL) | |
4871 gtk_widget_set_sensitive(gtkconv->toolbar.italic, | |
4872 (!(font_options & OPT_FONT_ITALIC))); | |
4873 | |
4874 if (gtkconv->toolbar.underline != NULL) | |
4875 gtk_widget_set_sensitive(gtkconv->toolbar.underline, | |
4876 (!(font_options & OPT_FONT_UNDERLINE))); | |
4877 } | |
4878 } | |
4879 | |
4880 void | |
4421 | 4881 gaim_gtkconv_update_font_colors(struct gaim_conversation *conv) |
4882 { | |
4438
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4883 struct gaim_gtk_conversation *gtkconv; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4884 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4885 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4886 return; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4887 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4888 gtkconv = GAIM_GTK_CONVERSATION(conv); |
4421 | 4889 |
4438
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4890 gtkconv->fg_color.red = fgcolor.red; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4891 gtkconv->fg_color.blue = fgcolor.blue; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4892 gtkconv->fg_color.green = fgcolor.green; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4893 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4894 gtkconv->bg_color.red = bgcolor.red; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4895 gtkconv->bg_color.blue = bgcolor.blue; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4896 gtkconv->bg_color.green = bgcolor.green; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4897 } |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4898 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4899 void |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4900 gaim_gtkconv_update_font_face(struct gaim_conversation *conv) |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4901 { |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4902 struct gaim_gtk_conversation *gtkconv; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4903 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4904 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4905 return; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4906 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4907 gtkconv = GAIM_GTK_CONVERSATION(conv); |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4908 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4909 strncpy(gtkconv->fontface, fontface, 128); |
4421 | 4910 } |
4911 | |
4912 void | |
4359 | 4913 gaim_gtkconv_update_tabs(void) |
4914 { | |
4915 GList *l; | |
4916 GtkPositionType pos; | |
4917 struct gaim_window *win; | |
4918 struct gaim_gtk_window *gtkwin; | |
4919 | |
4920 pos = ((im_options & OPT_IM_SIDE_TAB) | |
4921 ? ((im_options & OPT_IM_BR_TAB) ? GTK_POS_RIGHT : GTK_POS_LEFT) | |
4922 : ((im_options & OPT_IM_BR_TAB) ? GTK_POS_BOTTOM : GTK_POS_TOP)); | |
4923 | |
4924 for (l = gaim_get_windows(); l != NULL; l = l->next) { | |
4925 win = (struct gaim_window *)l->data; | |
4926 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4927 if (!GAIM_IS_GTK_WINDOW(win)) |
4359 | 4928 continue; |
4929 | |
4930 gtkwin = GAIM_GTK_WINDOW(win); | |
4931 | |
4932 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(gtkwin->notebook), pos); | |
4933 } | |
4934 } | |
4935 | |
4936 void | |
4937 gaim_gtkconv_update_chat_button_style() | |
4938 { | |
4939 GSList *l; | |
4940 struct gaim_connection *g; | |
4941 GtkWidget *parent; | |
4942 GaimConversationType type = GAIM_CONV_CHAT; | |
4943 | |
4944 for (l = connections; l != NULL; l = l->next) { | |
4945 GSList *bcs; | |
4946 struct gaim_conversation *conv; | |
4947 struct gaim_gtk_conversation *gtkconv; | |
4948 struct gaim_gtk_window *gtkwin; | |
4949 | |
4950 g = (struct gaim_connection *)l->data; | |
4951 | |
4952 for (bcs = g->buddy_chats; bcs != NULL; bcs = bcs->next) { | |
4953 conv = (struct gaim_conversation *)bcs->data; | |
4954 | |
4955 if (gaim_conversation_get_type(conv) != GAIM_CONV_CHAT) | |
4956 continue; | |
4957 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4958 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4959 continue; |
4960 | |
4961 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4962 gtkwin = GAIM_GTK_WINDOW(gaim_conversation_get_window(conv)); | |
4963 parent = gtk_widget_get_parent(gtkconv->send); | |
4964 | |
4965 gtkconv->send = | |
4966 gaim_gtk_change_text(_("Send"), | |
4967 gtkconv->send, GAIM_STOCK_SEND, type); | |
4968 gtkconv->u.chat->invite = | |
4969 gaim_gtk_change_text(_("Invite"), | |
4970 gtkconv->u.chat->invite, | |
4971 GAIM_STOCK_INVITE, type); | |
4972 | |
4973 gtk_box_pack_end(GTK_BOX(parent), gtkconv->send, FALSE, FALSE, | |
4974 type); | |
4975 gtk_box_pack_end(GTK_BOX(parent), gtkconv->u.chat->invite, | |
4976 FALSE, FALSE, 0); | |
4977 | |
4978 g_signal_connect(G_OBJECT(gtkconv->send), "clicked", | |
4979 G_CALLBACK(send_cb), conv); | |
4980 g_signal_connect(G_OBJECT(gtkconv->u.chat->invite), "clicked", | |
4981 G_CALLBACK(invite_cb), conv); | |
4982 | |
4983 gtk_button_set_relief(GTK_BUTTON(gtkconv->send), | |
4984 GTK_RELIEF_NONE); | |
4985 gtk_button_set_relief(GTK_BUTTON(gtkconv->u.chat->invite), | |
4986 GTK_RELIEF_NONE); | |
4987 | |
4988 gaim_gtkconv_update_buttons_by_protocol(conv); | |
4989 } | |
4990 } | |
4991 } | |
4992 | |
4993 void | |
4994 gaim_gtkconv_update_im_button_style() | |
4995 { | |
4996 GList *l; | |
4997 struct gaim_conversation *conv; | |
4998 struct gaim_gtk_conversation *gtkconv; | |
4999 | |
5000 for (l = gaim_get_ims(); l != NULL; l = l->next) { | |
5001 conv = (struct gaim_conversation *)l->data; | |
5002 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
5003 | |
5004 setup_im_buttons(conv, gtk_widget_get_parent(gtkconv->send)); | |
5005 } | |
5006 } | |
5007 | |
5008 void | |
5009 gaim_gtkconv_update_buttons_by_protocol(struct gaim_conversation *conv) | |
5010 { | |
5011 struct gaim_window *win; | |
5012 struct gaim_gtk_window *gtkwin = NULL; | |
5013 struct gaim_gtk_conversation *gtkconv; | |
5014 struct gaim_connection *gc; | |
5015 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
5016 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 5017 return; |
5018 | |
5019 gc = gaim_conversation_get_gc(conv); | |
5020 win = gaim_conversation_get_window(conv); | |
5021 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
5022 | |
5023 if (win != NULL) | |
5024 gtkwin = GAIM_GTK_WINDOW(win); | |
5025 | |
5026 if (gc == NULL) { | |
5027 gtk_widget_set_sensitive(gtkconv->send, FALSE); | |
5028 | |
4365
6e96ced6fb78
[gaim-migrate @ 4631]
Christian Hammond <chipx86@chipx86.com>
parents:
4364
diff
changeset
|
5029 if (win != NULL && gaim_window_get_active_conversation(win) == conv) { |
4359 | 5030 gtk_widget_set_sensitive(gtkwin->menu.insert_link, FALSE); |
5031 } | |
5032 } | |
4364
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
5033 else { |
4674 | 5034 gtk_widget_set_sensitive(gtkconv->send, TRUE); |
4365
6e96ced6fb78
[gaim-migrate @ 4631]
Christian Hammond <chipx86@chipx86.com>
parents:
4364
diff
changeset
|
5035 if (win != NULL) { |
6e96ced6fb78
[gaim-migrate @ 4631]
Christian Hammond <chipx86@chipx86.com>
parents:
4364
diff
changeset
|
5036 gtk_widget_set_sensitive(gtkwin->menu.insert_link, TRUE); |
6e96ced6fb78
[gaim-migrate @ 4631]
Christian Hammond <chipx86@chipx86.com>
parents:
4364
diff
changeset
|
5037 } |
4364
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
5038 } |
4359 | 5039 |
5040 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { | |
5041 if (gc == NULL) { | |
5042 gtk_widget_set_sensitive(gtkconv->info, FALSE); | |
5043 gtk_widget_set_sensitive(gtkconv->u.im->warn, FALSE); | |
5044 gtk_widget_set_sensitive(gtkconv->u.im->block, FALSE); | |
5045 gtk_widget_set_sensitive(gtkconv->u.im->add, FALSE); | |
5046 | |
5047 if (win != NULL && | |
5048 gaim_window_get_active_conversation(win) == conv) { | |
5049 | |
5050 gtk_widget_set_sensitive(gtkwin->menu.insert_image, FALSE); | |
5051 } | |
5052 | |
5053 return; | |
5054 } | |
5055 | |
5056 gtk_widget_set_sensitive(gtkconv->info, | |
5057 (gc->prpl->get_info != NULL)); | |
5058 | |
5059 gtk_widget_set_sensitive(gtkconv->toolbar.image, | |
5060 (gc->prpl->options & OPT_PROTO_IM_IMAGE)); | |
5061 | |
5062 if (win != NULL && gaim_window_get_active_conversation(win) == conv) { | |
5063 gtk_widget_set_sensitive(gtkwin->menu.insert_image, | |
5064 (gc->prpl->options & OPT_PROTO_IM_IMAGE)); | |
5065 } | |
5066 | |
5067 gtk_widget_set_sensitive(gtkconv->u.im->warn, | |
5068 (gc->prpl->warn != NULL)); | |
5069 | |
5070 gtk_widget_set_sensitive(gtkconv->u.im->block, | |
5071 (gc->prpl->add_permit != NULL)); | |
5072 | |
5073 update_convo_add_button(conv); | |
5074 } | |
5075 else if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) { | |
5076 if (gc == NULL) { | |
5077 gtk_widget_set_sensitive(gtkconv->u.chat->whisper, FALSE); | |
5078 gtk_widget_set_sensitive(gtkconv->u.chat->invite, FALSE); | |
5079 | |
5080 return; | |
5081 } | |
5082 | |
5083 gtk_widget_set_sensitive(gtkconv->send, (gc->prpl->chat_send != NULL)); | |
5084 | |
5085 gtk_widget_set_sensitive(gtkconv->toolbar.image, FALSE); | |
5086 /* gtk_widget_set_sensitive(gtkwin->menu.insert_image, FALSE); */ | |
5087 | |
5088 gtk_widget_set_sensitive(gtkconv->u.chat->whisper, | |
5089 (gc->prpl->chat_whisper != NULL)); | |
5090 | |
5091 gtk_widget_set_sensitive(gtkconv->u.chat->invite, | |
5092 (gc->prpl->chat_invite != NULL)); | |
5093 } | |
5094 } | |
5095 | |
5096 struct gaim_window * | |
5097 gaim_gtkwin_get_at_xy(int x, int y) | |
5098 { | |
5099 struct gaim_window *win = NULL; | |
5100 struct gaim_gtk_window *gtkwin; | |
5101 GdkWindow *gdkwin; | |
5102 GList *l; | |
5103 | |
5104 gdkwin = gdk_window_at_pointer(&x, &y); | |
5105 | |
5106 if (gdkwin) | |
5107 gdkwin = gdk_window_get_toplevel(gdkwin); | |
5108 | |
5109 for (l = gaim_get_windows(); l != NULL; l = l->next) { | |
5110 win = (struct gaim_window *)l->data; | |
5111 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
5112 if (!GAIM_IS_GTK_WINDOW(win)) |
4359 | 5113 continue; |
5114 | |
5115 gtkwin = GAIM_GTK_WINDOW(win); | |
5116 | |
5117 if (gdkwin == gtkwin->window->window) | |
5118 return win; | |
5119 } | |
5120 | |
5121 return NULL; | |
5122 } | |
5123 | |
5124 int | |
5125 gaim_gtkconv_get_tab_at_xy(struct gaim_window *win, int x, int y) | |
5126 { | |
5127 struct gaim_gtk_window *gtkwin; | |
5128 GList *l; | |
5129 gint nb_x, nb_y, x_rel, y_rel; | |
5130 GtkNotebook *notebook; | |
5131 GtkWidget *tab; | |
5132 gint i, page_num = 0; | |
5133 gboolean first_visible = TRUE; | |
5134 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
5135 if (!GAIM_IS_GTK_WINDOW(win)) |
4359 | 5136 return -1; |
5137 | |
5138 gtkwin = GAIM_GTK_WINDOW(win); | |
5139 notebook = GTK_NOTEBOOK(gtkwin->notebook); | |
5140 | |
5141 gdk_window_get_origin(gtkwin->notebook->window, &nb_x, &nb_y); | |
5142 x_rel = x - nb_x; | |
5143 y_rel = y - nb_y; | |
5144 | |
5145 for (l = gaim_window_get_conversations(win), i = 0; | |
5146 l != NULL; | |
5147 l = l->next, i++) { | |
5148 | |
5149 struct gaim_conversation *conv = l->data; | |
5150 tab = GAIM_GTK_CONVERSATION(conv)->tab_label; | |
5151 | |
5152 if (!GTK_WIDGET_MAPPED(tab)) | |
5153 continue; | |
5154 | |
5155 if (first_visible) { | |
5156 first_visible = FALSE; | |
5157 | |
5158 if (x_rel < tab->allocation.x) x_rel = tab->allocation.x; | |
5159 if (y_rel < tab->allocation.y) y_rel = tab->allocation.y; | |
5160 } | |
5161 | |
5162 if (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP || | |
5163 gtk_notebook_get_tab_pos(notebook) == GTK_POS_BOTTOM) { | |
5164 | |
5165 if (tab->allocation.x <= x_rel) { | |
5166 if (tab->allocation.x + tab->allocation.width <= x_rel) | |
5167 page_num = i + 1; | |
5168 else | |
5169 page_num = i; | |
5170 } | |
5171 else | |
5172 break; | |
5173 } | |
5174 else { | |
5175 if (tab->allocation.y <= y_rel) { | |
5176 if (tab->allocation.y + tab->allocation.height <= y_rel) | |
5177 page_num = i + 1; | |
5178 else | |
5179 page_num = i; | |
5180 } | |
5181 else | |
5182 break; | |
5183 } | |
5184 } | |
5185 | |
5186 if (i == gaim_window_get_conversation_count(win) + 1) | |
5187 return -1; | |
5188 | |
5189 return page_num; | |
5190 } | |
5191 | |
5192 int | |
5193 gaim_gtkconv_get_dest_tab_at_xy(struct gaim_window *win, int x, int y) | |
5194 { | |
5195 struct gaim_gtk_window *gtkwin; | |
5196 GList *l; | |
5197 gint nb_x, nb_y, x_rel, y_rel; | |
5198 GtkNotebook *notebook; | |
5199 GtkWidget *tab; | |
5200 gint i, page_num = 0; | |
5201 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
5202 if (!GAIM_IS_GTK_WINDOW(win)) |
4359 | 5203 return -1; |
5204 | |
5205 gtkwin = GAIM_GTK_WINDOW(win); | |
5206 notebook = GTK_NOTEBOOK(gtkwin->notebook); | |
5207 | |
5208 gdk_window_get_origin(gtkwin->notebook->window, &nb_x, &nb_y); | |
5209 x_rel = x - nb_x; | |
5210 y_rel = y - nb_y; | |
5211 | |
5212 for (l = gaim_window_get_conversations(win), i = 0; | |
5213 l != NULL; | |
5214 l = l->next, i++) { | |
5215 | |
5216 struct gaim_conversation *conv = l->data; | |
5217 tab = GAIM_GTK_CONVERSATION(conv)->tab_label; | |
5218 | |
5219 if (!GTK_WIDGET_MAPPED(tab)) | |
5220 continue; | |
5221 | |
5222 if (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP || | |
5223 gtk_notebook_get_tab_pos(notebook) == GTK_POS_BOTTOM) { | |
5224 | |
5225 if (tab->allocation.x <= x_rel) { | |
5226 if (tab->allocation.x + (tab->allocation.width / 2) <= x_rel) | |
5227 page_num = i + 1; | |
5228 else | |
5229 page_num = i; | |
5230 } | |
5231 else | |
5232 break; | |
5233 } | |
5234 else { | |
5235 if (tab->allocation.y <= y_rel) { | |
5236 if (tab->allocation.y + (tab->allocation.height / 2) <= y_rel) | |
5237 page_num = i + 1; | |
5238 else | |
5239 page_num = i; | |
5240 } | |
5241 else | |
5242 break; | |
5243 } | |
5244 } | |
5245 | |
5246 if (i == gaim_window_get_conversation_count(win) + 1) | |
5247 return -1; | |
5248 | |
5249 return page_num; | |
5250 } | |
4940
3708545afe42
[gaim-migrate @ 5274]
Christian Hammond <chipx86@chipx86.com>
parents:
4939
diff
changeset
|
5251 |