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