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