Mercurial > pidgin
annotate src/gtkconv.c @ 4916:d9b6b5ae34e4
[gaim-migrate @ 5250]
Buddy list editing.
Does this work? I don't know; I don't test things. It compiles though.
It probably does work though, because I'm perfect.
So, see, I did really terribly in school last semester (really terribly--
like, why didn't they kick me out terribly) and so I'm working really hard
to do well this semester (and I am so far :)). Anyway, that's why you may
have noticed I'm a bit slow with the development of late. In fact, I would
test and fix this stuff up, but I really need to work on an English paper,
so I figured it'd be best just to commit it as is and let Rob, Nathan, Chip
and the boys work out the kinks. Besides, I've had most of this code written
for weeks already.
Thank you all for your patience.
Oh, so there's now an Edit menu on your buddy list (which makes the minimum
buddy list width wider :-D) and here you'll find things with which to edit
your list and privacy, prefs and accounts. It should all be real intuitive.
Feel free to IM me if you want to talk about my paper.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Mon, 31 Mar 2003 07:19:46 +0000 |
parents | 3c649fe22e2c |
children | d80bc307e2c8 |
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 GtkWidget *hb; | |
2535 | |
2536 gtkwin = GAIM_GTK_WINDOW(win); | |
2537 | |
2538 /* Create the handle box. */ | |
2539 hb = gtk_handle_box_new(); | |
2540 | |
4630 | 2541 gtkwin->menu.item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, |
2542 "<main>", NULL); | |
2543 | |
2544 gtk_item_factory_set_translate_func (gtkwin->menu.item_factory, | |
4602
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2545 item_factory_translate_func, |
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
2546 NULL, NULL); |
4630 | 2547 |
2548 gtk_item_factory_create_items(gtkwin->menu.item_factory, menu_item_count, | |
4359 | 2549 menu_items, win); |
2550 | |
4630 | 2551 gtkwin->menu.menubar = gtk_item_factory_get_widget(gtkwin->menu.item_factory, |
2552 "<main>"); | |
2553 gtkwin->menu.view_history = gtk_item_factory_get_widget(gtkwin->menu.item_factory, | |
4834 | 2554 N_("/Conversation/View History...")); |
4630 | 2555 gtkwin->menu.insert_link = gtk_item_factory_get_widget(gtkwin->menu.item_factory, |
4834 | 2556 N_("/Conversation/Insert URL...")); |
4630 | 2557 gtkwin->menu.insert_image = gtk_item_factory_get_widget(gtkwin->menu.item_factory, |
4834 | 2558 N_("/Conversation/Insert Image...")); |
4630 | 2559 gtkwin->menu.logging = gtk_item_factory_get_widget(gtkwin->menu.item_factory, |
4834 | 2560 N_("/Options/Enable Logging")); |
4630 | 2561 gtkwin->menu.sounds = gtk_item_factory_get_widget(gtkwin->menu.item_factory, |
4834 | 2562 N_("/Options/Enable Sounds")); |
4359 | 2563 |
4360
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
2564 generate_send_as_items(win, NULL); |
4359 | 2565 |
2566 gtk_container_add(GTK_CONTAINER(hb), gtkwin->menu.menubar); | |
2567 | |
2568 gtk_widget_show(gtkwin->menu.menubar); | |
2569 gtk_widget_show(hb); | |
2570 | |
2571 return hb; | |
2572 } | |
2573 | |
2574 static void | |
2575 setup_im_buttons(struct gaim_conversation *conv, GtkWidget *parent) | |
2576 { | |
2577 struct gaim_connection *gc; | |
2578 struct gaim_gtk_conversation *gtkconv; | |
2579 struct gaim_gtk_im_pane *gtkim; | |
2580 GaimConversationType type = GAIM_CONV_IM; | |
2581 | |
2582 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2583 gtkim = gtkconv->u.im; | |
2584 gc = gaim_conversation_get_gc(conv); | |
2585 | |
2586 /* From right to left... */ | |
2587 | |
2588 /* Send button */ | |
2589 gtkconv->send = gaim_gtk_change_text(_("Send"), gtkconv->send, | |
2590 GAIM_STOCK_SEND, type); | |
2591 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->send, _("Send"), NULL); | |
2592 | |
2593 gtk_box_pack_end(GTK_BOX(parent), gtkconv->send, FALSE, FALSE, 0); | |
2594 | |
2595 /* Separator */ | |
2596 if (gtkim->sep2 != NULL) | |
2597 gtk_widget_destroy(gtkim->sep2); | |
2598 | |
2599 gtkim->sep2 = gtk_vseparator_new(); | |
2600 gtk_box_pack_end(GTK_BOX(parent), gtkim->sep2, FALSE, TRUE, 0); | |
2601 gtk_widget_show(gtkim->sep2); | |
2602 | |
2603 /* Now, um, just kind of all over the place. Huh? */ | |
2604 | |
2605 /* Add button */ | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2606 if (gaim_find_buddy(gaim_conversation_get_account(conv), |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2607 gaim_conversation_get_name(conv)) == NULL) { |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
2608 |
4359 | 2609 gtkim->add = gaim_gtk_change_text(_("Add"), gtkim->add, |
2610 GTK_STOCK_ADD, type); | |
2611 gtk_tooltips_set_tip(gtkconv->tooltips, gtkim->add, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2612 _("Add the user to your buddy list"), NULL); |
4359 | 2613 } |
2614 else { | |
2615 gtkim->add = gaim_gtk_change_text(_("Remove"), gtkim->add, | |
2616 GTK_STOCK_REMOVE, type); | |
2617 gtk_tooltips_set_tip(gtkconv->tooltips, gtkim->add, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2618 _("Remove the user from your buddy list"), NULL); |
4359 | 2619 } |
2620 | |
2621 gtk_box_pack_start(GTK_BOX(parent), gtkim->add, | |
2622 FALSE, FALSE, 0); | |
2623 | |
2624 /* Warn button */ | |
2625 gtkim->warn = gaim_gtk_change_text(_("Warn"), gtkim->warn, | |
2626 GAIM_STOCK_WARN, type); | |
2627 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
|
2628 gtk_tooltips_set_tip(gtkconv->tooltips, gtkim->warn, |
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2629 _("Warn the user"), NULL); |
4359 | 2630 |
2631 /* Info button */ | |
2632 gtkconv->info = gaim_gtk_change_text(_("Info"), gtkconv->info, | |
2633 GAIM_STOCK_INFO, type); | |
2634 gtk_box_pack_start(GTK_BOX(parent), gtkconv->info, FALSE, FALSE, 0); | |
2635 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->info, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2636 _("Get the user's information"), NULL); |
4359 | 2637 |
2638 /* Block button */ | |
2639 gtkim->block = gaim_gtk_change_text(_("Block"), gtkim->block, | |
2640 GAIM_STOCK_BLOCK, type); | |
2641 gtk_box_pack_start(GTK_BOX(parent), gtkim->block, FALSE, FALSE, 0); | |
2642 gtk_tooltips_set_tip(gtkconv->tooltips, gtkim->block, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2643 _("Block the user"), NULL); |
4359 | 2644 |
2645 gtk_button_set_relief(GTK_BUTTON(gtkconv->info), GTK_RELIEF_NONE); | |
2646 gtk_button_set_relief(GTK_BUTTON(gtkim->add), GTK_RELIEF_NONE); | |
2647 gtk_button_set_relief(GTK_BUTTON(gtkim->warn), GTK_RELIEF_NONE); | |
2648 gtk_button_set_relief(GTK_BUTTON(gtkconv->send), GTK_RELIEF_NONE); | |
2649 gtk_button_set_relief(GTK_BUTTON(gtkim->block), GTK_RELIEF_NONE); | |
2650 | |
2651 gtk_size_group_add_widget(gtkconv->sg, gtkconv->info); | |
2652 gtk_size_group_add_widget(gtkconv->sg, gtkim->add); | |
2653 gtk_size_group_add_widget(gtkconv->sg, gtkim->warn); | |
2654 gtk_size_group_add_widget(gtkconv->sg, gtkconv->send); | |
2655 gtk_size_group_add_widget(gtkconv->sg, gtkim->block); | |
2656 | |
2657 gtk_box_reorder_child(GTK_BOX(parent), gtkim->warn, 1); | |
2658 gtk_box_reorder_child(GTK_BOX(parent), gtkim->block, 2); | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
2659 gtk_box_reorder_child(GTK_BOX(parent), gtkim->add, 3); |
4359 | 2660 gtk_box_reorder_child(GTK_BOX(parent), gtkconv->info, 4); |
2661 | |
2662 gaim_gtkconv_update_buttons_by_protocol(conv); | |
2663 | |
2664 g_signal_connect(G_OBJECT(gtkconv->send), "clicked", | |
2665 G_CALLBACK(send_cb), conv); | |
2666 g_signal_connect(G_OBJECT(gtkconv->info), "clicked", | |
2667 G_CALLBACK(info_cb), conv); | |
2668 g_signal_connect(G_OBJECT(gtkim->warn), "clicked", | |
2669 G_CALLBACK(warn_cb), conv); | |
2670 g_signal_connect(G_OBJECT(gtkim->block), "clicked", | |
2671 G_CALLBACK(block_cb), conv); | |
2672 } | |
2673 | |
2674 static void | |
2675 setup_chat_buttons(struct gaim_conversation *conv, GtkWidget *parent) | |
2676 { | |
2677 struct gaim_connection *gc; | |
2678 struct gaim_gtk_conversation *gtkconv; | |
2679 struct gaim_gtk_chat_pane *gtkchat; | |
2680 struct gaim_gtk_window *gtkwin; | |
2681 GtkWidget *sep; | |
2682 | |
2683 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2684 gtkchat = gtkconv->u.chat; | |
2685 gtkwin = GAIM_GTK_WINDOW(gaim_conversation_get_window(conv)); | |
2686 gc = gaim_conversation_get_gc(conv); | |
2687 | |
2688 /* Send button */ | |
2689 gtkconv->send = gaim_gtk_change_text(_("Send"), gtkconv->send, | |
2690 GAIM_STOCK_SEND, GAIM_CONV_CHAT); | |
2691 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->send, _("Send"), NULL); | |
2692 | |
2693 gtk_box_pack_end(GTK_BOX(parent), gtkconv->send, FALSE, FALSE, 0); | |
2694 | |
2695 /* Separator */ | |
2696 sep = gtk_vseparator_new(); | |
2697 gtk_box_pack_end(GTK_BOX(parent), sep, FALSE, TRUE, 0); | |
2698 gtk_widget_show(sep); | |
2699 | |
2700 /* Invite */ | |
2701 gtkchat->invite = gaim_gtk_change_text(_("Invite"), gtkchat->invite, | |
2702 GAIM_STOCK_INVITE, GAIM_CONV_CHAT); | |
2703 gtk_tooltips_set_tip(gtkconv->tooltips, gtkchat->invite, | |
2704 _("Invite a user"), NULL); | |
2705 gtk_box_pack_end(GTK_BOX(parent), gtkchat->invite, FALSE, FALSE, 0); | |
2706 | |
2707 /* Set the relief on these. */ | |
2708 gtk_button_set_relief(GTK_BUTTON(gtkchat->invite), GTK_RELIEF_NONE); | |
2709 gtk_button_set_relief(GTK_BUTTON(gtkconv->send), GTK_RELIEF_NONE); | |
2710 | |
2711 /* Callbacks */ | |
2712 g_signal_connect(G_OBJECT(gtkconv->send), "clicked", | |
2713 G_CALLBACK(send_cb), conv); | |
2714 g_signal_connect(G_OBJECT(gtkchat->invite), "clicked", | |
2715 G_CALLBACK(invite_cb), conv); | |
2716 } | |
2717 | |
2718 static GtkWidget * | |
2719 build_conv_toolbar(struct gaim_conversation *conv) | |
2720 { | |
2721 struct gaim_gtk_conversation *gtkconv; | |
2722 GtkWidget *vbox; | |
2723 GtkWidget *hbox; | |
2724 GtkWidget *button; | |
2725 GtkWidget *sep; | |
2726 GtkSizeGroup *sg; | |
2727 | |
2728 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2729 | |
2730 sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); | |
2731 | |
2732 vbox = gtk_vbox_new(FALSE, 0); | |
2733 sep = gtk_hseparator_new(); | |
2734 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
2735 | |
2736 hbox = gtk_hbox_new(FALSE, 5); | |
2737 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
2738 | |
2739 /* Bold */ | |
2740 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_BOLD); | |
2741 gtk_size_group_add_widget(sg, button); | |
2742 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2743 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Bold"), NULL); | |
2744 | |
2745 g_signal_connect(G_OBJECT(button), "clicked", | |
2746 G_CALLBACK(do_bold), gtkconv); | |
2747 | |
2748 gtkconv->toolbar.bold = button; | |
2749 | |
2750 /* Italic */ | |
2751 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_ITALIC); | |
2752 gtk_size_group_add_widget(sg, button); | |
2753 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2754 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Italic"), NULL); | |
2755 | |
2756 g_signal_connect(G_OBJECT(button), "clicked", | |
2757 G_CALLBACK(do_italic), gtkconv); | |
2758 | |
2759 gtkconv->toolbar.italic = button; | |
2760 | |
2761 /* Underline */ | |
2762 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_UNDERLINE); | |
2763 gtk_size_group_add_widget(sg, button); | |
2764 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2765 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Underline"), NULL); | |
2766 | |
2767 g_signal_connect(G_OBJECT(button), "clicked", | |
2768 G_CALLBACK(do_underline), gtkconv); | |
2769 | |
2770 gtkconv->toolbar.underline = button; | |
2771 | |
2772 /* Sep */ | |
2773 sep = gtk_vseparator_new(); | |
2774 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | |
2775 | |
2776 /* Increase font size */ | |
2777 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_BIGGER); | |
2778 gtk_size_group_add_widget(sg, button); | |
2779 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2780 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2781 _("Larger font size"), NULL); | |
2782 | |
2783 g_signal_connect(G_OBJECT(button), "clicked", | |
2784 G_CALLBACK(do_big), gtkconv); | |
2785 | |
2786 /* Normal font size */ | |
2787 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_NORMAL); | |
2788 gtk_size_group_add_widget(sg, button); | |
2789 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2790 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2791 _("Normal font size"), NULL); | |
2792 | |
2793 g_signal_connect(G_OBJECT(button), "clicked", | |
2794 G_CALLBACK(do_normal), gtkconv); | |
2795 | |
2796 gtkconv->toolbar.normal_size = button; | |
2797 | |
2798 /* Decrease font size */ | |
2799 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_TEXT_SMALLER); | |
2800 gtk_size_group_add_widget(sg, button); | |
2801 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2802 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2803 _("Smaller font size"), NULL); | |
2804 | |
2805 g_signal_connect(G_OBJECT(button), "clicked", | |
2806 G_CALLBACK(do_small), gtkconv); | |
2807 | |
2808 /* Sep */ | |
2809 sep = gtk_vseparator_new(); | |
2810 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | |
2811 | |
4685 | 2812 /* Font Face */ |
2813 | |
2814 button = gaim_pixbuf_toolbar_button_from_stock(GTK_STOCK_SELECT_FONT); | |
2815 gtk_size_group_add_widget(sg, button); | |
2816 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2817 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2818 _("Font Face"), NULL); | |
2819 | |
2820 g_signal_connect(G_OBJECT(button), "clicked", | |
2821 G_CALLBACK(toggle_font), conv); | |
2822 | |
2823 gtkconv->toolbar.font = button; | |
2824 | |
4359 | 2825 /* Foreground Color */ |
2826 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_FGCOLOR); | |
2827 gtk_size_group_add_widget(sg, button); | |
2828 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2829 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2830 _("Foreground font color"), NULL); | |
2831 | |
2832 g_signal_connect(G_OBJECT(button), "clicked", | |
2833 G_CALLBACK(toggle_fg_color), conv); | |
2834 | |
2835 gtkconv->toolbar.fgcolor = button; | |
2836 | |
2837 /* Background Color */ | |
2838 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_BGCOLOR); | |
2839 gtk_size_group_add_widget(sg, button); | |
2840 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2841 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
2842 _("Background color"), NULL); | |
2843 | |
2844 g_signal_connect(G_OBJECT(button), "clicked", | |
2845 G_CALLBACK(toggle_bg_color), conv); | |
2846 | |
2847 gtkconv->toolbar.bgcolor = button; | |
2848 | |
2849 /* Sep */ | |
2850 sep = gtk_vseparator_new(); | |
2851 gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0); | |
2852 | |
2853 /* Insert IM Image */ | |
2854 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_IMAGE); | |
2855 gtk_size_group_add_widget(sg, button); | |
2856 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2857 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Insert image"), NULL); | |
2858 | |
2859 g_signal_connect(G_OBJECT(button), "clicked", | |
2860 G_CALLBACK(insert_image_cb), conv); | |
2861 | |
2862 gtkconv->toolbar.image = button; | |
2863 | |
2864 /* Insert Link */ | |
2865 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_LINK); | |
2866 gtk_size_group_add_widget(sg, button); | |
2867 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2868 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Insert link"), NULL); | |
2869 | |
2870 g_signal_connect(G_OBJECT(button), "clicked", | |
2871 G_CALLBACK(insert_link_cb), conv); | |
2872 | |
2873 gtkconv->toolbar.link = button; | |
2874 | |
2875 /* Insert Smiley */ | |
2876 button = gaim_pixbuf_toolbar_button_from_stock(GAIM_STOCK_SMILEY); | |
2877 gtk_size_group_add_widget(sg, button); | |
2878 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
2879 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("Insert smiley"), NULL); | |
2880 | |
2881 g_signal_connect(G_OBJECT(button), "clicked", | |
2882 G_CALLBACK(insert_smiley_cb), conv); | |
2883 | |
2884 gtkconv->toolbar.smiley = button; | |
2885 | |
2886 | |
2887 sep = gtk_hseparator_new(); | |
2888 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
2889 | |
2890 gtk_widget_show_all(vbox); | |
2891 | |
2892 return vbox; | |
2893 } | |
2894 | |
2895 static GtkWidget * | |
2896 setup_chat_pane(struct gaim_conversation *conv) | |
2897 { | |
2898 struct gaim_gtk_conversation *gtkconv; | |
2899 struct gaim_gtk_chat_pane *gtkchat; | |
2900 struct gaim_connection *gc; | |
2901 GtkWidget *vpaned, *hpaned; | |
2902 GtkWidget *vbox, *hbox; | |
2903 GtkWidget *lbox, *bbox; | |
2904 GtkWidget *label; | |
2905 GtkWidget *sw2; | |
2906 GtkWidget *list; | |
2907 GtkWidget *button; | |
2908 GtkWidget *frame; | |
2909 GtkListStore *ls; | |
2910 GtkCellRenderer *rend; | |
2911 GtkTreeViewColumn *col; | |
2912 | |
2913 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2914 gtkchat = gtkconv->u.chat; | |
2915 gc = gaim_conversation_get_gc(conv); | |
2916 | |
2917 /* Setup the outer pane. */ | |
2918 vpaned = gtk_vpaned_new(); | |
2919 gtk_widget_show(vpaned); | |
2920 | |
2921 /* Setup the top part of the pane. */ | |
2922 vbox = gtk_vbox_new(FALSE, 5); | |
2923 gtk_paned_pack1(GTK_PANED(vpaned), vbox, TRUE, FALSE); | |
2924 gtk_widget_show(vbox); | |
2925 | |
2926 if (gc->prpl->options & OPT_PROTO_CHAT_TOPIC) | |
2927 { | |
2928 hbox = gtk_hbox_new(FALSE, 0); | |
2929 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); | |
2930 gtk_widget_show(hbox); | |
2931 | |
2932 label = gtk_label_new(_("Topic:")); | |
2933 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); | |
2934 gtk_widget_show(label); | |
2935 | |
2936 gtkchat->topic_text = gtk_entry_new(); | |
4635 | 2937 gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE); |
4359 | 2938 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 5); |
2939 gtk_widget_show(gtkchat->topic_text); | |
2940 } | |
2941 | |
2942 /* Setup the horizontal pane. */ | |
2943 hpaned = gtk_hpaned_new(); | |
2944 gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 5); | |
2945 gtk_widget_show(hpaned); | |
2946 | |
2947 /* Setup the scrolled window to put gtkimhtml in. */ | |
2948 gtkconv->sw = gtk_scrolled_window_new(NULL, NULL); | |
2949 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gtkconv->sw), | |
2950 GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
2951 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(gtkconv->sw), | |
2952 GTK_SHADOW_IN); | |
2953 gtk_paned_pack1(GTK_PANED(hpaned), gtkconv->sw, TRUE, TRUE); | |
2954 | |
2955 gtk_widget_set_size_request(gtkconv->sw, | |
2956 buddy_chat_size.width, buddy_chat_size.height); | |
2957 gtk_widget_show(gtkconv->sw); | |
2958 | |
2959 /* Setup gtkihmtml. */ | |
2960 gtkconv->imhtml = gtk_imhtml_new(NULL, NULL); | |
2961 gtk_container_add(GTK_CONTAINER(gtkconv->sw), gtkconv->imhtml); | |
2962 | |
2963 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), | |
2964 (convo_options & OPT_CONVO_SHOW_TIME)); | |
2965 | |
2966 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event", | |
2967 G_CALLBACK(entry_stop_rclick_cb), NULL); | |
2968 | |
2969 gaim_setup_imhtml(gtkconv->imhtml); | |
2970 | |
2971 gtk_widget_show(gtkconv->imhtml); | |
2972 | |
2973 /* Build the right pane. */ | |
2974 lbox = gtk_vbox_new(FALSE, 5); | |
4409
0521eec12c33
[gaim-migrate @ 4682]
Christian Hammond <chipx86@chipx86.com>
parents:
4398
diff
changeset
|
2975 gtk_paned_pack2(GTK_PANED(hpaned), lbox, FALSE, TRUE); |
4359 | 2976 gtk_widget_show(lbox); |
2977 | |
2978 /* Setup the label telling how many people are in the room. */ | |
2979 gtkchat->count = gtk_label_new(_("0 people in room")); | |
2980 gtk_box_pack_start(GTK_BOX(lbox), gtkchat->count, FALSE, FALSE, 0); | |
2981 gtk_widget_show(gtkchat->count); | |
2982 | |
2983 /* Setup the list of users. */ | |
2984 sw2 = gtk_scrolled_window_new(NULL, NULL); | |
2985 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw2), | |
2986 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); | |
2987 gtk_box_pack_start(GTK_BOX(lbox), sw2, TRUE, TRUE, 0); | |
2988 gtk_widget_show(sw2); | |
2989 | |
2990 ls = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); | |
2991 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), 1, | |
2992 GTK_SORT_ASCENDING); | |
2993 | |
2994 list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls)); | |
2995 | |
2996 rend = gtk_cell_renderer_text_new(); | |
2997 col = gtk_tree_view_column_new_with_attributes(NULL, rend, | |
2998 "text", 0, NULL); | |
2999 gtk_tree_view_column_set_clickable(GTK_TREE_VIEW_COLUMN(col), TRUE); | |
3000 | |
3001 g_signal_connect(G_OBJECT(list), "button_press_event", | |
3002 G_CALLBACK(right_click_chat_cb), conv); | |
3003 | |
3004 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); | |
3005 | |
3006 col = gtk_tree_view_column_new_with_attributes(NULL, rend, | |
3007 "text", 1, NULL); | |
3008 gtk_tree_view_column_set_clickable(GTK_TREE_VIEW_COLUMN(col), TRUE); | |
3009 | |
3010 #if 0 | |
3011 g_signal_connect(G_OBJECT(list), "button_press_event", | |
3012 G_CALLBACK(right_click_chat), conv); | |
3013 #endif | |
3014 | |
3015 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); | |
3016 | |
3017 gtk_widget_set_size_request(list, 150, -1); | |
3018 | |
3019 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE); | |
3020 gtk_widget_show(list); | |
3021 | |
3022 gtkchat->list = list; | |
3023 | |
3024 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw2), list); | |
3025 | |
3026 /* Setup the user list toolbar. */ | |
3027 bbox = gtk_hbox_new(TRUE, 5); | |
3028 gtk_box_pack_start(GTK_BOX(lbox), bbox, FALSE, FALSE, 0); | |
3029 gtk_widget_show(bbox); | |
3030 | |
3031 /* IM */ | |
3032 button = gaim_pixbuf_button_from_stock(NULL, GTK_STOCK_REDO, | |
3033 GAIM_BUTTON_VERTICAL); | |
3034 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
3035 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
|
3036 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("IM the user"), NULL); |
4359 | 3037 g_signal_connect(G_OBJECT(button), "clicked", |
3038 G_CALLBACK(im_cb), conv); | |
3039 | |
3040 gtk_widget_show(button); | |
3041 | |
3042 /* Ignore */ | |
3043 button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_IGNORE, | |
3044 GAIM_BUTTON_VERTICAL); | |
3045 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
3046 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
|
3047 gtk_tooltips_set_tip(gtkconv->tooltips, button, |
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
3048 _("Ignore the user"), NULL); |
4359 | 3049 g_signal_connect(G_OBJECT(button), "clicked", |
3050 G_CALLBACK(ignore_cb), conv); | |
3051 gtk_widget_show(button); | |
3052 | |
3053 /* Info */ | |
3054 button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_INFO, | |
3055 GAIM_BUTTON_VERTICAL); | |
3056 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); | |
3057 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
3058 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
3059 _("Get the user's information"), NULL); |
4359 | 3060 g_signal_connect(G_OBJECT(button), "clicked", |
3061 G_CALLBACK(info_cb), conv); | |
3062 | |
3063 gtk_widget_show(button); | |
3064 | |
3065 gtkconv->info = button; | |
3066 | |
3067 /* Build the toolbar. */ | |
3068 vbox = gtk_vbox_new(FALSE, 5); | |
4409
0521eec12c33
[gaim-migrate @ 4682]
Christian Hammond <chipx86@chipx86.com>
parents:
4398
diff
changeset
|
3069 gtk_paned_pack2(GTK_PANED(vpaned), vbox, FALSE, FALSE); |
4359 | 3070 gtk_widget_show(vbox); |
3071 | |
3072 gtkconv->toolbar.toolbar = build_conv_toolbar(conv); | |
3073 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->toolbar.toolbar, | |
3074 FALSE, FALSE, 0); | |
3075 | |
3076 /* Setup the entry widget. */ | |
3077 frame = gtk_frame_new(NULL); | |
3078 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); | |
3079 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); | |
3080 gtk_widget_show(frame); | |
3081 | |
3082 gtkconv->entry_buffer = gtk_text_buffer_new(NULL); | |
3083 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", conv); | |
3084 gtkconv->entry = gtk_text_view_new_with_buffer(gtkconv->entry_buffer); | |
3085 | |
3086 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), GTK_WRAP_WORD); | |
4851 | 3087 gtk_widget_set_size_request(gtkconv->entry, -1, |
4359 | 3088 MAX(buddy_chat_size.entry_height, 25)); |
3089 | |
3090 /* Connect the signal handlers. */ | |
3091 g_signal_connect_swapped(G_OBJECT(gtkconv->entry), "key_press_event", | |
3092 G_CALLBACK(entry_key_pressed_cb_1), | |
3093 gtkconv->entry_buffer); | |
3094 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", | |
3095 G_CALLBACK(entry_stop_rclick_cb), NULL); | |
3096 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", | |
3097 G_CALLBACK(entry_key_pressed_cb_2), conv); | |
3098 | |
3099 #ifdef USE_GTKSPELL | |
3100 if (convo_options & OPT_CONVO_CHECK_SPELLING) | |
3101 gtkspell_new_attach(GTK_TEXT_VIEW(gtkconv->entry), NULL, NULL); | |
3102 #endif | |
3103 | |
3104 gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(gtkconv->entry)); | |
3105 gtk_widget_show(gtkconv->entry); | |
3106 | |
3107 /* Setup the bottom button box. */ | |
3108 gtkconv->bbox = gtk_hbox_new(FALSE, 5); | |
3109 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->bbox, FALSE, FALSE, 0); | |
3110 gtk_widget_show(gtkconv->bbox); | |
3111 | |
3112 setup_chat_buttons(conv, gtkconv->bbox); | |
3113 | |
3114 return vpaned; | |
3115 } | |
3116 | |
3117 static GtkWidget * | |
3118 setup_im_pane(struct gaim_conversation *conv) | |
3119 { | |
3120 struct gaim_gtk_conversation *gtkconv; | |
3121 struct gaim_gtk_im_pane *gtkim; | |
3122 GtkWidget *paned; | |
3123 GtkWidget *vbox; | |
3124 GtkWidget *vbox2; | |
3125 GtkWidget *frame; | |
3126 | |
3127 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3128 gtkim = gtkconv->u.im; | |
3129 | |
3130 /* Setup the outer pane. */ | |
3131 paned = gtk_vpaned_new(); | |
3132 gtk_widget_show(paned); | |
3133 | |
3134 /* Setup the top part of the pane. */ | |
3135 vbox = gtk_vbox_new(FALSE, 5); | |
4409
0521eec12c33
[gaim-migrate @ 4682]
Christian Hammond <chipx86@chipx86.com>
parents:
4398
diff
changeset
|
3136 gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE); |
4359 | 3137 gtk_widget_show(vbox); |
3138 | |
3139 /* Setup the gtkimhtml widget. */ | |
3140 gtkconv->sw = gtk_scrolled_window_new(NULL, NULL); | |
3141 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gtkconv->sw), | |
3142 GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); | |
3143 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(gtkconv->sw), | |
3144 GTK_SHADOW_IN); | |
3145 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->sw, TRUE, TRUE, 0); | |
4851 | 3146 |
4359 | 3147 gtk_widget_set_size_request(gtkconv->sw, conv_size.width, conv_size.height); |
3148 gtk_widget_show(gtkconv->sw); | |
3149 | |
3150 gtkconv->imhtml = gtk_imhtml_new(NULL, NULL); | |
3151 gtk_container_add(GTK_CONTAINER(gtkconv->sw), gtkconv->imhtml); | |
3152 | |
3153 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event", | |
3154 G_CALLBACK(entry_stop_rclick_cb), NULL); | |
3155 | |
3156 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), | |
3157 (convo_options & OPT_CONVO_SHOW_TIME)); | |
3158 | |
3159 gaim_setup_imhtml(gtkconv->imhtml); | |
3160 | |
3161 gtk_widget_show(gtkconv->imhtml); | |
3162 | |
3163 vbox2 = gtk_vbox_new(FALSE, 5); | |
3164 gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, FALSE); | |
3165 gtk_widget_show(vbox2); | |
3166 | |
3167 /* Build the toolbar. */ | |
3168 gtkconv->toolbar.toolbar = build_conv_toolbar(conv); | |
3169 gtk_box_pack_start(GTK_BOX(vbox2), gtkconv->toolbar.toolbar, | |
3170 FALSE, FALSE, 0); | |
3171 | |
3172 /* Setup the entry widget. */ | |
3173 frame = gtk_frame_new(NULL); | |
3174 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); | |
3175 gtk_box_pack_start(GTK_BOX(vbox2), frame, TRUE, TRUE, 0); | |
3176 gtk_widget_show(frame); | |
3177 | |
3178 gtkconv->entry_buffer = gtk_text_buffer_new(NULL); | |
3179 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", conv); | |
3180 gtkconv->entry = gtk_text_view_new_with_buffer(gtkconv->entry_buffer); | |
3181 | |
3182 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(gtkconv->entry), GTK_WRAP_WORD); | |
4851 | 3183 gtk_widget_set_size_request(gtkconv->entry, -1, |
4359 | 3184 MAX(conv_size.entry_height, 25)); |
3185 | |
3186 /* Connect the signal handlers. */ | |
3187 g_signal_connect_swapped(G_OBJECT(gtkconv->entry), "key_press_event", | |
3188 G_CALLBACK(entry_key_pressed_cb_1), | |
3189 gtkconv->entry_buffer); | |
3190 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", | |
3191 G_CALLBACK(entry_key_pressed_cb_2), conv); | |
3192 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", | |
3193 G_CALLBACK(entry_stop_rclick_cb), NULL); | |
3194 | |
3195 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "insert_text", | |
3196 G_CALLBACK(insert_text_cb), conv); | |
3197 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "delete_range", | |
3198 G_CALLBACK(delete_text_cb), conv); | |
3199 | |
3200 #ifdef USE_GTKSPELL | |
3201 if (convo_options & OPT_CONVO_CHECK_SPELLING) | |
3202 gtkspell_new_attach(GTK_TEXT_VIEW(gtkconv->entry), NULL, NULL); | |
3203 #endif | |
3204 | |
3205 gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(gtkconv->entry)); | |
3206 gtk_widget_show(gtkconv->entry); | |
3207 | |
3208 gtkconv->bbox = gtk_hbox_new(FALSE, 5); | |
3209 gtk_box_pack_start(GTK_BOX(vbox2), gtkconv->bbox, FALSE, FALSE, 0); | |
3210 gtk_widget_show(gtkconv->bbox); | |
3211 | |
3212 setup_im_buttons(conv, gtkconv->bbox); | |
3213 | |
3214 return paned; | |
3215 } | |
3216 | |
3217 static void | |
3218 move_next_tab(struct gaim_conversation *conv) | |
3219 { | |
3220 struct gaim_conversation *next_conv = NULL; | |
3221 struct gaim_window *win; | |
3222 GList *l; | |
3223 int index, i; | |
3224 | |
3225 win = gaim_conversation_get_window(conv); | |
3226 index = gaim_conversation_get_index(conv); | |
3227 | |
3228 /* First check the tabs after this position. */ | |
3229 for (l = g_list_nth(gaim_window_get_conversations(win), index); | |
3230 l != NULL; | |
3231 l = l->next) { | |
3232 | |
3233 next_conv = (struct gaim_conversation *)l->data; | |
3234 | |
3235 if (gaim_conversation_get_unseen(next_conv) > 0) | |
3236 break; | |
3237 | |
3238 next_conv = NULL; | |
3239 } | |
3240 | |
3241 if (next_conv == NULL) { | |
3242 | |
3243 /* Now check before this position. */ | |
3244 for (l = gaim_window_get_conversations(win), i = 0; | |
3245 l != NULL && i < index; | |
3246 l = l->next) { | |
3247 | |
3248 next_conv = (struct gaim_conversation *)l->data; | |
3249 | |
3250 if (gaim_conversation_get_unseen(next_conv) > 0) | |
3251 break; | |
3252 | |
3253 next_conv = NULL; | |
3254 } | |
3255 | |
3256 if (next_conv == NULL) { | |
3257 /* Okay, just grab the next conversation tab. */ | |
3258 if (index == gaim_window_get_conversation_count(win) - 1) | |
3259 next_conv = gaim_window_get_conversation_at(win, 0); | |
3260 else | |
3261 next_conv = gaim_window_get_conversation_at(win, index + 1); | |
3262 } | |
3263 } | |
3264 | |
3265 if (next_conv != NULL && next_conv != conv) { | |
3266 gaim_window_switch_conversation(win, | |
3267 gaim_conversation_get_index(next_conv)); | |
3268 } | |
3269 } | |
3270 | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3271 static void |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3272 conv_dnd_recv(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, |
4781 | 3273 GtkSelectionData *sd, guint info, guint t, struct gaim_conversation *conv) |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3274 { |
4781 | 3275 struct gaim_window *win = conv->window; |
3276 struct gaim_conversation *c; | |
3277 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) { | |
3278 GaimBlistNode *n = NULL; | |
3279 memcpy(&n, sd->data, sizeof(n)); | |
3280 if (!GAIM_BLIST_NODE_IS_BUDDY(n)) | |
3281 return; | |
3282 c = gaim_conversation_new(GAIM_CONV_IM, ((struct buddy*)n)->account, ((struct buddy*)n)->name); | |
3283 gaim_window_add_conversation (win, c); | |
4702 | 3284 } |
3285 | |
3286 /* do_error_dialog("MWAHAHAHA! I AM A TROLL! I AM GOING TO EAT YOU!", | |
3287 NULL, GAIM_WARNING); */ | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3288 } |
4359 | 3289 |
3290 /************************************************************************** | |
3291 * GTK+ window ops | |
3292 **************************************************************************/ | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3293 static struct gaim_conversation_ui_ops * |
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3294 gaim_gtk_get_conversation_ui_ops(void) |
4359 | 3295 { |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3296 return gaim_get_gtk_conversation_ui_ops(); |
4359 | 3297 } |
3298 | |
3299 static void | |
3300 gaim_gtk_new_window(struct gaim_window *win) | |
3301 { | |
3302 struct gaim_gtk_window *gtkwin; | |
3303 GtkPositionType pos; | |
3304 GtkWidget *testidea; | |
3305 GtkWidget *menubar; | |
3306 | |
3307 gtkwin = g_malloc0(sizeof(struct gaim_gtk_window)); | |
3308 | |
3309 win->ui_data = gtkwin; | |
3310 | |
3311 /* Create the window. */ | |
3312 gtkwin->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
3313 gtk_window_set_role(GTK_WINDOW(gtkwin->window), "conversation"); | |
4635 | 3314 gtk_window_set_resizable(GTK_WINDOW(gtkwin->window), TRUE); |
4510
4c394222c732
[gaim-migrate @ 4786]
Christian Hammond <chipx86@chipx86.com>
parents:
4505
diff
changeset
|
3315 gtk_container_set_border_width(GTK_CONTAINER(gtkwin->window), 0); |
4359 | 3316 gtk_widget_realize(gtkwin->window); |
3317 | |
3318 g_signal_connect(G_OBJECT(gtkwin->window), "delete_event", | |
3319 G_CALLBACK(close_win_cb), win); | |
3320 | |
3321 /* Create the notebook. */ | |
3322 gtkwin->notebook = gtk_notebook_new(); | |
3323 | |
3324 pos = ((im_options & OPT_IM_SIDE_TAB) | |
3325 ? ((im_options & OPT_IM_BR_TAB) ? GTK_POS_RIGHT : GTK_POS_LEFT) | |
3326 : ((im_options & OPT_IM_BR_TAB) ? GTK_POS_BOTTOM : GTK_POS_TOP)); | |
3327 | |
3328 #if 0 | |
3329 gtk_notebook_set_tab_hborder(GTK_NOTEBOOK(gtkwin->notebook), 0); | |
3330 gtk_notebook_set_tab_vborder(GTK_NOTEBOOK(gtkwin->notebook), 0); | |
3331 #endif | |
3332 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(gtkwin->notebook), pos); | |
3333 gtk_notebook_set_scrollable(GTK_NOTEBOOK(gtkwin->notebook), TRUE); | |
3334 gtk_notebook_popup_enable(GTK_NOTEBOOK(gtkwin->notebook)); | |
4818 | 3335 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkwin->notebook), FALSE); |
3336 | |
4359 | 3337 gtk_widget_show(gtkwin->notebook); |
3338 | |
3339 g_signal_connect_after(G_OBJECT(gtkwin->notebook), "switch_page", | |
3340 G_CALLBACK(switch_conv_cb), win); | |
3341 | |
3342 /* Setup the tab drag and drop signals. */ | |
4486 | 3343 gtk_widget_add_events(gtkwin->notebook, |
3344 GDK_BUTTON1_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); | |
3345 g_signal_connect(G_OBJECT(gtkwin->notebook), "button_press_event", | |
4572
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3346 G_CALLBACK(notebook_press_cb), win); |
4486 | 3347 g_signal_connect(G_OBJECT(gtkwin->notebook), "button_release_event", |
4572
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3348 G_CALLBACK(notebook_release_cb), win); |
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3349 |
4359 | 3350 testidea = gtk_vbox_new(FALSE, 0); |
4572
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3351 |
4359 | 3352 /* Setup the menubar. */ |
3353 menubar = setup_menubar(win); | |
3354 gtk_box_pack_start(GTK_BOX(testidea), menubar, FALSE, TRUE, 0); | |
3355 | |
3356 gtk_box_pack_start(GTK_BOX(testidea), gtkwin->notebook, TRUE, TRUE, 0); | |
3357 | |
3358 gtk_container_add(GTK_CONTAINER(gtkwin->window), testidea); | |
3359 | |
3360 gtk_widget_show(testidea); | |
3361 } | |
3362 | |
3363 static void | |
3364 gaim_gtk_destroy_window(struct gaim_window *win) | |
3365 { | |
3366 struct gaim_gtk_window *gtkwin = GAIM_GTK_WINDOW(win); | |
3367 | |
3368 gtk_widget_destroy(gtkwin->window); | |
3369 | |
4630 | 3370 g_object_unref(G_OBJECT(gtkwin->menu.item_factory)); |
3371 | |
4359 | 3372 g_free(gtkwin); |
3373 win->ui_data = NULL; | |
3374 } | |
3375 | |
3376 static void | |
3377 gaim_gtk_show(struct gaim_window *win) | |
3378 { | |
3379 struct gaim_gtk_window *gtkwin = GAIM_GTK_WINDOW(win); | |
3380 | |
3381 gtk_widget_show(gtkwin->window); | |
3382 } | |
3383 | |
3384 static void | |
3385 gaim_gtk_hide(struct gaim_window *win) | |
3386 { | |
3387 struct gaim_gtk_window *gtkwin = GAIM_GTK_WINDOW(win); | |
3388 | |
3389 gtk_widget_hide(gtkwin->window); | |
3390 } | |
3391 | |
3392 static void | |
3393 gaim_gtk_raise(struct gaim_window *win) | |
3394 { | |
3395 struct gaim_gtk_window *gtkwin = GAIM_GTK_WINDOW(win); | |
3396 | |
4526 | 3397 gdk_window_raise(gtkwin->window->window); |
4359 | 3398 } |
3399 | |
3400 static void | |
3401 gaim_gtk_flash(struct gaim_window *win) | |
3402 { | |
3403 #ifdef _WIN32 | |
3404 struct gaim_gtk_window *gtkwin = GAIM_GTK_WINDOW(win); | |
3405 | |
3406 wgaim_im_blink(gtkwin->window); | |
3407 #endif | |
3408 } | |
3409 | |
3410 static void | |
3411 gaim_gtk_switch_conversation(struct gaim_window *win, unsigned int index) | |
3412 { | |
3413 struct gaim_gtk_window *gtkwin; | |
3414 | |
3415 gtkwin = GAIM_GTK_WINDOW(win); | |
3416 | |
3417 gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkwin->notebook), index); | |
3418 } | |
3419 | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3420 static const GtkTargetEntry te[] = |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3421 { |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3422 {"text/plain", 0, 0}, |
4702 | 3423 {"text/uri-list", 0, 1}, |
4781 | 3424 {"GAIM_BLIST_NODE", 0, 2}, |
4702 | 3425 {"STRING", 0, 3} |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3426 }; |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3427 |
4359 | 3428 static void |
3429 gaim_gtk_add_conversation(struct gaim_window *win, | |
3430 struct gaim_conversation *conv) | |
3431 { | |
3432 struct gaim_gtk_window *gtkwin; | |
3433 struct gaim_gtk_conversation *gtkconv; | |
3434 GtkWidget *pane = NULL; | |
3435 GtkWidget *tab_cont; | |
3436 GtkWidget *tabby; | |
3437 gboolean new_ui; | |
4383
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3438 GaimConversationType conv_type; |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3439 const char *name; |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3440 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3441 name = gaim_conversation_get_name(conv); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3442 conv_type = gaim_conversation_get_type(conv); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3443 gtkwin = GAIM_GTK_WINDOW(win); |
4359 | 3444 |
3445 if (conv->ui_data != NULL) { | |
3446 gtkconv = (struct gaim_gtk_conversation *)conv->ui_data; | |
3447 | |
3448 tab_cont = gtkconv->tab_cont; | |
3449 | |
3450 new_ui = FALSE; | |
3451 } | |
3452 else { | |
3453 gtkconv = g_malloc0(sizeof(struct gaim_gtk_conversation)); | |
3454 conv->ui_data = gtkconv; | |
3455 | |
3456 /* Setup some initial variables. */ | |
3457 gtkconv->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); | |
3458 gtkconv->tooltips = gtk_tooltips_new(); | |
3459 | |
4421 | 3460 /* Setup the foreground and background colors */ |
3461 gaim_gtkconv_update_font_colors(conv); | |
3462 | |
4438
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
3463 /* Setup the font face */ |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
3464 gaim_gtkconv_update_font_face(conv); |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
3465 |
4383
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3466 if (conv_type == GAIM_CONV_CHAT) { |
4359 | 3467 gtkconv->u.chat = g_malloc0(sizeof(struct gaim_gtk_chat_pane)); |
3468 | |
3469 pane = setup_chat_pane(conv); | |
3470 } | |
4383
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3471 else if (conv_type == GAIM_CONV_IM) { |
4359 | 3472 gtkconv->u.im = g_malloc0(sizeof(struct gaim_gtk_im_pane)); |
3473 gtkconv->u.im->a_virgin = TRUE; | |
3474 | |
3475 pane = setup_im_pane(conv); | |
3476 } | |
3477 | |
3478 if (pane == NULL) { | |
4572
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3479 if (conv_type == GAIM_CONV_CHAT) g_free(gtkconv->u.chat); |
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3480 else if (conv_type == GAIM_CONV_IM) g_free(gtkconv->u.im); |
4359 | 3481 |
3482 g_free(gtkconv); | |
3483 conv->ui_data = NULL; | |
3484 | |
3485 return; | |
3486 } | |
3487 | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3488 /* Setup drag-and-drop */ |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3489 gtk_drag_dest_set(pane, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3490 GTK_DEST_DEFAULT_MOTION | |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3491 GTK_DEST_DEFAULT_DROP, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3492 te, sizeof(te) / sizeof(GtkTargetEntry), |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3493 GDK_ACTION_COPY); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3494 gtk_drag_dest_set(gtkconv->imhtml, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3495 GTK_DEST_DEFAULT_MOTION | |
4702 | 3496 GTK_DEST_DEFAULT_DROP, |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3497 te, sizeof(te) / sizeof(GtkTargetEntry), |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3498 GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3499 gtk_drag_dest_set(gtkconv->entry, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3500 GTK_DEST_DEFAULT_MOTION | |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3501 GTK_DEST_DEFAULT_DROP, |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3502 te, sizeof(te) / sizeof(GtkTargetEntry), |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3503 GDK_ACTION_COPY); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3504 |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3505 g_signal_connect(G_OBJECT(pane), "drag_data_received", |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3506 G_CALLBACK(conv_dnd_recv), conv); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3507 g_signal_connect(G_OBJECT(gtkconv->imhtml), "drag_data_received", |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3508 G_CALLBACK(conv_dnd_recv), conv); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3509 #if 0 |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3510 g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3511 G_CALLBACK(conv_dnd_recv), conv); |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3512 #endif |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3513 |
4383
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3514 /* |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3515 * Write the New Conversation log string. |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3516 * |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3517 * This should probably be elsewhere, but then, logging should |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3518 * 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
|
3519 */ |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3520 if (gaim_conversation_is_logging(conv) && |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3521 conv_type != GAIM_CONV_MISC) { |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3522 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3523 FILE *fd; |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3524 char filename[256]; |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3525 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3526 g_snprintf(filename, sizeof(filename), "%s%s", name, |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3527 (conv_type == GAIM_CONV_CHAT ? ".chat" : "")); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3528 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3529 fd = open_log_file(filename, (conv_type == GAIM_CONV_CHAT)); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3530 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3531 if (fd) { |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3532 if (!(logging_options & OPT_LOG_STRIP_HTML)) |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3533 fprintf(fd, |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3534 "<HR><BR><H3 Align=Center> " |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3535 "---- New Conversation @ %s ----</H3><BR>\n", |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3536 full_date()); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3537 else |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3538 fprintf(fd, "---- New Conversation @ %s ----\n", |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3539 full_date()); |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3540 |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3541 fclose(fd); |
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 } |
f7a84034f97f
[gaim-migrate @ 4649]
Christian Hammond <chipx86@chipx86.com>
parents:
4382
diff
changeset
|
3544 |
4359 | 3545 /* Setup the container for the tab. */ |
3546 gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, 5); | |
3547 gtk_container_set_border_width(GTK_CONTAINER(tab_cont), 5); | |
3548 gtk_container_add(GTK_CONTAINER(tab_cont), pane); | |
3549 gtk_widget_show(pane); | |
3550 | |
3551 new_ui = TRUE; | |
4636 | 3552 |
4359 | 3553 gtkconv->make_sound = TRUE; |
3554 } | |
3555 | |
3556 gtkconv->tabby = tabby = gtk_hbox_new(FALSE, 5); | |
3557 | |
3558 /* Close button. */ | |
3559 gtkconv->close = gtk_button_new(); | |
3560 gtk_widget_set_size_request(GTK_WIDGET(gtkconv->close), 16, 16); | |
3561 gtk_container_add(GTK_CONTAINER(gtkconv->close), | |
4445 | 3562 gtk_image_new_from_stock(GTK_STOCK_CLOSE, |
3563 GTK_ICON_SIZE_MENU)); | |
4359 | 3564 gtk_button_set_relief(GTK_BUTTON(gtkconv->close), GTK_RELIEF_NONE); |
3565 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->close, | |
4572
06084165a966
[gaim-migrate @ 4853]
Christian Hammond <chipx86@chipx86.com>
parents:
4571
diff
changeset
|
3566 _("Close conversation"), NULL); |
4359 | 3567 |
3568 g_signal_connect(G_OBJECT(gtkconv->close), "clicked", | |
4571
51e988d015ed
[gaim-migrate @ 4852]
Christian Hammond <chipx86@chipx86.com>
parents:
4561
diff
changeset
|
3569 G_CALLBACK(close_conv_cb), conv); |
4359 | 3570 |
3571 /* Tab label. */ | |
3572 gtkconv->tab_label = gtk_label_new(gaim_conversation_get_title(conv)); | |
3573 #if 0 | |
3574 gtk_misc_set_alignment(GTK_MISC(gtkconv->tab_label), 0.00, 0.5); | |
3575 gtk_misc_set_padding(GTK_MISC(gtkconv->tab_label), 4, 0); | |
3576 #endif | |
3577 | |
3578 /* Pack it all together. */ | |
3579 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->tab_label, TRUE, TRUE, 0); | |
4445 | 3580 gtk_widget_show(gtkconv->tab_label); |
3581 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); | |
3582 if (!(convo_options & OPT_CONVO_NO_X_ON_TAB)) | |
3583 gtk_widget_show_all(gtkconv->close); | |
3584 gtk_widget_show(tabby); | |
4359 | 3585 |
3586 | |
3587 /* Add this pane to the conversations notebook. */ | |
3588 gtk_notebook_append_page(GTK_NOTEBOOK(gtkwin->notebook), tab_cont, tabby); | |
3589 gtk_notebook_set_menu_label_text(GTK_NOTEBOOK(gtkwin->notebook), tab_cont, | |
3590 gaim_conversation_get_title(conv)); | |
3591 | |
3592 gtk_widget_show(tab_cont); | |
3593 | |
4818 | 3594 if (gaim_window_get_conversation_count(win) == 1) { |
3595 /* Er, bug in notebooks? Switch to the page manually. */ | |
4359 | 3596 gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkwin->notebook), 0); |
4851 | 3597 |
3598 if(conv_type == GAIM_CONV_IM) { | |
3599 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkwin->notebook), | |
3600 (im_options & OPT_IM_ONE_WINDOW)); | |
3601 } else if(conv_type == GAIM_CONV_CHAT) { | |
3602 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkwin->notebook), | |
3603 (chat_options & OPT_CHAT_ONE_WINDOW)); | |
3604 } | |
4818 | 3605 } else { |
3606 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkwin->notebook), TRUE); | |
3607 } | |
4359 | 3608 |
3609 if ((gtk_notebook_get_current_page(GTK_NOTEBOOK(gtkwin->notebook)) == 0) || | |
3610 (conv == g_list_nth_data(gaim_window_get_conversations(win), 0))) { | |
3611 | |
3612 gtk_widget_grab_focus(gtkconv->entry); | |
3613 } | |
3614 | |
3615 gaim_gtkconv_update_buddy_icon(conv); | |
3616 | |
3617 if (!new_ui) | |
3618 g_object_unref(gtkconv->tab_cont); | |
3619 | |
3620 if (gaim_window_get_conversation_count(win) == 1) | |
4685 | 3621 g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); |
4359 | 3622 } |
3623 | |
3624 static void | |
3625 gaim_gtk_remove_conversation(struct gaim_window *win, | |
3626 struct gaim_conversation *conv) | |
3627 { | |
3628 struct gaim_gtk_window *gtkwin; | |
3629 struct gaim_gtk_conversation *gtkconv; | |
3630 unsigned int index; | |
4818 | 3631 GaimConversationType conv_type; |
3632 | |
3633 conv_type = gaim_conversation_get_type(conv); | |
4359 | 3634 index = gaim_conversation_get_index(conv); |
3635 | |
3636 gtkwin = GAIM_GTK_WINDOW(win); | |
3637 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3638 | |
3639 g_object_ref(gtkconv->tab_cont); | |
3640 gtk_object_sink(GTK_OBJECT(gtkconv->tab_cont)); | |
3641 | |
3642 gtk_notebook_remove_page(GTK_NOTEBOOK(gtkwin->notebook), index); | |
3643 | |
4818 | 3644 /* go back to tabless if need be */ |
3645 if (gaim_window_get_conversation_count(win) <= 2) { | |
3646 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkwin->notebook), | |
3647 ((conv_type == GAIM_CONV_IM && im_options & OPT_IM_ONE_WINDOW) || | |
3648 (conv_type == GAIM_CONV_CHAT && im_options & OPT_CHAT_ONE_WINDOW))); | |
3649 } | |
3650 | |
3651 | |
4359 | 3652 /* If this window is setup with an inactive gc, regenerate the menu. */ |
4818 | 3653 if (conv_type == GAIM_CONV_IM && |
4359 | 3654 gaim_conversation_get_gc(conv) == NULL) { |
3655 | |
4360
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
3656 generate_send_as_items(win, conv); |
4359 | 3657 } |
3658 } | |
3659 | |
3660 static void | |
3661 gaim_gtk_move_conversation(struct gaim_window *win, | |
3662 struct gaim_conversation *conv, | |
3663 unsigned int new_index) | |
3664 { | |
3665 struct gaim_gtk_window *gtkwin; | |
3666 struct gaim_gtk_conversation *gtkconv; | |
3667 | |
3668 gtkwin = GAIM_GTK_WINDOW(win); | |
3669 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3670 | |
4415
c90039137172
[gaim-migrate @ 4688]
Christian Hammond <chipx86@chipx86.com>
parents:
4409
diff
changeset
|
3671 if (new_index > gaim_conversation_get_index(conv)) |
c90039137172
[gaim-migrate @ 4688]
Christian Hammond <chipx86@chipx86.com>
parents:
4409
diff
changeset
|
3672 new_index--; |
c90039137172
[gaim-migrate @ 4688]
Christian Hammond <chipx86@chipx86.com>
parents:
4409
diff
changeset
|
3673 |
4359 | 3674 gtk_notebook_reorder_child(GTK_NOTEBOOK(gtkwin->notebook), |
3675 gtkconv->tab_cont, new_index); | |
3676 } | |
3677 | |
3678 static int | |
3679 gaim_gtk_get_active_index(const struct gaim_window *win) | |
3680 { | |
3681 struct gaim_gtk_window *gtkwin; | |
3682 | |
3683 gtkwin = GAIM_GTK_WINDOW(win); | |
3684 | |
3685 return gtk_notebook_get_current_page(GTK_NOTEBOOK(gtkwin->notebook)); | |
3686 } | |
3687 | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3688 static struct gaim_window_ui_ops window_ui_ops = |
4359 | 3689 { |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3690 gaim_gtk_get_conversation_ui_ops, |
4359 | 3691 gaim_gtk_new_window, |
3692 gaim_gtk_destroy_window, | |
3693 gaim_gtk_show, | |
3694 gaim_gtk_hide, | |
3695 gaim_gtk_raise, | |
3696 gaim_gtk_flash, | |
3697 gaim_gtk_switch_conversation, | |
3698 gaim_gtk_add_conversation, | |
3699 gaim_gtk_remove_conversation, | |
3700 gaim_gtk_move_conversation, | |
3701 gaim_gtk_get_active_index | |
3702 }; | |
3703 | |
3704 static void | |
3705 update_convo_add_button(struct gaim_conversation *conv) | |
3706 { | |
3707 struct gaim_gtk_conversation *gtkconv; | |
3708 struct gaim_connection *gc; | |
3709 GaimConversationType type; | |
3710 GtkWidget *parent; | |
3711 | |
3712 type = gaim_conversation_get_type(conv); | |
3713 gc = gaim_conversation_get_gc(conv); | |
3714 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3715 parent = gtk_widget_get_parent(gtkconv->u.im->add); | |
3716 | |
4687 | 3717 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
|
3718 gtkconv->u.im->add = |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3719 gaim_gtk_change_text(_("Remove"), gtkconv->u.im->add, |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3720 GTK_STOCK_REMOVE, type); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3721 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->u.im->add, |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3722 _("Remove the user from your buddy list"), NULL); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3723 |
4359 | 3724 gtk_widget_set_sensitive(gtkconv->u.im->add, |
3725 (gc != NULL && gc->prpl->remove_buddy != NULL)); | |
3726 } else { | |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3727 gtkconv->u.im->add = |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3728 gaim_gtk_change_text(_("Add"), gtkconv->u.im->add, |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3729 GTK_STOCK_ADD, type); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3730 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->u.im->add, |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3731 _("Add the user to your buddy list"), NULL); |
4359 | 3732 |
3733 gtk_widget_set_sensitive(gtkconv->u.im->add, | |
3734 (gc != NULL && gc->prpl->add_buddy != NULL)); | |
3735 } | |
3736 | |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3737 g_signal_connect(G_OBJECT(gtkconv->u.im->add), "clicked", |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3738 G_CALLBACK(add_cb), conv); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3739 |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3740 gtk_box_pack_start(GTK_BOX(parent), gtkconv->u.im->add, |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3741 FALSE, FALSE, 0); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
3742 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
|
3743 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
|
3744 gtk_size_group_add_widget(gtkconv->sg, gtkconv->u.im->add); |
4359 | 3745 } |
3746 | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3747 struct gaim_window_ui_ops * |
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3748 gaim_get_gtk_window_ui_ops(void) |
4359 | 3749 { |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3750 return &window_ui_ops; |
4359 | 3751 } |
3752 | |
3753 /************************************************************************** | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
3754 * Conversation UI operations |
4359 | 3755 **************************************************************************/ |
3756 static void | |
3757 gaim_gtkconv_destroy(struct gaim_conversation *conv) | |
3758 { | |
3759 struct gaim_gtk_conversation *gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3760 | |
3761 if (gtkconv->dialogs.fg_color != NULL) | |
3762 gtk_widget_destroy(gtkconv->dialogs.fg_color); | |
3763 | |
3764 if (gtkconv->dialogs.bg_color != NULL) | |
3765 gtk_widget_destroy(gtkconv->dialogs.bg_color); | |
3766 | |
3767 if (gtkconv->dialogs.font != NULL) | |
3768 gtk_widget_destroy(gtkconv->dialogs.font); | |
3769 | |
3770 if (gtkconv->dialogs.smiley != NULL) | |
3771 gtk_widget_destroy(gtkconv->dialogs.smiley); | |
3772 | |
3773 if (gtkconv->dialogs.link != NULL) | |
3774 gtk_widget_destroy(gtkconv->dialogs.link); | |
3775 | |
3776 if (gtkconv->dialogs.log != NULL) | |
3777 gtk_widget_destroy(gtkconv->dialogs.log); | |
3778 | |
4571
51e988d015ed
[gaim-migrate @ 4852]
Christian Hammond <chipx86@chipx86.com>
parents:
4561
diff
changeset
|
3779 gtk_widget_destroy(gtkconv->tab_cont); |
4892 | 3780 g_object_unref(gtkconv->tab_cont); |
4571
51e988d015ed
[gaim-migrate @ 4852]
Christian Hammond <chipx86@chipx86.com>
parents:
4561
diff
changeset
|
3781 |
4359 | 3782 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { |
4755 | 3783 if (gtkconv->u.im->icon_timer != 0) |
3784 g_source_remove(gtkconv->u.im->icon_timer); | |
3785 | |
4359 | 3786 if (gtkconv->u.im->save_icon != NULL) |
3787 gtk_widget_destroy(gtkconv->u.im->save_icon); | |
3788 | |
3789 if (gtkconv->u.im->anim != NULL) | |
4793 | 3790 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); |
4359 | 3791 |
3792 g_free(gtkconv->u.im); | |
3793 } | |
3794 else if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) { | |
3795 g_free(gtkconv->u.chat); | |
3796 } | |
3797 | |
4633 | 3798 gtk_object_sink(GTK_OBJECT(gtkconv->tooltips)); |
3799 | |
4359 | 3800 g_free(gtkconv); |
3801 } | |
3802 | |
3803 static void | |
3804 gaim_gtkconv_write_im(struct gaim_conversation *conv, const char *who, | |
3805 const char *message, size_t len, int flags, time_t mtime) | |
3806 { | |
3807 struct gaim_gtk_conversation *gtkconv; | |
3808 | |
3809 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3810 | |
4382
76223649765b
[gaim-migrate @ 4648]
Christian Hammond <chipx86@chipx86.com>
parents:
4378
diff
changeset
|
3811 /* Play a sound, if specified in prefs. */ |
4359 | 3812 if (gtkconv->make_sound) { |
3813 if (flags & WFLAG_RECV) { | |
3814 if (gtkconv->u.im->a_virgin && | |
3815 (sound_options & OPT_SOUND_FIRST_RCV)) { | |
3816 | |
4561 | 3817 gaim_sound_play_event(GAIM_SOUND_FIRST_RECEIVE); |
4359 | 3818 } |
3819 else | |
4561 | 3820 gaim_sound_play_event(GAIM_SOUND_RECEIVE); |
4359 | 3821 } |
3822 else { | |
4561 | 3823 gaim_sound_play_event(GAIM_SOUND_SEND); |
4359 | 3824 } |
3825 } | |
3826 | |
3827 gtkconv->u.im->a_virgin = FALSE; | |
3828 | |
3829 gaim_conversation_write(conv, who, message, len, flags, mtime); | |
3830 } | |
3831 | |
3832 static void | |
3833 gaim_gtkconv_write_chat(struct gaim_conversation *conv, const char *who, | |
3834 const char *message, int flags, time_t mtime) | |
3835 { | |
3836 struct gaim_gtk_conversation *gtkconv; | |
3837 | |
3838 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3839 | |
4382
76223649765b
[gaim-migrate @ 4648]
Christian Hammond <chipx86@chipx86.com>
parents:
4378
diff
changeset
|
3840 /* Play a sound, if specified in prefs. */ |
4359 | 3841 if (gtkconv->make_sound) { |
3842 if (!(flags & WFLAG_WHISPER) && (flags & WFLAG_SEND)) | |
4561 | 3843 gaim_sound_play_event(GAIM_SOUND_CHAT_YOU_SAY); |
4359 | 3844 else if (flags & WFLAG_RECV) { |
3845 if ((flags & WFLAG_NICK) && (sound_options & OPT_SOUND_CHAT_NICK)) | |
4561 | 3846 gaim_sound_play_event(GAIM_SOUND_CHAT_NICK); |
4359 | 3847 else |
4561 | 3848 gaim_sound_play_event(GAIM_SOUND_CHAT_SAY); |
4359 | 3849 } |
3850 } | |
3851 | |
3852 if (chat_options & OPT_CHAT_COLORIZE) | |
3853 flags |= WFLAG_COLORIZE; | |
3854 | |
3855 gaim_conversation_write(conv, who, message, -1, flags, mtime); | |
3856 } | |
3857 | |
3858 static void | |
3859 gaim_gtkconv_write_conv(struct gaim_conversation *conv, const char *who, | |
3860 const char *message, size_t length, int flags, | |
3861 time_t mtime) | |
3862 { | |
3863 struct gaim_gtk_conversation *gtkconv; | |
3864 struct gaim_connection *gc; | |
3865 int gtk_font_options = 0; | |
3866 GString *log_str; | |
3867 FILE *fd; | |
3868 char buf[BUF_LONG]; | |
3869 char buf2[BUF_LONG]; | |
3870 char mdate[64]; | |
3871 char color[10]; | |
3872 char *str; | |
3873 char *with_font_tag; | |
4896 | 3874 char *sml_attrib = NULL; |
4895 | 3875 |
3876 if(length == -1) | |
3877 length = strlen(message) + 1; | |
3878 | |
4359 | 3879 gtkconv = GAIM_GTK_CONVERSATION(conv); |
3880 gc = gaim_conversation_get_gc(conv); | |
3881 | |
3882 strftime(mdate, sizeof(mdate), "%H:%M:%S", localtime(&mtime)); | |
3883 | |
4896 | 3884 if(gc) |
3885 sml_attrib = g_strdup_printf("sml=\"%s\"", gc->prpl->name); | |
3886 | |
4359 | 3887 gtk_font_options ^= GTK_IMHTML_NO_COMMENTS; |
3888 | |
3889 if (convo_options & OPT_CONVO_IGNORE_COLOUR) | |
3890 gtk_font_options ^= GTK_IMHTML_NO_COLOURS; | |
3891 | |
3892 if (convo_options & OPT_CONVO_IGNORE_FONTS) | |
3893 gtk_font_options ^= GTK_IMHTML_NO_FONTS; | |
3894 | |
3895 if (convo_options & OPT_CONVO_IGNORE_SIZES) | |
3896 gtk_font_options ^= GTK_IMHTML_NO_SIZES; | |
3897 | |
3898 if (!(logging_options & OPT_LOG_STRIP_HTML)) | |
3899 gtk_font_options ^= GTK_IMHTML_RETURN_LOG; | |
3900 | |
3901 if (flags & WFLAG_SYSTEM) { | |
3902 if (convo_options & OPT_CONVO_SHOW_TIME) | |
3903 g_snprintf(buf, BUF_LONG, "<FONT SIZE=\"2\">(%s) </FONT><B>%s</B>", | |
3904 mdate, message); | |
3905 else | |
3906 g_snprintf(buf, BUF_LONG, "<B>%s</B>", message); | |
3907 | |
3908 g_snprintf(buf2, sizeof(buf2), | |
3909 "<FONT SIZE=\"2\"><!--(%s) --></FONT><B>%s</B><BR>", | |
3910 mdate, message); | |
3911 | |
3912 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, -1, 0); | |
3913 | |
3914 if (logging_options & OPT_LOG_STRIP_HTML) { | |
3915 char *t1 = strip_html(buf); | |
3916 | |
3917 conv->history = g_string_append(conv->history, t1); | |
3918 conv->history = g_string_append(conv->history, "\n"); | |
3919 | |
3920 g_free(t1); | |
3921 } | |
3922 else { | |
3923 conv->history = g_string_append(conv->history, buf); | |
3924 conv->history = g_string_append(conv->history, "<BR>\n"); | |
3925 } | |
3926 | |
3927 if (!(flags & WFLAG_NOLOG) && gaim_conversation_is_logging(conv)) { | |
3928 | |
3929 char *t1; | |
3930 char nm[256]; | |
3931 | |
3932 if (logging_options & OPT_LOG_STRIP_HTML) | |
3933 t1 = strip_html(buf); | |
3934 else | |
3935 t1 = buf; | |
3936 | |
3937 if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) | |
3938 g_snprintf(nm, sizeof(nm), "%s.chat", | |
3939 gaim_conversation_get_name(conv)); | |
3940 else | |
3941 strncpy(nm, gaim_conversation_get_name(conv), sizeof(nm)); | |
3942 | |
3943 fd = open_log_file(nm, | |
3944 (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT)); | |
3945 | |
3946 if (fd) { | |
3947 if (logging_options & OPT_LOG_STRIP_HTML) | |
3948 fprintf(fd, "%s\n", t1); | |
3949 else | |
3950 fprintf(fd, "%s<BR>\n", t1); | |
3951 | |
3952 fclose(fd); | |
3953 } | |
3954 | |
3955 if (logging_options & OPT_LOG_STRIP_HTML) | |
3956 g_free(t1); | |
3957 } | |
3958 } | |
3959 else if (flags & WFLAG_NOLOG) { | |
3960 g_snprintf(buf, BUF_LONG, | |
3961 "<B><FONT COLOR=\"#777777\">%s</FONT></B><BR>", | |
3962 message); | |
3963 | |
3964 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf, -1, 0); | |
3965 } | |
3966 else { | |
4895 | 3967 char *new_message = g_memdup(message, length); |
3968 | |
4359 | 3969 if (flags & WFLAG_WHISPER) { |
3970 str = g_malloc(1024); | |
3971 | |
3972 /* If we're whispering, it's not an autoresponse. */ | |
3973 if (meify(new_message, length)) { | |
3974 g_snprintf(str, 1024, "***%s", who); | |
3975 strcpy(color, "#6C2585"); | |
3976 } | |
3977 else { | |
3978 g_snprintf(str, 1024, "*%s*:", who); | |
3979 strcpy(color, "#00FF00"); | |
3980 } | |
3981 } | |
3982 else { | |
3983 if (meify(new_message, length)) { | |
3984 str = g_malloc(1024); | |
3985 | |
3986 if (flags & WFLAG_AUTO) | |
3987 g_snprintf(str, 1024, "%s ***%s", AUTO_RESPONSE, who); | |
3988 else | |
3989 g_snprintf(str, 1024, "***%s", who); | |
3990 | |
3991 if (flags & WFLAG_NICK) | |
3992 strcpy(color, "#AF7F00"); | |
3993 else | |
3994 strcpy(color, "#062585"); | |
3995 } | |
3996 else { | |
3997 str = g_malloc(1024); | |
3998 | |
3999 if (flags & WFLAG_AUTO) | |
4000 g_snprintf(str, 1024, "%s %s", who, AUTO_RESPONSE); | |
4001 else | |
4002 g_snprintf(str, 1024, "%s:", who); | |
4003 | |
4004 if (flags & WFLAG_NICK) | |
4005 strcpy(color, "#AF7F00"); | |
4006 else if (flags & WFLAG_RECV) { | |
4007 if (flags & WFLAG_COLORIZE) { | |
4008 const char *u; | |
4009 int m = 0; | |
4010 | |
4011 for (u = who; *u != '\0'; u++) | |
4012 m += *u; | |
4013 | |
4014 m = m % NUM_NICK_COLORS; | |
4015 | |
4016 strcpy(color, nick_colors[m]); | |
4017 } | |
4018 else | |
4019 strcpy(color, "#A82F2F"); | |
4020 } | |
4021 else if (flags & WFLAG_SEND) | |
4022 strcpy(color, "#16569E"); | |
4023 } | |
4024 } | |
4025 | |
4026 if (convo_options & OPT_CONVO_SHOW_TIME) | |
4027 g_snprintf(buf, BUF_LONG, | |
4896 | 4028 "<FONT COLOR=\"%s\" %s><FONT SIZE=\"2\">(%s) </FONT>" |
4029 "<B>%s</B></FONT> ", color, | |
4030 sml_attrib ? sml_attrib : "", mdate, str); | |
4359 | 4031 else |
4032 g_snprintf(buf, BUF_LONG, | |
4896 | 4033 "<FONT COLOR=\"%s\" %s><B>%s</B></FONT> ", color, |
4034 sml_attrib ? sml_attrib : "", str); | |
4359 | 4035 |
4036 g_snprintf(buf2, BUF_LONG, | |
4896 | 4037 "<FONT COLOR=\"%s\" %s><FONT SIZE=\"2\"><!--(%s) --></FONT>" |
4359 | 4038 "<B>%s</B></FONT> ", |
4896 | 4039 color, sml_attrib ? sml_attrib : "", mdate, str); |
4359 | 4040 |
4041 g_free(str); | |
4042 | |
4043 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, -1, 0); | |
4044 | |
4895 | 4045 if(gc){ |
4896 | 4046 char *pre = g_strdup_printf("<font %s>", sml_attrib ? sml_attrib : ""); |
4895 | 4047 char *post = "</font>"; |
4048 int pre_len = strlen(pre); | |
4049 int post_len = strlen(post); | |
4050 | |
4051 with_font_tag = g_malloc(length + pre_len + post_len + 1); | |
4052 | |
4053 strcpy(with_font_tag, pre); | |
4054 memcpy(with_font_tag + pre_len, new_message, length); | |
4055 strcpy(with_font_tag + pre_len + length, post); | |
4056 | |
4057 length += pre_len + post_len; | |
4058 g_free(pre); | |
4059 } | |
4608 | 4060 else |
4895 | 4061 with_font_tag = g_memdup(new_message, length); |
4359 | 4062 |
4063 log_str = gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), | |
4895 | 4064 with_font_tag, length, gtk_font_options); |
4359 | 4065 |
4066 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), "<BR>", -1, 0); | |
4067 | |
4068 /* XXX This needs to be updated for the new length argument. */ | |
4069 if (logging_options & OPT_LOG_STRIP_HTML) { | |
4070 char *t1, *t2; | |
4071 | |
4072 t1 = strip_html(buf); | |
4073 t2 = strip_html(new_message); | |
4074 | |
4075 conv->history = g_string_append(conv->history, t1); | |
4076 conv->history = g_string_append(conv->history, t2); | |
4077 conv->history = g_string_append(conv->history, "\n"); | |
4078 | |
4079 g_free(t1); | |
4080 g_free(t2); | |
4081 } | |
4082 else { | |
4083 char *t1, *t2; | |
4084 | |
4085 t1 = html_logize(buf); | |
4086 t2 = html_logize(new_message); | |
4087 | |
4088 conv->history = g_string_append(conv->history, t1); | |
4089 conv->history = g_string_append(conv->history, t2); | |
4090 conv->history = g_string_append(conv->history, "\n"); | |
4091 conv->history = g_string_append(conv->history, log_str->str); | |
4092 conv->history = g_string_append(conv->history, "<BR>\n"); | |
4093 | |
4094 g_free(t1); | |
4095 g_free(t2); | |
4096 } | |
4097 | |
4098 /* XXX This needs to be updated for the new length argument. */ | |
4099 if (gaim_conversation_is_logging(conv)) { | |
4100 char *t1, *t2; | |
4101 char nm[256]; | |
4102 | |
4103 if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) | |
4104 g_snprintf(nm, sizeof(nm), "%s.chat", | |
4105 gaim_conversation_get_name(conv)); | |
4106 else | |
4107 strncpy(nm, gaim_conversation_get_name(conv), sizeof(nm)); | |
4108 | |
4109 if (logging_options & OPT_LOG_STRIP_HTML) { | |
4110 t1 = strip_html(buf); | |
4111 t2 = strip_html(with_font_tag); | |
4112 } | |
4113 else { | |
4114 t1 = html_logize(buf); | |
4115 t2 = html_logize(with_font_tag); | |
4116 } | |
4117 | |
4118 fd = open_log_file(nm, | |
4119 (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT)); | |
4120 | |
4121 if (fd) { | |
4122 if (logging_options & OPT_LOG_STRIP_HTML) | |
4123 fprintf(fd, "%s%s\n", t1, t2); | |
4124 else { | |
4125 fprintf(fd, "%s%s%s<BR>\n", t1, t2, log_str->str); | |
4126 g_string_free(log_str, TRUE); | |
4127 } | |
4128 | |
4129 fclose(fd); | |
4130 } | |
4131 | |
4132 g_free(t1); | |
4133 g_free(t2); | |
4134 } | |
4135 | |
4896 | 4136 if(sml_attrib) |
4137 g_free(sml_attrib); | |
4359 | 4138 g_free(with_font_tag); |
4139 g_free(new_message); | |
4140 } | |
4141 } | |
4142 | |
4143 static void | |
4144 gaim_gtkconv_chat_add_user(struct gaim_conversation *conv, const char *user) | |
4145 { | |
4146 struct gaim_chat *chat; | |
4147 struct gaim_gtk_conversation *gtkconv; | |
4148 struct gaim_gtk_chat_pane *gtkchat; | |
4149 char tmp[BUF_LONG]; | |
4150 int num_users; | |
4151 int pos; | |
4152 | |
4153 chat = GAIM_CHAT(conv); | |
4154 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4155 gtkchat = gtkconv->u.chat; | |
4156 | |
4157 num_users = g_list_length(gaim_chat_get_users(chat)); | |
4158 | |
4159 g_snprintf(tmp, sizeof(tmp), | |
4160 ngettext("%d person in room", "%d people in room", | |
4161 num_users), | |
4162 num_users); | |
4163 | |
4164 gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); | |
4165 | |
4166 if (gtkconv->make_sound) | |
4561 | 4167 gaim_sound_play_event(GAIM_SOUND_CHAT_JOIN); |
4359 | 4168 |
4169 pos = g_list_index(gaim_chat_get_users(chat), user); | |
4170 | |
4171 add_chat_buddy_common(conv, user, pos); | |
4172 } | |
4173 | |
4174 static void | |
4175 gaim_gtkconv_chat_rename_user(struct gaim_conversation *conv, | |
4176 const char *old_name, const char *new_name) | |
4177 { | |
4178 struct gaim_chat *chat; | |
4179 struct gaim_gtk_conversation *gtkconv; | |
4180 struct gaim_gtk_chat_pane *gtkchat; | |
4181 GtkTreeIter iter; | |
4182 GtkTreeModel *model; | |
4183 GList *names; | |
4184 int pos; | |
4185 int f = 1; | |
4186 | |
4187 chat = GAIM_CHAT(conv); | |
4188 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4189 gtkchat = gtkconv->u.chat; | |
4190 | |
4191 for (names = gaim_chat_get_users(chat); | |
4192 names != NULL; | |
4193 names = names->next) { | |
4194 | |
4195 char *u = (char *)names->data; | |
4196 | |
4793 | 4197 if (!gaim_utf8_strcasecmp(u, old_name)) { |
4359 | 4198 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
4199 | |
4200 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) | |
4201 break; | |
4202 | |
4203 while (f != 0) { | |
4204 char *val; | |
4205 | |
4206 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 1, &val, -1); | |
4207 | |
4793 | 4208 if (!gaim_utf8_strcasecmp(old_name, val)) { |
4359 | 4209 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); |
4640 | 4210 break; |
4211 } | |
4359 | 4212 |
4213 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4214 | |
4215 g_free(val); | |
4216 } | |
4217 | |
4218 break; | |
4219 } | |
4220 } | |
4221 | |
4222 if (!names) | |
4223 return; | |
4224 | |
4225 pos = g_list_index(gaim_chat_get_users(chat), new_name); | |
4226 | |
4227 add_chat_buddy_common(conv, new_name, pos); | |
4228 } | |
4229 | |
4230 static void | |
4231 gaim_gtkconv_chat_remove_user(struct gaim_conversation *conv, const char *user) | |
4232 { | |
4233 struct gaim_chat *chat; | |
4234 struct gaim_gtk_conversation *gtkconv; | |
4235 struct gaim_gtk_chat_pane *gtkchat; | |
4236 GtkTreeIter iter; | |
4237 GtkTreeModel *model; | |
4238 GList *names; | |
4239 char tmp[BUF_LONG]; | |
4240 int num_users; | |
4241 int f = 1; | |
4242 | |
4243 chat = GAIM_CHAT(conv); | |
4244 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4245 gtkchat = gtkconv->u.chat; | |
4246 | |
4247 num_users = g_list_length(gaim_chat_get_users(chat)) - 1; | |
4248 | |
4249 for (names = gaim_chat_get_users(chat); | |
4250 names != NULL; | |
4251 names = names->next) { | |
4252 | |
4253 char *u = (char *)names->data; | |
4254 | |
4793 | 4255 if (!gaim_utf8_strcasecmp(u, user)) { |
4359 | 4256 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
4257 | |
4258 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) | |
4259 break; | |
4260 | |
4261 while (f != 0) { | |
4262 char *val; | |
4263 | |
4264 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 1, &val, -1); | |
4265 | |
4793 | 4266 if (!gaim_utf8_strcasecmp(user, val)) |
4359 | 4267 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); |
4268 | |
4269 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4270 | |
4271 g_free(val); | |
4272 } | |
4273 | |
4274 break; | |
4275 } | |
4276 } | |
4277 | |
4278 if (names == NULL) | |
4279 return; | |
4280 | |
4281 g_snprintf(tmp, sizeof(tmp), | |
4282 ngettext("%d person in room", "%d people in room", | |
4283 num_users), num_users); | |
4284 | |
4285 gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); | |
4286 | |
4287 if (gtkconv->make_sound) | |
4561 | 4288 gaim_sound_play_event(GAIM_SOUND_CHAT_LEAVE); |
4359 | 4289 } |
4290 | |
4291 static void | |
4292 gaim_gtkconv_set_title(struct gaim_conversation *conv, const char *title) | |
4293 { | |
4294 struct gaim_gtk_conversation *gtkconv; | |
4681 | 4295 struct gaim_window *win; |
4296 struct gaim_gtk_window *gtkwin; | |
4297 | |
4298 win = gaim_conversation_get_window(conv); | |
4299 gtkwin = GAIM_GTK_WINDOW(win); | |
4359 | 4300 gtkconv = GAIM_GTK_CONVERSATION(conv); |
4301 | |
4302 gtk_label_set_text(GTK_LABEL(gtkconv->tab_label), title); | |
4681 | 4303 |
4304 if(conv == gaim_window_get_active_conversation(win)) | |
4305 gtk_window_set_title(GTK_WINDOW(gtkwin->window), title); | |
4359 | 4306 } |
4307 | |
4308 static void | |
4309 gaim_gtkconv_updated(struct gaim_conversation *conv, GaimConvUpdateType type) | |
4310 { | |
4311 struct gaim_window *win; | |
4736 | 4312 struct gaim_gtk_window *gtkwin; |
4359 | 4313 struct gaim_gtk_conversation *gtkconv; |
4314 struct gaim_gtk_chat_pane *gtkchat; | |
4315 struct gaim_chat *chat; | |
4316 | |
4317 win = gaim_conversation_get_window(conv); | |
4736 | 4318 gtkwin = GAIM_GTK_WINDOW(win); |
4359 | 4319 gtkconv = GAIM_GTK_CONVERSATION(conv); |
4320 | |
4491 | 4321 if (type == GAIM_CONV_UPDATE_ACCOUNT) { |
4359 | 4322 gaim_conversation_autoset_title(conv); |
4323 gaim_gtkconv_update_buddy_icon(conv); | |
4324 gaim_gtkconv_update_buttons_by_protocol(conv); | |
4325 | |
4685 | 4326 g_timeout_add(0, (GSourceFunc)update_send_as_selection, win); |
4359 | 4327 |
4328 smiley_themeize(gtkconv->imhtml); | |
4329 } | |
4330 else if (type == GAIM_CONV_UPDATE_TYPING || | |
4331 type == GAIM_CONV_UPDATE_UNSEEN) { | |
4332 GtkStyle *style; | |
4333 struct gaim_im *im = NULL; | |
4334 | |
4736 | 4335 |
4359 | 4336 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) |
4337 im = GAIM_IM(conv); | |
4338 | |
4339 style = gtk_style_new(); | |
4340 | |
4341 if (!GTK_WIDGET_REALIZED(gtkconv->tab_label)) | |
4342 gtk_widget_realize(gtkconv->tab_label); | |
4343 | |
4757 | 4344 pango_font_description_free(style->font_desc); |
4635 | 4345 style->font_desc = pango_font_description_copy( |
4346 gtk_widget_get_style(gtkconv->tab_label)->font_desc); | |
4359 | 4347 |
4348 if (im != NULL && gaim_im_get_typing_state(im) == TYPING) { | |
4577 | 4349 style->fg[GTK_STATE_NORMAL].red = 0x4646; |
4350 style->fg[GTK_STATE_NORMAL].green = 0xA0A0; | |
4351 style->fg[GTK_STATE_NORMAL].blue = 0x4646; | |
4352 style->fg[GTK_STATE_ACTIVE] = style->fg[GTK_STATE_NORMAL]; | |
4359 | 4353 } |
4354 else if (im != NULL && gaim_im_get_typing_state(im) == TYPED) { | |
4577 | 4355 style->fg[GTK_STATE_NORMAL].red = 0xD1D1; |
4356 style->fg[GTK_STATE_NORMAL].green = 0x9494; | |
4357 style->fg[GTK_STATE_NORMAL].blue = 0x0C0C; | |
4358 style->fg[GTK_STATE_ACTIVE] = style->fg[GTK_STATE_NORMAL]; | |
4359 | 4359 } |
4360 else if (gaim_conversation_get_unseen(conv) == GAIM_UNSEEN_NICK) { | |
4577 | 4361 style->fg[GTK_STATE_ACTIVE].red = 0x3131; |
4362 style->fg[GTK_STATE_ACTIVE].green = 0x4E4E; | |
4363 style->fg[GTK_STATE_ACTIVE].blue = 0x6C6C; | |
4578 | 4364 style->fg[GTK_STATE_NORMAL] = style->fg[GTK_STATE_ACTIVE]; |
4359 | 4365 } |
4366 else if (gaim_conversation_get_unseen(conv) == GAIM_UNSEEN_TEXT) { | |
4577 | 4367 style->fg[GTK_STATE_ACTIVE].red = 0xDFDF; |
4368 style->fg[GTK_STATE_ACTIVE].green = 0x4242; | |
4369 style->fg[GTK_STATE_ACTIVE].blue = 0x1E1E; | |
4578 | 4370 style->fg[GTK_STATE_NORMAL] = style->fg[GTK_STATE_ACTIVE]; |
4359 | 4371 } |
4372 | |
4373 gtk_widget_set_style(gtkconv->tab_label, style); | |
4635 | 4374 g_object_unref(G_OBJECT(style)); |
4736 | 4375 |
4812 | 4376 if(conv == gaim_window_get_active_conversation(win)) { |
4736 | 4377 update_typing_icon(conv); |
4378 } | |
4379 | |
4359 | 4380 } |
4381 else if (type == GAIM_CONV_UPDATE_TOPIC) { | |
4382 chat = GAIM_CHAT(conv); | |
4383 gtkchat = gtkconv->u.chat; | |
4384 | |
4385 gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), | |
4386 gaim_chat_get_topic(chat)); | |
4387 } | |
4388 else if (type == GAIM_CONV_ACCOUNT_ONLINE || | |
4389 type == GAIM_CONV_ACCOUNT_OFFLINE) { | |
4390 | |
4360
c435a29370b8
[gaim-migrate @ 4626]
Christian Hammond <chipx86@chipx86.com>
parents:
4359
diff
changeset
|
4391 generate_send_as_items(win, NULL); |
4359 | 4392 } |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
4393 else if(type == GAIM_CONV_UPDATE_ADD || |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
4394 type == GAIM_CONV_UPDATE_REMOVE) { |
4736 | 4395 |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
4396 update_convo_add_button(conv); |
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
4397 } |
4359 | 4398 } |
4399 | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
4400 static struct gaim_conversation_ui_ops conversation_ui_ops = |
4359 | 4401 { |
4402 gaim_gtkconv_destroy, /* destroy_conversation */ | |
4403 gaim_gtkconv_write_chat, /* write_chat */ | |
4404 gaim_gtkconv_write_im, /* write_im */ | |
4405 gaim_gtkconv_write_conv, /* write_conv */ | |
4406 gaim_gtkconv_chat_add_user, /* chat_add_user */ | |
4407 gaim_gtkconv_chat_rename_user, /* chat_rename_user */ | |
4408 gaim_gtkconv_chat_remove_user, /* chat_remove_user */ | |
4409 gaim_gtkconv_set_title, /* set_title */ | |
4410 NULL, /* update_progress */ | |
4411 gaim_gtkconv_updated /* updated */ | |
4412 }; | |
4413 | |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
4414 struct gaim_conversation_ui_ops * |
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
4415 gaim_get_gtk_conversation_ui_ops(void) |
4359 | 4416 { |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
4417 return &conversation_ui_ops; |
4359 | 4418 } |
4419 | |
4420 /************************************************************************** | |
4421 * Public conversation utility functions | |
4422 **************************************************************************/ | |
4423 void | |
4424 gaim_gtkconv_toggle_smileys(void) | |
4425 { | |
4426 GList *cl; | |
4427 struct gaim_conversation *conv; | |
4428 struct gaim_gtk_conversation *gtkconv; | |
4429 | |
4430 for (cl = gaim_get_conversations(); cl != NULL; cl = cl->next) { | |
4431 | |
4432 conv = (struct gaim_conversation *)cl->data; | |
4433 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4434 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4435 continue; |
4436 | |
4437 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4438 | |
4439 gtk_imhtml_show_smileys(GTK_IMHTML(gtkconv->imhtml), | |
4440 (convo_options & OPT_CONVO_SHOW_SMILEY)); | |
4441 } | |
4442 } | |
4443 | |
4444 void | |
4445 gaim_gtkconv_toggle_timestamps(void) | |
4446 { | |
4447 GList *cl; | |
4448 struct gaim_conversation *conv; | |
4449 struct gaim_gtk_conversation *gtkconv; | |
4450 | |
4451 for (cl = gaim_get_conversations(); cl != NULL; cl = cl->next) { | |
4452 | |
4453 conv = (struct gaim_conversation *)cl->data; | |
4454 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4455 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4456 continue; |
4457 | |
4458 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4459 | |
4460 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), | |
4461 (convo_options & OPT_CONVO_SHOW_TIME)); | |
4462 } | |
4463 } | |
4464 | |
4465 void | |
4466 gaim_gtkconv_toggle_spellchk(void) | |
4467 { | |
4468 #ifdef USE_GTKSPELL | |
4469 GList *cl; | |
4470 struct gaim_conversation *conv; | |
4471 struct gaim_gtk_conversation *gtkconv; | |
4472 GtkSpell *spell; | |
4473 | |
4859
a9a831508b43
[gaim-migrate @ 5186]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4851
diff
changeset
|
4474 debug_printf("gaim_gtkconv_toggle_spellchk\n"); |
4359 | 4475 for (cl = gaim_get_conversations(); cl != NULL; cl = cl->next) { |
4476 | |
4477 conv = (struct gaim_conversation *)cl->data; | |
4478 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4479 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4480 continue; |
4481 | |
4482 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4483 | |
4484 if (convo_options & OPT_CONVO_CHECK_SPELLING) | |
4485 gtkspell_new_attach(GTK_TEXT_VIEW(gtkconv->entry), NULL, NULL); | |
4486 else { | |
4487 spell = gtkspell_get_from_text_view(GTK_TEXT_VIEW(gtkconv->entry)); | |
4488 gtkspell_detach(spell); | |
4489 } | |
4490 } | |
4491 #endif | |
4492 } | |
4493 | |
4445 | 4494 void |
4495 gaim_gtkconv_toggle_close_buttons(void) | |
4496 { | |
4497 GList *cl; | |
4498 struct gaim_conversation *conv; | |
4499 struct gaim_gtk_conversation *gtkconv; | |
4500 | |
4501 for (cl = gaim_get_conversations(); cl != NULL; cl = cl->next) { | |
4502 conv = (struct gaim_conversation *)cl->data; | |
4503 if (!GAIM_IS_GTK_CONVERSATION(conv)) | |
4504 continue; | |
4505 | |
4506 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4507 | |
4508 if (convo_options & OPT_CONVO_NO_X_ON_TAB) | |
4509 gtk_widget_hide(gtkconv->close); | |
4510 else | |
4511 gtk_widget_show_all(gtkconv->close); | |
4512 } | |
4513 } | |
4514 | |
4359 | 4515 static void |
4516 remove_icon(struct gaim_gtk_conversation *gtkconv) | |
4517 { | |
4518 if (gtkconv == NULL) | |
4519 return; | |
4520 | |
4521 if (gtkconv->u.im->icon != NULL) | |
4522 gtk_container_remove(GTK_CONTAINER(gtkconv->bbox), | |
4523 gtkconv->u.im->icon->parent->parent); | |
4524 | |
4525 if (gtkconv->u.im->anim != NULL) | |
4793 | 4526 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); |
4359 | 4527 |
4528 if (gtkconv->u.im->icon_timer != 0) | |
4529 g_source_remove(gtkconv->u.im->icon_timer); | |
4530 | |
4531 if (gtkconv->u.im->iter != NULL) | |
4532 g_object_unref(G_OBJECT(gtkconv->u.im->iter)); | |
4533 | |
4534 gtkconv->u.im->icon_timer = 0; | |
4535 gtkconv->u.im->icon = NULL; | |
4536 gtkconv->u.im->anim = NULL; | |
4537 gtkconv->u.im->iter = NULL; | |
4538 } | |
4539 | |
4540 static gboolean | |
4541 redraw_icon(gpointer data) | |
4542 { | |
4543 struct gaim_conversation *conv = (struct gaim_conversation *)data; | |
4544 struct gaim_gtk_conversation *gtkconv; | |
4545 | |
4546 GdkPixbuf *buf; | |
4547 GdkPixbuf *scale; | |
4548 GdkPixmap *pm; | |
4549 GdkBitmap *bm; | |
4550 gint delay; | |
4551 | |
4552 if (!g_list_find(gaim_get_ims(), conv)) { | |
4553 debug_printf("I think this is a bug.\n"); | |
4554 return FALSE; | |
4555 } | |
4556 | |
4557 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4558 | |
4559 gdk_pixbuf_animation_iter_advance(gtkconv->u.im->iter, NULL); | |
4560 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter); | |
4561 | |
4562 scale = gdk_pixbuf_scale_simple(buf, | |
4563 MAX(gdk_pixbuf_get_width(buf) * SCALE(gtkconv->u.im->anim) / | |
4564 gdk_pixbuf_animation_get_width(gtkconv->u.im->anim), 1), | |
4565 MAX(gdk_pixbuf_get_height(buf) * SCALE(gtkconv->u.im->anim) / | |
4566 gdk_pixbuf_animation_get_height(gtkconv->u.im->anim), 1), | |
4567 GDK_INTERP_NEAREST); | |
4568 | |
4569 gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 100); | |
4793 | 4570 g_object_unref(G_OBJECT(scale)); |
4635 | 4571 gtk_image_set_from_pixmap(GTK_IMAGE(gtkconv->u.im->icon), pm, bm); |
4793 | 4572 g_object_unref(G_OBJECT(pm)); |
4359 | 4573 gtk_widget_queue_draw(gtkconv->u.im->icon); |
4574 | |
4575 if (bm) | |
4793 | 4576 g_object_unref(G_OBJECT(bm)); |
4359 | 4577 |
4578 delay = gdk_pixbuf_animation_iter_get_delay_time(gtkconv->u.im->iter) / 10; | |
4579 | |
4580 gtkconv->u.im->icon_timer = g_timeout_add(delay * 10, redraw_icon, conv); | |
4581 | |
4582 return FALSE; | |
4583 } | |
4584 | |
4585 static void | |
4586 start_anim(GtkObject *obj, struct gaim_conversation *conv) | |
4587 { | |
4588 struct gaim_gtk_conversation *gtkconv; | |
4589 int delay; | |
4590 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4591 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4592 return; |
4593 | |
4594 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4595 | |
4596 delay = gdk_pixbuf_animation_iter_get_delay_time(gtkconv->u.im->iter) / 10; | |
4597 | |
4598 if (gtkconv->u.im->anim) | |
4599 gtkconv->u.im->icon_timer = g_timeout_add(delay * 10, redraw_icon, | |
4600 conv); | |
4601 } | |
4602 | |
4603 static void | |
4604 stop_anim(GtkObject *obj, struct gaim_conversation *conv) | |
4605 { | |
4606 struct gaim_gtk_conversation *gtkconv; | |
4607 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4608 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4609 return; |
4610 | |
4611 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4612 | |
4613 if (gtkconv->u.im->icon_timer != 0) | |
4614 g_source_remove(gtkconv->u.im->icon_timer); | |
4615 | |
4616 gtkconv->u.im->icon_timer = 0; | |
4617 } | |
4618 | |
4619 static gboolean | |
4620 icon_menu(GtkObject *obj, GdkEventButton *e, struct gaim_conversation *conv) | |
4621 { | |
4622 struct gaim_gtk_conversation *gtkconv; | |
4623 static GtkWidget *menu = NULL; | |
4624 GtkWidget *button; | |
4625 | |
4626 if (e->button != 3 || e->type != GDK_BUTTON_PRESS) | |
4627 return FALSE; | |
4628 | |
4629 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4630 | |
4631 /* | |
4632 * If a menu already exists, destroy it before creating a new one, | |
4633 * thus freeing-up the memory it occupied. | |
4634 */ | |
4635 if (menu != NULL) | |
4636 gtk_widget_destroy(menu); | |
4637 | |
4638 menu = gtk_menu_new(); | |
4639 | |
4640 if (gtkconv->u.im->icon_timer) { | |
4641 button = gtk_menu_item_new_with_label(_("Disable Animation")); | |
4642 g_signal_connect(GTK_OBJECT(button), "activate", | |
4643 G_CALLBACK(stop_anim), conv); | |
4644 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); | |
4645 gtk_widget_show(button); | |
4646 } | |
4647 else if (gtkconv->u.im->anim && | |
4648 !(gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim))) | |
4649 { | |
4650 button = gtk_menu_item_new_with_label(_("Enable Animation")); | |
4651 g_signal_connect(GTK_OBJECT(button), "activate", | |
4652 G_CALLBACK(start_anim), conv); | |
4653 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); | |
4654 gtk_widget_show(button); | |
4655 } | |
4656 | |
4657 button = gtk_menu_item_new_with_label(_("Hide Icon")); | |
4658 g_signal_connect_swapped(GTK_OBJECT(button), "activate", | |
4515
9b9737a00a96
[gaim-migrate @ 4793]
Christian Hammond <chipx86@chipx86.com>
parents:
4513
diff
changeset
|
4659 G_CALLBACK(remove_icon), gtkconv); |
4359 | 4660 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); |
4661 gtk_widget_show(button); | |
4662 | |
4663 button = gtk_menu_item_new_with_label(_("Save Icon As...")); | |
4664 g_signal_connect(GTK_OBJECT(button), "activate", | |
4665 G_CALLBACK(gaim_gtk_save_icon_dialog), conv); | |
4666 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); | |
4667 gtk_widget_show(button); | |
4668 | |
4669 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); | |
4670 | |
4671 return TRUE; | |
4672 } | |
4673 | |
4674 void | |
4675 gaim_gtkconv_update_buddy_icon(struct gaim_conversation *conv) | |
4676 { | |
4677 struct gaim_gtk_conversation *gtkconv; | |
4678 | |
4679 char filename[256]; | |
4680 FILE *file; | |
4681 GError *err = NULL; | |
4682 | |
4757 | 4683 struct buddy *buddy; |
4684 | |
4359 | 4685 void *data; |
4686 int len, delay; | |
4687 | |
4688 GdkPixbuf *buf; | |
4689 | |
4690 GtkWidget *event; | |
4691 GtkWidget *frame; | |
4692 GdkPixbuf *scale; | |
4693 GdkPixmap *pm; | |
4694 GdkBitmap *bm; | |
4695 int sf = 0; | |
4696 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4697 if (conv == NULL || !GAIM_IS_GTK_CONVERSATION(conv) || |
4359 | 4698 gaim_conversation_get_type(conv) != GAIM_CONV_IM) { |
4699 | |
4700 return; | |
4701 } | |
4702 | |
4703 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4704 | |
4705 remove_icon(gtkconv); | |
4706 | |
4707 if (im_options & OPT_IM_HIDE_ICONS) | |
4708 return; | |
4709 | |
4710 if (gaim_conversation_get_gc(conv) == NULL) | |
4711 return; | |
4712 | |
4793 | 4713 if(gtkconv->u.im->anim) |
4714 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); | |
4715 | |
4757 | 4716 if((buddy = gaim_find_buddy(gaim_conversation_get_account(conv), |
4717 gaim_conversation_get_name(conv))) != NULL) { | |
4718 char *file = gaim_buddy_get_setting(buddy, "buddy_icon"); | |
4719 if(file) { | |
4720 gtkconv->u.im->anim = gdk_pixbuf_animation_new_from_file(file, &err); | |
4721 g_free(file); | |
4722 } | |
4723 } else { | |
4724 data = get_icon_data(gaim_conversation_get_gc(conv), | |
4725 normalize(gaim_conversation_get_name(conv)), | |
4726 &len); | |
4727 | |
4728 if (!data) | |
4729 return; | |
4730 | |
4731 /* this is such an evil hack, i don't know why i'm even considering it. | |
4732 * we'll do it differently when gdk-pixbuf-loader isn't leaky anymore. */ | |
4733 g_snprintf(filename, sizeof(filename), | |
4734 "%s" G_DIR_SEPARATOR_S "gaimicon-%s.%d", | |
4735 g_get_tmp_dir(), gaim_conversation_get_name(conv), getpid()); | |
4736 | |
4737 if (!(file = fopen(filename, "wb"))) | |
4738 return; | |
4739 | |
4740 fwrite(data, 1, len, file); | |
4741 fclose(file); | |
4742 | |
4743 gtkconv->u.im->anim = gdk_pixbuf_animation_new_from_file(filename, &err); | |
4744 /* make sure we remove the file as soon as possible */ | |
4745 unlink(filename); | |
4746 } | |
4359 | 4747 |
4748 if (err) { | |
4749 debug_printf("Buddy icon error: %s\n", err->message); | |
4750 g_error_free(err); | |
4751 } | |
4752 | |
4753 | |
4754 if (!gtkconv->u.im->anim) | |
4755 return; | |
4756 | |
4793 | 4757 if(gtkconv->u.im->iter) |
4758 g_object_unref(G_OBJECT(gtkconv->u.im->iter)); | |
4759 | |
4359 | 4760 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) { |
4761 gtkconv->u.im->iter = NULL; | |
4762 delay = 0; | |
4763 buf = gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); | |
4764 } else { | |
4765 gtkconv->u.im->iter = | |
4766 gdk_pixbuf_animation_get_iter(gtkconv->u.im->anim, NULL); | |
4767 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter); | |
4768 delay = gdk_pixbuf_animation_iter_get_delay_time(gtkconv->u.im->iter); | |
4769 delay = delay / 10; | |
4770 } | |
4771 | |
4772 sf = SCALE(gtkconv->u.im->anim); | |
4773 scale = gdk_pixbuf_scale_simple(buf, | |
4774 MAX(gdk_pixbuf_get_width(buf) * sf / | |
4775 gdk_pixbuf_animation_get_width(gtkconv->u.im->anim), 1), | |
4776 MAX(gdk_pixbuf_get_height(buf) * sf / | |
4777 gdk_pixbuf_animation_get_height(gtkconv->u.im->anim), 1), | |
4778 GDK_INTERP_NEAREST); | |
4779 | |
4780 if (delay) | |
4781 gtkconv->u.im->icon_timer = g_timeout_add(delay * 10, redraw_icon, | |
4782 conv); | |
4783 | |
4784 gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 100); | |
4793 | 4785 g_object_unref(G_OBJECT(scale)); |
4359 | 4786 |
4787 frame = gtk_frame_new(NULL); | |
4788 gtk_frame_set_shadow_type(GTK_FRAME(frame), | |
4789 (bm ? GTK_SHADOW_NONE : GTK_SHADOW_IN)); | |
4790 gtk_box_pack_start(GTK_BOX(gtkconv->bbox), frame, FALSE, FALSE, 5); | |
4791 gtk_box_reorder_child(GTK_BOX(gtkconv->bbox), frame, 0); | |
4792 gtk_widget_show(frame); | |
4793 | |
4794 event = gtk_event_box_new(); | |
4795 gtk_container_add(GTK_CONTAINER(frame), event); | |
4796 g_signal_connect(GTK_OBJECT(event), "button-press-event", | |
4797 G_CALLBACK(icon_menu), conv); | |
4798 gtk_widget_show(event); | |
4799 | |
4635 | 4800 gtkconv->u.im->icon = gtk_image_new_from_pixmap(pm, bm); |
4359 | 4801 gtk_widget_set_size_request(gtkconv->u.im->icon, sf, sf); |
4802 gtk_container_add(GTK_CONTAINER(event), gtkconv->u.im->icon); | |
4803 gtk_widget_show(gtkconv->u.im->icon); | |
4804 | |
4805 if(im_options & OPT_IM_NO_ANIMATION) | |
4806 stop_anim(NULL, conv); | |
4807 | |
4793 | 4808 g_object_unref(G_OBJECT(pm)); |
4359 | 4809 |
4810 if (bm) | |
4793 | 4811 g_object_unref(G_OBJECT(bm)); |
4359 | 4812 } |
4813 | |
4814 void | |
4815 gaim_gtkconv_hide_buddy_icons(void) | |
4816 { | |
4817 gaim_conversation_foreach(gaim_gtkconv_update_buddy_icon); | |
4818 } | |
4819 | |
4820 void | |
4821 gaim_gtkconv_set_anim(void) | |
4822 { | |
4823 GList *l; | |
4824 | |
4825 if (im_options & OPT_IM_HIDE_ICONS) | |
4826 return; | |
4827 | |
4828 if (im_options & OPT_IM_NO_ANIMATION) { | |
4829 for (l = gaim_get_ims(); l != NULL; l = l->next) | |
4830 stop_anim(NULL, (struct gaim_conversation *)l->data); | |
4831 } else { | |
4832 for (l = gaim_get_ims(); l != NULL; l = l->next) | |
4833 start_anim(NULL, (struct gaim_conversation *)l->data); | |
4834 } | |
4835 } | |
4836 | |
4837 void | |
4838 gaim_gtkconv_update_font_buttons(void) | |
4839 { | |
4840 GList *l; | |
4841 struct gaim_conversation *conv; | |
4842 struct gaim_gtk_conversation *gtkconv; | |
4843 | |
4844 for (l = gaim_get_ims(); l != NULL; l = l->next) { | |
4845 conv = (struct gaim_conversation *)l->data; | |
4846 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4847 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4848 continue; |
4849 | |
4850 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4851 | |
4852 if (gtkconv->toolbar.bold != NULL) | |
4853 gtk_widget_set_sensitive(gtkconv->toolbar.bold, | |
4854 (!(font_options & OPT_FONT_BOLD))); | |
4855 | |
4856 if (gtkconv->toolbar.italic != NULL) | |
4857 gtk_widget_set_sensitive(gtkconv->toolbar.italic, | |
4858 (!(font_options & OPT_FONT_ITALIC))); | |
4859 | |
4860 if (gtkconv->toolbar.underline != NULL) | |
4861 gtk_widget_set_sensitive(gtkconv->toolbar.underline, | |
4862 (!(font_options & OPT_FONT_UNDERLINE))); | |
4863 } | |
4864 } | |
4865 | |
4866 void | |
4421 | 4867 gaim_gtkconv_update_font_colors(struct gaim_conversation *conv) |
4868 { | |
4438
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4869 struct gaim_gtk_conversation *gtkconv; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4870 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4871 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4872 return; |
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 gtkconv = GAIM_GTK_CONVERSATION(conv); |
4421 | 4875 |
4438
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4876 gtkconv->fg_color.red = fgcolor.red; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4877 gtkconv->fg_color.blue = fgcolor.blue; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4878 gtkconv->fg_color.green = fgcolor.green; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4879 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4880 gtkconv->bg_color.red = bgcolor.red; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4881 gtkconv->bg_color.blue = bgcolor.blue; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4882 gtkconv->bg_color.green = bgcolor.green; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4883 } |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4884 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4885 void |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4886 gaim_gtkconv_update_font_face(struct gaim_conversation *conv) |
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 struct gaim_gtk_conversation *gtkconv; |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4889 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4890 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4891 return; |
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 gtkconv = GAIM_GTK_CONVERSATION(conv); |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4894 |
2054d8429925
[gaim-migrate @ 4713]
Christian Hammond <chipx86@chipx86.com>
parents:
4421
diff
changeset
|
4895 strncpy(gtkconv->fontface, fontface, 128); |
4421 | 4896 } |
4897 | |
4898 void | |
4359 | 4899 gaim_gtkconv_update_tabs(void) |
4900 { | |
4901 GList *l; | |
4902 GtkPositionType pos; | |
4903 struct gaim_window *win; | |
4904 struct gaim_gtk_window *gtkwin; | |
4905 | |
4906 pos = ((im_options & OPT_IM_SIDE_TAB) | |
4907 ? ((im_options & OPT_IM_BR_TAB) ? GTK_POS_RIGHT : GTK_POS_LEFT) | |
4908 : ((im_options & OPT_IM_BR_TAB) ? GTK_POS_BOTTOM : GTK_POS_TOP)); | |
4909 | |
4910 for (l = gaim_get_windows(); l != NULL; l = l->next) { | |
4911 win = (struct gaim_window *)l->data; | |
4912 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4913 if (!GAIM_IS_GTK_WINDOW(win)) |
4359 | 4914 continue; |
4915 | |
4916 gtkwin = GAIM_GTK_WINDOW(win); | |
4917 | |
4918 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(gtkwin->notebook), pos); | |
4919 } | |
4920 } | |
4921 | |
4922 void | |
4923 gaim_gtkconv_update_chat_button_style() | |
4924 { | |
4925 GSList *l; | |
4926 struct gaim_connection *g; | |
4927 GtkWidget *parent; | |
4928 GaimConversationType type = GAIM_CONV_CHAT; | |
4929 | |
4930 for (l = connections; l != NULL; l = l->next) { | |
4931 GSList *bcs; | |
4932 struct gaim_conversation *conv; | |
4933 struct gaim_gtk_conversation *gtkconv; | |
4934 struct gaim_gtk_window *gtkwin; | |
4935 | |
4936 g = (struct gaim_connection *)l->data; | |
4937 | |
4938 for (bcs = g->buddy_chats; bcs != NULL; bcs = bcs->next) { | |
4939 conv = (struct gaim_conversation *)bcs->data; | |
4940 | |
4941 if (gaim_conversation_get_type(conv) != GAIM_CONV_CHAT) | |
4942 continue; | |
4943 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
4944 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 4945 continue; |
4946 | |
4947 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4948 gtkwin = GAIM_GTK_WINDOW(gaim_conversation_get_window(conv)); | |
4949 parent = gtk_widget_get_parent(gtkconv->send); | |
4950 | |
4951 gtkconv->send = | |
4952 gaim_gtk_change_text(_("Send"), | |
4953 gtkconv->send, GAIM_STOCK_SEND, type); | |
4954 gtkconv->u.chat->invite = | |
4955 gaim_gtk_change_text(_("Invite"), | |
4956 gtkconv->u.chat->invite, | |
4957 GAIM_STOCK_INVITE, type); | |
4958 | |
4959 gtk_box_pack_end(GTK_BOX(parent), gtkconv->send, FALSE, FALSE, | |
4960 type); | |
4961 gtk_box_pack_end(GTK_BOX(parent), gtkconv->u.chat->invite, | |
4962 FALSE, FALSE, 0); | |
4963 | |
4964 g_signal_connect(G_OBJECT(gtkconv->send), "clicked", | |
4965 G_CALLBACK(send_cb), conv); | |
4966 g_signal_connect(G_OBJECT(gtkconv->u.chat->invite), "clicked", | |
4967 G_CALLBACK(invite_cb), conv); | |
4968 | |
4969 gtk_button_set_relief(GTK_BUTTON(gtkconv->send), | |
4970 GTK_RELIEF_NONE); | |
4971 gtk_button_set_relief(GTK_BUTTON(gtkconv->u.chat->invite), | |
4972 GTK_RELIEF_NONE); | |
4973 | |
4974 gaim_gtkconv_update_buttons_by_protocol(conv); | |
4975 } | |
4976 } | |
4977 } | |
4978 | |
4979 void | |
4980 gaim_gtkconv_update_im_button_style() | |
4981 { | |
4982 GList *l; | |
4983 struct gaim_conversation *conv; | |
4984 struct gaim_gtk_conversation *gtkconv; | |
4985 | |
4986 for (l = gaim_get_ims(); l != NULL; l = l->next) { | |
4987 conv = (struct gaim_conversation *)l->data; | |
4988 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4989 | |
4990 setup_im_buttons(conv, gtk_widget_get_parent(gtkconv->send)); | |
4991 } | |
4992 } | |
4993 | |
4994 void | |
4995 gaim_gtkconv_update_buttons_by_protocol(struct gaim_conversation *conv) | |
4996 { | |
4997 struct gaim_window *win; | |
4998 struct gaim_gtk_window *gtkwin = NULL; | |
4999 struct gaim_gtk_conversation *gtkconv; | |
5000 struct gaim_connection *gc; | |
5001 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
5002 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 5003 return; |
5004 | |
5005 gc = gaim_conversation_get_gc(conv); | |
5006 win = gaim_conversation_get_window(conv); | |
5007 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
5008 | |
5009 if (win != NULL) | |
5010 gtkwin = GAIM_GTK_WINDOW(win); | |
5011 | |
5012 if (gc == NULL) { | |
5013 gtk_widget_set_sensitive(gtkconv->send, FALSE); | |
5014 | |
4365
6e96ced6fb78
[gaim-migrate @ 4631]
Christian Hammond <chipx86@chipx86.com>
parents:
4364
diff
changeset
|
5015 if (win != NULL && gaim_window_get_active_conversation(win) == conv) { |
4359 | 5016 gtk_widget_set_sensitive(gtkwin->menu.insert_link, FALSE); |
5017 } | |
5018 } | |
4364
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
5019 else { |
4674 | 5020 gtk_widget_set_sensitive(gtkconv->send, TRUE); |
4365
6e96ced6fb78
[gaim-migrate @ 4631]
Christian Hammond <chipx86@chipx86.com>
parents:
4364
diff
changeset
|
5021 if (win != NULL) { |
6e96ced6fb78
[gaim-migrate @ 4631]
Christian Hammond <chipx86@chipx86.com>
parents:
4364
diff
changeset
|
5022 gtk_widget_set_sensitive(gtkwin->menu.insert_link, TRUE); |
6e96ced6fb78
[gaim-migrate @ 4631]
Christian Hammond <chipx86@chipx86.com>
parents:
4364
diff
changeset
|
5023 } |
4364
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
5024 } |
4359 | 5025 |
5026 if (gaim_conversation_get_type(conv) == GAIM_CONV_IM) { | |
5027 if (gc == NULL) { | |
5028 gtk_widget_set_sensitive(gtkconv->info, FALSE); | |
5029 gtk_widget_set_sensitive(gtkconv->u.im->warn, FALSE); | |
5030 gtk_widget_set_sensitive(gtkconv->u.im->block, FALSE); | |
5031 gtk_widget_set_sensitive(gtkconv->u.im->add, FALSE); | |
5032 | |
5033 if (win != NULL && | |
5034 gaim_window_get_active_conversation(win) == conv) { | |
5035 | |
5036 gtk_widget_set_sensitive(gtkwin->menu.insert_image, FALSE); | |
5037 } | |
5038 | |
5039 return; | |
5040 } | |
5041 | |
5042 gtk_widget_set_sensitive(gtkconv->info, | |
5043 (gc->prpl->get_info != NULL)); | |
5044 | |
5045 gtk_widget_set_sensitive(gtkconv->toolbar.image, | |
5046 (gc->prpl->options & OPT_PROTO_IM_IMAGE)); | |
5047 | |
5048 if (win != NULL && gaim_window_get_active_conversation(win) == conv) { | |
5049 gtk_widget_set_sensitive(gtkwin->menu.insert_image, | |
5050 (gc->prpl->options & OPT_PROTO_IM_IMAGE)); | |
5051 } | |
5052 | |
5053 gtk_widget_set_sensitive(gtkconv->u.im->warn, | |
5054 (gc->prpl->warn != NULL)); | |
5055 | |
5056 gtk_widget_set_sensitive(gtkconv->u.im->block, | |
5057 (gc->prpl->add_permit != NULL)); | |
5058 | |
5059 update_convo_add_button(conv); | |
5060 } | |
5061 else if (gaim_conversation_get_type(conv) == GAIM_CONV_CHAT) { | |
5062 if (gc == NULL) { | |
5063 gtk_widget_set_sensitive(gtkconv->u.chat->whisper, FALSE); | |
5064 gtk_widget_set_sensitive(gtkconv->u.chat->invite, FALSE); | |
5065 | |
5066 return; | |
5067 } | |
5068 | |
5069 gtk_widget_set_sensitive(gtkconv->send, (gc->prpl->chat_send != NULL)); | |
5070 | |
5071 gtk_widget_set_sensitive(gtkconv->toolbar.image, FALSE); | |
5072 /* gtk_widget_set_sensitive(gtkwin->menu.insert_image, FALSE); */ | |
5073 | |
5074 gtk_widget_set_sensitive(gtkconv->u.chat->whisper, | |
5075 (gc->prpl->chat_whisper != NULL)); | |
5076 | |
5077 gtk_widget_set_sensitive(gtkconv->u.chat->invite, | |
5078 (gc->prpl->chat_invite != NULL)); | |
5079 } | |
5080 } | |
5081 | |
5082 struct gaim_window * | |
5083 gaim_gtkwin_get_at_xy(int x, int y) | |
5084 { | |
5085 struct gaim_window *win = NULL; | |
5086 struct gaim_gtk_window *gtkwin; | |
5087 GdkWindow *gdkwin; | |
5088 GList *l; | |
5089 | |
5090 gdkwin = gdk_window_at_pointer(&x, &y); | |
5091 | |
5092 if (gdkwin) | |
5093 gdkwin = gdk_window_get_toplevel(gdkwin); | |
5094 | |
5095 for (l = gaim_get_windows(); l != NULL; l = l->next) { | |
5096 win = (struct gaim_window *)l->data; | |
5097 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
5098 if (!GAIM_IS_GTK_WINDOW(win)) |
4359 | 5099 continue; |
5100 | |
5101 gtkwin = GAIM_GTK_WINDOW(win); | |
5102 | |
5103 if (gdkwin == gtkwin->window->window) | |
5104 return win; | |
5105 } | |
5106 | |
5107 return NULL; | |
5108 } | |
5109 | |
5110 int | |
5111 gaim_gtkconv_get_tab_at_xy(struct gaim_window *win, int x, int y) | |
5112 { | |
5113 struct gaim_gtk_window *gtkwin; | |
5114 GList *l; | |
5115 gint nb_x, nb_y, x_rel, y_rel; | |
5116 GtkNotebook *notebook; | |
5117 GtkWidget *tab; | |
5118 gint i, page_num = 0; | |
5119 gboolean first_visible = TRUE; | |
5120 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
5121 if (!GAIM_IS_GTK_WINDOW(win)) |
4359 | 5122 return -1; |
5123 | |
5124 gtkwin = GAIM_GTK_WINDOW(win); | |
5125 notebook = GTK_NOTEBOOK(gtkwin->notebook); | |
5126 | |
5127 gdk_window_get_origin(gtkwin->notebook->window, &nb_x, &nb_y); | |
5128 x_rel = x - nb_x; | |
5129 y_rel = y - nb_y; | |
5130 | |
5131 for (l = gaim_window_get_conversations(win), i = 0; | |
5132 l != NULL; | |
5133 l = l->next, i++) { | |
5134 | |
5135 struct gaim_conversation *conv = l->data; | |
5136 tab = GAIM_GTK_CONVERSATION(conv)->tab_label; | |
5137 | |
5138 if (!GTK_WIDGET_MAPPED(tab)) | |
5139 continue; | |
5140 | |
5141 if (first_visible) { | |
5142 first_visible = FALSE; | |
5143 | |
5144 if (x_rel < tab->allocation.x) x_rel = tab->allocation.x; | |
5145 if (y_rel < tab->allocation.y) y_rel = tab->allocation.y; | |
5146 } | |
5147 | |
5148 if (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP || | |
5149 gtk_notebook_get_tab_pos(notebook) == GTK_POS_BOTTOM) { | |
5150 | |
5151 if (tab->allocation.x <= x_rel) { | |
5152 if (tab->allocation.x + tab->allocation.width <= x_rel) | |
5153 page_num = i + 1; | |
5154 else | |
5155 page_num = i; | |
5156 } | |
5157 else | |
5158 break; | |
5159 } | |
5160 else { | |
5161 if (tab->allocation.y <= y_rel) { | |
5162 if (tab->allocation.y + tab->allocation.height <= y_rel) | |
5163 page_num = i + 1; | |
5164 else | |
5165 page_num = i; | |
5166 } | |
5167 else | |
5168 break; | |
5169 } | |
5170 } | |
5171 | |
5172 if (i == gaim_window_get_conversation_count(win) + 1) | |
5173 return -1; | |
5174 | |
5175 return page_num; | |
5176 } | |
5177 | |
5178 int | |
5179 gaim_gtkconv_get_dest_tab_at_xy(struct gaim_window *win, int x, int y) | |
5180 { | |
5181 struct gaim_gtk_window *gtkwin; | |
5182 GList *l; | |
5183 gint nb_x, nb_y, x_rel, y_rel; | |
5184 GtkNotebook *notebook; | |
5185 GtkWidget *tab; | |
5186 gint i, page_num = 0; | |
5187 | |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
5188 if (!GAIM_IS_GTK_WINDOW(win)) |
4359 | 5189 return -1; |
5190 | |
5191 gtkwin = GAIM_GTK_WINDOW(win); | |
5192 notebook = GTK_NOTEBOOK(gtkwin->notebook); | |
5193 | |
5194 gdk_window_get_origin(gtkwin->notebook->window, &nb_x, &nb_y); | |
5195 x_rel = x - nb_x; | |
5196 y_rel = y - nb_y; | |
5197 | |
5198 for (l = gaim_window_get_conversations(win), i = 0; | |
5199 l != NULL; | |
5200 l = l->next, i++) { | |
5201 | |
5202 struct gaim_conversation *conv = l->data; | |
5203 tab = GAIM_GTK_CONVERSATION(conv)->tab_label; | |
5204 | |
5205 if (!GTK_WIDGET_MAPPED(tab)) | |
5206 continue; | |
5207 | |
5208 if (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP || | |
5209 gtk_notebook_get_tab_pos(notebook) == GTK_POS_BOTTOM) { | |
5210 | |
5211 if (tab->allocation.x <= x_rel) { | |
5212 if (tab->allocation.x + (tab->allocation.width / 2) <= x_rel) | |
5213 page_num = i + 1; | |
5214 else | |
5215 page_num = i; | |
5216 } | |
5217 else | |
5218 break; | |
5219 } | |
5220 else { | |
5221 if (tab->allocation.y <= y_rel) { | |
5222 if (tab->allocation.y + (tab->allocation.height / 2) <= y_rel) | |
5223 page_num = i + 1; | |
5224 else | |
5225 page_num = i; | |
5226 } | |
5227 else | |
5228 break; | |
5229 } | |
5230 } | |
5231 | |
5232 if (i == gaim_window_get_conversation_count(win) + 1) | |
5233 return -1; | |
5234 | |
5235 return page_num; | |
5236 } |