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