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