Mercurial > pidgin
annotate src/gtkconv.c @ 11849:dc51cdcb648e
[gaim-migrate @ 14140]
sf patch #1339135, from Sadrul Habib Chowdhury
Hi. Bleeter found this bug:
(1) open up some conversation window
(2) open the smiley dialog
(3) close the conversation window. the smiley dialog
remains open
(4) select some smiley
(5) Gaim crashes
This patch fixes this crash. It shouldn't cause any
probs with regards to gtk-version-checking. The other
code handling the smiley-dialog doesn't do the
version-checking, so this shouldn't be necessary either.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 27 Oct 2005 12:00:17 +0000 |
parents | 908ff9b56e99 |
children | 3bfb2cffcef2 |
rev | line source |
---|---|
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
1 /** |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10274
diff
changeset
|
2 * @file gtkconv.c GTK+ Conversation API |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
3 * @ingroup gtkui |
4359 | 4 * |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10274
diff
changeset
|
5 * gaim |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10274
diff
changeset
|
6 * |
8046 | 7 * Gaim is the legal property of its developers, whose names are too numerous |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
6725
e62a504c83d0
[gaim-migrate @ 7252]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
10 * |
4359 | 11 * This program is free software; you can redistribute it and/or modify |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 * | |
25 */ | |
9791 | 26 #include "internal.h" |
27 #include "gtkgaim.h" | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
28 |
4359 | 29 #ifndef _WIN32 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
30 # include <X11/Xlib.h> |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
31 #endif |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
32 |
4359 | 33 #ifdef USE_GTKSPELL |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
34 # include <gtkspell/gtkspell.h> |
7538
357eb1c39b72
[gaim-migrate @ 8151]
Christian Hammond <chipx86@chipx86.com>
parents:
7476
diff
changeset
|
35 # ifdef _WIN32 |
357eb1c39b72
[gaim-migrate @ 8151]
Christian Hammond <chipx86@chipx86.com>
parents:
7476
diff
changeset
|
36 # include "wspell.h" |
357eb1c39b72
[gaim-migrate @ 8151]
Christian Hammond <chipx86@chipx86.com>
parents:
7476
diff
changeset
|
37 # endif |
4359 | 38 #endif |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
39 |
4359 | 40 #include <gdk/gdkkeysyms.h> |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
41 |
9699 | 42 #include "account.h" |
9130 | 43 #include "cmds.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
44 #include "debug.h" |
6982 | 45 #include "imgstore.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
46 #include "log.h" |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5402
diff
changeset
|
47 #include "notify.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
48 #include "prpl.h" |
6038 | 49 #include "request.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
50 #include "util.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
51 |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10274
diff
changeset
|
52 #include "gtkdnd-hints.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
53 #include "gtkblist.h" |
5717 | 54 #include "gtkconv.h" |
11583 | 55 #include "gtkconvwin.h" |
9709 | 56 #include "gtkdialogs.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
57 #include "gtkimhtml.h" |
8317 | 58 #include "gtkimhtmltoolbar.h" |
7431 | 59 #include "gtklog.h" |
11554
f8443218b7fe
[gaim-migrate @ 13814]
Gary Kramlich <grim@reaperworld.com>
parents:
11552
diff
changeset
|
60 #include "gtkmenutray.h" |
5907
18486c860a46
[gaim-migrate @ 6339]
Christian Hammond <chipx86@chipx86.com>
parents:
5902
diff
changeset
|
61 #include "gtkpounce.h" |
11206
86d3ce670f05
[gaim-migrate @ 13334]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11145
diff
changeset
|
62 #include "gtkprefs.h" |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6291
diff
changeset
|
63 #include "gtkprivacy.h" |
11525 | 64 #include "gtkthemes.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
65 #include "gtkutils.h" |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10274
diff
changeset
|
66 #include "gtkstock.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
67 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
68 #define AUTO_RESPONSE "<AUTO-REPLY> : " |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
69 |
11731 | 70 #define SEND_COLOR "#001f41" |
71 #define RECV_COLOR "#a63802" | |
7854 | 72 |
10108 | 73 #define LUMINANCE(c) (float)((0.3*(c.red))+(0.59*(c.green))+(0.11*(c.blue))) |
74 | |
75 /* These colors come from the default GNOME palette */ | |
76 static GdkColor nick_colors[] = { | |
10117
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
77 {0, 47616, 46336, 43776}, /* Basic 3D Medium */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
78 {0, 32768, 32000, 29696}, /* Basic 3D Dark */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
79 {0, 22016, 20992, 18432}, /* 3D Shadow */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
80 {0, 33536, 42496, 32512}, /* Green Medium */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
81 {0, 23808, 29952, 21760}, /* Green Dark */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
82 {0, 17408, 22016, 12800}, /* Green Shadow */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
83 {0, 57344, 46592, 44800}, /* Red Hilight */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
84 {0, 49408, 26112, 23040}, /* Red Medium */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
85 {0, 34816, 17920, 12544}, /* Red Dark */ |
10812
d087e928ffd1
[gaim-migrate @ 12465]
Luke Schierer <lschiere@pidgin.im>
parents:
10810
diff
changeset
|
86 {0, 49408, 14336, 8704}, /* Red Shadow */ |
10117
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
87 {0, 34816, 32512, 41728}, /* Purple Medium */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
88 {0, 25088, 23296, 33024}, /* Purple Dark */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
89 {0, 18688, 16384, 26112}, /* Purple Shadow */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
90 {0, 40192, 47104, 53760}, /* Blue Hilight */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
91 {0, 29952, 36864, 44544}, /* Blue Medium */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
92 {0, 57344, 49920, 40448}, /* Face Skin Medium */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
93 {0, 45824, 37120, 26880}, /* Face skin Dark */ |
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
94 {0, 33280, 26112, 18176}, /* Face Skin Shadow */ |
10812
d087e928ffd1
[gaim-migrate @ 12465]
Luke Schierer <lschiere@pidgin.im>
parents:
10810
diff
changeset
|
95 {0, 57088, 16896, 7680}, /* Accent Red */ |
d087e928ffd1
[gaim-migrate @ 12465]
Luke Schierer <lschiere@pidgin.im>
parents:
10810
diff
changeset
|
96 {0, 39168, 0, 0}, /* Accent Red Dark */ |
10117
d520ab74fe8f
[gaim-migrate @ 11154]
Luke Schierer <lschiere@pidgin.im>
parents:
10116
diff
changeset
|
97 {0, 17920, 40960, 17920}, /* Accent Green */ |
10812
d087e928ffd1
[gaim-migrate @ 12465]
Luke Schierer <lschiere@pidgin.im>
parents:
10810
diff
changeset
|
98 {0, 9728, 50944, 9728} /* Accent Green Dark */ |
4359 | 99 }; |
6291 | 100 |
4359 | 101 #define NUM_NICK_COLORS (sizeof(nick_colors) / sizeof(*nick_colors)) |
102 | |
11581 | 103 typedef struct { |
4359 | 104 GtkWidget *window; |
105 | |
106 GtkWidget *entry; | |
107 GtkWidget *message; | |
108 | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
109 GaimConversation *conv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
110 |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
111 } InviteBuddyInfo; |
4359 | 112 |
113 static GtkWidget *invite_dialog = NULL; | |
11206
86d3ce670f05
[gaim-migrate @ 13334]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11145
diff
changeset
|
114 static GtkWidget *warn_close_dialog = NULL; |
4359 | 115 |
11594 | 116 static gboolean update_send_to_selection(GaimGtkWindow *win); |
117 static void generate_send_to_items(GaimGtkWindow *win); | |
11581 | 118 |
4359 | 119 /* Prototypes. <-- because Paco-Paco hates this comment. */ |
10810 | 120 static void got_typing_keypress(GaimGtkConversation *gtkconv, gboolean first); |
11604 | 121 static void gray_stuff_out(GaimGtkConversation *gtkconv); |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
122 static GList *generate_invite_user_names(GaimConnection *gc); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
123 static void add_chat_buddy_common(GaimConversation *conv, const char *name, |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
124 const char *alias, const char *old_name); |
9605 | 125 static gboolean tab_complete(GaimConversation *conv); |
11604 | 126 static void gaim_gtkconv_updated(GaimConversation *conv, GaimConvUpdateType type); |
11613 | 127 static void gtkconv_set_unseen(GaimGtkConversation *gtkconv, GaimUnseenState state); |
10810 | 128 static void update_typing_icon(GaimGtkConversation *gtkconv); |
4602
4128761bacb8
[gaim-migrate @ 4889]
Christian Hammond <chipx86@chipx86.com>
parents:
4598
diff
changeset
|
129 static char *item_factory_translate_func (const char *path, gpointer func_data); |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
130 gboolean gaim_gtkconv_has_focus(GaimConversation *conv); |
4359 | 131 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
132 static GdkColor *get_nick_color(GaimGtkConversation *gtkconv, const char *name) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
133 static GdkColor col; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
134 GtkStyle *style = gtk_widget_get_style(gtkconv->imhtml); |
11480
e9251afae7b8
[gaim-migrate @ 13722]
Richard Laager <rlaager@wiktel.com>
parents:
11479
diff
changeset
|
135 float scale; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
136 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
137 col = nick_colors[g_str_hash(name) % NUM_NICK_COLORS]; |
11480
e9251afae7b8
[gaim-migrate @ 13722]
Richard Laager <rlaager@wiktel.com>
parents:
11479
diff
changeset
|
138 scale = ((1-(LUMINANCE(style->base[GTK_STATE_NORMAL]) / LUMINANCE(style->white))) * |
e9251afae7b8
[gaim-migrate @ 13722]
Richard Laager <rlaager@wiktel.com>
parents:
11479
diff
changeset
|
139 (LUMINANCE(style->white)/MAX(MAX(col.red, col.blue), col.green))); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
140 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
141 /* The colors are chosen to look fine on white; we should never have to darken */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
142 if (scale > 1) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
143 col.red *= scale; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
144 col.green *= scale; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
145 col.blue *= scale; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
146 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
147 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
148 return &col; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
149 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
150 |
4359 | 151 /************************************************************************** |
152 * Callbacks | |
153 **************************************************************************/ | |
10971 | 154 |
4359 | 155 static gint |
10810 | 156 close_conv_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
4359 | 157 { |
10810 | 158 GList *list = g_list_copy(gtkconv->convs), *l; |
11508 | 159 |
10810 | 160 l = list; |
161 while (l) { | |
162 GaimConversation *conv = l->data; | |
163 gaim_conversation_destroy(conv); | |
164 l = l->next; | |
165 } | |
11508 | 166 |
10810 | 167 g_list_free(list); |
11508 | 168 |
4361
25d5b2a7545f
[gaim-migrate @ 4627]
Christian Hammond <chipx86@chipx86.com>
parents:
4360
diff
changeset
|
169 return TRUE; |
4359 | 170 } |
171 | |
8914 | 172 static gboolean |
10810 | 173 size_allocate_cb(GtkWidget *w, GtkAllocation *allocation, GaimGtkConversation *gtkconv) |
8914 | 174 { |
10810 | 175 GaimConversation *conv = gtkconv->active_conv; |
11508 | 176 |
8914 | 177 if (!GTK_WIDGET_VISIBLE(w)) |
178 return FALSE; | |
179 | |
180 if (!GAIM_IS_GTK_CONVERSATION(conv)) | |
181 return FALSE; | |
182 | |
11620
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
183 /* I find that I resize the window when it has a bunch of conversations in it, mostly so that the |
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
184 * tab bar will fit, but then I don't want new windows taking up the entire screen. I check to see |
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
185 * if there is only one conversation in the window. This way we'll be setting new windows to the |
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
186 * size of the last resized new window. */ |
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
187 /* I think that the above justification is not the majority, and that the new tab resizing should |
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
188 * negate it anyway. --luke */ |
11338 | 189 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
8914 | 190 { |
11453
d446fcc2c63b
[gaim-migrate @ 13692]
Luke Schierer <lschiere@pidgin.im>
parents:
11452
diff
changeset
|
191 if (w == gtkconv->imhtml) { |
d446fcc2c63b
[gaim-migrate @ 13692]
Luke Schierer <lschiere@pidgin.im>
parents:
11452
diff
changeset
|
192 gaim_prefs_set_int("/gaim/gtk/conversations/im/default_width", allocation->width); |
d446fcc2c63b
[gaim-migrate @ 13692]
Luke Schierer <lschiere@pidgin.im>
parents:
11452
diff
changeset
|
193 gaim_prefs_set_int("/gaim/gtk/conversations/im/default_height", allocation->height); |
d446fcc2c63b
[gaim-migrate @ 13692]
Luke Schierer <lschiere@pidgin.im>
parents:
11452
diff
changeset
|
194 } |
8914 | 195 if (w == gtkconv->entry) |
196 gaim_prefs_set_int("/gaim/gtk/conversations/im/entry_height", allocation->height); | |
197 } | |
11338 | 198 else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) |
8914 | 199 { |
11453
d446fcc2c63b
[gaim-migrate @ 13692]
Luke Schierer <lschiere@pidgin.im>
parents:
11452
diff
changeset
|
200 if (w == gtkconv->imhtml) { |
d446fcc2c63b
[gaim-migrate @ 13692]
Luke Schierer <lschiere@pidgin.im>
parents:
11452
diff
changeset
|
201 gaim_prefs_set_int("/gaim/gtk/conversations/chat/default_width", allocation->width); |
d446fcc2c63b
[gaim-migrate @ 13692]
Luke Schierer <lschiere@pidgin.im>
parents:
11452
diff
changeset
|
202 gaim_prefs_set_int("/gaim/gtk/conversations/chat/default_height", allocation->height); |
d446fcc2c63b
[gaim-migrate @ 13692]
Luke Schierer <lschiere@pidgin.im>
parents:
11452
diff
changeset
|
203 } |
8914 | 204 if (w == gtkconv->entry) |
205 gaim_prefs_set_int("/gaim/gtk/conversations/chat/entry_height", allocation->height); | |
206 } | |
207 | |
208 return FALSE; | |
209 } | |
210 | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
211 static void |
10810 | 212 default_formatize(GaimGtkConversation *c) |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
213 { |
10810 | 214 GaimConversation *conv = c->active_conv; |
11508 | 215 |
10665 | 216 if (conv->features & GAIM_CONNECTION_HTML) |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
217 { |
11267
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
218 char *color; |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
219 GdkColor fg_color, bg_color; |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
220 |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
221 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_bold") != GTK_IMHTML(c->entry)->edit.bold) |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
222 gtk_imhtml_toggle_bold(GTK_IMHTML(c->entry)); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
223 |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
224 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_italic") != GTK_IMHTML(c->entry)->edit.italic) |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
225 gtk_imhtml_toggle_italic(GTK_IMHTML(c->entry)); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
226 |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
227 if (gaim_prefs_get_bool("/gaim/gtk/conversations/send_underline") != GTK_IMHTML(c->entry)->edit.underline) |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
228 gtk_imhtml_toggle_underline(GTK_IMHTML(c->entry)); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
229 |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
230 gtk_imhtml_toggle_fontface(GTK_IMHTML(c->entry), |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
231 gaim_prefs_get_string("/gaim/gtk/conversations/font_face")); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
232 |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
233 if (!(conv->features & GAIM_CONNECTION_NO_FONTSIZE)) |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
234 gtk_imhtml_font_set_size(GTK_IMHTML(c->entry), |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
235 gaim_prefs_get_int("/gaim/gtk/conversations/font_size")); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
236 |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
237 if(strcmp(gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor"), "") != 0) |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
238 { |
11267
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
239 gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/fgcolor"), |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
240 &fg_color); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
241 color = g_strdup_printf("#%02x%02x%02x", |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
242 fg_color.red / 256, |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
243 fg_color.green / 256, |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
244 fg_color.blue / 256); |
8061 | 245 } |
11267
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
246 else |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
247 color = g_strdup(""); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
248 |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
249 gtk_imhtml_toggle_forecolor(GTK_IMHTML(c->entry), color); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
250 g_free(color); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
251 |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
252 if(!(conv->features & GAIM_CONNECTION_NO_BGCOLOR) && |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
253 strcmp(gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor"), "") != 0) |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
254 { |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
255 gdk_color_parse(gaim_prefs_get_string("/gaim/gtk/conversations/bgcolor"), |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
256 &bg_color); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
257 color = g_strdup_printf("#%02x%02x%02x", |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
258 bg_color.red / 256, |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
259 bg_color.green / 256, |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
260 bg_color.blue / 256); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
261 } |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
262 else |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
263 color = g_strdup(""); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
264 |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
265 gtk_imhtml_toggle_background(GTK_IMHTML(c->entry), color); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
266 g_free(color); |
8677 | 267 |
9025 | 268 |
10665 | 269 if (conv->features & GAIM_CONNECTION_FORMATTING_WBFO) |
8677 | 270 gtk_imhtml_set_whole_buffer_formatting_only(GTK_IMHTML(c->entry), TRUE); |
271 else | |
272 gtk_imhtml_set_whole_buffer_formatting_only(GTK_IMHTML(c->entry), FALSE); | |
8061 | 273 } |
274 } | |
9130 | 275 |
11275
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
276 static void |
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
277 clear_formatting_cb(GtkIMHtml *imhtml, GaimGtkConversation *gtkconv) |
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
278 { |
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
279 default_formatize(gtkconv); |
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
280 } |
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
281 |
9130 | 282 static const char * |
283 gaim_gtk_get_cmd_prefix(void) | |
284 { | |
285 return "/"; | |
286 } | |
287 | |
9167 | 288 static GaimCmdRet |
9829 | 289 say_command_cb(GaimConversation *conv, |
290 const char *cmd, char **args, char **error, void *data) | |
291 { | |
11338 | 292 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
9829 | 293 gaim_conv_im_send(GAIM_CONV_IM(conv), args[0]); |
11338 | 294 else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) |
9829 | 295 gaim_conv_chat_send(GAIM_CONV_CHAT(conv), args[0]); |
296 | |
297 return GAIM_CMD_RET_OK; | |
298 } | |
299 | |
300 static GaimCmdRet | |
9167 | 301 me_command_cb(GaimConversation *conv, |
9597 | 302 const char *cmd, char **args, char **error, void *data) |
9167 | 303 { |
304 char *tmp; | |
305 | |
306 tmp = g_strdup_printf("/me %s", args[0]); | |
9175 | 307 |
11338 | 308 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
9167 | 309 gaim_conv_im_send(GAIM_CONV_IM(conv), tmp); |
11338 | 310 else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) |
9167 | 311 gaim_conv_chat_send(GAIM_CONV_CHAT(conv), tmp); |
312 | |
313 g_free(tmp); | |
314 return GAIM_CMD_RET_OK; | |
315 } | |
316 | |
9212 | 317 static GaimCmdRet |
318 debug_command_cb(GaimConversation *conv, | |
9597 | 319 const char *cmd, char **args, char **error, void *data) |
9212 | 320 { |
321 char *tmp, *markup; | |
322 GaimCmdStatus status; | |
323 | |
324 if (!g_ascii_strcasecmp(args[0], "version")) { | |
325 tmp = g_strdup_printf(_("me is using Gaim v%s."), VERSION); | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10698
diff
changeset
|
326 markup = g_markup_escape_text(tmp, -1); |
9212 | 327 |
328 status = gaim_cmd_do_command(conv, tmp, markup, error); | |
329 | |
330 g_free(tmp); | |
331 g_free(markup); | |
332 return status; | |
333 } else { | |
334 gaim_conversation_write(conv, NULL, _("Supported debug options are: version"), | |
335 GAIM_MESSAGE_NO_LOG|GAIM_MESSAGE_ERROR, time(NULL)); | |
336 return GAIM_CMD_STATUS_OK; | |
337 } | |
338 } | |
339 | |
9213 | 340 static GaimCmdRet |
11145
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
341 clear_command_cb(GaimConversation *conv, |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
342 const char *cmd, char **args, char **error, void *data) |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
343 { |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
344 GaimGtkConversation *gtkconv = NULL; |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
345 |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
346 gtkconv = GAIM_GTK_CONVERSATION(conv); |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
347 |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
348 gtk_imhtml_clear(GTK_IMHTML(gtkconv->imhtml)); |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
349 |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
350 return GAIM_CMD_STATUS_OK; |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
351 } |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
352 |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
353 static GaimCmdRet |
9213 | 354 help_command_cb(GaimConversation *conv, |
9597 | 355 const char *cmd, char **args, char **error, void *data) |
9213 | 356 { |
9597 | 357 GList *l, *text; |
9213 | 358 GString *s; |
9597 | 359 |
360 if (args[0] != NULL) { | |
361 s = g_string_new(""); | |
362 text = gaim_cmd_help(conv, args[0]); | |
363 | |
364 if (text) { | |
365 for (l = text; l; l = l->next) | |
366 if (l->next) | |
9816 | 367 g_string_append_printf(s, "%s\n", (char *)l->data); |
9597 | 368 else |
9816 | 369 g_string_append_printf(s, "%s", (char *)l->data); |
9597 | 370 } else { |
371 g_string_append(s, _("No such command (in this context).")); | |
372 } | |
373 } else { | |
374 s = g_string_new(_("Use \"/help <command>\" for help on a specific command.\n" | |
375 "The following commands are available in this context:\n")); | |
376 | |
377 text = gaim_cmd_list(conv); | |
378 for (l = text; l; l = l->next) | |
9213 | 379 if (l->next) |
9597 | 380 g_string_append_printf(s, "%s, ", (char *)l->data); |
9213 | 381 else |
9597 | 382 g_string_append_printf(s, "%s.", (char *)l->data); |
9213 | 383 } |
384 | |
385 gaim_conversation_write(conv, NULL, s->str, GAIM_MESSAGE_NO_LOG, time(NULL)); | |
386 g_string_free(s, TRUE); | |
387 | |
388 return GAIM_CMD_STATUS_OK; | |
389 } | |
390 | |
4359 | 391 static void |
9374 | 392 send_history_add(GaimConversation *conv, const char *message) |
393 { | |
394 GList *first; | |
395 | |
396 first = g_list_first(conv->send_history); | |
397 | |
398 if (first->data) | |
399 g_free(first->data); | |
400 | |
401 first->data = g_strdup(message); | |
402 | |
403 conv->send_history = g_list_prepend(first, NULL); | |
404 } | |
405 | |
9832 | 406 static gboolean |
407 check_for_and_do_command(GaimConversation *conv) | |
408 { | |
409 GaimGtkConversation *gtkconv; | |
410 char *cmd; | |
411 const char *prefix; | |
412 GaimAccount *account; | |
413 GtkTextIter start; | |
414 | |
415 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
416 account = gaim_conversation_get_account(conv); | |
417 prefix = gaim_gtk_get_cmd_prefix(); | |
418 | |
419 cmd = gtk_imhtml_get_text(GTK_IMHTML(gtkconv->entry), NULL, NULL); | |
420 gtk_text_buffer_get_start_iter(GTK_IMHTML(gtkconv->entry)->text_buffer, &start); | |
421 | |
422 if (cmd && (strncmp(cmd, prefix, strlen(prefix)) == 0) | |
423 && !gtk_text_iter_get_child_anchor(&start)) { | |
424 GaimCmdStatus status; | |
425 char *error, *cmdline, *markup, *send_history; | |
426 GtkTextIter end; | |
427 | |
428 send_history = gtk_imhtml_get_markup(GTK_IMHTML(gtkconv->entry)); | |
429 send_history_add(conv, send_history); | |
430 g_free(send_history); | |
431 | |
432 cmdline = cmd + strlen(prefix); | |
433 | |
434 gtk_text_iter_forward_chars(&start, g_utf8_strlen(prefix, -1)); | |
435 gtk_text_buffer_get_end_iter(GTK_IMHTML(gtkconv->entry)->text_buffer, &end); | |
436 markup = gtk_imhtml_get_markup_range(GTK_IMHTML(gtkconv->entry), &start, &end); | |
437 status = gaim_cmd_do_command(conv, cmdline, markup, &error); | |
438 g_free(cmd); | |
439 g_free(markup); | |
440 | |
441 switch (status) { | |
442 case GAIM_CMD_STATUS_OK: | |
443 return TRUE; | |
444 case GAIM_CMD_STATUS_NOT_FOUND: | |
445 if (!gaim_prefs_get_bool("/gaim/gtk/conversations/passthrough_unknown_commands")) { | |
446 gaim_conversation_write(conv, "", _("No such command."), | |
447 GAIM_MESSAGE_NO_LOG, time(NULL)); | |
448 | |
449 return TRUE; | |
450 } | |
451 return FALSE; | |
452 case GAIM_CMD_STATUS_WRONG_ARGS: | |
453 gaim_conversation_write(conv, "", _("Syntax Error: You typed the wrong number of arguments " | |
454 "to that command."), | |
455 GAIM_MESSAGE_NO_LOG, time(NULL)); | |
456 return TRUE; | |
457 case GAIM_CMD_STATUS_FAILED: | |
458 gaim_conversation_write(conv, "", error ? error : _("Your command failed for an unknown reason."), | |
459 GAIM_MESSAGE_NO_LOG, time(NULL)); | |
460 if(error) | |
461 g_free(error); | |
462 return TRUE; | |
463 case GAIM_CMD_STATUS_WRONG_TYPE: | |
11338 | 464 if(gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
10843 | 465 gaim_conversation_write(conv, "", _("That command only works in chats, not IMs."), |
9832 | 466 GAIM_MESSAGE_NO_LOG, time(NULL)); |
467 else | |
10843 | 468 gaim_conversation_write(conv, "", _("That command only works in IMs, not chats."), |
9832 | 469 GAIM_MESSAGE_NO_LOG, time(NULL)); |
470 return TRUE; | |
471 case GAIM_CMD_STATUS_WRONG_PRPL: | |
472 gaim_conversation_write(conv, "", _("That command doesn't work on this protocol."), | |
473 GAIM_MESSAGE_NO_LOG, time(NULL)); | |
474 return TRUE; | |
475 } | |
476 } | |
477 | |
478 g_free(cmd); | |
479 return FALSE; | |
480 } | |
481 | |
9374 | 482 static void |
10810 | 483 send_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
4359 | 484 { |
10810 | 485 GaimConversation *conv = gtkconv->active_conv; |
8655 | 486 GaimAccount *account; |
8677 | 487 GaimConnection *gc; |
8448 | 488 char *buf, *clean; |
4359 | 489 |
8655 | 490 account = gaim_conversation_get_account(conv); |
9130 | 491 |
9471 | 492 if (!gaim_account_is_connected(account)) |
493 return; | |
494 | |
11338 | 495 if ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) && |
9474 | 496 gaim_conv_chat_has_left(GAIM_CONV_CHAT(conv))) |
9471 | 497 return; |
498 | |
9832 | 499 if (check_for_and_do_command(conv)) { |
500 gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); | |
501 return; | |
9130 | 502 } |
503 | |
8442 | 504 buf = gtk_imhtml_get_markup(GTK_IMHTML(gtkconv->entry)); |
8962 | 505 clean = gtk_imhtml_get_text(GTK_IMHTML(gtkconv->entry), NULL, NULL); |
8448 | 506 |
4359 | 507 gtk_widget_grab_focus(gtkconv->entry); |
508 | |
8448 | 509 if (strlen(clean) == 0) { |
510 g_free(clean); | |
4359 | 511 return; |
512 } | |
513 | |
8677 | 514 gc = gaim_account_get_connection(account); |
10665 | 515 if (gc && (conv->features & GAIM_CONNECTION_NO_NEWLINES)) { |
8677 | 516 char **bufs; |
517 int i; | |
518 | |
519 bufs = gtk_imhtml_get_markup_lines(GTK_IMHTML(gtkconv->entry)); | |
520 for (i = 0; bufs[i]; i++) { | |
9374 | 521 send_history_add(conv, bufs[i]); |
11338 | 522 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
8677 | 523 gaim_conv_im_send(GAIM_CONV_IM(conv), bufs[i]); |
11338 | 524 else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) |
8677 | 525 gaim_conv_chat_send(GAIM_CONV_CHAT(conv), bufs[i]); |
526 } | |
527 | |
528 g_strfreev(bufs); | |
529 | |
530 } else { | |
9374 | 531 send_history_add(conv, buf); |
11338 | 532 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
8677 | 533 gaim_conv_im_send(GAIM_CONV_IM(conv), buf); |
11338 | 534 else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) |
8677 | 535 gaim_conv_chat_send(GAIM_CONV_CHAT(conv), buf); |
536 } | |
4359 | 537 |
8677 | 538 g_free(clean); |
4359 | 539 g_free(buf); |
540 | |
8061 | 541 gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); |
11613 | 542 gtkconv_set_unseen(gtkconv, GAIM_UNSEEN_NONE); |
4359 | 543 } |
544 | |
545 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
546 add_remove_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
4359 | 547 { |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
548 GaimAccount *account; |
4359 | 549 const char *name; |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
550 GaimConversation *conv = gtkconv->active_conv; |
4359 | 551 |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
552 account = gaim_conversation_get_account(conv); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
553 name = gaim_conversation_get_name(conv); |
7879 | 554 |
11338 | 555 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { |
7859 | 556 GaimBuddy *b; |
557 | |
558 b = gaim_find_buddy(account, name); | |
559 if (b != NULL) | |
9730 | 560 gaim_gtkdialogs_remove_buddy(b); |
7859 | 561 else if (account != NULL && gaim_account_is_connected(account)) |
562 gaim_blist_request_add_buddy(account, (char *)name, NULL, NULL); | |
11338 | 563 } else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { |
7859 | 564 GaimChat *c; |
565 | |
566 c = gaim_blist_find_chat(account, name); | |
567 if (c != NULL) | |
9730 | 568 gaim_gtkdialogs_remove_chat(c); |
7859 | 569 else if (account != NULL && gaim_account_is_connected(account)) |
9754 | 570 gaim_blist_request_add_chat(account, NULL, NULL, name); |
7859 | 571 } |
4359 | 572 |
573 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); | |
574 } | |
575 | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
576 static void chat_do_info(GaimGtkConversation *gtkconv, const char *who) |
7975 | 577 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
578 GaimConversation *conv = gtkconv->active_conv; |
7975 | 579 GaimPluginProtocolInfo *prpl_info = NULL; |
580 GaimConnection *gc; | |
581 | |
582 if ((gc = gaim_conversation_get_gc(conv))) { | |
583 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
584 | |
585 /* | |
586 * If there are special needs for getting info on users in | |
587 * buddy chat "rooms"... | |
588 */ | |
589 if (prpl_info->get_cb_info != NULL) | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
590 { |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
591 prpl_info->get_cb_info(gc, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
592 gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)), who); |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
593 } |
7975 | 594 else |
595 prpl_info->get_info(gc, who); | |
596 } | |
597 } | |
598 | |
599 | |
4359 | 600 static void |
10810 | 601 info_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
4359 | 602 { |
10810 | 603 GaimConversation *conv = gtkconv->active_conv; |
4359 | 604 |
11338 | 605 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { |
7879 | 606 serv_get_info(gaim_conversation_get_gc(conv), |
607 gaim_conversation_get_name(conv)); | |
608 | |
609 gtk_widget_grab_focus(gtkconv->entry); | |
11338 | 610 } else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { |
7879 | 611 /* Get info of the person currently selected in the GtkTreeView */ |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
612 GaimGtkChatPane *gtkchat; |
4359 | 613 GtkTreeIter iter; |
614 GtkTreeModel *model; | |
615 GtkTreeSelection *sel; | |
9554 | 616 char *name; |
4359 | 617 |
618 gtkchat = gtkconv->u.chat; | |
619 | |
620 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); | |
621 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list)); | |
622 | |
623 if (gtk_tree_selection_get_selected(sel, NULL, &iter)) | |
9498 | 624 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &name, -1); |
4359 | 625 else |
626 return; | |
627 | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
628 chat_do_info(gtkconv, name); |
9554 | 629 g_free(name); |
4359 | 630 } |
631 } | |
632 | |
633 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
634 block_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
4359 | 635 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
636 GaimConversation *conv = gtkconv->active_conv; |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6291
diff
changeset
|
637 GaimAccount *account; |
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6291
diff
changeset
|
638 |
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6291
diff
changeset
|
639 account = gaim_conversation_get_account(conv); |
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6291
diff
changeset
|
640 |
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6291
diff
changeset
|
641 if (account != NULL && gaim_account_is_connected(account)) |
6399
d726a36628e8
[gaim-migrate @ 6904]
Christian Hammond <chipx86@chipx86.com>
parents:
6398
diff
changeset
|
642 gaim_gtk_request_add_block(account, gaim_conversation_get_name(conv)); |
4359 | 643 |
644 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); | |
645 } | |
646 | |
647 static void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
648 do_invite(GtkWidget *w, int resp, InviteBuddyInfo *info) |
4359 | 649 { |
650 const char *buddy, *message; | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
651 GaimGtkConversation *gtkconv; |
4359 | 652 |
653 gtkconv = GAIM_GTK_CONVERSATION(info->conv); | |
654 | |
655 if (resp == GTK_RESPONSE_OK) { | |
656 buddy = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(info->entry)->entry)); | |
657 message = gtk_entry_get_text(GTK_ENTRY(info->message)); | |
658 | |
10113 | 659 if (!g_ascii_strcasecmp(buddy, "")) |
4359 | 660 return; |
661 | |
662 serv_chat_invite(gaim_conversation_get_gc(info->conv), | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
663 gaim_conv_chat_get_id(GAIM_CONV_CHAT(info->conv)), |
4359 | 664 message, buddy); |
665 } | |
666 | |
667 gtk_widget_destroy(invite_dialog); | |
668 invite_dialog = NULL; | |
669 | |
670 g_free(info); | |
671 } | |
672 | |
673 static void | |
9909 | 674 invite_dnd_recv(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, |
675 GtkSelectionData *sd, guint inf, guint t, gpointer data) | |
676 { | |
677 InviteBuddyInfo *info = (InviteBuddyInfo *)data; | |
678 const char *convprotocol; | |
679 | |
680 convprotocol = gaim_account_get_protocol_id(gaim_conversation_get_account(info->conv)); | |
681 | |
682 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) | |
683 { | |
684 GaimBlistNode *node = NULL; | |
685 GaimBuddy *buddy; | |
686 | |
687 memcpy(&node, sd->data, sizeof(node)); | |
688 | |
689 if (GAIM_BLIST_NODE_IS_CONTACT(node)) | |
690 buddy = gaim_contact_get_priority_buddy((GaimContact *)node); | |
691 else if (GAIM_BLIST_NODE_IS_BUDDY(node)) | |
692 buddy = (GaimBuddy *)node; | |
693 else | |
694 return; | |
695 | |
696 if (strcmp(convprotocol, gaim_account_get_protocol_id(buddy->account))) | |
697 { | |
698 gaim_notify_error(NULL, NULL, | |
699 _("That buddy is not on the same protocol as this " | |
10843 | 700 "chat."), NULL); |
9909 | 701 } |
702 else | |
703 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(info->entry)->entry), buddy->name); | |
704 | |
705 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); | |
706 } | |
707 else if (sd->target == gdk_atom_intern("application/x-im-contact", FALSE)) | |
708 { | |
709 char *protocol = NULL; | |
710 char *username = NULL; | |
711 GaimAccount *account; | |
712 | |
11137 | 713 if (gaim_gtk_parse_x_im_contact((const char *)sd->data, FALSE, &account, |
9909 | 714 &protocol, &username, NULL)) |
715 { | |
716 if (account == NULL) | |
717 { | |
718 gaim_notify_error(NULL, NULL, | |
719 _("You are not currently signed on with an account that " | |
720 "can invite that buddy."), NULL); | |
721 } | |
722 else if (strcmp(convprotocol, gaim_account_get_protocol_id(account))) | |
723 { | |
724 gaim_notify_error(NULL, NULL, | |
725 _("That buddy is not on the same protocol as this " | |
10843 | 726 "chat."), NULL); |
9909 | 727 } |
728 else | |
729 { | |
730 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(info->entry)->entry), username); | |
731 } | |
732 } | |
733 | |
734 if (username != NULL) g_free(username); | |
735 if (protocol != NULL) g_free(protocol); | |
736 | |
737 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); | |
738 } | |
739 } | |
740 | |
741 static const GtkTargetEntry dnd_targets[] = | |
742 { | |
743 {"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, 0}, | |
744 {"application/x-im-contact", 0, 1} | |
745 }; | |
746 | |
747 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
748 invite_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
4359 | 749 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
750 GaimConversation *conv = gtkconv->active_conv; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
751 InviteBuddyInfo *info = NULL; |
4359 | 752 |
753 if (invite_dialog == NULL) { | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
754 GaimConnection *gc; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
755 GaimGtkWindow *gtkwin; |
4359 | 756 GtkWidget *label; |
757 GtkWidget *vbox, *hbox; | |
758 GtkWidget *table; | |
759 GtkWidget *img; | |
760 | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
761 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, |
11581 | 762 GTK_ICON_SIZE_DIALOG); |
4359 | 763 |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
764 info = g_new0(InviteBuddyInfo, 1); |
4359 | 765 info->conv = conv; |
766 | |
11581 | 767 gc = gaim_conversation_get_gc(conv); |
768 gtkwin = gaim_gtkconv_get_window(gtkconv); | |
4359 | 769 |
770 /* Create the new dialog. */ | |
771 invite_dialog = gtk_dialog_new_with_buttons( | |
7859 | 772 _("Invite Buddy Into Chat Room"), |
7879 | 773 GTK_WINDOW(gtkwin->window), 0, |
774 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
9443
3584cdab1d0b
[gaim-migrate @ 10264]
Christian Hammond <chipx86@chipx86.com>
parents:
9374
diff
changeset
|
775 GAIM_STOCK_INVITE, GTK_RESPONSE_OK, NULL); |
4359 | 776 |
777 gtk_dialog_set_default_response(GTK_DIALOG(invite_dialog), | |
11581 | 778 GTK_RESPONSE_OK); |
11243 | 779 gtk_container_set_border_width(GTK_CONTAINER(invite_dialog), GAIM_HIG_BOX_SPACE); |
4359 | 780 gtk_window_set_resizable(GTK_WINDOW(invite_dialog), FALSE); |
781 gtk_dialog_set_has_separator(GTK_DIALOG(invite_dialog), FALSE); | |
782 | |
9909 | 783 info->window = GTK_WIDGET(invite_dialog); |
784 | |
4359 | 785 /* Setup the outside spacing. */ |
786 vbox = GTK_DIALOG(invite_dialog)->vbox; | |
787 | |
11243 | 788 gtk_box_set_spacing(GTK_BOX(vbox), GAIM_HIG_BORDER); |
789 gtk_container_set_border_width(GTK_CONTAINER(vbox), GAIM_HIG_BOX_SPACE); | |
4359 | 790 |
791 /* Setup the inner hbox and put the dialog's icon in it. */ | |
11243 | 792 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); |
4359 | 793 gtk_container_add(GTK_CONTAINER(vbox), hbox); |
794 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
795 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
796 | |
797 /* Setup the right vbox. */ | |
798 vbox = gtk_vbox_new(FALSE, 0); | |
799 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
800 | |
801 /* Put our happy label in it. */ | |
802 label = gtk_label_new(_("Please enter the name of the user you wish " | |
803 "to invite, along with an optional invite " | |
804 "message.")); | |
805 gtk_widget_set_size_request(label, 350, -1); | |
806 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
807 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
808 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
809 | |
810 /* hbox for the table, and to give it some spacing on the left. */ | |
11243 | 811 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
4359 | 812 gtk_container_add(GTK_CONTAINER(vbox), hbox); |
813 | |
814 /* Setup the table we're going to use to lay stuff out. */ | |
815 table = gtk_table_new(2, 2, FALSE); | |
11243 | 816 gtk_table_set_row_spacings(GTK_TABLE(table), GAIM_HIG_BOX_SPACE); |
817 gtk_table_set_col_spacings(GTK_TABLE(table), GAIM_HIG_BOX_SPACE); | |
818 gtk_container_set_border_width(GTK_CONTAINER(table), GAIM_HIG_BORDER); | |
4359 | 819 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); |
820 | |
821 /* Now the Buddy label */ | |
822 label = gtk_label_new(NULL); | |
823 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Buddy:")); | |
824 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
825 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); | |
826 | |
827 /* Now the Buddy drop-down entry field. */ | |
828 info->entry = gtk_combo_new(); | |
829 gtk_combo_set_case_sensitive(GTK_COMBO(info->entry), FALSE); | |
830 gtk_entry_set_activates_default( | |
831 GTK_ENTRY(GTK_COMBO(info->entry)->entry), TRUE); | |
832 | |
833 gtk_table_attach_defaults(GTK_TABLE(table), info->entry, 1, 2, 0, 1); | |
834 gtk_label_set_mnemonic_widget(GTK_LABEL(label), info->entry); | |
835 | |
836 /* Fill in the names. */ | |
837 gtk_combo_set_popdown_strings(GTK_COMBO(info->entry), | |
838 generate_invite_user_names(gc)); | |
839 | |
840 | |
841 /* Now the label for "Message" */ | |
842 label = gtk_label_new(NULL); | |
843 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Message:")); | |
844 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
845 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); | |
846 | |
847 | |
848 /* And finally, the Message entry field. */ | |
849 info->message = gtk_entry_new(); | |
850 gtk_entry_set_activates_default(GTK_ENTRY(info->message), TRUE); | |
851 | |
852 gtk_table_attach_defaults(GTK_TABLE(table), info->message, 1, 2, 1, 2); | |
853 gtk_label_set_mnemonic_widget(GTK_LABEL(label), info->message); | |
854 | |
855 /* Connect the signals. */ | |
856 g_signal_connect(G_OBJECT(invite_dialog), "response", | |
857 G_CALLBACK(do_invite), info); | |
9909 | 858 /* Setup drag-and-drop */ |
859 gtk_drag_dest_set(info->window, | |
860 GTK_DEST_DEFAULT_MOTION | | |
861 GTK_DEST_DEFAULT_DROP, | |
862 dnd_targets, | |
863 sizeof(dnd_targets) / sizeof(GtkTargetEntry), | |
864 GDK_ACTION_COPY); | |
865 gtk_drag_dest_set(info->entry, | |
866 GTK_DEST_DEFAULT_MOTION | | |
867 GTK_DEST_DEFAULT_DROP, | |
868 dnd_targets, | |
869 sizeof(dnd_targets) / sizeof(GtkTargetEntry), | |
870 GDK_ACTION_COPY); | |
871 | |
872 g_signal_connect(G_OBJECT(info->window), "drag_data_received", | |
873 G_CALLBACK(invite_dnd_recv), info); | |
874 g_signal_connect(G_OBJECT(info->entry), "drag_data_received", | |
875 G_CALLBACK(invite_dnd_recv), info); | |
876 | |
4359 | 877 } |
878 | |
879 gtk_widget_show_all(invite_dialog); | |
880 | |
881 if (info != NULL) | |
882 gtk_widget_grab_focus(GTK_COMBO(info->entry)->entry); | |
883 } | |
884 | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
885 static void |
7748 | 886 menu_new_conv_cb(gpointer data, guint action, GtkWidget *widget) |
887 { | |
9714 | 888 gaim_gtkdialogs_im(); |
7748 | 889 } |
890 | |
891 static void | |
9504 | 892 savelog_writefile_cb(void *user_data, const char *filename) |
9489 | 893 { |
9504 | 894 GaimConversation *conv = (GaimConversation *)user_data; |
9489 | 895 FILE *fp; |
896 const char *name; | |
10849 | 897 gchar *text; |
9489 | 898 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10572
diff
changeset
|
899 if ((fp = g_fopen(filename, "w+")) == NULL) { |
9504 | 900 gaim_notify_error(conv, NULL, _("Unable to open file."), NULL); |
9489 | 901 return; |
902 } | |
903 | |
904 name = gaim_conversation_get_name(conv); | |
10849 | 905 fprintf(fp, "<html>\n<head><title>%s</title></head>\n<body>", name); |
9489 | 906 fprintf(fp, _("<h1>Conversation with %s</h1>\n"), name); |
10849 | 907 |
908 text = gtk_imhtml_get_markup( | |
909 GTK_IMHTML(GAIM_GTK_CONVERSATION(conv)->imhtml)); | |
910 fprintf(fp, "%s", text); | |
911 g_free(text); | |
912 | |
913 fprintf(fp, "\n</body>\n</html>\n"); | |
9489 | 914 fclose(fp); |
915 } | |
916 | |
10849 | 917 /* |
918 * It would be kinda cool if this gave the option of saving a | |
919 * plaintext v. HTML file. | |
920 */ | |
9489 | 921 static void |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
922 menu_save_as_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
923 { |
11581 | 924 GaimGtkWindow *win = data; |
925 GaimConversation *conv = gaim_gtk_conv_window_get_active_conversation(win); | |
9489 | 926 gchar *buf; |
927 | |
928 buf = g_strdup_printf("%s.html", gaim_normalize(conv->account, conv->name)); | |
9504 | 929 |
10849 | 930 gaim_request_file(conv, _("Save Conversation"), gaim_escape_filename(buf), |
931 TRUE, G_CALLBACK(savelog_writefile_cb), NULL, conv); | |
9489 | 932 |
933 g_free(buf); | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
934 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
935 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
936 static void |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
937 menu_view_log_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
938 { |
11581 | 939 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
940 GaimConversation *conv; |
9917 | 941 GaimLogType type; |
10809
f9e01ccd6046
[gaim-migrate @ 12461]
Luke Schierer <lschiere@pidgin.im>
parents:
10807
diff
changeset
|
942 const char *name; |
f9e01ccd6046
[gaim-migrate @ 12461]
Luke Schierer <lschiere@pidgin.im>
parents:
10807
diff
changeset
|
943 GaimAccount *account; |
10845 | 944 GSList *buddies, *cur; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
945 |
11581 | 946 conv = gaim_gtk_conv_window_get_active_conversation(win); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
947 |
11338 | 948 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
9917 | 949 type = GAIM_LOG_IM; |
11338 | 950 else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) |
9917 | 951 type = GAIM_LOG_CHAT; |
952 else | |
953 return; | |
954 | |
10809
f9e01ccd6046
[gaim-migrate @ 12461]
Luke Schierer <lschiere@pidgin.im>
parents:
10807
diff
changeset
|
955 name = gaim_conversation_get_name(conv); |
f9e01ccd6046
[gaim-migrate @ 12461]
Luke Schierer <lschiere@pidgin.im>
parents:
10807
diff
changeset
|
956 account = gaim_conversation_get_account(conv); |
f9e01ccd6046
[gaim-migrate @ 12461]
Luke Schierer <lschiere@pidgin.im>
parents:
10807
diff
changeset
|
957 |
10845 | 958 buddies = gaim_find_buddies(account, name); |
959 for (cur = buddies; cur != NULL; cur = cur->next) | |
960 { | |
961 GaimBlistNode *node = cur->data; | |
10846 | 962 if ((node != NULL) && ((node->prev != NULL) || (node->next != NULL))) |
10845 | 963 { |
964 gaim_gtk_log_show_contact((GaimContact *)node->parent); | |
965 g_slist_free(buddies); | |
966 return; | |
967 } | |
10809
f9e01ccd6046
[gaim-migrate @ 12461]
Luke Schierer <lschiere@pidgin.im>
parents:
10807
diff
changeset
|
968 } |
10845 | 969 g_slist_free(buddies); |
10809
f9e01ccd6046
[gaim-migrate @ 12461]
Luke Schierer <lschiere@pidgin.im>
parents:
10807
diff
changeset
|
970 |
f9e01ccd6046
[gaim-migrate @ 12461]
Luke Schierer <lschiere@pidgin.im>
parents:
10807
diff
changeset
|
971 gaim_gtk_log_show(type, name, account); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
972 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
973 |
8974 | 974 static void |
975 menu_clear_cb(gpointer data, guint action, GtkWidget *widget) | |
976 { | |
11581 | 977 GaimGtkWindow *win = data; |
8974 | 978 GaimConversation *conv; |
979 GaimGtkConversation *gtkconv; | |
980 | |
11581 | 981 conv = gaim_gtk_conv_window_get_active_conversation(win); |
8974 | 982 gtkconv = GAIM_GTK_CONVERSATION(conv); |
983 | |
984 gtk_imhtml_clear(GTK_IMHTML(gtkconv->imhtml)); | |
985 } | |
986 | |
7295 | 987 struct _search { |
988 GaimGtkConversation *gtkconv; | |
989 GtkWidget *entry; | |
990 }; | |
991 | |
7929 | 992 static void do_search_cb(GtkWidget *widget, gint resp, struct _search *s) |
7295 | 993 { |
7929 | 994 switch (resp) { |
995 case GTK_RESPONSE_OK: | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
996 gtk_imhtml_search_find(GTK_IMHTML(s->gtkconv->imhtml), |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
997 gtk_entry_get_text(GTK_ENTRY(s->entry))); |
7929 | 998 break; |
999 | |
1000 case GTK_RESPONSE_DELETE_EVENT: | |
1001 case GTK_RESPONSE_CLOSE: | |
1002 gtk_imhtml_search_clear(GTK_IMHTML(s->gtkconv->imhtml)); | |
1003 gtk_widget_destroy(s->gtkconv->dialogs.search); | |
1004 s->gtkconv->dialogs.search = NULL; | |
1005 g_free(s); | |
1006 break; | |
1007 } | |
7295 | 1008 } |
1009 | |
1010 static void | |
7751 | 1011 menu_find_cb(gpointer data, guint action, GtkWidget *widget) |
7295 | 1012 { |
11581 | 1013 GaimGtkWindow *gtkwin = data; |
1014 GaimConversation *conv = gaim_gtk_conv_window_get_active_conversation(gtkwin); | |
7295 | 1015 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
7929 | 1016 GtkWidget *hbox; |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1017 GtkWidget *img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1018 GTK_ICON_SIZE_DIALOG); |
7929 | 1019 GtkWidget *label; |
7295 | 1020 struct _search *s; |
1021 | |
7798 | 1022 if (gtkconv->dialogs.search) { |
1023 gtk_window_present(GTK_WINDOW(gtkconv->dialogs.search)); | |
7295 | 1024 return; |
7798 | 1025 } |
7300
41bbe5534441
[gaim-migrate @ 7884]
Christian Hammond <chipx86@chipx86.com>
parents:
7298
diff
changeset
|
1026 |
7295 | 1027 s = g_malloc(sizeof(struct _search)); |
1028 s->gtkconv = gtkconv; | |
7929 | 1029 |
1030 gtkconv->dialogs.search = gtk_dialog_new_with_buttons(_("Find"), | |
1031 GTK_WINDOW(gtkwin->window), GTK_DIALOG_DESTROY_WITH_PARENT, | |
1032 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, | |
1033 GTK_STOCK_FIND, GTK_RESPONSE_OK, NULL); | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1034 gtk_dialog_set_default_response(GTK_DIALOG(gtkconv->dialogs.search), |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1035 GTK_RESPONSE_OK); |
7929 | 1036 g_signal_connect(G_OBJECT(gtkconv->dialogs.search), "response", |
1037 G_CALLBACK(do_search_cb), s); | |
1038 | |
11243 | 1039 gtk_container_set_border_width(GTK_CONTAINER(gtkconv->dialogs.search), GAIM_HIG_BOX_SPACE); |
7929 | 1040 gtk_window_set_resizable(GTK_WINDOW(gtkconv->dialogs.search), FALSE); |
1041 gtk_dialog_set_has_separator(GTK_DIALOG(gtkconv->dialogs.search), FALSE); | |
11243 | 1042 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(gtkconv->dialogs.search)->vbox), GAIM_HIG_BORDER); |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1043 gtk_container_set_border_width( |
11243 | 1044 GTK_CONTAINER(GTK_DIALOG(gtkconv->dialogs.search)->vbox), GAIM_HIG_BOX_SPACE); |
1045 | |
1046 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1047 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(gtkconv->dialogs.search)->vbox), |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1048 hbox); |
7929 | 1049 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
1050 | |
1051 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1052 gtk_dialog_set_response_sensitive(GTK_DIALOG(gtkconv->dialogs.search), |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1053 GTK_RESPONSE_OK, FALSE); |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1054 |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1055 label = gtk_label_new(NULL); |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1056 gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), _("_Search for:")); |
7929 | 1057 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
1058 | |
1059 s->entry = gtk_entry_new(); | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1060 gtk_entry_set_activates_default(GTK_ENTRY(s->entry), TRUE); |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1061 gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(s->entry)); |
7929 | 1062 g_signal_connect(G_OBJECT(s->entry), "changed", |
1063 G_CALLBACK(gaim_gtk_set_sensitive_if_input), | |
1064 gtkconv->dialogs.search); | |
1065 gtk_box_pack_start(GTK_BOX(hbox), s->entry, FALSE, FALSE, 0); | |
7300
41bbe5534441
[gaim-migrate @ 7884]
Christian Hammond <chipx86@chipx86.com>
parents:
7298
diff
changeset
|
1066 |
7295 | 1067 gtk_widget_show_all(gtkconv->dialogs.search); |
7929 | 1068 gtk_widget_grab_focus(s->entry); |
7295 | 1069 } |
1070 | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1071 static void |
9468 | 1072 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget) |
1073 { | |
11581 | 1074 GaimGtkWindow *win = data; |
1075 GaimConversation *conv = gaim_gtk_conv_window_get_active_conversation(win); | |
9468 | 1076 |
11338 | 1077 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { |
9468 | 1078 serv_send_file(gaim_conversation_get_gc(conv), gaim_conversation_get_name(conv), NULL); |
1079 } | |
1080 | |
1081 } | |
1082 | |
1083 static void | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1084 menu_add_pounce_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1085 { |
11581 | 1086 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1087 GaimConversation *conv; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1088 |
11581 | 1089 conv = gaim_gtk_conv_window_get_active_gtkconv(win)->active_conv; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1090 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1091 gaim_gtkpounce_dialog_show(gaim_conversation_get_account(conv), |
11581 | 1092 gaim_conversation_get_name(conv), NULL); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1093 } |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1094 |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1095 static void |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1096 menu_insert_link_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1097 { |
11581 | 1098 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1099 GaimGtkConversation *gtkconv; |
8756 | 1100 GtkIMHtmlToolbar *toolbar; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1101 |
11581 | 1102 gtkconv = gaim_gtk_conv_window_get_active_gtkconv(win); |
8756 | 1103 toolbar = GTK_IMHTMLTOOLBAR(gtkconv->toolbar); |
1104 | |
1105 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->link), | |
1106 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->link))); | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1107 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1108 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1109 static void |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1110 menu_insert_image_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1111 { |
11581 | 1112 GaimGtkWindow *win = data; |
8756 | 1113 GaimConversation *conv; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1114 GaimGtkConversation *gtkconv; |
8756 | 1115 GtkIMHtmlToolbar *toolbar; |
1116 | |
11581 | 1117 gtkconv = gaim_gtk_conv_window_get_active_gtkconv(win); |
1118 conv = gtkconv->active_conv; | |
8756 | 1119 toolbar = GTK_IMHTMLTOOLBAR(gtkconv->toolbar); |
1120 | |
1121 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), | |
1122 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toolbar->image))); | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1123 } |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1124 |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1125 static void |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1126 menu_alias_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1127 { |
11581 | 1128 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1129 GaimConversation *conv; |
7879 | 1130 GaimAccount *account; |
1131 const char *name; | |
1132 | |
11581 | 1133 conv = gaim_gtk_conv_window_get_active_conversation(win); |
7879 | 1134 account = gaim_conversation_get_account(conv); |
1135 name = gaim_conversation_get_name(conv); | |
1136 | |
11338 | 1137 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { |
7879 | 1138 GaimBuddy *b; |
1139 | |
1140 b = gaim_find_buddy(account, name); | |
1141 if (b != NULL) | |
9730 | 1142 gaim_gtkdialogs_alias_buddy(b); |
11338 | 1143 } else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { |
7879 | 1144 GaimChat *c; |
1145 | |
1146 c = gaim_blist_find_chat(account, name); | |
1147 if (c != NULL) | |
9730 | 1148 gaim_gtkdialogs_alias_chat(c); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1149 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1150 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1151 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1152 static void |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1153 menu_get_info_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1154 { |
11581 | 1155 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1156 GaimConversation *conv; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1157 |
11581 | 1158 conv = gaim_gtk_conv_window_get_active_conversation(win); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1159 |
10810 | 1160 info_cb(NULL, GAIM_GTK_CONVERSATION(conv)); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1161 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1162 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1163 static void |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1164 menu_invite_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1165 { |
11581 | 1166 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1167 GaimConversation *conv; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1168 |
11581 | 1169 conv = gaim_gtk_conv_window_get_active_conversation(win); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1170 |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1171 invite_cb(NULL, GAIM_GTK_CONVERSATION(conv)); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1172 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1173 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1174 static void |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1175 menu_block_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1176 { |
11581 | 1177 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1178 GaimConversation *conv; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1179 |
11581 | 1180 conv = gaim_gtk_conv_window_get_active_conversation(win); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1181 |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1182 block_cb(NULL, GAIM_GTK_CONVERSATION(conv)); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1183 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1184 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1185 static void |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1186 menu_add_remove_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1187 { |
11581 | 1188 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1189 GaimConversation *conv; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1190 |
11581 | 1191 conv = gaim_gtk_conv_window_get_active_conversation(win); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1192 |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1193 add_remove_cb(NULL, GAIM_GTK_CONVERSATION(conv)); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1194 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1195 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1196 static void |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1197 menu_close_conv_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1198 { |
11581 | 1199 GaimGtkWindow *win = data; |
1200 | |
1201 close_conv_cb(NULL, GAIM_GTK_CONVERSATION(gaim_gtk_conv_window_get_active_conversation(win))); | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1202 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1203 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1204 static void |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1205 menu_logging_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1206 { |
11581 | 1207 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1208 GaimConversation *conv; |
11805
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1209 gboolean logging; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1210 |
11581 | 1211 conv = gaim_gtk_conv_window_get_active_conversation(win); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1212 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1213 if (conv == NULL) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1214 return; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1215 |
11805
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1216 logging = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1217 |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1218 if (logging == gaim_conversation_is_logging(conv)) |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1219 return; |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1220 |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1221 if (logging) |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1222 { |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1223 /* Enable logging first so the message below can be logged. */ |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1224 gaim_conversation_set_logging(conv, TRUE); |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1225 |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1226 gaim_conversation_write(conv, NULL, |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1227 _("Logging started. Future messages in this conversation will be logged."), |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1228 conv->logs ? (GAIM_MESSAGE_SYSTEM) : |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1229 (GAIM_MESSAGE_SYSTEM | GAIM_MESSAGE_NO_LOG), |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1230 time(NULL)); |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1231 } |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1232 else |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1233 { |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1234 gaim_conversation_write(conv, NULL, |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1235 _("Logging stopped. Future messages in this conversation will not be logged."), |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1236 conv->logs ? (GAIM_MESSAGE_SYSTEM) : |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1237 (GAIM_MESSAGE_SYSTEM | GAIM_MESSAGE_NO_LOG), |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1238 time(NULL)); |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1239 |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1240 /* Disable the logging second, so that the above message can be logged. */ |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1241 gaim_conversation_set_logging(conv, FALSE); |
615c2fd3d72e
[gaim-migrate @ 14096]
Richard Laager <rlaager@wiktel.com>
parents:
11799
diff
changeset
|
1242 } |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1243 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1244 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1245 static void |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1246 menu_toolbar_cb(gpointer data, guint action, GtkWidget *widget) |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1247 { |
11581 | 1248 GaimGtkWindow *win = data; |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1249 GaimConversation *conv; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1250 GaimGtkConversation *gtkconv; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1251 |
11581 | 1252 conv = gaim_gtk_conv_window_get_active_conversation(win); |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1253 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1254 if (conv == NULL) |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1255 return; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1256 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1257 gtkconv = GAIM_GTK_CONVERSATION(conv); |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1258 |
10377 | 1259 gaim_prefs_set_bool("/gaim/gtk/conversations/show_formatting_toolbar", |
11581 | 1260 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))); |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1261 } |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1262 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1263 static void |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1264 menu_sounds_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1265 { |
11581 | 1266 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1267 GaimConversation *conv; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1268 GaimGtkConversation *gtkconv; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1269 |
11581 | 1270 conv = gaim_gtk_conv_window_get_active_conversation(win); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1271 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1272 if (!conv) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1273 return; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1274 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1275 gtkconv = GAIM_GTK_CONVERSATION(conv); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1276 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1277 gtkconv->make_sound = |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1278 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1279 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1280 |
7961 | 1281 static void |
9188 | 1282 menu_timestamps_cb(gpointer data, guint action, GtkWidget *widget) |
1283 { | |
11581 | 1284 GaimGtkWindow *win = data; |
9188 | 1285 GaimConversation *conv; |
1286 GaimGtkConversation *gtkconv; | |
1287 | |
11581 | 1288 conv = gaim_gtk_conv_window_get_active_conversation(win); |
9188 | 1289 |
1290 if (!conv) | |
1291 return; | |
1292 | |
1293 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1294 | |
1295 gtkconv->show_timestamps = | |
1296 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); | |
1297 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), | |
1298 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))); | |
1299 } | |
1300 | |
1301 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1302 chat_do_im(GaimGtkConversation *gtkconv, const char *who) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1303 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1304 GaimConversation *conv = gtkconv->active_conv; |
10431 | 1305 GaimAccount *account; |
1306 GaimConnection *gc; | |
7961 | 1307 GaimPluginProtocolInfo *prpl_info = NULL; |
1308 char *real_who; | |
1309 | |
1310 account = gaim_conversation_get_account(conv); | |
10431 | 1311 g_return_if_fail(account != NULL); |
1312 | |
1313 gc = gaim_account_get_connection(account); | |
1314 g_return_if_fail(gc != NULL); | |
1315 | |
1316 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
1317 | |
1318 if (prpl_info && prpl_info->get_cb_real_name) | |
1319 real_who = prpl_info->get_cb_real_name(gc, | |
7961 | 1320 gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)), who); |
1321 else | |
1322 real_who = g_strdup(who); | |
1323 | |
1324 if(!real_who) | |
1325 return; | |
1326 | |
10431 | 1327 gaim_gtkdialogs_im_with_user(account, real_who); |
7961 | 1328 |
1329 g_free(real_who); | |
1330 } | |
1331 | |
1332 static void | |
10810 | 1333 chat_im_button_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
7961 | 1334 { |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1335 GaimGtkChatPane *gtkchat; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1336 GtkTreeIter iter; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1337 GtkTreeModel *model; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1338 GtkTreeSelection *sel; |
9554 | 1339 char *name; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1340 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1341 gtkchat = gtkconv->u.chat; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1342 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1343 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1344 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1345 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1346 if (gtk_tree_selection_get_selected(sel, NULL, &iter)) |
9498 | 1347 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &name, -1); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1348 else |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1349 return; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1350 |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1351 chat_do_im(gtkconv, name); |
9554 | 1352 g_free(name); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1353 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1354 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1355 static void |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1356 ignore_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1357 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1358 GaimConversation *conv = gtkconv->active_conv; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1359 GaimGtkChatPane *gtkchat; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1360 GaimConvChat *chat; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1361 GtkTreeIter iter; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1362 GtkTreeModel *model; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1363 GtkTreeSelection *sel; |
10504 | 1364 char *name; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1365 char *alias; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1366 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1367 chat = GAIM_CONV_CHAT(conv); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1368 gtkchat = gtkconv->u.chat; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1369 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1370 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1371 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1372 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1373 if (gtk_tree_selection_get_selected(sel, NULL, &iter)) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1374 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1375 CHAT_USERS_NAME_COLUMN, &name, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1376 CHAT_USERS_ALIAS_COLUMN, &alias, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1377 -1); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1378 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1379 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1380 else |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1381 return; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1382 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1383 if (gaim_conv_chat_is_user_ignored(chat, name)) |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1384 gaim_conv_chat_unignore(chat, name); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1385 else |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1386 gaim_conv_chat_ignore(chat, name); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1387 |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
1388 add_chat_buddy_common(conv, name, alias, NULL); |
10504 | 1389 g_free(name); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1390 g_free(alias); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1391 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1392 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1393 static void |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1394 menu_chat_im_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
7398 | 1395 { |
1396 const char *who = g_object_get_data(G_OBJECT(w), "user_data"); | |
1397 | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1398 chat_do_im(gtkconv, who); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1399 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1400 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1401 static void |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1402 menu_chat_send_file_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
9468 | 1403 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1404 GaimConversation *conv = gtkconv->active_conv; |
9468 | 1405 const char *who = g_object_get_data(G_OBJECT(w), "user_data"); |
1406 GaimConnection *gc = gaim_conversation_get_gc(conv); | |
1407 | |
1408 serv_send_file(gc, who, NULL); | |
1409 } | |
1410 | |
1411 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1412 menu_chat_info_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1413 { |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1414 char *who; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1415 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1416 who = g_object_get_data(G_OBJECT(w), "user_data"); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1417 |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1418 chat_do_info(gtkconv, who); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1419 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1420 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1421 static void |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1422 menu_chat_get_away_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1423 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1424 GaimConversation *conv = gtkconv->active_conv; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1425 GaimPluginProtocolInfo *prpl_info = NULL; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1426 GaimConnection *gc; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1427 char *who; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1428 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1429 gc = gaim_conversation_get_gc(conv); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1430 who = g_object_get_data(G_OBJECT(w), "user_data"); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1431 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1432 if (gc != NULL) { |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1433 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1434 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1435 /* |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1436 * May want to expand this to work similarly to menu_info_cb? |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1437 */ |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1438 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1439 if (prpl_info->get_cb_away != NULL) |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1440 { |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1441 prpl_info->get_cb_away(gc, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1442 gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)), who); |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1443 } |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1444 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1445 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1446 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1447 static void |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1448 menu_chat_add_remove_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1449 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1450 GaimConversation *conv = gtkconv->active_conv; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1451 GaimAccount *account; |
6695 | 1452 GaimBuddy *b; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1453 char *name; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1454 |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1455 account = gaim_conversation_get_account(conv); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1456 name = g_object_get_data(G_OBJECT(w), "user_data"); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1457 b = gaim_find_buddy(account, name); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1458 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1459 if (b != NULL) |
9730 | 1460 gaim_gtkdialogs_remove_buddy(b); |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1461 else if (account != NULL && gaim_account_is_connected(account)) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1462 gaim_blist_request_add_buddy(account, name, NULL, NULL); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1463 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1464 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1465 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1466 |
8143 | 1467 static GtkWidget * |
10504 | 1468 create_chat_menu(GaimConversation *conv, const char *who, |
8143 | 1469 GaimPluginProtocolInfo *prpl_info, GaimConnection *gc) |
1470 { | |
1471 static GtkWidget *menu = NULL; | |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
1472 GaimConvChat *chat = GAIM_CONV_CHAT(conv); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1473 gboolean is_me = FALSE; |
8143 | 1474 GtkWidget *button; |
1475 | |
1476 /* | |
1477 * If a menu already exists, destroy it before creating a new one, | |
1478 * thus freeing-up the memory it occupied. | |
1479 */ | |
1480 if (menu) | |
1481 gtk_widget_destroy(menu); | |
1482 | |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
1483 if (!strcmp(chat->nick, gaim_normalize(conv->account, who))) |
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
1484 is_me = TRUE; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1485 |
8143 | 1486 menu = gtk_menu_new(); |
1487 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1488 if (!is_me) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1489 button = gaim_new_item_from_stock(menu, _("IM"), GAIM_STOCK_IM, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1490 G_CALLBACK(menu_chat_im_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1491 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1492 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1493 if (prpl_info && prpl_info->send_file |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1494 && (!prpl_info->can_receive_file || prpl_info->can_receive_file(gc, who))) { |
11508 | 1495 button = gaim_new_item_from_stock(menu, _("Send File"), |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1496 GAIM_STOCK_FILE_TRANSFER, G_CALLBACK(menu_chat_send_file_cb), |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1497 GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1498 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1499 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1500 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1501 if (gaim_conv_chat_is_user_ignored(GAIM_CONV_CHAT(conv), who)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1502 button = gaim_new_item_from_stock(menu, _("Un-Ignore"), GAIM_STOCK_IGNORE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1503 G_CALLBACK(ignore_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1504 else |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1505 button = gaim_new_item_from_stock(menu, _("Ignore"), GAIM_STOCK_IGNORE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1506 G_CALLBACK(ignore_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
10504 | 1507 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); |
9468 | 1508 } |
9498 | 1509 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1510 if (prpl_info->get_info || prpl_info->get_cb_info) { |
10221 | 1511 button = gaim_new_item_from_stock(menu, _("Info"), GAIM_STOCK_INFO, |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1512 G_CALLBACK(menu_chat_info_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
10504 | 1513 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); |
8143 | 1514 } |
1515 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1516 if (prpl_info->get_cb_away) { |
10221 | 1517 button = gaim_new_item_from_stock(menu, _("Get Away Message"), GAIM_STOCK_AWAY, |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1518 G_CALLBACK(menu_chat_get_away_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
10504 | 1519 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); |
8143 | 1520 } |
1521 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1522 if (!is_me && !(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME)) { |
8143 | 1523 if (gaim_find_buddy(gc->account, who)) |
10221 | 1524 button = gaim_new_item_from_stock(menu, _("Remove"), GTK_STOCK_REMOVE, |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1525 G_CALLBACK(menu_chat_add_remove_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
8143 | 1526 else |
10221 | 1527 button = gaim_new_item_from_stock(menu, _("Add"), GTK_STOCK_ADD, |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1528 G_CALLBACK(menu_chat_add_remove_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
10504 | 1529 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); |
8143 | 1530 } |
1531 | |
1532 return menu; | |
1533 } | |
1534 | |
1535 | |
1536 static gint | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1537 gtkconv_chat_popup_menu_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
8143 | 1538 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1539 GaimConversation *conv = gtkconv->active_conv; |
8143 | 1540 GaimPluginProtocolInfo *prpl_info = NULL; |
1541 GaimGtkChatPane *gtkchat; | |
1542 GaimConnection *gc; | |
1543 GaimAccount *account; | |
1544 GtkTreeSelection *sel; | |
1545 GtkTreeIter iter; | |
1546 GtkTreeModel *model; | |
1547 GtkWidget *menu; | |
1548 gchar *who; | |
1549 | |
1550 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1551 gtkchat = gtkconv->u.chat; | |
1552 account = gaim_conversation_get_account(conv); | |
1553 gc = account->gc; | |
1554 | |
1555 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); | |
1556 | |
1557 if (gc != NULL) | |
1558 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
1559 | |
1560 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list)); | |
1561 if(!gtk_tree_selection_get_selected(sel, NULL, &iter)) | |
1562 return FALSE; | |
1563 | |
9498 | 1564 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1); |
8143 | 1565 menu = create_chat_menu (conv, who, prpl_info, gc); |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1566 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1567 gaim_gtk_treeview_popup_menu_position_func, widget, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1568 0, GDK_CURRENT_TIME); |
10504 | 1569 g_free(who); |
8143 | 1570 |
1571 return TRUE; | |
1572 } | |
1573 | |
1574 | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1575 static gint |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1576 right_click_chat_cb(GtkWidget *widget, GdkEventButton *event, |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1577 GaimGtkConversation *gtkconv) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1578 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1579 GaimConversation *conv = gtkconv->active_conv; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1580 GaimPluginProtocolInfo *prpl_info = NULL; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1581 GaimGtkChatPane *gtkchat; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1582 GaimConnection *gc; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1583 GaimAccount *account; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1584 GtkTreePath *path; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1585 GtkTreeIter iter; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1586 GtkTreeModel *model; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1587 GtkTreeViewColumn *column; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1588 gchar *who; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1589 int x, y; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1590 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1591 gtkchat = gtkconv->u.chat; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1592 account = gaim_conversation_get_account(conv); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1593 gc = account->gc; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1594 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1595 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1596 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1597 gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(gtkchat->list), |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1598 event->x, event->y, &path, &column, &x, &y); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1599 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1600 if (path == NULL) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1601 return FALSE; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1602 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1603 if (gc != NULL) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1604 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1605 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1606 gtk_tree_selection_select_path(GTK_TREE_SELECTION( |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1607 gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list))), path); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1608 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1609 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path); |
9498 | 1610 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1611 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1612 if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1613 chat_do_im(gtkconv, who); |
7398 | 1614 } else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { |
8143 | 1615 GtkWidget *menu = create_chat_menu (conv, who, prpl_info, gc); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1616 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1617 event->button, event->time); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1618 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1619 |
10504 | 1620 g_free(who); |
1621 gtk_tree_path_free(path); | |
1622 | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1623 return TRUE; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1624 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1625 |
8133 | 1626 static void |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1627 move_to_next_unread_tab(GaimGtkConversation *gtkconv, gboolean forward) |
8133 | 1628 { |
10827 | 1629 GaimGtkConversation *next_gtkconv = NULL; |
11581 | 1630 GaimGtkWindow *win; |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1631 int index, i, total, found = 0; |
8133 | 1632 |
11581 | 1633 win = gtkconv->win; |
1634 index = gtk_notebook_page_num(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont); | |
1635 total = gaim_gtk_conv_window_get_gtkconv_count(win); | |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1636 |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1637 /* First check the tabs after (forward) or before (!forward) this position. */ |
11620
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
1638 for (i = forward ? index + 1 : index - 1; |
11581 | 1639 !found && (next_gtkconv = gaim_gtk_conv_window_get_gtkconv_at_index(win, i)); |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1640 forward ? i++ : i--) { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1641 if (i == -1) { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1642 break; |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1643 } |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1644 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1645 if (next_gtkconv->unseen_state > 0) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1646 found = 1; |
8133 | 1647 } |
11252 | 1648 |
10893
3f85d6fc763a
[gaim-migrate @ 12606]
Luke Schierer <lschiere@pidgin.im>
parents:
10892
diff
changeset
|
1649 if (!found) { |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1650 /* Now check from the beginning up to (forward) or end back to (!forward) this position. */ |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1651 for (i = forward ? 0 : total - 1; |
11620
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
1652 !found && (forward ? i < index : i >= 0) && |
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
1653 (next_gtkconv = gaim_gtk_conv_window_get_gtkconv_at_index(win, i)); |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1654 forward ? i++ : i--) { |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1655 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1656 if (next_gtkconv->unseen_state > 0) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1657 found = 1; |
8133 | 1658 } |
10827 | 1659 |
10893
3f85d6fc763a
[gaim-migrate @ 12606]
Luke Schierer <lschiere@pidgin.im>
parents:
10892
diff
changeset
|
1660 if (!found) { |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1661 /* Okay, just grab the next (forward) or previous (!forward) conversation tab. */ |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1662 if (forward) { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1663 index++; |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1664 } |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1665 else { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1666 index = (index == 0) ? total - 1 : index - 1; |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1667 } |
11581 | 1668 if (!(next_gtkconv = gaim_gtk_conv_window_get_gtkconv_at_index(win, index))) |
1669 next_gtkconv = gaim_gtk_conv_window_get_gtkconv_at_index(win, 0); | |
10827 | 1670 } |
8133 | 1671 } |
1672 | |
10827 | 1673 if (next_gtkconv != NULL && next_gtkconv != gtkconv) |
11581 | 1674 gaim_gtk_conv_window_switch_gtkconv(win, next_gtkconv); |
8133 | 1675 } |
1676 | |
4359 | 1677 static gboolean |
8105 | 1678 entry_key_press_cb(GtkWidget *entry, GdkEventKey *event, gpointer data) |
4359 | 1679 { |
11581 | 1680 GaimGtkWindow *win; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
1681 GaimConversation *conv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
1682 GaimGtkConversation *gtkconv; |
8105 | 1683 int curconv; |
1684 | |
10810 | 1685 gtkconv = (GaimGtkConversation *)data; |
10849 | 1686 conv = gtkconv->active_conv; |
11581 | 1687 win = gtkconv->win; |
1688 curconv = gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook)); | |
10839 | 1689 |
8105 | 1690 /* If CTRL was held down... */ |
1691 if (event->state & GDK_CONTROL_MASK) { | |
4359 | 1692 switch (event->keyval) { |
1693 case GDK_Up: | |
1694 if (!conv->send_history) | |
1695 break; | |
1696 | |
1697 if (!conv->send_history->prev) { | |
1698 GtkTextIter start, end; | |
1699 | |
1700 if (conv->send_history->data) | |
1701 g_free(conv->send_history->data); | |
1702 | |
1703 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, | |
1704 &start); | |
1705 gtk_text_buffer_get_end_iter(gtkconv->entry_buffer, &end); | |
1706 | |
1707 conv->send_history->data = | |
8506 | 1708 gtk_imhtml_get_markup(GTK_IMHTML(gtkconv->entry)); |
4359 | 1709 } |
8677 | 1710 |
11276
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1711 if (conv->send_history->next && conv->send_history->next->data) { |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1712 GObject *object; |
8677 | 1713 GtkTextIter iter; |
1714 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); | |
4359 | 1715 |
1716 conv->send_history = conv->send_history->next; | |
11276
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1717 |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1718 /* Block the signal to prevent application of default formatting. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1719 object = g_object_ref(G_OBJECT(gtkconv->entry)); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1720 g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1721 NULL, gtkconv); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1722 /* Clear the formatting. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1723 gtk_imhtml_clear_formatting(GTK_IMHTML(gtkconv->entry)); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1724 /* Unblock the signal. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1725 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1726 NULL, gtkconv); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1727 g_object_unref(object); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1728 |
8061 | 1729 gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1730 gtk_imhtml_append_text_with_images( |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1731 GTK_IMHTML(gtkconv->entry), conv->send_history->data, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1732 0, NULL); |
8677 | 1733 /* this is mainly just a hack so the formatting at the |
1734 * cursor gets picked up. */ | |
1735 gtk_text_buffer_get_end_iter(buffer, &iter); | |
1736 gtk_text_buffer_move_mark_by_name(buffer, "insert", &iter); | |
4359 | 1737 } |
1738 | |
8105 | 1739 return TRUE; |
4359 | 1740 break; |
1741 | |
1742 case GDK_Down: | |
1743 if (!conv->send_history) | |
1744 break; | |
1745 | |
11276
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1746 if (conv->send_history->prev && conv->send_history->prev->data) { |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1747 GObject *object; |
8677 | 1748 GtkTextIter iter; |
1749 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); | |
8105 | 1750 |
4359 | 1751 conv->send_history = conv->send_history->prev; |
11276
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1752 |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1753 /* Block the signal to prevent application of default formatting. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1754 object = g_object_ref(G_OBJECT(gtkconv->entry)); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1755 g_signal_handlers_block_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1756 NULL, gtkconv); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1757 /* Clear the formatting. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1758 gtk_imhtml_clear_formatting(GTK_IMHTML(gtkconv->entry)); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1759 /* Unblock the signal. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1760 g_signal_handlers_unblock_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1761 NULL, gtkconv); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1762 g_object_unref(object); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1763 |
8105 | 1764 gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1765 gtk_imhtml_append_text_with_images( |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1766 GTK_IMHTML(gtkconv->entry), conv->send_history->data, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1767 0, NULL); |
8677 | 1768 /* this is mainly just a hack so the formatting at the |
1769 * cursor gets picked up. */ | |
11267
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1770 if (*(char *)conv->send_history->data) { |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1771 gtk_text_buffer_get_end_iter(buffer, &iter); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1772 gtk_text_buffer_move_mark_by_name(buffer, "insert", &iter); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1773 } else { |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1774 /* Restore the default formatting */ |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1775 default_formatize(gtkconv); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1776 } |
4359 | 1777 } |
1778 | |
8105 | 1779 return TRUE; |
4359 | 1780 break; |
8105 | 1781 |
8108 | 1782 case GDK_Page_Down: |
8143 | 1783 case ']': |
11581 | 1784 if (!gaim_gtk_conv_window_get_gtkconv_at_index(win, curconv + 1)) |
1785 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); | |
10827 | 1786 else |
11581 | 1787 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv + 1); |
8105 | 1788 return TRUE; |
1789 break; | |
1790 | |
8108 | 1791 case GDK_Page_Up: |
8143 | 1792 case '[': |
11581 | 1793 if (!gaim_gtk_conv_window_get_gtkconv_at_index(win, curconv - 1)) |
1794 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), -1); | |
10827 | 1795 else |
11581 | 1796 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv - 1); |
8133 | 1797 return TRUE; |
1798 break; | |
1799 | |
8108 | 1800 case GDK_Tab: |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1801 case GDK_ISO_Left_Tab: |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1802 if (event->state & GDK_SHIFT_MASK) { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1803 move_to_next_unread_tab(gtkconv, FALSE); |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1804 } else { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1805 move_to_next_unread_tab(gtkconv, TRUE); |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1806 } |
8108 | 1807 |
1808 return TRUE; | |
1809 break; | |
1810 | |
11252 | 1811 case GDK_comma: |
11581 | 1812 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), |
1813 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), | |
11252 | 1814 curconv - 1); |
1815 break; | |
1816 | |
1817 case GDK_period: | |
11581 | 1818 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), |
1819 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), | |
11780 | 1820 #if GTK_CHECK_VERSION(2,2,0) |
11581 | 1821 (curconv + 1) % gtk_notebook_get_n_pages(GTK_NOTEBOOK(win->notebook))); |
11780 | 1822 #else |
1823 (curconv + 1) % g_list_length(GTK_NOTEBOOK(win->notebook)->children)); | |
1824 #endif | |
11252 | 1825 break; |
1826 | |
8105 | 1827 } /* End of switch */ |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1828 } |
8758 | 1829 |
8105 | 1830 /* If ALT (or whatever) was held down... */ |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1831 else if (event->state & GDK_MOD1_MASK) |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1832 { |
10864 | 1833 if (event->keyval > '0' && event->keyval <= '9') |
1834 { | |
8105 | 1835 int switchto = event->keyval - '1'; |
11581 | 1836 if (switchto < gaim_gtk_conv_window_get_gtkconv_count(win)) |
1837 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), switchto); | |
4359 | 1838 |
1839 return TRUE; | |
1840 } | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1841 } |
8758 | 1842 |
8105 | 1843 /* If neither CTRL nor ALT were held down... */ |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1844 else |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1845 { |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1846 switch (event->keyval) |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1847 { |
10678
210e38f53b7b
[gaim-migrate @ 12221]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10666
diff
changeset
|
1848 case GDK_Tab: |
9605 | 1849 return tab_complete(conv); |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1850 break; |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1851 |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1852 case GDK_Page_Up: |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1853 gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml)); |
8105 | 1854 return TRUE; |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1855 break; |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1856 |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1857 case GDK_Page_Down: |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1858 gtk_imhtml_page_down(GTK_IMHTML(gtkconv->imhtml)); |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1859 return TRUE; |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1860 break; |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1861 |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1862 } |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1863 } |
4359 | 1864 return FALSE; |
1865 } | |
1866 | |
1867 /* | |
1868 * NOTE: | |
6725
e62a504c83d0
[gaim-migrate @ 7252]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1869 * This guy just kills a single right click from being propagated any |
e62a504c83d0
[gaim-migrate @ 7252]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1870 * further. I have no idea *why* we need this, but we do ... It |
4359 | 1871 * prevents right clicks on the GtkTextView in a convo dialog from |
6725
e62a504c83d0
[gaim-migrate @ 7252]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1872 * going all the way down to the notebook. I suspect a bug in |
4359 | 1873 * GtkTextView, but I'm not ready to point any fingers yet. |
1874 */ | |
1875 static gboolean | |
1876 entry_stop_rclick_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) | |
1877 { | |
1878 if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { | |
1879 /* Right single click */ | |
1880 g_signal_stop_emission_by_name(G_OBJECT(widget), "button_press_event"); | |
1881 | |
1882 return TRUE; | |
1883 } | |
1884 | |
1885 return FALSE; | |
1886 } | |
1887 | |
8173 | 1888 /* |
1889 * If someone tries to type into the conversation backlog of a | |
1890 * conversation window then we yank focus from the conversation backlog | |
1891 * and give it to the text entry box so that people can type | |
1892 * all the live long day and it will get entered into the entry box. | |
1893 */ | |
6057 | 1894 static gboolean |
8105 | 1895 refocus_entry_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) |
6057 | 1896 { |
1897 GaimGtkConversation *gtkconv = data; | |
1898 | |
8237 | 1899 /* If we have a valid key for the conversation display, then exit */ |
8224 | 1900 if ((event->state & GDK_CONTROL_MASK) || |
8237 | 1901 (event->keyval == GDK_F10) || |
1902 (event->keyval == GDK_Shift_L) || | |
1903 (event->keyval == GDK_Shift_R) || | |
1904 (event->keyval == GDK_Escape) || | |
8177 | 1905 (event->keyval == GDK_Up) || |
1906 (event->keyval == GDK_Down) || | |
1907 (event->keyval == GDK_Left) || | |
8191 | 1908 (event->keyval == GDK_Right) || |
1909 (event->keyval == GDK_Home) || | |
9297 | 1910 (event->keyval == GDK_End) || |
1911 (event->keyval == GDK_Tab) || | |
1912 (event->keyval == GDK_ISO_Left_Tab)) | |
8177 | 1913 return FALSE; |
1914 | |
1915 if (event->type == GDK_KEY_RELEASE) | |
1916 gtk_widget_grab_focus(gtkconv->entry); | |
1917 | |
1918 gtk_widget_event(gtkconv->entry, (GdkEvent *)event); | |
1919 | |
1920 return TRUE; | |
6057 | 1921 } |
1922 | |
4359 | 1923 static void |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1924 gaim_gtkconv_set_active_conversation(GaimConversation *conv) |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1925 { |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1926 GaimGtkConversation *gtkconv; |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1927 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1928 g_return_if_fail(conv != NULL); |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1929 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1930 gtkconv = GAIM_GTK_CONVERSATION(conv); |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1931 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1932 if (gtkconv->active_conv == conv) |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1933 return; |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1934 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1935 gaim_conversation_close_logs(gtkconv->active_conv); |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1936 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1937 gtkconv->active_conv = conv; |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1938 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1939 gaim_conversation_set_logging(conv, |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1940 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(gtkconv->win->menu.logging))); |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1941 } |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1942 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1943 static void |
11604 | 1944 gaim_gtkconv_switch_active_conversation(GaimConversation *conv) |
1945 { | |
1946 GaimGtkConversation *gtkconv; | |
1947 | |
1948 g_return_if_fail(conv != NULL); | |
1949 | |
1950 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1951 | |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1952 gaim_gtkconv_set_active_conversation(conv); |
11604 | 1953 |
1954 gray_stuff_out(gtkconv); | |
1955 update_typing_icon(gtkconv); | |
1956 | |
1957 gtk_window_set_title(GTK_WINDOW(gtkconv->win->window), | |
1958 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label))); | |
1959 | |
11671
4ebd27e664c4
[gaim-migrate @ 13957]
Luke Schierer <lschiere@pidgin.im>
parents:
11669
diff
changeset
|
1960 gaim_conversation_update(conv, GAIM_CONV_UPDATE_ACCOUNT); |
11604 | 1961 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry), |
1962 gaim_account_get_protocol_name(conv->account)); | |
1963 } | |
1964 | |
1965 static void | |
4673 | 1966 menu_conv_sel_send_cb(GObject *m, gpointer data) |
4359 | 1967 { |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
1968 GaimAccount *account = g_object_get_data(m, "gaim_account"); |
11594 | 1969 gchar *name = g_object_get_data(m, "gaim_buddy_name"); |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
1970 GaimConversation *conv; |
4359 | 1971 |
10059
79fafe47d919
[gaim-migrate @ 11027]
Luke Schierer <lschiere@pidgin.im>
parents:
10053
diff
changeset
|
1972 if (gtk_check_menu_item_get_active((GtkCheckMenuItem*) m) == FALSE) |
79fafe47d919
[gaim-migrate @ 11027]
Luke Schierer <lschiere@pidgin.im>
parents:
10053
diff
changeset
|
1973 return; |
79fafe47d919
[gaim-migrate @ 11027]
Luke Schierer <lschiere@pidgin.im>
parents:
10053
diff
changeset
|
1974 |
11594 | 1975 conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, account, name); |
11604 | 1976 gaim_gtkconv_switch_active_conversation(conv); |
4359 | 1977 } |
1978 | |
1979 static void | |
1980 insert_text_cb(GtkTextBuffer *textbuffer, GtkTextIter *position, | |
1981 gchar *new_text, gint new_text_length, gpointer user_data) | |
1982 { | |
10810 | 1983 GaimGtkConversation *gtkconv = (GaimGtkConversation *)user_data; |
1984 GaimConversation *conv; | |
1985 | |
1986 g_return_if_fail(gtkconv != NULL); | |
11508 | 1987 |
10810 | 1988 conv = gtkconv->active_conv; |
4359 | 1989 |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
1990 if (!gaim_prefs_get_bool("/core/conversations/im/send_typing")) |
4359 | 1991 return; |
1992 | |
10810 | 1993 got_typing_keypress(gtkconv, (gtk_text_iter_is_start(position) && |
1994 gtk_text_iter_is_end(position))); | |
4359 | 1995 } |
1996 | |
1997 static void | |
1998 delete_text_cb(GtkTextBuffer *textbuffer, GtkTextIter *start_pos, | |
1999 GtkTextIter *end_pos, gpointer user_data) | |
2000 { | |
10810 | 2001 GaimGtkConversation *gtkconv = (GaimGtkConversation *)user_data; |
2002 GaimConversation *conv; | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2003 GaimConvIm *im; |
4359 | 2004 |
10810 | 2005 g_return_if_fail(gtkconv != NULL); |
11508 | 2006 |
10810 | 2007 conv = gtkconv->active_conv; |
4359 | 2008 |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
2009 if (!gaim_prefs_get_bool("/core/conversations/im/send_typing")) |
4359 | 2010 return; |
2011 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2012 im = GAIM_CONV_IM(conv); |
4359 | 2013 |
2014 if (gtk_text_iter_is_start(start_pos) && gtk_text_iter_is_end(end_pos)) { | |
2015 | |
2016 /* We deleted all the text, so turn off typing. */ | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2017 if (gaim_conv_im_get_type_again_timeout(im)) |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2018 gaim_conv_im_stop_type_again_timeout(im); |
4359 | 2019 |
2020 serv_send_typing(gaim_conversation_get_gc(conv), | |
6695 | 2021 gaim_conversation_get_name(conv), |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
2022 GAIM_NOT_TYPING); |
4359 | 2023 } |
2024 else { | |
2025 /* We're deleting, but not all of it, so it counts as typing. */ | |
10810 | 2026 got_typing_keypress(gtkconv, FALSE); |
4359 | 2027 } |
2028 } | |
2029 | |
8189 | 2030 /************************************************************************** |
2031 * A bunch of buddy icon functions | |
2032 **************************************************************************/ | |
11581 | 2033 GdkPixbuf * |
2034 gaim_gtkconv_get_tab_icon(GaimConversation *conv, gboolean small_icon) | |
7143 | 2035 { |
10116 | 2036 GaimAccount *account = NULL; |
2037 const char *name = NULL; | |
7143 | 2038 GdkPixbuf *status = NULL; |
2039 | |
10116 | 2040 g_return_val_if_fail(conv != NULL, NULL); |
2041 | |
2042 account = gaim_conversation_get_account(conv); | |
2043 name = gaim_conversation_get_name(conv); | |
2044 | |
2045 g_return_val_if_fail(account != NULL, NULL); | |
2046 g_return_val_if_fail(name != NULL, NULL); | |
2047 | |
11338 | 2048 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { |
7143 | 2049 GaimBuddy *b = gaim_find_buddy(account, name); |
2050 if (b != NULL) { | |
2051 status = gaim_gtk_blist_get_status_icon((GaimBlistNode*)b, | |
8755
d0364feabf96
[gaim-migrate @ 9510]
Christian Hammond <chipx86@chipx86.com>
parents:
8748
diff
changeset
|
2052 (small_icon ? GAIM_STATUS_ICON_SMALL : GAIM_STATUS_ICON_LARGE)); |
7143 | 2053 } |
2054 } | |
2055 | |
2056 if (!status) { | |
2057 GdkPixbuf *pixbuf; | |
10884 | 2058 pixbuf = gaim_gtk_create_prpl_icon(account); |
7143 | 2059 |
8755
d0364feabf96
[gaim-migrate @ 9510]
Christian Hammond <chipx86@chipx86.com>
parents:
8748
diff
changeset
|
2060 if (small_icon && pixbuf != NULL) |
8748
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2061 { |
7143 | 2062 status = gdk_pixbuf_scale_simple(pixbuf, 15, 15, |
2063 GDK_INTERP_BILINEAR); | |
2064 g_object_unref(pixbuf); | |
2065 } | |
8748
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2066 else |
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2067 status = pixbuf; |
7143 | 2068 } |
2069 return status; | |
2070 } | |
2071 | |
8189 | 2072 static void |
2073 update_tab_icon(GaimConversation *conv) | |
2074 { | |
2075 GaimGtkConversation *gtkconv; | |
11581 | 2076 GaimGtkWindow *win; |
8189 | 2077 GaimAccount *account; |
2078 const char *name; | |
2079 GdkPixbuf *status = NULL; | |
2080 | |
10116 | 2081 g_return_if_fail(conv != NULL); |
2082 | |
8189 | 2083 gtkconv = GAIM_GTK_CONVERSATION(conv); |
11581 | 2084 win = gtkconv->win; |
8189 | 2085 name = gaim_conversation_get_name(conv); |
2086 account = gaim_conversation_get_account(conv); | |
2087 | |
11581 | 2088 status = gaim_gtkconv_get_tab_icon(conv, TRUE); |
8189 | 2089 |
10116 | 2090 g_return_if_fail(status != NULL); |
2091 | |
8189 | 2092 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->icon), status); |
2093 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->menu_icon), status); | |
2094 | |
8748
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2095 if (status != NULL) |
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2096 g_object_unref(status); |
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2097 |
11581 | 2098 if (gaim_gtk_conv_window_get_active_conversation(win) == conv && |
11338 | 2099 (gaim_conversation_get_type(conv) != GAIM_CONV_TYPE_IM || |
10504 | 2100 gtkconv->u.im->anim == NULL)) |
8748
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2101 { |
11581 | 2102 status = gaim_gtkconv_get_tab_icon(conv, FALSE); |
2103 | |
2104 gtk_window_set_icon(GTK_WINDOW(win->window), status); | |
8189 | 2105 |
8748
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2106 if (status != NULL) |
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2107 g_object_unref(status); |
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2108 } |
8189 | 2109 } |
2110 | |
2111 static gboolean | |
2112 redraw_icon(gpointer data) | |
2113 { | |
10810 | 2114 GaimGtkConversation *gtkconv = (GaimGtkConversation *)data; |
2115 GaimConversation *conv = gtkconv->active_conv; | |
9318 | 2116 GaimAccount *account; |
2117 GaimPluginProtocolInfo *prpl_info = NULL; | |
8189 | 2118 |
2119 GdkPixbuf *buf; | |
2120 GdkPixbuf *scale; | |
2121 GdkPixmap *pm; | |
2122 GdkBitmap *bm; | |
2123 gint delay; | |
9318 | 2124 int scale_width, scale_height; |
8189 | 2125 |
2126 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
9318 | 2127 account = gaim_conversation_get_account(conv); |
2128 if(account && account->gc) | |
2129 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl); | |
8189 | 2130 |
2131 gdk_pixbuf_animation_iter_advance(gtkconv->u.im->iter, NULL); | |
2132 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter); | |
2133 | |
10483 | 2134 gaim_gtk_buddy_icon_get_scale_size(buf, prpl_info ? &prpl_info->icon_spec : |
9318 | 2135 NULL, &scale_width, &scale_height); |
2136 | |
2137 /* this code is ugly, and scares me */ | |
8189 | 2138 scale = gdk_pixbuf_scale_simple(buf, |
9318 | 2139 MAX(gdk_pixbuf_get_width(buf) * scale_width / |
8189 | 2140 gdk_pixbuf_animation_get_width(gtkconv->u.im->anim), 1), |
9318 | 2141 MAX(gdk_pixbuf_get_height(buf) * scale_height / |
8189 | 2142 gdk_pixbuf_animation_get_height(gtkconv->u.im->anim), 1), |
11324 | 2143 GDK_INTERP_BILINEAR); |
8189 | 2144 |
2145 gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 100); | |
2146 g_object_unref(G_OBJECT(scale)); | |
2147 gtk_image_set_from_pixmap(GTK_IMAGE(gtkconv->u.im->icon), pm, bm); | |
2148 g_object_unref(G_OBJECT(pm)); | |
2149 gtk_widget_queue_draw(gtkconv->u.im->icon); | |
2150 | |
2151 if (bm) | |
2152 g_object_unref(G_OBJECT(bm)); | |
2153 | |
9131 | 2154 delay = gdk_pixbuf_animation_iter_get_delay_time(gtkconv->u.im->iter); |
10639 | 2155 |
2156 if (delay < 100) | |
9131 | 2157 delay = 100; |
2158 | |
11799
a3c28707ef4d
[gaim-migrate @ 14090]
Gary Kramlich <grim@reaperworld.com>
parents:
11787
diff
changeset
|
2159 gtkconv->u.im->icon_timer = g_timeout_add(delay, redraw_icon, gtkconv); |
8189 | 2160 |
2161 return FALSE; | |
2162 } | |
2163 | |
2164 static void | |
10810 | 2165 start_anim(GtkObject *obj, GaimGtkConversation *gtkconv) |
8189 | 2166 { |
2167 int delay; | |
2168 | |
8228 | 2169 if (gtkconv->u.im->anim == NULL) |
2170 return; | |
2171 | |
8202 | 2172 if (gtkconv->u.im->icon_timer != 0) |
2173 return; | |
2174 | |
8189 | 2175 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) |
2176 return; | |
2177 | |
10639 | 2178 delay = gdk_pixbuf_animation_iter_get_delay_time(gtkconv->u.im->iter); |
2179 | |
2180 if (delay < 100) | |
2181 delay = 100; | |
2182 | |
11799
a3c28707ef4d
[gaim-migrate @ 14090]
Gary Kramlich <grim@reaperworld.com>
parents:
11787
diff
changeset
|
2183 gtkconv->u.im->icon_timer = g_timeout_add(delay, redraw_icon, gtkconv); |
8189 | 2184 } |
2185 | |
2186 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2187 remove_icon(GaimGtkConversation *gtkconv) |
8189 | 2188 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2189 GaimConversation *conv = gtkconv->active_conv; |
10456 | 2190 GaimGtkWindow *gtkwin; |
2191 | |
2192 g_return_if_fail(conv != NULL); | |
2193 | |
9887 | 2194 if (gtkconv->u.im->icon_container != NULL) |
2195 gtk_widget_destroy(gtkconv->u.im->icon_container); | |
8189 | 2196 |
2197 if (gtkconv->u.im->anim != NULL) | |
2198 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); | |
2199 | |
2200 if (gtkconv->u.im->icon_timer != 0) | |
2201 g_source_remove(gtkconv->u.im->icon_timer); | |
2202 | |
2203 if (gtkconv->u.im->iter != NULL) | |
2204 g_object_unref(G_OBJECT(gtkconv->u.im->iter)); | |
2205 | |
2206 gtkconv->u.im->icon_timer = 0; | |
2207 gtkconv->u.im->icon = NULL; | |
2208 gtkconv->u.im->anim = NULL; | |
2209 gtkconv->u.im->iter = NULL; | |
10456 | 2210 gtkconv->u.im->icon_container = NULL; |
9687 | 2211 gtkconv->u.im->show_icon = FALSE; |
10456 | 2212 |
11581 | 2213 gtkwin = gtkconv->win; |
10456 | 2214 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkwin->menu.show_icon), FALSE); |
8189 | 2215 } |
2216 | |
9497 | 2217 static void |
9504 | 2218 saveicon_writefile_cb(void *user_data, const char *filename) |
9497 | 2219 { |
10810 | 2220 GaimGtkConversation *gtkconv = (GaimGtkConversation *)user_data; |
2221 GaimConversation *conv = gtkconv->active_conv; | |
9497 | 2222 FILE *fp; |
2223 GaimBuddyIcon *icon; | |
2224 const void *data; | |
2225 size_t len; | |
2226 | |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10572
diff
changeset
|
2227 if ((fp = g_fopen(filename, "wb")) == NULL) { |
9504 | 2228 gaim_notify_error(conv, NULL, _("Unable to open file."), NULL); |
9497 | 2229 return; |
2230 } | |
2231 | |
2232 icon = gaim_conv_im_get_icon(GAIM_CONV_IM(conv)); | |
2233 data = gaim_buddy_icon_get_data(icon, &len); | |
2234 | |
2235 if ((len <= 0) || (data == NULL)) { | |
9504 | 2236 gaim_notify_error(conv, NULL, _("Unable to save icon file to disk."), NULL); |
9497 | 2237 return; |
2238 } | |
2239 | |
2240 fwrite(data, 1, len, fp); | |
2241 fclose(fp); | |
2242 } | |
2243 | |
2244 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2245 icon_menu_save_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
9497 | 2246 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2247 GaimConversation *conv = gtkconv->active_conv; |
10953 | 2248 const gchar *ext; |
9497 | 2249 gchar *buf; |
2250 | |
2251 g_return_if_fail(conv != NULL); | |
9504 | 2252 |
10953 | 2253 ext = gaim_buddy_icon_get_type(gaim_conv_im_get_icon(GAIM_CONV_IM(conv))); |
2254 if (ext == NULL) | |
2255 ext = "icon"; | |
2256 | |
2257 buf = g_strdup_printf("%s.%s", gaim_normalize(conv->account, conv->name), ext); | |
9504 | 2258 |
2259 gaim_request_file(conv, _("Save Icon"), buf, TRUE, | |
11799
a3c28707ef4d
[gaim-migrate @ 14090]
Gary Kramlich <grim@reaperworld.com>
parents:
11787
diff
changeset
|
2260 G_CALLBACK(saveicon_writefile_cb), NULL, gtkconv); |
9497 | 2261 |
2262 g_free(buf); | |
2263 } | |
2264 | |
11581 | 2265 static void |
2266 stop_anim(GtkObject *obj, GaimGtkConversation *gtkconv) | |
2267 { | |
2268 if (gtkconv->u.im->icon_timer != 0) | |
2269 g_source_remove(gtkconv->u.im->icon_timer); | |
2270 | |
2271 gtkconv->u.im->icon_timer = 0; | |
2272 } | |
2273 | |
2274 | |
2275 static void | |
2276 toggle_icon_animate_cb(GtkWidget *w, GaimGtkConversation *gtkconv) | |
2277 { | |
2278 gtkconv->u.im->animate = | |
2279 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w)); | |
2280 | |
2281 if (gtkconv->u.im->animate) | |
2282 start_anim(NULL, gtkconv); | |
2283 else | |
2284 stop_anim(NULL, gtkconv); | |
2285 } | |
2286 | |
8189 | 2287 static gboolean |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2288 icon_menu(GtkObject *obj, GdkEventButton *e, GaimGtkConversation *gtkconv) |
8189 | 2289 { |
2290 static GtkWidget *menu = NULL; | |
2291 GtkWidget *button; | |
2292 | |
2293 if (e->button != 3 || e->type != GDK_BUTTON_PRESS) | |
2294 return FALSE; | |
2295 | |
2296 /* | |
2297 * If a menu already exists, destroy it before creating a new one, | |
2298 * thus freeing-up the memory it occupied. | |
2299 */ | |
2300 if (menu != NULL) | |
2301 gtk_widget_destroy(menu); | |
2302 | |
2303 menu = gtk_menu_new(); | |
2304 | |
2305 if (gtkconv->u.im->anim && | |
2306 !(gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim))) | |
2307 { | |
2308 gaim_new_check_item(menu, _("Animate"), | |
11799
a3c28707ef4d
[gaim-migrate @ 14090]
Gary Kramlich <grim@reaperworld.com>
parents:
11787
diff
changeset
|
2309 G_CALLBACK(toggle_icon_animate_cb), gtkconv, |
8189 | 2310 gtkconv->u.im->icon_timer); |
2311 } | |
2312 | |
2313 button = gtk_menu_item_new_with_label(_("Hide Icon")); | |
2314 g_signal_connect_swapped(G_OBJECT(button), "activate", | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2315 G_CALLBACK(remove_icon), gtkconv); |
8189 | 2316 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); |
2317 gtk_widget_show(button); | |
2318 | |
2319 gaim_new_item_from_stock(menu, _("Save Icon As..."), GTK_STOCK_SAVE_AS, | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2320 G_CALLBACK(icon_menu_save_cb), gtkconv, |
8189 | 2321 0, 0, NULL); |
2322 | |
2323 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); | |
2324 | |
2325 return TRUE; | |
2326 } | |
10456 | 2327 |
2328 static void | |
2329 menu_buddyicon_cb(gpointer data, guint action, GtkWidget *widget) | |
2330 { | |
11581 | 2331 GaimGtkWindow *win = data; |
10456 | 2332 GaimConversation *conv; |
2333 GaimGtkConversation *gtkconv; | |
2334 gboolean active; | |
2335 | |
11581 | 2336 conv = gaim_gtk_conv_window_get_active_conversation(win); |
10456 | 2337 |
2338 if (!conv) | |
2339 return; | |
2340 | |
11338 | 2341 g_return_if_fail(gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM); |
10456 | 2342 |
2343 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2344 | |
2345 active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); | |
2346 gtkconv->u.im->show_icon = active; | |
2347 if (active) | |
2348 gaim_gtkconv_update_buddy_icon(conv); | |
2349 else | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2350 remove_icon(gtkconv); |
10456 | 2351 } |
2352 | |
8189 | 2353 /************************************************************************** |
2354 * End of the bunch of buddy icon functions | |
2355 **************************************************************************/ | |
2356 | |
11581 | 2357 GaimGtkWindow * |
2358 gaim_gtkconv_get_window(GaimGtkConversation *gtkconv) | |
2359 { | |
2360 g_return_val_if_fail(gtkconv != NULL, NULL); | |
2361 return gtkconv->win; | |
2362 } | |
2363 | |
2364 static GtkItemFactoryEntry menu_items[] = | |
2365 { | |
2366 /* Conversation menu */ | |
2367 { N_("/_Conversation"), NULL, NULL, 0, "<Branch>" }, | |
2368 | |
2369 { N_("/Conversation/New Instant _Message..."), "<CTL>M", menu_new_conv_cb, | |
2370 0, "<StockItem>", GAIM_STOCK_IM }, | |
2371 | |
2372 { "/Conversation/sep0", NULL, NULL, 0, "<Separator>" }, | |
2373 | |
2374 { N_("/Conversation/_Find..."), NULL, menu_find_cb, 0, | |
2375 "<StockItem>", GTK_STOCK_FIND }, | |
2376 { N_("/Conversation/View _Log"), NULL, menu_view_log_cb, 0, NULL }, | |
2377 { N_("/Conversation/_Save As..."), NULL, menu_save_as_cb, 0, | |
2378 "<StockItem>", GTK_STOCK_SAVE_AS }, | |
2379 { N_("/Conversation/Clear"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR }, | |
2380 | |
2381 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>" }, | |
2382 | |
2383 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", GAIM_STOCK_FILE_TRANSFER }, | |
2384 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, | |
2385 0, NULL }, | |
2386 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0, | |
2387 "<StockItem>", GAIM_STOCK_INFO }, | |
2388 { N_("/Conversation/In_vite..."), NULL, menu_invite_cb, 0, | |
2389 "<StockItem>", GAIM_STOCK_INVITE }, | |
2390 | |
2391 { "/Conversation/sep2", NULL, NULL, 0, "<Separator>" }, | |
2392 | |
2393 { N_("/Conversation/Al_ias..."), NULL, menu_alias_cb, 0, | |
2394 "<StockItem>", GAIM_STOCK_EDIT }, | |
2395 { N_("/Conversation/_Block..."), NULL, menu_block_cb, 0, | |
2396 "<StockItem>", GAIM_STOCK_BLOCK }, | |
2397 { N_("/Conversation/_Add..."), NULL, menu_add_remove_cb, 0, | |
2398 "<StockItem>", GTK_STOCK_ADD }, | |
2399 { N_("/Conversation/_Remove..."), NULL, menu_add_remove_cb, 0, | |
2400 "<StockItem>", GTK_STOCK_REMOVE }, | |
2401 | |
2402 { "/Conversation/sep3", NULL, NULL, 0, "<Separator>" }, | |
2403 | |
2404 { N_("/Conversation/Insert Lin_k..."), NULL, menu_insert_link_cb, 0, | |
2405 "<StockItem>", GAIM_STOCK_LINK }, | |
2406 { N_("/Conversation/Insert Imag_e..."), NULL, menu_insert_image_cb, 0, | |
2407 "<StockItem>", GAIM_STOCK_IMAGE }, | |
2408 | |
2409 { "/Conversation/sep4", NULL, NULL, 0, "<Separator>" }, | |
2410 | |
2411 { N_("/Conversation/_Close"), NULL, menu_close_conv_cb, 0, | |
2412 "<StockItem>", GTK_STOCK_CLOSE }, | |
2413 | |
2414 /* Options */ | |
2415 { N_("/_Options"), NULL, NULL, 0, "<Branch>" }, | |
2416 { N_("/Options/Enable _Logging"), NULL, menu_logging_cb, 0, "<CheckItem>" }, | |
2417 { N_("/Options/Enable _Sounds"), NULL, menu_sounds_cb, 0, "<CheckItem>" }, | |
2418 { N_("/Options/Show Formatting _Toolbars"), NULL, menu_toolbar_cb, 0, "<CheckItem>" }, | |
2419 { N_("/Options/Show Ti_mestamps"), "F2", menu_timestamps_cb, 0, "<CheckItem>" }, | |
2420 { N_("/Options/Show Buddy _Icon"), NULL, menu_buddyicon_cb, 0, "<CheckItem>" }, | |
2421 }; | |
2422 | |
2423 static const int menu_item_count = | |
2424 sizeof(menu_items) / sizeof(*menu_items); | |
2425 | |
2426 static char * | |
2427 item_factory_translate_func (const char *path, gpointer func_data) | |
2428 { | |
2429 return _((char *)path); | |
2430 } | |
2431 | |
2432 static GtkWidget * | |
2433 setup_menubar(GaimGtkWindow *win) | |
2434 { | |
2435 GtkAccelGroup *accel_group; | |
2436 | |
2437 accel_group = gtk_accel_group_new (); | |
2438 gtk_window_add_accel_group(GTK_WINDOW(win->window), accel_group); | |
2439 g_object_unref(accel_group); | |
2440 | |
2441 win->menu.item_factory = | |
2442 gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group); | |
2443 | |
2444 gtk_item_factory_set_translate_func(win->menu.item_factory, | |
2445 item_factory_translate_func, | |
2446 NULL, NULL); | |
2447 | |
2448 gtk_item_factory_create_items(win->menu.item_factory, menu_item_count, | |
2449 menu_items, win); | |
2450 g_signal_connect(G_OBJECT(accel_group), "accel-changed", | |
2451 G_CALLBACK(gaim_gtk_save_accels_cb), NULL); | |
2452 | |
2453 | |
2454 win->menu.menubar = | |
2455 gtk_item_factory_get_widget(win->menu.item_factory, "<main>"); | |
2456 | |
2457 | |
2458 win->menu.view_log = | |
2459 gtk_item_factory_get_widget(win->menu.item_factory, | |
2460 N_("/Conversation/View Log")); | |
2461 | |
2462 /* --- */ | |
2463 | |
2464 win->menu.send_file = | |
2465 gtk_item_factory_get_widget(win->menu.item_factory, | |
2466 N_("/Conversation/Send File...")); | |
2467 | |
2468 win->menu.add_pounce = | |
2469 gtk_item_factory_get_widget(win->menu.item_factory, | |
2470 N_("/Conversation/Add Buddy Pounce...")); | |
2471 | |
2472 /* --- */ | |
2473 | |
2474 win->menu.get_info = | |
2475 gtk_item_factory_get_widget(win->menu.item_factory, | |
2476 N_("/Conversation/Get Info")); | |
2477 | |
2478 win->menu.invite = | |
2479 gtk_item_factory_get_widget(win->menu.item_factory, | |
2480 N_("/Conversation/Invite...")); | |
2481 | |
2482 /* --- */ | |
2483 | |
2484 win->menu.alias = | |
2485 gtk_item_factory_get_widget(win->menu.item_factory, | |
2486 N_("/Conversation/Alias...")); | |
2487 | |
2488 win->menu.block = | |
2489 gtk_item_factory_get_widget(win->menu.item_factory, | |
2490 N_("/Conversation/Block...")); | |
2491 | |
2492 win->menu.add = | |
2493 gtk_item_factory_get_widget(win->menu.item_factory, | |
2494 N_("/Conversation/Add...")); | |
2495 | |
2496 win->menu.remove = | |
2497 gtk_item_factory_get_widget(win->menu.item_factory, | |
2498 N_("/Conversation/Remove...")); | |
2499 | |
2500 /* --- */ | |
2501 | |
2502 win->menu.insert_link = | |
2503 gtk_item_factory_get_widget(win->menu.item_factory, | |
2504 N_("/Conversation/Insert Link...")); | |
2505 | |
2506 win->menu.insert_image = | |
2507 gtk_item_factory_get_widget(win->menu.item_factory, | |
2508 N_("/Conversation/Insert Image...")); | |
2509 | |
2510 /* --- */ | |
2511 | |
2512 win->menu.logging = | |
2513 gtk_item_factory_get_widget(win->menu.item_factory, | |
2514 N_("/Options/Enable Logging")); | |
2515 win->menu.sounds = | |
2516 gtk_item_factory_get_widget(win->menu.item_factory, | |
2517 N_("/Options/Enable Sounds")); | |
2518 win->menu.show_formatting_toolbar = | |
2519 gtk_item_factory_get_widget(win->menu.item_factory, | |
2520 N_("/Options/Show Formatting Toolbars")); | |
2521 win->menu.show_timestamps = | |
2522 gtk_item_factory_get_widget(win->menu.item_factory, | |
2523 N_("/Options/Show Timestamps")); | |
2524 win->menu.show_icon = | |
2525 gtk_item_factory_get_widget(win->menu.item_factory, | |
2526 N_("/Options/Show Buddy Icon")); | |
2527 | |
2528 | |
2529 win->menu.tray = gaim_gtk_menu_tray_new(); | |
2530 gtk_menu_shell_append(GTK_MENU_SHELL(win->menu.menubar), | |
2531 win->menu.tray); | |
2532 gtk_widget_show(win->menu.tray); | |
2533 | |
2534 gtk_widget_show(win->menu.menubar); | |
2535 | |
2536 return win->menu.menubar; | |
2537 } | |
2538 | |
4359 | 2539 |
2540 /************************************************************************** | |
2541 * Utility functions | |
2542 **************************************************************************/ | |
2543 | |
2544 static void | |
10810 | 2545 got_typing_keypress(GaimGtkConversation *gtkconv, gboolean first) |
4359 | 2546 { |
10810 | 2547 GaimConversation *conv = gtkconv->active_conv; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2548 GaimConvIm *im; |
4685 | 2549 |
4359 | 2550 /* |
2551 * We know we got something, so we at least have to make sure we don't | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
2552 * send GAIM_TYPED any time soon. |
4359 | 2553 */ |
2554 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2555 im = GAIM_CONV_IM(conv); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2556 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2557 if (gaim_conv_im_get_type_again_timeout(im)) |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2558 gaim_conv_im_stop_type_again_timeout(im); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2559 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2560 gaim_conv_im_start_type_again_timeout(im); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2561 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2562 if (first || (gaim_conv_im_get_type_again(im) != 0 && |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2563 time(NULL) > gaim_conv_im_get_type_again(im))) { |
4359 | 2564 |
2565 int timeout = serv_send_typing(gaim_conversation_get_gc(conv), | |
2566 (char *)gaim_conversation_get_name(conv), | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
2567 GAIM_TYPING); |
4359 | 2568 |
2569 if (timeout) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2570 gaim_conv_im_set_type_again(im, time(NULL) + timeout); |
4359 | 2571 else |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2572 gaim_conv_im_set_type_again(im, 0); |
4359 | 2573 } |
2574 } | |
2575 | |
4736 | 2576 static void |
10810 | 2577 update_typing_icon(GaimGtkConversation *gtkconv) |
4736 | 2578 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2579 GaimGtkWindow *gtkwin; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2580 GaimConvIm *im = NULL; |
10810 | 2581 GaimConversation *conv = gtkconv->active_conv; |
11508 | 2582 |
11581 | 2583 gtkwin = gtkconv->win; |
4736 | 2584 |
11338 | 2585 if(gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2586 im = GAIM_CONV_IM(conv); |
4736 | 2587 |
11787
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2588 if(gtkwin->menu.typing_icon) { |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2589 gtk_widget_destroy(gtkwin->menu.typing_icon); |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2590 gtkwin->menu.typing_icon = NULL; |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2591 } |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2592 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2593 if(im && gaim_conv_im_get_typing_state(im) == GAIM_TYPING) { |
11787
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2594 gtkwin->menu.typing_icon = |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2595 gtk_image_new_from_stock(GAIM_STOCK_TYPING, GTK_ICON_SIZE_MENU); |
4757 | 2596 gtk_tooltips_set_tip(gtkconv->tooltips, gtkwin->menu.typing_icon, |
4736 | 2597 _("User is typing..."), NULL); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2598 } else if(im && gaim_conv_im_get_typing_state(im) == GAIM_TYPED) { |
11787
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2599 gtkwin->menu.typing_icon = |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2600 gtk_image_new_from_stock(GAIM_STOCK_TYPED, GTK_ICON_SIZE_MENU); |
4757 | 2601 gtk_tooltips_set_tip(gtkconv->tooltips, gtkwin->menu.typing_icon, |
4736 | 2602 _("User has typed something and paused"), NULL); |
11787
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2603 } |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2604 |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2605 if(gtkwin->menu.typing_icon) { |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2606 gtk_widget_show(gtkwin->menu.typing_icon); |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2607 gaim_gtk_menu_tray_append(GAIM_GTK_MENU_TRAY(gtkwin->menu.tray), |
c9188d3eb9d3
[gaim-migrate @ 14078]
Gary Kramlich <grim@reaperworld.com>
parents:
11780
diff
changeset
|
2608 gtkwin->menu.typing_icon); |
4736 | 2609 } |
2610 } | |
2611 | |
4685 | 2612 static gboolean |
11594 | 2613 update_send_to_selection(GaimGtkWindow *win) |
4359 | 2614 { |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
2615 GaimAccount *account; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2616 GaimConversation *conv; |
4359 | 2617 GtkWidget *menu; |
2618 GList *child; | |
11594 | 2619 GaimBuddy *b; |
11581 | 2620 |
2621 conv = gaim_gtk_conv_window_get_active_conversation(win); | |
4359 | 2622 |
5860
52d5fad43950
[gaim-migrate @ 6291]
Christian Hammond <chipx86@chipx86.com>
parents:
5858
diff
changeset
|
2623 if (conv == NULL) |
52d5fad43950
[gaim-migrate @ 6291]
Christian Hammond <chipx86@chipx86.com>
parents:
5858
diff
changeset
|
2624 return FALSE; |
5678
619bca773b2e
[gaim-migrate @ 6096]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
2625 |
619bca773b2e
[gaim-migrate @ 6096]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
2626 account = gaim_conversation_get_account(conv); |
11581 | 2627 |
11594 | 2628 if (win->menu.send_to == NULL) |
4685 | 2629 return FALSE; |
4364
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
2630 |
11594 | 2631 if (!(b = gaim_find_buddy(account, conv->name))) |
2632 return FALSE; | |
2633 | |
2634 | |
2635 gtk_widget_show(win->menu.send_to); | |
4359 | 2636 |
2637 menu = gtk_menu_item_get_submenu( | |
11594 | 2638 GTK_MENU_ITEM(win->menu.send_to)); |
4359 | 2639 |
2640 for (child = gtk_container_get_children(GTK_CONTAINER(menu)); | |
2641 child != NULL; | |
2642 child = child->next) { | |
2643 | |
2644 GtkWidget *item = child->data; | |
11594 | 2645 GaimBuddy *item_buddy; |
2646 GaimAccount *item_account = g_object_get_data(G_OBJECT(item), "gaim_account"); | |
2647 gchar *buddy_name = g_object_get_data(G_OBJECT(item), | |
2648 "gaim_buddy_name"); | |
2649 item_buddy = gaim_find_buddy(item_account, buddy_name); | |
2650 | |
2651 if (b == item_buddy) { | |
4359 | 2652 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); |
2653 break; | |
2654 } | |
2655 } | |
6030
54c37db13279
[gaim-migrate @ 6480]
Christian Hammond <chipx86@chipx86.com>
parents:
6016
diff
changeset
|
2656 |
4685 | 2657 return FALSE; |
4359 | 2658 } |
2659 | |
2660 static void | |
11594 | 2661 create_sendto_item(GtkWidget *menu, GtkSizeGroup *sg, GSList **group, GaimBuddy *bud) |
2662 { | |
2663 GaimAccount *account; | |
2664 GtkWidget *box; | |
2665 GtkWidget *label; | |
2666 GtkWidget *image; | |
2667 GtkWidget *menuitem; | |
11625 | 2668 GdkPixbuf *pixbuf; |
11616 | 2669 gchar *text; |
11594 | 2670 |
2671 account = bud->account; | |
2672 | |
2673 /* Create a pixmap for the protocol icon. */ | |
11625 | 2674 pixbuf = gaim_gtk_blist_get_status_icon((GaimBlistNode*)bud, GAIM_STATUS_ICON_SMALL); |
11594 | 2675 /* Now convert it to GtkImage */ |
2676 if (pixbuf == NULL) | |
2677 image = gtk_image_new(); | |
2678 else | |
11625 | 2679 image = gtk_image_new_from_pixbuf(pixbuf); |
11594 | 2680 |
2681 gtk_size_group_add_widget(sg, image); | |
2682 | |
2683 g_object_unref(G_OBJECT(pixbuf)); | |
2684 | |
2685 /* Make our menu item */ | |
11616 | 2686 text = g_strdup_printf("%s (%s)", gaim_buddy_get_name(bud), gaim_account_get_username(bud->account)); |
2687 menuitem = gtk_radio_menu_item_new_with_label(*group, text); | |
2688 g_free(text); | |
11594 | 2689 *group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); |
2690 | |
2691 /* Do some evil, see some evil, speak some evil. */ | |
2692 box = gtk_hbox_new(FALSE, 0); | |
2693 | |
2694 label = gtk_bin_get_child(GTK_BIN(menuitem)); | |
2695 g_object_ref(label); | |
2696 gtk_container_remove(GTK_CONTAINER(menuitem), label); | |
2697 | |
2698 gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); | |
2699 gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 4); | |
2700 | |
2701 g_object_unref(label); | |
2702 | |
2703 gtk_container_add(GTK_CONTAINER(menuitem), box); | |
2704 | |
2705 gtk_widget_show(label); | |
2706 gtk_widget_show(image); | |
2707 gtk_widget_show(box); | |
2708 | |
2709 /* Set our data and callbacks. */ | |
2710 g_object_set_data(G_OBJECT(menuitem), "gaim_account", account); | |
2711 g_object_set_data_full(G_OBJECT(menuitem), "gaim_buddy_name", g_strdup(gaim_buddy_get_name(bud)), g_free); | |
2712 | |
2713 g_signal_connect(G_OBJECT(menuitem), "activate", | |
2714 G_CALLBACK(menu_conv_sel_send_cb), NULL); | |
2715 | |
2716 gtk_widget_show(menuitem); | |
2717 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | |
2718 } | |
2719 | |
2720 static void | |
2721 generate_send_to_items(GaimGtkWindow *win) | |
11581 | 2722 { |
4359 | 2723 GtkWidget *menu; |
2724 GSList *group = NULL; | |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2725 GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
11594 | 2726 GaimGtkConversation *gtkconv; |
2727 GSList *l, *buds; | |
2728 | |
2729 g_return_if_fail(win != NULL); | |
2730 | |
2731 gtkconv = gaim_gtk_conv_window_get_active_gtkconv(win); | |
2732 | |
11604 | 2733 g_return_if_fail(gtkconv != NULL); |
2734 | |
11594 | 2735 if (win->menu.send_to != NULL) |
2736 gtk_widget_destroy(win->menu.send_to); | |
2737 | |
4359 | 2738 |
2739 /* Build the Send As menu */ | |
11594 | 2740 win->menu.send_to = gtk_menu_item_new_with_mnemonic(_("_Send To")); |
2741 gtk_widget_show(win->menu.send_to); | |
4359 | 2742 |
2743 menu = gtk_menu_new(); | |
11581 | 2744 gtk_menu_shell_insert(GTK_MENU_SHELL(win->menu.menubar), |
11594 | 2745 win->menu.send_to, 2); |
2746 gtk_menu_item_set_submenu(GTK_MENU_ITEM(win->menu.send_to), menu); | |
4359 | 2747 |
2748 gtk_widget_show(menu); | |
2749 | |
11604 | 2750 if (gtkconv->active_conv->type == GAIM_CONV_TYPE_IM) { |
2751 buds = gaim_find_buddies(gtkconv->active_conv->account, gtkconv->active_conv->name); | |
2752 for (l = buds; l != NULL; l = l->next) { | |
2753 GaimBuddy *b; | |
2754 GaimBlistNode *node; | |
2755 | |
2756 b = l->data; | |
2757 node = (GaimBlistNode *) gaim_buddy_get_contact(b); | |
2758 | |
2759 for (node = node->child; node != NULL; node = node->next) | |
2760 if (GAIM_BLIST_NODE_IS_BUDDY(node) && gaim_account_is_connected(((GaimBuddy *)node)->account)) | |
2761 create_sendto_item(menu, sg, &group, (GaimBuddy *) node); | |
2762 } | |
2763 | |
2764 g_slist_free(buds); | |
4359 | 2765 } |
2766 | |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2767 g_object_unref(sg); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2768 |
11594 | 2769 gtk_widget_show(win->menu.send_to); |
2770 if (!group) | |
2771 gtk_widget_set_sensitive(win->menu.send_to, FALSE); | |
2772 update_send_to_selection(win); | |
4359 | 2773 } |
2774 | |
2775 static GList * | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
2776 generate_invite_user_names(GaimConnection *gc) |
4359 | 2777 { |
6695 | 2778 GaimBlistNode *gnode,*cnode,*bnode; |
4359 | 2779 static GList *tmp = NULL; |
2780 | |
2781 if (tmp) | |
2782 g_list_free(tmp); | |
2783 | |
2784 tmp = g_list_append(NULL, ""); | |
2785 | |
2786 if (gc != NULL) { | |
4785 | 2787 for(gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
2788 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
2789 continue; | |
6695 | 2790 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
2791 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 2792 continue; |
6695 | 2793 for(bnode = cnode->child; bnode; bnode = bnode->next) { |
2794 GaimBuddy *buddy; | |
2795 | |
2796 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
2797 continue; | |
2798 | |
2799 buddy = (GaimBuddy *)bnode; | |
2800 | |
2801 if (buddy->account == gc->account && | |
2802 GAIM_BUDDY_IS_ONLINE(buddy)) | |
10572 | 2803 tmp = g_list_insert_sorted(tmp, buddy->name, |
2804 (GCompareFunc)g_utf8_collate); | |
6695 | 2805 } |
4359 | 2806 } |
2807 } | |
2808 } | |
2809 | |
2810 return tmp; | |
2811 } | |
2812 | |
9498 | 2813 static GdkPixbuf * |
9554 | 2814 get_chat_buddy_status_icon(GaimConvChat *chat, const char *name, GaimConvChatBuddyFlags flags) |
9498 | 2815 { |
9554 | 2816 GdkPixbuf *pixbuf, *scale, *scale2; |
9498 | 2817 char *filename; |
10274 | 2818 const char *image = NULL; |
9554 | 2819 |
2820 if (flags & GAIM_CBFLAGS_FOUNDER) { | |
10274 | 2821 image = "founder.png"; |
9554 | 2822 } else if (flags & GAIM_CBFLAGS_OP) { |
10274 | 2823 image = "op.png"; |
9554 | 2824 } else if (flags & GAIM_CBFLAGS_HALFOP) { |
10274 | 2825 image = "halfop.png"; |
9554 | 2826 } else if (flags & GAIM_CBFLAGS_VOICE) { |
10274 | 2827 image = "voice.png"; |
9554 | 2828 } else if ((!flags) && gaim_conv_chat_is_user_ignored(chat, name)) { |
10274 | 2829 image = "ignored.png"; |
2830 } else { | |
2831 return NULL; | |
9554 | 2832 } |
10274 | 2833 |
2834 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
2835 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
2836 g_free(filename); | |
2837 | |
2838 if (!pixbuf) | |
2839 return NULL; | |
2840 | |
2841 scale = gdk_pixbuf_scale_simple(pixbuf, 15, 15, GDK_INTERP_BILINEAR); | |
2842 g_object_unref(pixbuf); | |
2843 | |
2844 if (flags && gaim_conv_chat_is_user_ignored(chat, name)) { | |
2845 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "ignored.png", NULL); | |
9498 | 2846 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
2847 g_free(filename); | |
10274 | 2848 scale2 = gdk_pixbuf_scale_simple(pixbuf, 15, 15, GDK_INTERP_BILINEAR); |
9498 | 2849 g_object_unref(pixbuf); |
10274 | 2850 gdk_pixbuf_composite(scale2, scale, 0, 0, 15, 15, 0, 0, 1, 1, GDK_INTERP_BILINEAR, 192); |
2851 g_object_unref(scale2); | |
9498 | 2852 } |
2853 | |
10274 | 2854 return scale; |
9498 | 2855 } |
2856 | |
4359 | 2857 static void |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
2858 add_chat_buddy_common(GaimConversation *conv, const char *name, const char *alias, const char *old_name) |
4359 | 2859 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2860 GaimGtkConversation *gtkconv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2861 GaimGtkChatPane *gtkchat; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2862 GaimConvChat *chat; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2863 GaimConnection *gc; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2864 GaimPluginProtocolInfo *prpl_info; |
9554 | 2865 GaimConvChatBuddyFlags flags; |
4359 | 2866 GtkListStore *ls; |
9498 | 2867 GdkPixbuf *pixbuf; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2868 GtkTreeIter iter; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2869 gboolean is_me = FALSE; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2870 gboolean is_buddy; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2871 GdkColor send_color; |
11508 | 2872 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2873 gdk_color_parse(SEND_COLOR, &send_color); |
4359 | 2874 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2875 chat = GAIM_CONV_CHAT(conv); |
4359 | 2876 gtkconv = GAIM_GTK_CONVERSATION(conv); |
2877 gtkchat = gtkconv->u.chat; | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2878 gc = gaim_conversation_get_gc(conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2879 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2880 if (!gc || !(prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl))) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2881 return; |
4359 | 2882 |
2883 ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list))); | |
2884 | |
9554 | 2885 flags = gaim_conv_chat_user_get_flags(chat, name); |
2886 pixbuf = get_chat_buddy_status_icon(chat, name, flags); | |
9498 | 2887 |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
2888 if (!strcmp(chat->nick, gaim_normalize(conv->account, old_name != NULL ? old_name : name))) |
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
2889 is_me = TRUE; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2890 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2891 is_buddy = (gaim_find_buddy(conv->account, name) != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2892 |
4359 | 2893 gtk_list_store_append(ls, &iter); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2894 gtk_list_store_set(ls, &iter, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2895 CHAT_USERS_ICON_COLUMN, pixbuf, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2896 CHAT_USERS_ALIAS_COLUMN, alias, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2897 CHAT_USERS_NAME_COLUMN, name, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2898 CHAT_USERS_FLAGS_COLUMN, flags, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2899 CHAT_USERS_COLOR_COLUMN, is_me ? &send_color : get_nick_color(gtkconv, alias), |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2900 CHAT_USERS_BUDDY_COLUMN, is_buddy, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2901 -1); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2902 |
9554 | 2903 if (pixbuf) |
2904 g_object_unref(pixbuf); | |
4359 | 2905 } |
2906 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2907 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2908 tab_complete_process_item(int *most_matched, char *entered, char **partial, char *nick_partial, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2909 GList **matches, gboolean command, char *name) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2910 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2911 strncpy(nick_partial, name, strlen(entered)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2912 nick_partial[strlen(entered)] = '\0'; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2913 if (gaim_utf8_strcasecmp(nick_partial, entered)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2914 return; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2915 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2916 /* if we're here, it's a possible completion */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2917 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2918 if (*most_matched == -1) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2919 /* |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2920 * this will only get called once, since from now |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2921 * on *most_matched is >= 0 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2922 */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2923 *most_matched = strlen(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2924 *partial = g_strdup(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2925 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2926 else if (*most_matched) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2927 char *tmp = g_strdup(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2928 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2929 while (gaim_utf8_strcasecmp(tmp, *partial)) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2930 (*partial)[*most_matched] = '\0'; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2931 if (*most_matched < strlen(tmp)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2932 tmp[*most_matched] = '\0'; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2933 (*most_matched)--; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2934 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2935 (*most_matched)++; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2936 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2937 g_free(tmp); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2938 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2939 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2940 *matches = g_list_insert_sorted(*matches, g_strdup(name), |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2941 (GCompareFunc)gaim_utf8_strcasecmp); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2942 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2943 |
9605 | 2944 static gboolean |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2945 tab_complete(GaimConversation *conv) |
4359 | 2946 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2947 GaimGtkConversation *gtkconv; |
4359 | 2948 GtkTextIter cursor, word_start, start_buffer; |
2949 int start; | |
2950 int most_matched = -1; | |
2951 char *entered, *partial = NULL; | |
2952 char *text; | |
8021 | 2953 char *nick_partial; |
9605 | 2954 const char *prefix; |
4359 | 2955 GList *matches = NULL; |
9605 | 2956 gboolean command = FALSE; |
4359 | 2957 |
2958 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2959 | |
2960 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, &start_buffer); | |
2961 gtk_text_buffer_get_iter_at_mark(gtkconv->entry_buffer, &cursor, | |
2962 gtk_text_buffer_get_insert(gtkconv->entry_buffer)); | |
2963 | |
2964 word_start = cursor; | |
2965 | |
2966 /* if there's nothing there just return */ | |
2967 if (!gtk_text_iter_compare(&cursor, &start_buffer)) | |
11338 | 2968 return (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) ? TRUE : FALSE; |
6725
e62a504c83d0
[gaim-migrate @ 7252]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
2969 |
4359 | 2970 text = gtk_text_buffer_get_text(gtkconv->entry_buffer, &start_buffer, |
2971 &cursor, FALSE); | |
2972 | |
2973 /* if we're at the end of ": " we need to move back 2 spaces */ | |
2974 start = strlen(text) - 1; | |
2975 | |
8021 | 2976 if (strlen(text) >= 2 && !strncmp(&text[start-1], ": ", 2)) { |
4359 | 2977 gtk_text_iter_backward_chars(&word_start, 2); |
8021 | 2978 start-=2; |
2979 } | |
4359 | 2980 |
2981 /* find the start of the word that we're tabbing */ | |
2982 while (start >= 0 && text[start] != ' ') { | |
2983 gtk_text_iter_backward_char(&word_start); | |
2984 start--; | |
2985 } | |
2986 | |
9605 | 2987 prefix = gaim_gtk_get_cmd_prefix(); |
2988 if (start == -1 && (strlen(text) >= strlen(prefix)) && !strncmp(text, prefix, strlen(prefix))) { | |
2989 command = TRUE; | |
2990 gtk_text_iter_forward_chars(&word_start, strlen(prefix)); | |
2991 } | |
2992 | |
4359 | 2993 g_free(text); |
2994 | |
2995 entered = gtk_text_buffer_get_text(gtkconv->entry_buffer, &word_start, | |
2996 &cursor, FALSE); | |
2997 | |
8021 | 2998 if (!g_utf8_strlen(entered, -1)) { |
4359 | 2999 g_free(entered); |
11338 | 3000 return (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) ? TRUE : FALSE; |
4359 | 3001 } |
3002 | |
8021 | 3003 nick_partial = g_malloc(strlen(entered)+1); |
3004 | |
9605 | 3005 if (command) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3006 GList *list = gaim_cmd_list(conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3007 GList *l; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3008 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3009 /* Commands */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3010 for (l = list; l != NULL; l = l->next) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3011 tab_complete_process_item(&most_matched, entered, &partial, nick_partial, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3012 &matches, TRUE, l->data); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3013 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3014 g_list_free(list); |
11338 | 3015 } else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3016 GaimConvChat *chat = GAIM_CONV_CHAT(conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3017 GList *l = gaim_conv_chat_get_users(chat); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3018 GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(GAIM_GTK_CONVERSATION(conv)->u.chat->list)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3019 GtkTreeIter iter; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3020 int f; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3021 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3022 /* Users */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3023 for (; l != NULL; l = l->next) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3024 tab_complete_process_item(&most_matched, entered, &partial, nick_partial, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3025 &matches, TRUE, ((GaimConvChatBuddy *)l->data)->name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3026 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3027 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3028 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3029 /* Aliases */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3030 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3031 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3032 do { |
11460
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3033 char *name; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3034 char *alias; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3035 |
11460
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3036 gtk_tree_model_get(model, &iter, |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3037 CHAT_USERS_NAME_COLUMN, &name, |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3038 CHAT_USERS_ALIAS_COLUMN, &alias, |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3039 -1); |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3040 |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3041 if (strcmp(name, alias)) |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3042 tab_complete_process_item(&most_matched, entered, &partial, nick_partial, |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3043 &matches, FALSE, alias); |
11460
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3044 g_free(name); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3045 g_free(alias); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3046 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3047 f = gtk_tree_model_iter_next(model, &iter); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3048 } while (f != 0); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3049 } |
9605 | 3050 } else { |
3051 g_free(nick_partial); | |
3052 g_free(entered); | |
3053 return FALSE; | |
3054 } | |
3055 | |
8021 | 3056 g_free(nick_partial); |
3057 | |
4359 | 3058 /* we're only here if we're doing new style */ |
3059 | |
3060 /* if there weren't any matches, return */ | |
3061 if (!matches) { | |
3062 /* if matches isn't set partials won't be either */ | |
3063 g_free(entered); | |
11338 | 3064 return (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) ? TRUE : FALSE; |
4359 | 3065 } |
3066 | |
3067 gtk_text_buffer_delete(gtkconv->entry_buffer, &word_start, &cursor); | |
3068 | |
3069 if (!matches->next) { | |
3070 /* there was only one match. fill it in. */ | |
3071 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, &start_buffer); | |
3072 gtk_text_buffer_get_iter_at_mark(gtkconv->entry_buffer, &cursor, | |
3073 gtk_text_buffer_get_insert(gtkconv->entry_buffer)); | |
3074 | |
3075 if (!gtk_text_iter_compare(&cursor, &start_buffer)) { | |
3076 char *tmp = g_strdup_printf("%s: ", (char *)matches->data); | |
3077 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, tmp, -1); | |
3078 g_free(tmp); | |
3079 } | |
3080 else | |
3081 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, | |
3082 matches->data, -1); | |
3083 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3084 g_free(matches->data); |
4359 | 3085 matches = g_list_remove(matches, matches->data); |
3086 } | |
3087 else { | |
3088 /* | |
3089 * there were lots of matches, fill in as much as possible | |
3090 * and display all of them | |
3091 */ | |
3092 char *addthis = g_malloc0(1); | |
3093 | |
3094 while (matches) { | |
3095 char *tmp = addthis; | |
3096 addthis = g_strconcat(tmp, matches->data, " ", NULL); | |
3097 g_free(tmp); | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3098 g_free(matches->data); |
4359 | 3099 matches = g_list_remove(matches, matches->data); |
3100 } | |
3101 | |
6982 | 3102 gaim_conversation_write(conv, NULL, addthis, GAIM_MESSAGE_NO_LOG, |
4359 | 3103 time(NULL)); |
3104 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, partial, -1); | |
3105 g_free(addthis); | |
3106 } | |
3107 | |
3108 g_free(entered); | |
3109 g_free(partial); | |
9605 | 3110 |
3111 return TRUE; | |
4359 | 3112 } |
3113 | |
10810 | 3114 static void topic_callback(GtkWidget *w, GaimGtkConversation *gtkconv) |
7971 | 3115 { |
3116 GaimPluginProtocolInfo *prpl_info = NULL; | |
3117 GaimConnection *gc; | |
10810 | 3118 GaimConversation *conv = gtkconv->active_conv; |
7971 | 3119 GaimGtkChatPane *gtkchat; |
11261
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3120 char *new_topic; |
8858 | 3121 const char *current_topic; |
7971 | 3122 |
3123 gc = gaim_conversation_get_gc(conv); | |
3124 | |
3125 if(!gc || !(prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl))) | |
3126 return; | |
3127 | |
3128 if(prpl_info->set_chat_topic == NULL) | |
3129 return; | |
3130 | |
3131 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3132 gtkchat = gtkconv->u.chat; | |
11261
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3133 new_topic = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtkchat->topic_text))); |
8858 | 3134 current_topic = gaim_conv_chat_get_topic(GAIM_CONV_CHAT(conv)); |
3135 | |
11261
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3136 if(current_topic && !g_utf8_collate(new_topic, current_topic)){ |
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3137 g_free(new_topic); |
7971 | 3138 return; |
11261
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3139 } |
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3140 |
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3141 gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), current_topic); |
7971 | 3142 |
8858 | 3143 prpl_info->set_chat_topic(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)), |
3144 new_topic); | |
11261
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3145 |
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3146 g_free(new_topic); |
7971 | 3147 } |
3148 | |
9554 | 3149 static gint |
3150 sort_chat_users(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata) | |
3151 { | |
3152 GaimConvChatBuddyFlags f1 = 0, f2 = 0; | |
3153 char *user1 = NULL, *user2 = NULL; | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3154 gboolean buddy1 = FALSE, buddy2 = FALSE; |
9554 | 3155 gint ret = 0; |
3156 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3157 gtk_tree_model_get(model, a, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3158 CHAT_USERS_ALIAS_COLUMN, &user1, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3159 CHAT_USERS_FLAGS_COLUMN, &f1, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3160 CHAT_USERS_BUDDY_COLUMN, &buddy1, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3161 -1); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3162 gtk_tree_model_get(model, b, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3163 CHAT_USERS_ALIAS_COLUMN, &user2, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3164 CHAT_USERS_FLAGS_COLUMN, &f2, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3165 CHAT_USERS_BUDDY_COLUMN, &buddy2, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3166 -1); |
9554 | 3167 |
3168 if (user1 == NULL || user2 == NULL) { | |
3169 if (!(user1 == NULL && user2 == NULL)) | |
3170 ret = (user1 == NULL) ? -1: 1; | |
3171 } else if (f1 != f2) { | |
3172 /* sort more important users first */ | |
3173 ret = (f1 > f2) ? -1 : 1; | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3174 } else if (buddy1 != buddy2) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3175 ret = buddy1 ? -1 : 1; |
9554 | 3176 } else { |
10904 | 3177 ret = gaim_utf8_strcasecmp(user1, user2); |
9554 | 3178 } |
3179 | |
3180 g_free(user1); | |
3181 g_free(user2); | |
3182 | |
3183 return ret; | |
3184 } | |
3185 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3186 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3187 update_chat_alias(GaimBuddy *buddy, GaimConversation *conv, GaimConnection *gc, GaimPluginProtocolInfo *prpl_info) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3188 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3189 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
3190 GaimConvChat *chat = GAIM_CONV_CHAT(conv); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3191 GtkTreeModel *model; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3192 char *normalized_name; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3193 GtkTreeIter iter; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3194 int f; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3195 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3196 g_return_if_fail(buddy != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3197 g_return_if_fail(conv != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3198 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3199 /* This is safe because this callback is only used in chats, not IMs. */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3200 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkconv->u.chat->list)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3201 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3202 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3203 return; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3204 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3205 normalized_name = g_strdup(gaim_normalize(conv->account, buddy->name)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3206 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3207 do { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3208 char *name; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3209 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3210 gtk_tree_model_get(model, &iter, CHAT_USERS_NAME_COLUMN, &name, -1); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3211 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3212 if (!strcmp(normalized_name, gaim_normalize(conv->account, name))) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3213 const char *alias = name; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3214 GaimBuddy *buddy2; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3215 |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
3216 if (strcmp(chat->nick, gaim_normalize(conv->account, name))) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3217 /* This user is not me, so look into updating the alias. */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3218 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3219 if ((buddy2 = gaim_find_buddy(conv->account, name)) != NULL) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3220 alias = gaim_buddy_get_contact_alias(buddy2); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3221 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3222 gtk_list_store_set(GTK_LIST_STORE(model), &iter, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3223 CHAT_USERS_ALIAS_COLUMN, alias, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3224 CHAT_USERS_COLOR_COLUMN, get_nick_color(gtkconv, alias), |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3225 -1); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3226 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3227 g_free(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3228 break; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3229 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3230 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3231 f = gtk_tree_model_iter_next(model, &iter); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3232 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3233 g_free(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3234 } while (f != 0); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3235 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3236 g_free(normalized_name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3237 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3238 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3239 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3240 blist_node_aliased_cb(GaimBlistNode *node, const char *old_alias, GaimConversation *conv) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3241 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3242 GaimConnection *gc; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3243 GaimPluginProtocolInfo *prpl_info; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3244 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3245 g_return_if_fail(node != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3246 g_return_if_fail(conv != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3247 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3248 gc = gaim_conversation_get_gc(conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3249 g_return_if_fail(gc != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3250 g_return_if_fail(gc->prpl != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3251 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3252 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3253 if (prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3254 return; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3255 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3256 if (GAIM_BLIST_NODE_IS_CONTACT(node)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3257 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3258 GaimBlistNode *bnode; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3259 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3260 for(bnode = node->child; bnode; bnode = bnode->next) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3261 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3262 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3263 continue; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3264 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3265 update_chat_alias((GaimBuddy *)bnode, conv, gc, prpl_info); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3266 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3267 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3268 else if (GAIM_BLIST_NODE_IS_BUDDY(node)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3269 update_chat_alias((GaimBuddy *)node, conv, gc, prpl_info); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3270 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3271 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3272 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3273 buddy_cb_common(GaimBuddy *buddy, GaimConversation *conv, gboolean is_buddy) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3274 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3275 GtkTreeModel *model; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3276 char *normalized_name; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3277 GtkTreeIter iter; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3278 int f; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3279 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3280 g_return_if_fail(buddy != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3281 g_return_if_fail(conv != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3282 |
11846
908ff9b56e99
[gaim-migrate @ 14137]
Richard Laager <rlaager@wiktel.com>
parents:
11815
diff
changeset
|
3283 /* Do nothing if the buddy does not belong to the conv's account */ |
908ff9b56e99
[gaim-migrate @ 14137]
Richard Laager <rlaager@wiktel.com>
parents:
11815
diff
changeset
|
3284 if (gaim_buddy_get_account(buddy) != gaim_conversation_get_account(conv)) |
908ff9b56e99
[gaim-migrate @ 14137]
Richard Laager <rlaager@wiktel.com>
parents:
11815
diff
changeset
|
3285 return; |
908ff9b56e99
[gaim-migrate @ 14137]
Richard Laager <rlaager@wiktel.com>
parents:
11815
diff
changeset
|
3286 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3287 /* This is safe because this callback is only used in chats, not IMs. */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3288 model = gtk_tree_view_get_model(GTK_TREE_VIEW(GAIM_GTK_CONVERSATION(conv)->u.chat->list)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3289 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3290 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3291 return; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3292 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3293 normalized_name = g_strdup(gaim_normalize(conv->account, buddy->name)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3294 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3295 do { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3296 char *name; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3297 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3298 gtk_tree_model_get(model, &iter, CHAT_USERS_NAME_COLUMN, &name, -1); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3299 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3300 if (!strcmp(normalized_name, gaim_normalize(conv->account, name))) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3301 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CHAT_USERS_BUDDY_COLUMN, is_buddy, -1); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3302 g_free(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3303 break; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3304 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3305 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3306 f = gtk_tree_model_iter_next(model, &iter); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3307 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3308 g_free(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3309 } while (f != 0); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3310 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3311 g_free(normalized_name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3312 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3313 blist_node_aliased_cb((GaimBlistNode *)buddy, NULL, conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3314 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3315 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3316 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3317 buddy_added_cb(GaimBuddy *buddy, GaimConversation *conv) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3318 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3319 buddy_cb_common(buddy, conv, TRUE); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3320 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3321 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3322 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3323 buddy_removed_cb(GaimBuddy *buddy, GaimConversation *conv) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3324 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3325 /* If there's another buddy for the same "dude" on the list, do nothing. */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3326 if (gaim_find_buddy(buddy->account, buddy->name) != NULL) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3327 return; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3328 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3329 buddy_cb_common(buddy, conv, FALSE); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3330 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3331 |
4359 | 3332 static GtkWidget * |
10810 | 3333 setup_chat_pane(GaimGtkConversation *gtkconv) |
4359 | 3334 { |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5204
diff
changeset
|
3335 GaimPluginProtocolInfo *prpl_info = NULL; |
10810 | 3336 GaimConversation *conv = gtkconv->active_conv; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3337 GaimGtkChatPane *gtkchat; |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
3338 GaimConnection *gc; |
4359 | 3339 GtkWidget *vpaned, *hpaned; |
10175 | 3340 GtkWidget *vbox, *hbox, *frame; |
4359 | 3341 GtkWidget *lbox, *bbox; |
3342 GtkWidget *label; | |
3343 GtkWidget *list; | |
3344 GtkWidget *button; | |
7949 | 3345 GtkWidget *sw; |
4359 | 3346 GtkListStore *ls; |
3347 GtkCellRenderer *rend; | |
3348 GtkTreeViewColumn *col; | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3349 void *blist_handle = gaim_blist_get_handle(); |
9080 | 3350 GList *focus_chain = NULL; |
4359 | 3351 |
3352 gtkchat = gtkconv->u.chat; | |
3353 gc = gaim_conversation_get_gc(conv); | |
3354 | |
3355 /* Setup the outer pane. */ | |
3356 vpaned = gtk_vpaned_new(); | |
3357 gtk_widget_show(vpaned); | |
3358 | |
3359 /* Setup the top part of the pane. */ | |
11243 | 3360 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
8914 | 3361 gtk_paned_pack1(GTK_PANED(vpaned), vbox, TRUE, TRUE); |
4359 | 3362 gtk_widget_show(vbox); |
3363 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5204
diff
changeset
|
3364 if (gc != NULL) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5204
diff
changeset
|
3365 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5204
diff
changeset
|
3366 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5204
diff
changeset
|
3367 if (prpl_info->options & OPT_PROTO_CHAT_TOPIC) |
4359 | 3368 { |
11243 | 3369 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
8253
0c5977fd3101
[gaim-migrate @ 8976]
Christian Hammond <chipx86@chipx86.com>
parents:
8252
diff
changeset
|
3370 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
4359 | 3371 gtk_widget_show(hbox); |
3372 | |
3373 label = gtk_label_new(_("Topic:")); | |
8253
0c5977fd3101
[gaim-migrate @ 8976]
Christian Hammond <chipx86@chipx86.com>
parents:
8252
diff
changeset
|
3374 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
4359 | 3375 gtk_widget_show(label); |
3376 | |
3377 gtkchat->topic_text = gtk_entry_new(); | |
8253
0c5977fd3101
[gaim-migrate @ 8976]
Christian Hammond <chipx86@chipx86.com>
parents:
8252
diff
changeset
|
3378 |
7971 | 3379 if(prpl_info->set_chat_topic == NULL) { |
3380 gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE); | |
3381 } else { | |
3382 g_signal_connect(GTK_OBJECT(gtkchat->topic_text), "activate", | |
10810 | 3383 G_CALLBACK(topic_callback), gtkconv); |
7971 | 3384 } |
3385 | |
8253
0c5977fd3101
[gaim-migrate @ 8976]
Christian Hammond <chipx86@chipx86.com>
parents:
8252
diff
changeset
|
3386 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0); |
4359 | 3387 gtk_widget_show(gtkchat->topic_text); |
3388 } | |
3389 | |
3390 /* Setup the horizontal pane. */ | |
3391 hpaned = gtk_hpaned_new(); | |
8253
0c5977fd3101
[gaim-migrate @ 8976]
Christian Hammond <chipx86@chipx86.com>
parents:
8252
diff
changeset
|
3392 gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0); |
4359 | 3393 gtk_widget_show(hpaned); |
3394 | |
10175 | 3395 /* Setup gtkihmtml. */ |
3396 frame = gaim_gtk_create_imhtml(FALSE, >kconv->imhtml, NULL); | |
3397 gtk_widget_set_name(gtkconv->imhtml, "gaim_gtkconv_imhtml"); | |
10389 | 3398 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), TRUE); |
10175 | 3399 gtk_paned_pack1(GTK_PANED(hpaned), frame, TRUE, TRUE); |
3400 gtk_widget_show(frame); | |
3401 | |
3402 gtk_widget_set_size_request(gtkconv->imhtml, | |
5550
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5546
diff
changeset
|
3403 gaim_prefs_get_int("/gaim/gtk/conversations/chat/default_width"), |
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5546
diff
changeset
|
3404 gaim_prefs_get_int("/gaim/gtk/conversations/chat/default_height")); |
10175 | 3405 g_signal_connect(G_OBJECT(gtkconv->imhtml), "size-allocate", |
10810 | 3406 G_CALLBACK(size_allocate_cb), gtkconv); |
8914 | 3407 |
4359 | 3408 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event", |
3409 G_CALLBACK(entry_stop_rclick_cb), NULL); | |
8105 | 3410 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_press_event", |
6057 | 3411 G_CALLBACK(refocus_entry_cb), gtkconv); |
8109 | 3412 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_release_event", |
3413 G_CALLBACK(refocus_entry_cb), gtkconv); | |
4359 | 3414 |
3415 /* Build the right pane. */ | |
11243 | 3416 lbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
4409
0521eec12c33
[gaim-migrate @ 4682]
Christian Hammond <chipx86@chipx86.com>
parents:
4398
diff
changeset
|
3417 gtk_paned_pack2(GTK_PANED(hpaned), lbox, FALSE, TRUE); |
4359 | 3418 gtk_widget_show(lbox); |
3419 | |
3420 /* Setup the label telling how many people are in the room. */ | |
3421 gtkchat->count = gtk_label_new(_("0 people in room")); | |
3422 gtk_box_pack_start(GTK_BOX(lbox), gtkchat->count, FALSE, FALSE, 0); | |
3423 gtk_widget_show(gtkchat->count); | |
3424 | |
3425 /* Setup the list of users. */ | |
7949 | 3426 sw = gtk_scrolled_window_new(NULL, NULL); |
3427 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
8076 | 3428 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
7949 | 3429 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); |
3430 gtk_box_pack_start(GTK_BOX(lbox), sw, TRUE, TRUE, 0); | |
3431 gtk_widget_show(sw); | |
4359 | 3432 |
9554 | 3433 ls = gtk_list_store_new(CHAT_USERS_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3434 G_TYPE_STRING, G_TYPE_INT, GDK_TYPE_COLOR, G_TYPE_BOOLEAN); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3435 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_COLUMN, |
9554 | 3436 sort_chat_users, NULL, NULL); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3437 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_COLUMN, |
4359 | 3438 GTK_SORT_ASCENDING); |
3439 | |
3440 list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls)); | |
3441 | |
9498 | 3442 rend = gtk_cell_renderer_pixbuf_new(); |
3443 | |
4359 | 3444 col = gtk_tree_view_column_new_with_attributes(NULL, rend, |
9498 | 3445 "pixbuf", CHAT_USERS_ICON_COLUMN, NULL); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3446 gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_AUTOSIZE); |
9498 | 3447 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); |
4359 | 3448 |
3449 g_signal_connect(G_OBJECT(list), "button_press_event", | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
3450 G_CALLBACK(right_click_chat_cb), gtkconv); |
8143 | 3451 g_signal_connect(G_OBJECT(list), "popup-menu", |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
3452 G_CALLBACK(gtkconv_chat_popup_menu_cb), gtkconv); |
4359 | 3453 |
9498 | 3454 rend = gtk_cell_renderer_text_new(); |
3455 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3456 g_object_set(rend, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3457 "foreground-set", TRUE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3458 "weight", PANGO_WEIGHT_BOLD, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3459 NULL); |
4359 | 3460 col = gtk_tree_view_column_new_with_attributes(NULL, rend, |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3461 "text", CHAT_USERS_ALIAS_COLUMN, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3462 "foreground-gdk", CHAT_USERS_COLOR_COLUMN, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3463 "weight-set", CHAT_USERS_BUDDY_COLUMN, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3464 NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3465 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3466 gaim_signal_connect(blist_handle, "buddy-added", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3467 gtkchat, GAIM_CALLBACK(buddy_added_cb), conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3468 gaim_signal_connect(blist_handle, "buddy-removed", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3469 gtkchat, GAIM_CALLBACK(buddy_removed_cb), conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3470 gaim_signal_connect(blist_handle, "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3471 gtkchat, GAIM_CALLBACK(blist_node_aliased_cb), conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3472 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3473 #if GTK_CHECK_VERSION(2,6,0) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3474 gtk_tree_view_column_set_expand(col, TRUE); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3475 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3476 #endif |
4359 | 3477 |
3478 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); | |
3479 | |
3480 gtk_widget_set_size_request(list, 150, -1); | |
3481 | |
3482 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE); | |
3483 gtk_widget_show(list); | |
3484 | |
3485 gtkchat->list = list; | |
3486 | |
7949 | 3487 gtk_container_add(GTK_CONTAINER(sw), list); |
4359 | 3488 |
3489 /* Setup the user list toolbar. */ | |
11243 | 3490 bbox = gtk_hbox_new(TRUE, GAIM_HIG_BOX_SPACE); |
4359 | 3491 gtk_box_pack_start(GTK_BOX(lbox), bbox, FALSE, FALSE, 0); |
3492 gtk_widget_show(bbox); | |
3493 | |
3494 /* IM */ | |
10221 | 3495 button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_IM, |
4359 | 3496 GAIM_BUTTON_VERTICAL); |
10500 | 3497 gtkchat->userlist_im = button; |
4359 | 3498 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
3499 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
|
3500 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("IM the user"), NULL); |
4359 | 3501 g_signal_connect(G_OBJECT(button), "clicked", |
10810 | 3502 G_CALLBACK(chat_im_button_cb), gtkconv); |
4359 | 3503 |
3504 gtk_widget_show(button); | |
3505 | |
3506 /* Ignore */ | |
3507 button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_IGNORE, | |
3508 GAIM_BUTTON_VERTICAL); | |
10500 | 3509 gtkchat->userlist_ignore = button; |
4359 | 3510 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
3511 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
|
3512 gtk_tooltips_set_tip(gtkconv->tooltips, button, |
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
3513 _("Ignore the user"), NULL); |
4359 | 3514 g_signal_connect(G_OBJECT(button), "clicked", |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
3515 G_CALLBACK(ignore_cb), gtkconv); |
4359 | 3516 gtk_widget_show(button); |
3517 | |
3518 /* Info */ | |
3519 button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_INFO, | |
3520 GAIM_BUTTON_VERTICAL); | |
10500 | 3521 gtkchat->userlist_info = button; |
4359 | 3522 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
3523 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
3524 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
3525 _("Get the user's information"), NULL); |
4359 | 3526 g_signal_connect(G_OBJECT(button), "clicked", |
10810 | 3527 G_CALLBACK(info_cb), gtkconv); |
4359 | 3528 |
3529 gtk_widget_show(button); | |
3530 | |
10175 | 3531 /* Setup the bottom half of the conversation window */ |
11243 | 3532 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
8914 | 3533 gtk_paned_pack2(GTK_PANED(vpaned), vbox, FALSE, TRUE); |
4963
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3534 gtk_widget_show(vbox); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3535 |
11243 | 3536 gtkconv->lower_hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
9332 | 3537 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->lower_hbox, TRUE, TRUE, 0); |
3538 gtk_widget_show(gtkconv->lower_hbox); | |
3539 | |
11243 | 3540 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
9332 | 3541 gtk_box_pack_end(GTK_BOX(gtkconv->lower_hbox), vbox, TRUE, TRUE, 0); |
3542 gtk_widget_show(vbox); | |
3543 | |
10175 | 3544 /* Setup the toolbar, entry widget and all signals */ |
3545 frame = gaim_gtk_create_imhtml(TRUE, >kconv->entry, >kconv->toolbar); | |
10080 | 3546 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
10175 | 3547 gtk_widget_show(frame); |
3548 | |
9005 | 3549 gtk_widget_set_name(gtkconv->entry, "gaim_gtkconv_entry"); |
8456 | 3550 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry), |
9699 | 3551 gaim_account_get_protocol_name(conv->account)); |
10175 | 3552 gtk_widget_set_size_request(gtkconv->entry, -1, |
3553 gaim_prefs_get_int("/gaim/gtk/conversations/chat/entry_height")); | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
3554 gtkconv->entry_buffer = |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
3555 gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); |
10810 | 3556 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", gtkconv); |
7949 | 3557 |
3558 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", | |
10810 | 3559 G_CALLBACK(entry_key_press_cb), gtkconv); |
10115 | 3560 g_signal_connect(G_OBJECT(gtkconv->entry), "message_send", |
10810 | 3561 G_CALLBACK(send_cb), gtkconv); |
4359 | 3562 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", |
10810 | 3563 G_CALLBACK(entry_stop_rclick_cb), NULL); |
8914 | 3564 g_signal_connect(G_OBJECT(gtkconv->entry), "size-allocate", |
10810 | 3565 G_CALLBACK(size_allocate_cb), gtkconv); |
3566 | |
3567 default_formatize(gtkconv); | |
4359 | 3568 |
9080 | 3569 /* |
3570 * Focus for chat windows should be as follows: | |
3571 * Tab title -> chat topic -> conversation scrollback -> user list -> | |
3572 * user list buttons -> entry -> buttons at bottom | |
3573 */ | |
9332 | 3574 focus_chain = g_list_prepend(focus_chain, gtkconv->entry); |
9080 | 3575 gtk_container_set_focus_chain(GTK_CONTAINER(vbox), focus_chain); |
3576 | |
4359 | 3577 return vpaned; |
3578 } | |
3579 | |
3580 static GtkWidget * | |
10810 | 3581 setup_im_pane(GaimGtkConversation *gtkconv) |
4359 | 3582 { |
10810 | 3583 GaimConversation *conv = gtkconv->active_conv; |
10175 | 3584 GtkWidget *frame; |
4359 | 3585 GtkWidget *paned; |
10175 | 3586 GtkWidget *vbox; |
3587 GtkWidget *vbox2; | |
9080 | 3588 GList *focus_chain = NULL; |
4359 | 3589 |
10175 | 3590 /* Setup the outer pane */ |
4359 | 3591 paned = gtk_vpaned_new(); |
3592 gtk_widget_show(paned); | |
3593 | |
10175 | 3594 /* Setup the top part of the pane */ |
11243 | 3595 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
4409
0521eec12c33
[gaim-migrate @ 4682]
Christian Hammond <chipx86@chipx86.com>
parents:
4398
diff
changeset
|
3596 gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE); |
4359 | 3597 gtk_widget_show(vbox); |
3598 | |
10175 | 3599 /* Setup the gtkimhtml widget */ |
3600 frame = gaim_gtk_create_imhtml(FALSE, >kconv->imhtml, NULL); | |
3601 gtk_widget_set_name(gtkconv->imhtml, "gaim_gtkconv_imhtml"); | |
10389 | 3602 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml),TRUE); |
10175 | 3603 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
3604 gtk_widget_show(frame); | |
3605 | |
3606 gtk_widget_set_size_request(gtkconv->imhtml, | |
5550
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5546
diff
changeset
|
3607 gaim_prefs_get_int("/gaim/gtk/conversations/im/default_width"), |
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5546
diff
changeset
|
3608 gaim_prefs_get_int("/gaim/gtk/conversations/im/default_height")); |
10175 | 3609 g_signal_connect(G_OBJECT(gtkconv->imhtml), "size-allocate", |
10810 | 3610 G_CALLBACK(size_allocate_cb), gtkconv); |
4359 | 3611 |
3612 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event", | |
10810 | 3613 G_CALLBACK(entry_stop_rclick_cb), NULL); |
8105 | 3614 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_press_event", |
10810 | 3615 G_CALLBACK(refocus_entry_cb), gtkconv); |
8109 | 3616 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_release_event", |
10810 | 3617 G_CALLBACK(refocus_entry_cb), gtkconv); |
4359 | 3618 |
10175 | 3619 /* Setup the bottom half of the conversation window */ |
11243 | 3620 vbox2 = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
8914 | 3621 gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, TRUE); |
4963
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3622 gtk_widget_show(vbox2); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3623 |
11243 | 3624 gtkconv->lower_hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
9332 | 3625 gtk_box_pack_start(GTK_BOX(vbox2), gtkconv->lower_hbox, TRUE, TRUE, 0); |
3626 gtk_widget_show(gtkconv->lower_hbox); | |
3627 | |
11243 | 3628 vbox2 = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
9332 | 3629 gtk_box_pack_end(GTK_BOX(gtkconv->lower_hbox), vbox2, TRUE, TRUE, 0); |
3630 gtk_widget_show(vbox2); | |
8821 | 3631 |
10175 | 3632 /* Setup the toolbar, entry widget and all signals */ |
3633 frame = gaim_gtk_create_imhtml(TRUE, >kconv->entry, >kconv->toolbar); | |
10080 | 3634 gtk_box_pack_start(GTK_BOX(vbox2), frame, TRUE, TRUE, 0); |
10175 | 3635 gtk_widget_show(frame); |
3636 | |
9005 | 3637 gtk_widget_set_name(gtkconv->entry, "gaim_gtkconv_entry"); |
8456 | 3638 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry), |
9699 | 3639 gaim_account_get_protocol_name(conv->account)); |
10175 | 3640 gtk_widget_set_size_request(gtkconv->entry, -1, |
3641 gaim_prefs_get_int("/gaim/gtk/conversations/im/entry_height")); | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
3642 gtkconv->entry_buffer = |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
3643 gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); |
10810 | 3644 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", gtkconv); |
4963
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3645 |
4359 | 3646 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", |
10810 | 3647 G_CALLBACK(entry_key_press_cb), gtkconv); |
3648 g_signal_connect(G_OBJECT(gtkconv->entry), "message_send", G_CALLBACK(send_cb), gtkconv); | |
4359 | 3649 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", |
10810 | 3650 G_CALLBACK(entry_stop_rclick_cb), NULL); |
8914 | 3651 g_signal_connect(G_OBJECT(gtkconv->entry), "size-allocate", |
10810 | 3652 G_CALLBACK(size_allocate_cb), gtkconv); |
4359 | 3653 |
3654 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "insert_text", | |
10810 | 3655 G_CALLBACK(insert_text_cb), gtkconv); |
4359 | 3656 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "delete_range", |
10810 | 3657 G_CALLBACK(delete_text_cb), gtkconv); |
4359 | 3658 |
8481 | 3659 /* had to move this after the imtoolbar is attached so that the |
3660 * signals get fired to toggle the buttons on the toolbar as well. | |
3661 */ | |
10810 | 3662 default_formatize(gtkconv); |
4359 | 3663 |
11275
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
3664 g_signal_connect_after(G_OBJECT(gtkconv->entry), "format_function_clear", |
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
3665 G_CALLBACK(clear_formatting_cb), gtkconv); |
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
3666 |
8758 | 3667 gtkconv->u.im->animate = gaim_prefs_get_bool("/gaim/gtk/conversations/im/animate_buddy_icons"); |
9687 | 3668 gtkconv->u.im->show_icon = TRUE; |
4359 | 3669 |
9080 | 3670 /* |
3671 * Focus for IM windows should be as follows: | |
10356 | 3672 * Tab title -> conversation scrollback -> entry |
9080 | 3673 */ |
9332 | 3674 focus_chain = g_list_prepend(focus_chain, gtkconv->entry); |
9080 | 3675 gtk_container_set_focus_chain(GTK_CONTAINER(vbox2), focus_chain); |
8143 | 3676 |
4359 | 3677 return paned; |
3678 } | |
3679 | |
3680 static void | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3681 conv_dnd_recv(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, |
10810 | 3682 GtkSelectionData *sd, guint info, guint t, |
3683 GaimGtkConversation *gtkconv) | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3684 { |
10810 | 3685 GaimConversation *conv = gtkconv->active_conv; |
11581 | 3686 GaimGtkWindow *win = gtkconv->win; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3687 GaimConversation *c; |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3688 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3689 { |
4781 | 3690 GaimBlistNode *n = NULL; |
6695 | 3691 GaimBuddy *b; |
11581 | 3692 GaimGtkConversation *gtkconv = NULL; |
9622 | 3693 |
11812 | 3694 n = *(GaimBlistNode **)sd->data; |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3695 |
6695 | 3696 if (GAIM_BLIST_NODE_IS_CONTACT(n)) |
3697 b = gaim_contact_get_priority_buddy((GaimContact*)n); | |
3698 else if (GAIM_BLIST_NODE_IS_BUDDY(n)) | |
3699 b = (GaimBuddy*)n; | |
3700 else | |
4781 | 3701 return; |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3702 |
9622 | 3703 /* |
3704 * If we already have an open conversation with this buddy, then | |
3705 * just move the conv to this window. Otherwise, create a new | |
3706 * conv and add it to this window. | |
3707 */ | |
11338 | 3708 c = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, b->name, b->account); |
9622 | 3709 if (c != NULL) { |
11581 | 3710 GaimGtkWindow *oldwin; |
3711 gtkconv = GAIM_GTK_CONVERSATION(c); | |
3712 oldwin = gtkconv->win; | |
9622 | 3713 if (oldwin != win) { |
11581 | 3714 gaim_gtk_conv_window_remove_gtkconv(oldwin, gtkconv); |
3715 gaim_gtk_conv_window_add_gtkconv(win, gtkconv); | |
9622 | 3716 } |
3717 } else { | |
11338 | 3718 c = gaim_conversation_new(GAIM_CONV_TYPE_IM, b->account, b->name); |
11581 | 3719 gtkconv = GAIM_GTK_CONVERSATION(c); |
11812 | 3720 if (gtkconv->win != win) |
3721 { | |
3722 gaim_gtk_conv_window_remove_gtkconv(gtkconv->win, gtkconv); | |
3723 gaim_gtk_conv_window_add_gtkconv(win, gtkconv); | |
3724 } | |
9622 | 3725 } |
3726 | |
3727 /* Make this conversation the active conversation */ | |
11581 | 3728 gaim_gtk_conv_window_switch_gtkconv(win, gtkconv); |
8802
1076cd8579ea
[gaim-migrate @ 9564]
Christian Hammond <chipx86@chipx86.com>
parents:
8758
diff
changeset
|
3729 |
1076cd8579ea
[gaim-migrate @ 9564]
Christian Hammond <chipx86@chipx86.com>
parents:
8758
diff
changeset
|
3730 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
4702 | 3731 } |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3732 else if (sd->target == gdk_atom_intern("application/x-im-contact", FALSE)) |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3733 { |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3734 char *protocol = NULL; |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3735 char *username = NULL; |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3736 GaimAccount *account; |
11581 | 3737 GaimGtkConversation *gtkconv; |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3738 |
11137 | 3739 if (gaim_gtk_parse_x_im_contact((const char *)sd->data, FALSE, &account, |
7718 | 3740 &protocol, &username, NULL)) |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3741 { |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3742 if (account == NULL) |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3743 { |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3744 gaim_notify_error(NULL, NULL, |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3745 _("You are not currently signed on with an account that " |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3746 "can add that buddy."), NULL); |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3747 } |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3748 else |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3749 { |
11338 | 3750 c = gaim_conversation_new(GAIM_CONV_TYPE_IM, account, username); |
11581 | 3751 gtkconv = GAIM_GTK_CONVERSATION(c); |
11812 | 3752 if (gtkconv->win != win) |
3753 { | |
3754 gaim_gtk_conv_window_remove_gtkconv(gtkconv->win, gtkconv); | |
3755 gaim_gtk_conv_window_add_gtkconv(win, gtkconv); | |
3756 } | |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3757 } |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3758 } |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3759 |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3760 if (username != NULL) g_free(username); |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3761 if (protocol != NULL) g_free(protocol); |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3762 |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3763 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3764 } |
9525 | 3765 else if (sd->target == gdk_atom_intern("text/uri-list", FALSE)) { |
11338 | 3766 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
10229 | 3767 gaim_dnd_file_manage(sd, gaim_conversation_get_account(conv), gaim_conversation_get_name(conv)); |
10145 | 3768 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
9495 | 3769 } |
10145 | 3770 else |
3771 gtk_drag_finish(dc, FALSE, FALSE, t); | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3772 } |
4359 | 3773 |
3774 | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3775 static const GtkTargetEntry te[] = |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3776 { |
10145 | 3777 GTK_IMHTML_DND_TARGETS, |
3778 {"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, GTK_IMHTML_DRAG_NUM}, | |
3779 {"application/x-im-contact", 0, GTK_IMHTML_DRAG_NUM + 1} | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3780 }; |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3781 |
10810 | 3782 static GaimGtkConversation * |
3783 gaim_gtk_conv_find_gtkconv(GaimConversation * conv) | |
3784 { | |
3785 GaimBuddy *bud = gaim_find_buddy(conv->account, conv->name), *b; | |
3786 GaimContact *c; | |
3787 GaimBlistNode *cn; | |
10935 | 3788 |
10810 | 3789 if (!bud) |
3790 return NULL; | |
10935 | 3791 |
10810 | 3792 if (!(c = gaim_buddy_get_contact(bud))) |
3793 return NULL; | |
10935 | 3794 |
10810 | 3795 cn = (GaimBlistNode *)c; |
3796 for (b = (GaimBuddy *)cn->child; b; b = (GaimBuddy *) ((GaimBlistNode *)b)->next) { | |
3797 GaimConversation *conv; | |
11338 | 3798 if ((conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, b->name, b->account))) { |
10810 | 3799 if (conv->ui_data) |
3800 return conv->ui_data; | |
3801 } | |
3802 } | |
10935 | 3803 |
10810 | 3804 return NULL; |
3805 } | |
3806 | |
11815
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3807 static void |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3808 buddy_update_cb(GaimBlistNode *bnode) |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3809 { |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3810 GList *list; |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3811 |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3812 g_return_if_fail(bnode); |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3813 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(bnode)); |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3814 |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3815 for (list = gaim_gtk_conv_windows_get_list(); list; list = list->next) |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3816 { |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3817 GaimGtkWindow *win = list->data; |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3818 GaimConversation *conv = gaim_gtk_conv_window_get_active_conversation(win); |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3819 |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3820 if (gaim_conversation_get_type(conv) != GAIM_CONV_TYPE_IM) |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3821 continue; |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3822 |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3823 gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_ONLINE); |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3824 } |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3825 } |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3826 |
11581 | 3827 /************************************************************************** |
3828 * Conversation UI operations | |
3829 **************************************************************************/ | |
3830 void | |
3831 gaim_gtkconv_new(GaimConversation *conv) | |
3832 { | |
3833 GaimGtkConversation *gtkconv; | |
3834 GaimConversationType conv_type = gaim_conversation_get_type(conv); | |
4359 | 3835 GtkWidget *pane = NULL; |
3836 GtkWidget *tab_cont; | |
11581 | 3837 |
3838 if (conv_type == GAIM_CONV_TYPE_IM && (gtkconv = gaim_gtk_conv_find_gtkconv(conv))) { | |
10810 | 3839 conv->ui_data = gtkconv; |
3840 if (!g_list_find(gtkconv->convs, conv)) | |
3841 gtkconv->convs = g_list_prepend(gtkconv->convs, conv); | |
11604 | 3842 gaim_gtkconv_switch_active_conversation(conv); |
10810 | 3843 return; |
4359 | 3844 } |
3845 | |
11581 | 3846 gtkconv = g_new0(GaimGtkConversation, 1); |
3847 conv->ui_data = gtkconv; | |
3848 gtkconv->active_conv = conv; | |
3849 gtkconv->convs = g_list_prepend(gtkconv->convs, conv); | |
3850 | |
3851 /* Setup some initial variables. */ | |
3852 gtkconv->sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); | |
3853 gtkconv->tooltips = gtk_tooltips_new(); | |
3854 | |
3855 if (conv_type == GAIM_CONV_TYPE_IM) { | |
3856 gtkconv->u.im = g_malloc0(sizeof(GaimGtkImPane)); | |
3857 | |
3858 pane = setup_im_pane(gtkconv); | |
3859 } else if (conv_type == GAIM_CONV_TYPE_CHAT) { | |
3860 gtkconv->u.chat = g_malloc0(sizeof(GaimGtkChatPane)); | |
3861 pane = setup_chat_pane(gtkconv); | |
3862 } | |
3863 | |
3864 if (pane == NULL) { | |
3865 if (conv_type == GAIM_CONV_TYPE_CHAT) | |
3866 g_free(gtkconv->u.chat); | |
3867 else if (conv_type == GAIM_CONV_TYPE_IM) | |
3868 g_free(gtkconv->u.im); | |
3869 | |
3870 g_free(gtkconv); | |
3871 conv->ui_data = NULL; | |
3872 return; | |
10449 | 3873 } |
11581 | 3874 |
3875 /* Setup drag-and-drop */ | |
3876 gtk_drag_dest_set(pane, | |
3877 GTK_DEST_DEFAULT_MOTION | | |
3878 GTK_DEST_DEFAULT_DROP, | |
3879 te, sizeof(te) / sizeof(GtkTargetEntry), | |
3880 GDK_ACTION_COPY); | |
3881 gtk_drag_dest_set(pane, | |
3882 GTK_DEST_DEFAULT_MOTION | | |
3883 GTK_DEST_DEFAULT_DROP, | |
3884 te, sizeof(te) / sizeof(GtkTargetEntry), | |
3885 GDK_ACTION_COPY); | |
3886 gtk_drag_dest_set(gtkconv->imhtml, 0, | |
3887 te, sizeof(te) / sizeof(GtkTargetEntry), | |
3888 GDK_ACTION_COPY); | |
3889 | |
3890 gtk_drag_dest_set(gtkconv->entry, 0, | |
3891 te, sizeof(te) / sizeof(GtkTargetEntry), | |
3892 GDK_ACTION_COPY); | |
3893 | |
3894 g_signal_connect(G_OBJECT(pane), "drag_data_received", | |
3895 G_CALLBACK(conv_dnd_recv), gtkconv); | |
3896 g_signal_connect(G_OBJECT(gtkconv->imhtml), "drag_data_received", | |
3897 G_CALLBACK(conv_dnd_recv), gtkconv); | |
3898 g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", | |
3899 G_CALLBACK(conv_dnd_recv), gtkconv); | |
3900 | |
3901 /* Setup the container for the tab. */ | |
3902 gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
3903 g_object_set_data(G_OBJECT(tab_cont), "GaimGtkConversation", gtkconv); | |
3904 gtk_container_set_border_width(GTK_CONTAINER(tab_cont), GAIM_HIG_BOX_SPACE); | |
3905 gtk_container_add(GTK_CONTAINER(tab_cont), pane); | |
3906 gtk_widget_show(pane); | |
3907 | |
3908 gtkconv->make_sound = TRUE; | |
3909 | |
3910 if (gaim_prefs_get_bool("/gaim/gtk/conversations/show_formatting_toolbar")) | |
3911 gtk_widget_show(gtkconv->toolbar); | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
3912 else |
11581 | 3913 gtk_widget_hide(gtkconv->toolbar); |
3914 | |
3915 gtkconv->show_timestamps = TRUE; | |
3916 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), TRUE); | |
11603
b97545f21b4c
[gaim-migrate @ 13874]
Gary Kramlich <grim@reaperworld.com>
parents:
11602
diff
changeset
|
3917 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml), |
b97545f21b4c
[gaim-migrate @ 13874]
Gary Kramlich <grim@reaperworld.com>
parents:
11602
diff
changeset
|
3918 gaim_account_get_protocol_name(conv->account)); |
11581 | 3919 |
3920 g_signal_connect_swapped(G_OBJECT(pane), "focus", | |
3921 G_CALLBACK(gtk_widget_grab_focus), | |
3922 gtkconv->entry); | |
3923 | |
11815
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3924 if (conv_type == GAIM_CONV_TYPE_IM) |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3925 { |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3926 gaim_signal_connect(gaim_blist_get_handle(), "buddy-added", gtkconv, |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3927 G_CALLBACK(buddy_update_cb), conv); |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3928 gaim_signal_connect(gaim_blist_get_handle(), "buddy-removed", gtkconv, |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3929 G_CALLBACK(buddy_update_cb), conv); |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3930 } |
821f40e1912f
[gaim-migrate @ 14106]
Richard Laager <rlaager@wiktel.com>
parents:
11812
diff
changeset
|
3931 |
11581 | 3932 gaim_gtkconv_placement_place(gtkconv); |
3933 } | |
3934 | |
4359 | 3935 static void |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3936 gaim_gtkconv_destroy(GaimConversation *conv) |
4359 | 3937 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3938 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
4359 | 3939 |
10810 | 3940 gtkconv->convs = g_list_remove(gtkconv->convs, conv); |
3941 /* Don't destroy ourselves until all our convos are gone */ | |
3942 if (gtkconv->convs) | |
3943 return; | |
11508 | 3944 |
11581 | 3945 gaim_gtk_conv_window_remove_gtkconv(gtkconv->win, gtkconv); |
3946 | |
9504 | 3947 /* If the "Save Conversation" or "Save Icon" dialogs are open then close them */ |
3948 gaim_request_close_with_handle(conv); | |
4359 | 3949 |
4571
51e988d015ed
[gaim-migrate @ 4852]
Christian Hammond <chipx86@chipx86.com>
parents:
4561
diff
changeset
|
3950 gtk_widget_destroy(gtkconv->tab_cont); |
4892 | 3951 g_object_unref(gtkconv->tab_cont); |
4571
51e988d015ed
[gaim-migrate @ 4852]
Christian Hammond <chipx86@chipx86.com>
parents:
4561
diff
changeset
|
3952 |
11338 | 3953 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { |
4755 | 3954 if (gtkconv->u.im->icon_timer != 0) |
3955 g_source_remove(gtkconv->u.im->icon_timer); | |
3956 | |
4359 | 3957 if (gtkconv->u.im->anim != NULL) |
4793 | 3958 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); |
4359 | 3959 |
3960 g_free(gtkconv->u.im); | |
11581 | 3961 } else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3962 gaim_signals_disconnect_by_handle(gtkconv->u.chat); |
4359 | 3963 g_free(gtkconv->u.chat); |
3964 } | |
3965 | |
4633 | 3966 gtk_object_sink(GTK_OBJECT(gtkconv->tooltips)); |
3967 | |
4359 | 3968 g_free(gtkconv); |
3969 } | |
3970 | |
3971 static void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3972 gaim_gtkconv_write_im(GaimConversation *conv, const char *who, |
6982 | 3973 const char *message, GaimMessageFlags flags, |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3974 time_t mtime) |
4359 | 3975 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3976 GaimGtkConversation *gtkconv; |
4359 | 3977 |
3978 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
3979 gaim_gtkconv_set_active_conversation(conv); |
4359 | 3980 |
6982 | 3981 gaim_conversation_write(conv, who, message, flags, mtime); |
4359 | 3982 } |
3983 | |
3984 static void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3985 gaim_gtkconv_write_chat(GaimConversation *conv, const char *who, |
6621 | 3986 const char *message, GaimMessageFlags flags, time_t mtime) |
4359 | 3987 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3988 GaimGtkConversation *gtkconv; |
4359 | 3989 |
3990 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
3991 gaim_gtkconv_set_active_conversation(conv); |
4359 | 3992 |
10398 | 3993 flags |= GAIM_MESSAGE_COLORIZE; |
4359 | 3994 |
6982 | 3995 gaim_conversation_write(conv, who, message, flags, mtime); |
4359 | 3996 } |
3997 | |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3998 /* The callback for an event on a link tag. */ |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3999 static gboolean buddytag_event(GtkTextTag *tag, GObject *imhtml, |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4000 GdkEvent *event, GtkTextIter *arg2, gpointer data) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4001 if (event->type == GDK_BUTTON_PRESS |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4002 || event->type == GDK_2BUTTON_PRESS) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4003 GdkEventButton *btn_event = (GdkEventButton*) event; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4004 GaimConversation *conv = data; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4005 char *buddyname; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4006 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4007 /* strlen("BUDDY ") == 6 */ |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4008 g_return_val_if_fail((tag->name != NULL) |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4009 && (strlen(tag->name) > 6), FALSE); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4010 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4011 buddyname = (tag->name) + 6; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4012 |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4013 if (btn_event->button == 2 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4014 && event->type == GDK_2BUTTON_PRESS) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4015 chat_do_info(GAIM_GTK_CONVERSATION(conv), buddyname); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4016 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4017 return TRUE; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4018 } else if (btn_event->button == 3 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4019 && event->type == GDK_BUTTON_PRESS) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4020 GtkTextIter start, end; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4021 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4022 /* we shouldn't display the popup |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4023 * if the user has selected something: */ |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4024 if (!gtk_text_buffer_get_selection_bounds( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4025 gtk_text_iter_get_buffer(arg2), |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4026 &start, &end)) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4027 GaimPluginProtocolInfo *prpl_info = NULL; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4028 GtkWidget *menu = NULL; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4029 GaimConnection *gc = |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4030 gaim_conversation_get_gc(conv); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4031 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4032 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4033 if (gc != NULL) |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4034 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4035 gc->prpl); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4036 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4037 menu = create_chat_menu(conv, buddyname, |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4038 prpl_info, gc); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4039 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4040 NULL, GTK_WIDGET(imhtml), |
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4041 btn_event->button, |
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4042 btn_event->time); |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4043 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4044 /* Don't propagate the event any further */ |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4045 return TRUE; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4046 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4047 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4048 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4049 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4050 return FALSE; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4051 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4052 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4053 static GtkTextTag *get_buddy_tag(GaimConversation *conv, const char *who) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4054 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4055 GtkTextTag *buddytag; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4056 /* strlen("BUDDY ") == 6 */ |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4057 gchar str[strlen(who) + 7]; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4058 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4059 g_snprintf(str, sizeof(str), "BUDDY %s", who); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4060 str[sizeof(str)] = '\0'; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4061 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4062 buddytag = gtk_text_tag_table_lookup( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4063 gtk_text_buffer_get_tag_table( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4064 GTK_IMHTML(gtkconv->imhtml)->text_buffer), str); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4065 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4066 if (buddytag == NULL) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4067 buddytag = gtk_text_buffer_create_tag( |
11096 | 4068 GTK_IMHTML(gtkconv->imhtml)->text_buffer, str, NULL); |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4069 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4070 g_signal_connect(G_OBJECT(buddytag), "event", |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4071 G_CALLBACK(buddytag_event), conv); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4072 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4073 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4074 return buddytag; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4075 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4076 |
4359 | 4077 static void |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4078 gaim_gtkconv_write_conv(GaimConversation *conv, const char *name, const char *alias, |
6982 | 4079 const char *message, GaimMessageFlags flags, |
4359 | 4080 time_t mtime) |
4081 { | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4082 GaimGtkConversation *gtkconv; |
11581 | 4083 GaimGtkWindow *win; |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
4084 GaimConnection *gc; |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4085 GaimAccount *account; |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4086 GaimPluginProtocolInfo *prpl_info; |
4359 | 4087 int gtk_font_options = 0; |
11224
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4088 int max_scrollback_lines = gaim_prefs_get_int( |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4089 "/gaim/gtk/conversations/scrollback_lines"); |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4090 int line_count; |
4359 | 4091 char buf2[BUF_LONG]; |
4092 char mdate[64]; | |
4093 char color[10]; | |
4094 char *str; | |
4095 char *with_font_tag; | |
4896 | 4096 char *sml_attrib = NULL; |
6982 | 4097 size_t length = strlen(message) + 1; |
4895 | 4098 |
4359 | 4099 gtkconv = GAIM_GTK_CONVERSATION(conv); |
11581 | 4100 |
4101 /* Set the active conversation to the one that just messaged us. */ | |
4102 /* TODO: consider not doing this if the account is offline or something */ | |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
4103 gaim_gtkconv_set_active_conversation(conv); |
11581 | 4104 |
4359 | 4105 gc = gaim_conversation_get_gc(conv); |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4106 account = gaim_conversation_get_account(conv); |
11581 | 4107 win = gtkconv->win; |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4108 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
4109 |
11224
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4110 line_count = gtk_text_buffer_get_line_count( |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4111 gtk_text_view_get_buffer(GTK_TEXT_VIEW( |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4112 gtkconv->imhtml))); |
11227
8b3d1b2c2c43
[gaim-migrate @ 13365]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11224
diff
changeset
|
4113 |
11224
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4114 /* If we're sitting at more than 100 lines more than the |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4115 max scrollback, trim down to max scrollback */ |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4116 if (max_scrollback_lines > 0 |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4117 && line_count > (max_scrollback_lines + 100)) { |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4118 GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4119 GTK_TEXT_VIEW(gtkconv->imhtml)); |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4120 GtkTextIter start, end; |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4121 |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4122 gtk_text_buffer_get_start_iter(text_buffer, &start); |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4123 gtk_text_buffer_get_iter_at_line(text_buffer, &end, |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4124 (line_count - max_scrollback_lines)); |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4125 gtk_imhtml_delete(GTK_IMHTML(gtkconv->imhtml), &start, &end); |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4126 } |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4127 |
8677 | 4128 if (gtk_text_buffer_get_char_count(gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml)))) |
4129 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), "<BR>", 0); | |
4130 | |
5133 | 4131 if(time(NULL) > mtime + 20*60) /* show date if older than 20 minutes */ |
4132 strftime(mdate, sizeof(mdate), "%Y-%m-%d %H:%M:%S", localtime(&mtime)); | |
4133 else | |
4134 strftime(mdate, sizeof(mdate), "%H:%M:%S", localtime(&mtime)); | |
4359 | 4135 |
4896 | 4136 if(gc) |
9699 | 4137 sml_attrib = g_strdup_printf("sml=\"%s\"", |
4138 gaim_account_get_protocol_name(conv->account)); | |
7440 | 4139 |
10503 | 4140 gtk_font_options |= GTK_IMHTML_NO_COMMENTS; |
4359 | 4141 |
11267
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
4142 if (!gaim_prefs_get_bool("/gaim/gtk/conversations/show_incoming_formatting")) |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4143 gtk_font_options |= GTK_IMHTML_NO_COLOURS | GTK_IMHTML_NO_FONTS | GTK_IMHTML_NO_SIZES | GTK_IMHTML_NO_FORMATTING; |
4359 | 4144 |
7956 | 4145 /* this is gonna crash one day, I can feel it. */ |
4146 if (GAIM_PLUGIN_PROTOCOL_INFO(gaim_find_prpl(gaim_account_get_protocol_id(conv->account)))->options & | |
7431 | 4147 OPT_PROTO_USE_POINTSIZE) { |
10503 | 4148 gtk_font_options |= GTK_IMHTML_USE_POINTSIZE; |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
4149 } |
4359 | 4150 |
10737 | 4151 /* TODO: These colors should not be hardcoded so log.c can use them */ |
6621 | 4152 if (flags & GAIM_MESSAGE_SYSTEM) { |
4359 | 4153 g_snprintf(buf2, sizeof(buf2), |
8690 | 4154 "<FONT %s><FONT SIZE=\"2\"><!--(%s) --></FONT><B>%s</B></FONT>", |
10854
bdd72261ec8c
[gaim-migrate @ 12529]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10849
diff
changeset
|
4155 sml_attrib ? sml_attrib : "", mdate, message); |
7440 | 4156 |
8962 | 4157 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, 0); |
7440 | 4158 |
8722 | 4159 } else if (flags & GAIM_MESSAGE_ERROR) { |
4160 g_snprintf(buf2, sizeof(buf2), | |
9627 | 4161 "<FONT COLOR=\"#ff0000\"><FONT %s><FONT SIZE=\"2\"><!--(%s) --></FONT><B>%s</B></FONT></FONT>", |
10854
bdd72261ec8c
[gaim-migrate @ 12529]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10849
diff
changeset
|
4162 sml_attrib ? sml_attrib : "", mdate, message); |
9554 | 4163 |
8962 | 4164 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, 0); |
4165 | |
7431 | 4166 } else if (flags & GAIM_MESSAGE_NO_LOG) { |
10884 | 4167 g_snprintf(buf2, BUF_LONG, |
8690 | 4168 "<B><FONT %s COLOR=\"#777777\">%s</FONT></B>", |
10854
bdd72261ec8c
[gaim-migrate @ 12529]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10849
diff
changeset
|
4169 sml_attrib ? sml_attrib : "", message); |
7440 | 4170 |
10884 | 4171 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, 0); |
10346 | 4172 } else if (flags & GAIM_MESSAGE_RAW) { |
10348 | 4173 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), message, 0); |
10346 | 4174 } else { |
4895 | 4175 char *new_message = g_memdup(message, length); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4176 char *alias_escaped = (alias ? g_markup_escape_text(alias, strlen(alias)) : g_strdup("")); |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4177 /* The initial offset is to deal with |
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4178 * escaped entities making the string longer */ |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4179 int tag_start_offset = alias ? (strlen(alias_escaped) - strlen(alias)) : 0; |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4180 int tag_end_offset = 0; |
7440 | 4181 |
6621 | 4182 if (flags & GAIM_MESSAGE_WHISPER) { |
4359 | 4183 str = g_malloc(1024); |
7440 | 4184 |
4359 | 4185 /* If we're whispering, it's not an autoresponse. */ |
10504 | 4186 if (gaim_message_meify(new_message, -1 )) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4187 g_snprintf(str, 1024, "***%s", alias_escaped); |
4359 | 4188 strcpy(color, "#6C2585"); |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4189 tag_start_offset += 3; |
4359 | 4190 } |
4191 else { | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4192 g_snprintf(str, 1024, "*%s*:", alias_escaped); |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4193 tag_start_offset += 1; |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4194 tag_end_offset = 2; |
4359 | 4195 strcpy(color, "#00FF00"); |
4196 } | |
7440 | 4197 } |
4359 | 4198 else { |
10504 | 4199 if (gaim_message_meify(new_message, -1)) { |
4359 | 4200 str = g_malloc(1024); |
7440 | 4201 |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4202 if (flags & GAIM_MESSAGE_AUTO_RESP) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4203 g_snprintf(str, 1024, "%s ***%s", AUTO_RESPONSE, alias_escaped); |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4204 tag_start_offset += 4 |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4205 + strlen(AUTO_RESPONSE); |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4206 } else { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4207 g_snprintf(str, 1024, "***%s", alias_escaped); |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4208 tag_start_offset += 3; |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4209 } |
7440 | 4210 |
6621 | 4211 if (flags & GAIM_MESSAGE_NICK) |
4359 | 4212 strcpy(color, "#AF7F00"); |
4213 else | |
4214 strcpy(color, "#062585"); | |
4215 } | |
4216 else { | |
4217 str = g_malloc(1024); | |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4218 if (flags & GAIM_MESSAGE_AUTO_RESP) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4219 g_snprintf(str, 1024, "%s %s", alias_escaped, AUTO_RESPONSE); |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4220 tag_start_offset += 1 |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4221 + strlen(AUTO_RESPONSE); |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4222 } else { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4223 g_snprintf(str, 1024, "%s:", alias_escaped); |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4224 tag_end_offset = 1; |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4225 } |
6621 | 4226 if (flags & GAIM_MESSAGE_NICK) |
4359 | 4227 strcpy(color, "#AF7F00"); |
6621 | 4228 else if (flags & GAIM_MESSAGE_RECV) { |
10108 | 4229 if (flags & GAIM_MESSAGE_COLORIZE) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4230 GdkColor *col = get_nick_color(gtkconv, alias); |
10346 | 4231 |
10108 | 4232 g_snprintf(color, sizeof(color), "#%02X%02X%02X", |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4233 col->red >> 8, col->green >> 8, col->blue >> 8); |
10108 | 4234 } else |
7854 | 4235 strcpy(color, RECV_COLOR); |
4359 | 4236 } |
6621 | 4237 else if (flags & GAIM_MESSAGE_SEND) |
7854 | 4238 strcpy(color, SEND_COLOR); |
10892 | 4239 else { |
4240 gaim_debug_error("gtkconv", "message missing flags\n"); | |
4241 strcpy(color, "#000000"); | |
4242 } | |
4359 | 4243 } |
4244 } | |
10892 | 4245 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4246 if(alias_escaped) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4247 g_free(alias_escaped); |
11508 | 4248 |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4249 /* Are we in a chat where we can tell which users are buddies? */ |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4250 if (!(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME) && |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4251 gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4252 |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4253 /* Bold buddies to make them stand out from non-buddies. */ |
11581 | 4254 if (flags & GAIM_MESSAGE_SEND || |
11530
2a13cfe607b5
[gaim-migrate @ 13779]
Richard Laager <rlaager@wiktel.com>
parents:
11525
diff
changeset
|
4255 flags & GAIM_MESSAGE_NICK || |
2a13cfe607b5
[gaim-migrate @ 13779]
Richard Laager <rlaager@wiktel.com>
parents:
11525
diff
changeset
|
4256 gaim_find_buddy(account, name) != NULL) { |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4257 g_snprintf(buf2, BUF_LONG, |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4258 "<FONT COLOR=\"%s\" %s><FONT SIZE=\"2\"><!--(%s) --></FONT>" |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4259 "<B>%s</B></FONT> ", |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4260 color, sml_attrib ? sml_attrib : "", mdate, str); |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4261 } else { |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4262 g_snprintf(buf2, BUF_LONG, |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4263 "<FONT COLOR=\"%s\" %s><FONT SIZE=\"2\"><!--(%s) --></FONT>" |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4264 "%s</FONT> ", |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4265 color, sml_attrib ? sml_attrib : "", mdate, str); |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4266 |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4267 } |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4268 } else { |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4269 /* Bold everyone's name to make the name stand out from the message. */ |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4270 g_snprintf(buf2, BUF_LONG, |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4271 "<FONT COLOR=\"%s\" %s><FONT SIZE=\"2\"><!--(%s) --></FONT>" |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4272 "<B>%s</B></FONT> ", |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4273 color, sml_attrib ? sml_attrib : "", mdate, str); |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4274 } |
7440 | 4275 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4276 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, 0); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4277 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4278 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT && |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4279 !(flags & GAIM_MESSAGE_SEND)) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4280 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4281 GtkTextIter start, end; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4282 GtkTextTag *buddytag = get_buddy_tag(conv, name); |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4283 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4284 gtk_text_buffer_get_end_iter( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4285 GTK_IMHTML(gtkconv->imhtml)->text_buffer, |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4286 &end); |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4287 gtk_text_iter_backward_chars(&end, |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4288 tag_end_offset + 1); |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4289 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4290 gtk_text_buffer_get_end_iter( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4291 GTK_IMHTML(gtkconv->imhtml)->text_buffer, |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4292 &start); |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4293 gtk_text_iter_backward_chars(&start, |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4294 strlen(str) + 1 - tag_start_offset); |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4295 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4296 gtk_text_buffer_apply_tag( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4297 GTK_IMHTML(gtkconv->imhtml)->text_buffer, |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4298 buddytag, &start, &end); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4299 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4300 |
4359 | 4301 g_free(str); |
4302 | |
4895 | 4303 if(gc){ |
4896 | 4304 char *pre = g_strdup_printf("<font %s>", sml_attrib ? sml_attrib : ""); |
4895 | 4305 char *post = "</font>"; |
4306 int pre_len = strlen(pre); | |
4307 int post_len = strlen(post); | |
7440 | 4308 |
4895 | 4309 with_font_tag = g_malloc(length + pre_len + post_len + 1); |
7440 | 4310 |
4895 | 4311 strcpy(with_font_tag, pre); |
4312 memcpy(with_font_tag + pre_len, new_message, length); | |
4313 strcpy(with_font_tag + pre_len + length, post); | |
7440 | 4314 |
4895 | 4315 length += pre_len + post_len; |
4316 g_free(pre); | |
4317 } | |
4608 | 4318 else |
4895 | 4319 with_font_tag = g_memdup(new_message, length); |
7440 | 4320 |
8962 | 4321 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), |
4322 with_font_tag, gtk_font_options); | |
7440 | 4323 |
4324 g_free(with_font_tag); | |
7447 | 4325 g_free(new_message); |
7440 | 4326 } |
4327 | |
5012 | 4328 if(sml_attrib) |
4329 g_free(sml_attrib); | |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4330 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4331 /* Tab highlighting stuff */ |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4332 if (!gaim_gtkconv_has_focus(conv)) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4333 { |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4334 GaimUnseenState unseen = GAIM_UNSEEN_NONE; |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4335 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4336 if ((flags & GAIM_MESSAGE_NICK) == GAIM_MESSAGE_NICK || |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4337 gtkconv->unseen_state == GAIM_UNSEEN_NICK) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4338 unseen = GAIM_UNSEEN_NICK; |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4339 else if ((((flags & GAIM_MESSAGE_SYSTEM) == GAIM_MESSAGE_SYSTEM) || |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4340 ((flags & GAIM_MESSAGE_ERROR) == GAIM_MESSAGE_ERROR)) && |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4341 gtkconv->unseen_state != GAIM_UNSEEN_TEXT) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4342 unseen = GAIM_UNSEEN_EVENT; |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4343 else |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4344 unseen = GAIM_UNSEEN_TEXT; |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4345 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4346 gtkconv_set_unseen(gtkconv, unseen); |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4347 } |
4359 | 4348 } |
4349 | |
4350 static void | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4351 gaim_gtkconv_chat_add_users(GaimConversation *conv, GList *users, GList *aliases) |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4352 { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4353 GaimConvChat *chat; |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4354 GaimGtkConversation *gtkconv; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4355 GaimGtkChatPane *gtkchat; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4356 GList *l; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4357 GList *ll; |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4358 char tmp[BUF_LONG]; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4359 int num_users; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4360 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4361 chat = GAIM_CONV_CHAT(conv); |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4362 gtkconv = GAIM_GTK_CONVERSATION(conv); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4363 gtkchat = gtkconv->u.chat; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4364 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4365 num_users = g_list_length(gaim_conv_chat_get_users(chat)); |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4366 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4367 g_snprintf(tmp, sizeof(tmp), |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4368 ngettext("%d person in room", "%d people in room", |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4369 num_users), |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4370 num_users); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4371 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4372 gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4373 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4374 l = users; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4375 ll = aliases; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4376 while (l != NULL && ll != NULL) { |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
4377 add_chat_buddy_common(conv, (const char *)l->data, (const char *)ll->data, NULL); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4378 l = l->next; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4379 ll = ll->next; |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4380 } |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4381 } |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4382 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4383 static void |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4384 gaim_gtkconv_chat_rename_user(GaimConversation *conv, const char *old_name, |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4385 const char *new_name, const char *new_alias) |
4359 | 4386 { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4387 GaimConvChat *chat; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4388 GaimGtkConversation *gtkconv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4389 GaimGtkChatPane *gtkchat; |
4359 | 4390 GtkTreeIter iter; |
4391 GtkTreeModel *model; | |
4392 int f = 1; | |
4393 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4394 chat = GAIM_CONV_CHAT(conv); |
4359 | 4395 gtkconv = GAIM_GTK_CONVERSATION(conv); |
4396 gtkchat = gtkconv->u.chat; | |
4397 | |
9554 | 4398 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
4399 | |
4400 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) | |
4401 return; | |
4402 | |
4403 while (f != 0) { | |
4404 char *val; | |
4405 | |
4406 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &val, -1); | |
4407 | |
4408 if (!gaim_utf8_strcasecmp(old_name, val)) { | |
4409 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
4410 g_free(val); | |
4359 | 4411 break; |
4412 } | |
9554 | 4413 |
4414 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4415 | |
4416 g_free(val); | |
4359 | 4417 } |
4418 | |
9554 | 4419 if (!gaim_conv_chat_find_user(chat, old_name)) |
4359 | 4420 return; |
4421 | |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4422 g_return_if_fail(new_alias != NULL); |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4423 |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
4424 add_chat_buddy_common(conv, new_name, new_alias, old_name); |
4359 | 4425 } |
4426 | |
4427 static void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4428 gaim_gtkconv_chat_remove_user(GaimConversation *conv, const char *user) |
4359 | 4429 { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4430 GaimConvChat *chat; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4431 GaimGtkConversation *gtkconv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4432 GaimGtkChatPane *gtkchat; |
4359 | 4433 GtkTreeIter iter; |
4434 GtkTreeModel *model; | |
4435 char tmp[BUF_LONG]; | |
4436 int num_users; | |
4437 int f = 1; | |
4438 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4439 chat = GAIM_CONV_CHAT(conv); |
4359 | 4440 gtkconv = GAIM_GTK_CONVERSATION(conv); |
4441 gtkchat = gtkconv->u.chat; | |
4442 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4443 num_users = g_list_length(gaim_conv_chat_get_users(chat)) - 1; |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4444 |
9554 | 4445 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
4446 | |
4447 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) | |
4448 return; | |
4449 | |
4450 while (f != 0) { | |
4451 char *val; | |
4452 | |
4453 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &val, -1); | |
4454 | |
4455 if (!gaim_utf8_strcasecmp(user, val)) { | |
4456 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
4457 g_free(val); | |
4359 | 4458 break; |
4459 } | |
9554 | 4460 |
4461 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4462 | |
4463 g_free(val); | |
4359 | 4464 } |
4465 | |
9554 | 4466 if (!gaim_conv_chat_find_user(chat, user)) |
4359 | 4467 return; |
4468 | |
4469 g_snprintf(tmp, sizeof(tmp), | |
9554 | 4470 ngettext("%d person in room", "%d people in room", |
4471 num_users), num_users); | |
4359 | 4472 |
4473 gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); | |
4474 | |
4475 } | |
4476 | |
4477 static void | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4478 gaim_gtkconv_chat_remove_users(GaimConversation *conv, GList *users) |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4479 { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4480 GaimConvChat *chat; |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4481 GaimGtkConversation *gtkconv; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4482 GaimGtkChatPane *gtkchat; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4483 GtkTreeIter iter; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4484 GtkTreeModel *model; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4485 GList *l; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4486 char tmp[BUF_LONG]; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4487 int num_users; |
8256
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8253
diff
changeset
|
4488 gboolean f; |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4489 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4490 chat = GAIM_CONV_CHAT(conv); |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4491 gtkconv = GAIM_GTK_CONVERSATION(conv); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4492 gtkchat = gtkconv->u.chat; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4493 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4494 num_users = g_list_length(gaim_conv_chat_get_users(chat)) - |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4495 g_list_length(users); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4496 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4497 for (l = users; l != NULL; l = l->next) { |
9554 | 4498 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
4499 | |
10812
d087e928ffd1
[gaim-migrate @ 12465]
Luke Schierer <lschiere@pidgin.im>
parents:
10810
diff
changeset
|
4500 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) |
9554 | 4501 continue; |
4502 | |
4503 do { | |
4504 char *val; | |
4505 | |
4506 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, | |
4507 CHAT_USERS_NAME_COLUMN, &val, -1); | |
4508 | |
9696 | 4509 if (!gaim_utf8_strcasecmp((char *)l->data, val)) { |
4510 #if GTK_CHECK_VERSION(2,2,0) | |
9554 | 4511 f = gtk_list_store_remove(GTK_LIST_STORE(model), &iter); |
9696 | 4512 #else |
4513 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
4514 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4515 #endif | |
4516 } | |
9554 | 4517 else |
4518 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4519 | |
4520 g_free(val); | |
4521 } while (f); | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4522 } |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4523 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4524 g_snprintf(tmp, sizeof(tmp), |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4525 ngettext("%d person in room", "%d people in room", |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4526 num_users), num_users); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4527 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4528 gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4529 } |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4530 |
9554 | 4531 static void |
4532 gaim_gtkconv_chat_update_user(GaimConversation *conv, const char *user) | |
4533 { | |
4534 GaimConvChat *chat; | |
4535 GaimGtkConversation *gtkconv; | |
4536 GaimGtkChatPane *gtkchat; | |
4537 GtkTreeIter iter; | |
4538 GtkTreeModel *model; | |
4539 int f = 1; | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4540 char *alias = NULL; |
9554 | 4541 |
4542 chat = GAIM_CONV_CHAT(conv); | |
4543 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4544 gtkchat = gtkconv->u.chat; | |
4545 | |
4546 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); | |
4547 | |
4548 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) | |
4549 return; | |
4550 | |
4551 while (f != 0) { | |
4552 char *val; | |
4553 | |
4554 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &val, -1); | |
4555 | |
4556 if (!gaim_utf8_strcasecmp(user, val)) { | |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
4557 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_ALIAS_COLUMN, &alias, -1); |
9554 | 4558 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); |
4559 g_free(val); | |
4560 break; | |
4561 } | |
4562 | |
4563 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4564 | |
4565 g_free(val); | |
4566 } | |
4567 | |
4568 if (!gaim_conv_chat_find_user(chat, user)) | |
4569 return; | |
4570 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4571 g_return_if_fail(alias != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4572 |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
4573 add_chat_buddy_common(conv, user, alias, NULL); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4574 g_free(alias); |
9554 | 4575 } |
4576 | |
11581 | 4577 gboolean |
9260
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4578 gaim_gtkconv_has_focus(GaimConversation *conv) |
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4579 { |
11581 | 4580 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
4581 GaimGtkWindow *win; | |
9260
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4582 gboolean has_focus; |
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4583 |
11581 | 4584 win = gtkconv->win; |
4585 | |
4586 g_object_get(G_OBJECT(win->window), "has-toplevel-focus", &has_focus, NULL); | |
9260
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4587 |
11684
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4588 if (has_focus) |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4589 { |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4590 GaimConversation *c = gaim_gtk_conv_window_get_active_conversation(win); |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4591 if (GAIM_GTK_CONVERSATION(c) == gtkconv) |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4592 return TRUE; |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4593 } |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4594 return FALSE; |
9260
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4595 } |
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4596 |
10526 | 4597 static gboolean |
4598 gaim_gtkconv_custom_smiley_add(GaimConversation *conv, const char *smile) | |
4599 { | |
4600 GaimGtkConversation *gtkconv; | |
4601 GtkIMHtmlSmiley *smiley; | |
4602 GdkPixbufLoader *loader; | |
11525 | 4603 struct smiley_list *list; |
4604 const char *sml = NULL, *conv_sml; | |
4605 | |
4606 if (!conv || !smile || !*smile) { | |
10526 | 4607 return FALSE; |
4608 } | |
4609 | |
11525 | 4610 /* If smileys are off, return false */ |
4611 if (gaim_gtkthemes_smileys_disabled()) | |
4612 return FALSE; | |
4613 | |
4614 /* If possible add this smiley to the current theme. | |
4615 * The addition is only temporary: custom smilies aren't saved to disk. */ | |
4616 conv_sml = gaim_account_get_protocol_name(conv->account); | |
10526 | 4617 gtkconv = GAIM_GTK_CONVERSATION(conv); |
11525 | 4618 |
4619 for (list = (struct smiley_list *)current_smiley_theme->list; list; list = list->next) { | |
4620 if (!strcmp(list->sml, conv_sml)) { | |
4621 sml = list->sml; | |
4622 break; | |
4623 } | |
4624 } | |
4625 | |
10526 | 4626 smiley = gtk_imhtml_smiley_get(GTK_IMHTML(gtkconv->imhtml), sml, smile); |
4627 | |
4628 if (smiley) { | |
11525 | 4629 |
4630 if (!(smiley->flags & GTK_IMHTML_SMILEY_CUSTOM)) { | |
4631 return FALSE; | |
4632 } | |
4633 | |
4634 /* Close the old GdkPixbufAnimation, then create a new one for | |
4635 * the smiley we are about to receive */ | |
4636 g_object_unref(G_OBJECT(smiley->icon)); | |
4637 | |
4638 smiley->loader = gdk_pixbuf_loader_new(); | |
4639 smiley->icon = gdk_pixbuf_loader_get_animation(smiley->loader); | |
4640 if (smiley->icon) | |
4641 g_object_ref(G_OBJECT(smiley->icon)); | |
4642 | |
4643 /* A custom smiley is already associated */ | |
4644 return TRUE; | |
10526 | 4645 } |
4646 | |
4647 loader = gdk_pixbuf_loader_new(); | |
4648 | |
4649 /* this is wrong, this file ought not call g_new on GtkIMHtmlSmiley */ | |
4650 /* Let gtk_imhtml have a gtk_imhtml_smiley_new function, and let | |
10812
d087e928ffd1
[gaim-migrate @ 12465]
Luke Schierer <lschiere@pidgin.im>
parents:
10810
diff
changeset
|
4651 GtkIMHtmlSmiley by opaque */ |
10526 | 4652 smiley = g_new0(GtkIMHtmlSmiley, 1); |
4653 smiley->file = NULL; | |
4654 smiley->smile = g_strdup(smile); | |
4655 smiley->loader = loader; | |
11525 | 4656 smiley->flags = smiley->flags | GTK_IMHTML_SMILEY_CUSTOM; |
10526 | 4657 |
4658 smiley->icon = gdk_pixbuf_loader_get_animation(loader); | |
4659 if (smiley->icon) | |
4660 g_object_ref(G_OBJECT(smiley->icon)); | |
4661 | |
11525 | 4662 |
10526 | 4663 gtk_imhtml_associate_smiley(GTK_IMHTML(gtkconv->imhtml), sml, smiley); |
10537 | 4664 |
10526 | 4665 return TRUE; |
4666 } | |
4667 | |
10537 | 4668 static void |
10526 | 4669 gaim_gtkconv_custom_smiley_write(GaimConversation *conv, const char *smile, |
11137 | 4670 const guchar *data, gsize size) |
10526 | 4671 { |
4672 GaimGtkConversation *gtkconv; | |
4673 GtkIMHtmlSmiley *smiley; | |
10537 | 4674 GdkPixbufLoader *loader; |
10526 | 4675 const char *sml; |
4676 | |
4677 sml = gaim_account_get_protocol_name(conv->account); | |
4678 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4679 smiley = gtk_imhtml_smiley_get(GTK_IMHTML(gtkconv->imhtml), sml, smile); | |
4680 | |
10537 | 4681 if (!smiley) |
10526 | 4682 return; |
10537 | 4683 |
10526 | 4684 loader = smiley->loader; |
10537 | 4685 if (!loader) |
10526 | 4686 return; |
4687 | |
4688 gdk_pixbuf_loader_write(loader, data, size, NULL); | |
4689 } | |
4690 | |
4691 static void | |
4692 gaim_gtkconv_custom_smiley_close(GaimConversation *conv, const char *smile) | |
4693 { | |
4694 GaimGtkConversation *gtkconv; | |
4695 GtkIMHtmlSmiley *smiley; | |
4696 GdkPixbufLoader *loader; | |
4697 const char *sml; | |
11525 | 4698 GtkWidget *icon = NULL; |
4699 GtkTextChildAnchor *anchor = NULL; | |
4700 GtkTextIter end; | |
4701 GtkIMHtml *imhtml; | |
4702 GSList *current = NULL; | |
10526 | 4703 |
4704 g_return_if_fail(conv != NULL); | |
4705 g_return_if_fail(smile != NULL); | |
4706 | |
4707 sml = gaim_account_get_protocol_name(conv->account); | |
4708 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4709 smiley = gtk_imhtml_smiley_get(GTK_IMHTML(gtkconv->imhtml), sml, smile); | |
4710 | |
10537 | 4711 if (!smiley) |
10526 | 4712 return; |
4713 | |
4714 loader = smiley->loader; | |
4715 | |
10537 | 4716 if (!loader) |
10526 | 4717 return; |
10537 | 4718 |
11525 | 4719 smiley->icon = gdk_pixbuf_loader_get_animation(loader); |
4720 if (smiley->icon) | |
4721 g_object_ref(G_OBJECT(smiley->icon)); | |
4722 | |
4723 for (current = smiley->anchors; current != NULL; current = g_slist_next(current)) { | |
4724 | |
4725 icon = gtk_image_new_from_animation(smiley->icon); | |
4726 gtk_widget_show(icon); | |
4727 | |
4728 if (icon) { | |
4729 anchor = GTK_TEXT_CHILD_ANCHOR(current->data); | |
4730 | |
4731 g_object_set_data_full(G_OBJECT(anchor), "gtkimhtml_plaintext", g_strdup(gaim_unescape_html(smile)), g_free); | |
4732 g_object_set_data_full(G_OBJECT(anchor), "gtkimhtml_htmltext", g_strdup(smile), g_free); | |
4733 | |
4734 gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(gtkconv->imhtml), icon, anchor); | |
4735 } | |
4736 | |
4737 } | |
4738 | |
4739 g_slist_free(smiley->anchors); | |
4740 smiley->anchors = NULL; | |
4741 | |
4742 /* Scroll to the end of the widget in case the smiley height was big... */ | |
4743 /* FIXME: need to test this actually works, previous dealings with scrolling | |
4744 * makes me question it */ | |
4745 imhtml = GTK_IMHTML(gtkconv->imhtml); | |
4746 gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(imhtml->text_buffer), &end); | |
4747 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(gtkconv->imhtml), &end, 0, TRUE, 0, 0); | |
4748 | |
10526 | 4749 gaim_debug_info("gtkconv", "About to close the smiley pixbuf\n"); |
4750 | |
4751 gdk_pixbuf_loader_close(loader, NULL); | |
4752 g_object_unref(G_OBJECT(loader)); | |
4753 smiley->loader = NULL; | |
4754 } | |
4755 | |
11581 | 4756 /* |
4757 * Makes sure all the menu items and all the buttons are hidden/shown and | |
4758 * sensitive/insensitive. This is called after changing tabs and when an | |
4759 * account signs on or off. | |
4760 */ | |
4761 static void | |
4762 gray_stuff_out(GaimGtkConversation *gtkconv) | |
4763 { | |
4764 GaimGtkWindow *win; | |
4765 GaimConversation *conv = gtkconv->active_conv; | |
4766 GaimConnection *gc; | |
4767 GaimPluginProtocolInfo *prpl_info = NULL; | |
4768 GdkPixbuf *window_icon = NULL; | |
4769 GtkIMHtmlButtons buttons; | |
4770 GaimAccount *account; | |
4771 | |
4772 win = gaim_gtkconv_get_window(gtkconv); | |
4773 gc = gaim_conversation_get_gc(conv); | |
4774 account = gaim_conversation_get_account(conv); | |
4775 | |
4776 if (gc != NULL) | |
4777 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
4778 | |
11594 | 4779 if (win->menu.send_to != NULL) |
11734 | 4780 update_send_to_selection(win); |
11581 | 4781 |
4782 /* | |
4783 * Handle hiding and showing stuff based on what type of conv this is. | |
4784 * Stuff that Gaim IMs support in general should be shown for IM | |
4785 * conversations. Stuff that Gaim chats support in general should be | |
4786 * shown for chat conversations. It doesn't matter whether the PRPL | |
4787 * supports it or not--that only affects if the button or menu item | |
4788 * is sensitive or not. | |
4789 */ | |
4790 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { | |
4791 /* Show stuff that applies to IMs, hide stuff that applies to chats */ | |
4792 | |
4793 /* Deal with menu items */ | |
4794 gtk_widget_show(win->menu.view_log); | |
4795 gtk_widget_show(win->menu.send_file); | |
4796 gtk_widget_show(win->menu.add_pounce); | |
4797 gtk_widget_show(win->menu.get_info); | |
4798 gtk_widget_hide(win->menu.invite); | |
4799 gtk_widget_show(win->menu.alias); | |
4800 gtk_widget_show(win->menu.block); | |
4801 | |
4802 if (gaim_find_buddy(account, gaim_conversation_get_name(conv)) == NULL) { | |
4803 gtk_widget_show(win->menu.add); | |
4804 gtk_widget_hide(win->menu.remove); | |
4805 } else { | |
4806 gtk_widget_show(win->menu.remove); | |
4807 gtk_widget_hide(win->menu.add); | |
4808 } | |
4809 | |
4810 gtk_widget_show(win->menu.insert_link); | |
4811 gtk_widget_show(win->menu.insert_image); | |
4812 gtk_widget_show(win->menu.show_icon); | |
4813 } else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { | |
4814 /* Show stuff that applies to Chats, hide stuff that applies to IMs */ | |
4815 | |
4816 /* Deal with menu items */ | |
4817 gtk_widget_show(win->menu.view_log); | |
4818 gtk_widget_hide(win->menu.send_file); | |
4819 gtk_widget_hide(win->menu.add_pounce); | |
4820 gtk_widget_hide(win->menu.get_info); | |
4821 gtk_widget_show(win->menu.invite); | |
4822 gtk_widget_show(win->menu.alias); | |
4823 gtk_widget_hide(win->menu.block); | |
4824 gtk_widget_hide(win->menu.show_icon); | |
4825 | |
4826 if (gaim_blist_find_chat(account, gaim_conversation_get_name(conv)) == NULL) { | |
4827 /* If the chat is NOT in the buddy list */ | |
4828 gtk_widget_show(win->menu.add); | |
4829 gtk_widget_hide(win->menu.remove); | |
4830 } else { | |
4831 /* If the chat IS in the buddy list */ | |
4832 gtk_widget_hide(win->menu.add); | |
4833 gtk_widget_show(win->menu.remove); | |
4834 } | |
4835 | |
4836 gtk_widget_show(win->menu.insert_link); | |
4837 gtk_widget_hide(win->menu.insert_image); | |
4838 } | |
4839 | |
4840 /* | |
4841 * Handle graying stuff out based on whether an account is connected | |
4842 * and what features that account supports. | |
4843 */ | |
4844 if ((gc != NULL) && | |
4845 ( (gaim_conversation_get_type(conv) != GAIM_CONV_TYPE_CHAT) || | |
4846 !gaim_conv_chat_has_left(GAIM_CONV_CHAT(conv)) )) { | |
4847 /* Account is online */ | |
4848 /* Deal with the toolbar */ | |
4849 if (conv->features & GAIM_CONNECTION_HTML) { | |
4850 buttons = GTK_IMHTML_ALL; /* Everything on */ | |
4851 if (!(prpl_info->options & OPT_PROTO_IM_IMAGE) || | |
4852 conv->features & GAIM_CONNECTION_NO_IMAGES) | |
4853 buttons &= ~GTK_IMHTML_IMAGE; | |
4854 if (conv->features & GAIM_CONNECTION_NO_BGCOLOR) | |
4855 buttons &= ~GTK_IMHTML_BACKCOLOR; | |
4856 if (conv->features & GAIM_CONNECTION_NO_FONTSIZE) { | |
4857 buttons &= ~GTK_IMHTML_GROW; | |
4858 buttons &= ~GTK_IMHTML_SHRINK; | |
4859 } | |
4860 if (conv->features & GAIM_CONNECTION_NO_URLDESC) | |
4861 buttons &= ~GTK_IMHTML_LINKDESC; | |
4862 } else { | |
4863 buttons = GTK_IMHTML_SMILEY; | |
4864 } | |
4865 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); | |
4866 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), gaim_account_get_protocol_id(account)); | |
4867 | |
4868 /* Deal with menu items */ | |
4869 gtk_widget_set_sensitive(win->menu.view_log, TRUE); | |
4870 gtk_widget_set_sensitive(win->menu.add_pounce, TRUE); | |
4871 gtk_widget_set_sensitive(win->menu.get_info, (prpl_info->get_info != NULL)); | |
4872 gtk_widget_set_sensitive(win->menu.invite, (prpl_info->chat_invite != NULL)); | |
4873 gtk_widget_set_sensitive(win->menu.block, (prpl_info->add_deny != NULL)); | |
4874 gtk_widget_set_sensitive(win->menu.insert_link, (conv->features & GAIM_CONNECTION_HTML)); | |
4875 gtk_widget_set_sensitive(win->menu.insert_image, (prpl_info->options & OPT_PROTO_IM_IMAGE)); | |
4876 | |
4877 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { | |
4878 gtk_widget_set_sensitive(win->menu.add, (prpl_info->add_buddy != NULL)); | |
4879 gtk_widget_set_sensitive(win->menu.remove, (prpl_info->remove_buddy != NULL)); | |
4880 gtk_widget_set_sensitive(win->menu.send_file, | |
4881 (prpl_info->send_file != NULL && (!prpl_info->can_receive_file || | |
4882 prpl_info->can_receive_file(gc, gaim_conversation_get_name(conv))))); | |
4883 gtk_widget_set_sensitive(win->menu.alias, | |
4884 (gaim_find_buddy(account, gaim_conversation_get_name(conv)) != NULL)); | |
4885 } else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { | |
4886 gtk_widget_set_sensitive(win->menu.add, (prpl_info->join_chat != NULL)); | |
4887 gtk_widget_set_sensitive(win->menu.remove, (prpl_info->join_chat != NULL)); | |
4888 gtk_widget_set_sensitive(win->menu.alias, | |
4889 (gaim_blist_find_chat(account, gaim_conversation_get_name(conv)) != NULL)); | |
4890 } | |
4891 | |
4892 /* Deal with chat userlist buttons */ | |
4893 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) | |
4894 { | |
4895 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_im, TRUE); | |
4896 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_ignore, TRUE); | |
4897 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_info, (prpl_info->get_info != NULL)); | |
4898 } | |
4899 } else { | |
4900 /* Account is offline */ | |
4901 /* Or it's a chat that we've left. */ | |
4902 | |
4903 /* Then deal with menu items */ | |
4904 gtk_widget_set_sensitive(win->menu.view_log, TRUE); | |
4905 gtk_widget_set_sensitive(win->menu.send_file, FALSE); | |
4906 gtk_widget_set_sensitive(win->menu.add_pounce, TRUE); | |
4907 gtk_widget_set_sensitive(win->menu.get_info, FALSE); | |
4908 gtk_widget_set_sensitive(win->menu.invite, FALSE); | |
4909 gtk_widget_set_sensitive(win->menu.alias, FALSE); | |
4910 gtk_widget_set_sensitive(win->menu.block, FALSE); | |
4911 gtk_widget_set_sensitive(win->menu.add, FALSE); | |
4912 gtk_widget_set_sensitive(win->menu.remove, FALSE); | |
4913 gtk_widget_set_sensitive(win->menu.insert_link, TRUE); | |
4914 gtk_widget_set_sensitive(win->menu.insert_image, FALSE); | |
4915 | |
4916 /* Deal with chat userlist buttons */ | |
4917 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) | |
4918 { | |
4919 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_im, FALSE); | |
4920 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_ignore, FALSE); | |
4921 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_info, FALSE); | |
4922 } | |
4923 } | |
4924 | |
4925 /* | |
4926 * Update the window's icon | |
4927 */ | |
4928 if ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) && | |
4929 (gtkconv->u.im->anim)) | |
4930 { | |
4931 window_icon = | |
4932 gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); | |
4933 g_object_ref(window_icon); | |
4934 } else { | |
4935 window_icon = gaim_gtkconv_get_tab_icon(conv, FALSE); | |
4936 } | |
4937 gtk_window_set_icon(GTK_WINDOW(win->window), window_icon); | |
4938 if (window_icon != NULL) | |
4939 g_object_unref(G_OBJECT(window_icon)); | |
4940 } | |
4941 | |
10526 | 4942 |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4943 static void |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4944 gaim_gtkconv_updated(GaimConversation *conv, GaimConvUpdateType type) |
4359 | 4945 { |
11581 | 4946 GaimGtkWindow *win; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4947 GaimGtkConversation *gtkconv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4948 GaimGtkChatPane *gtkchat; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4949 GaimConvChat *chat; |
4359 | 4950 |
10116 | 4951 g_return_if_fail(conv != NULL); |
4952 | |
4359 | 4953 gtkconv = GAIM_GTK_CONVERSATION(conv); |
11581 | 4954 win = gtkconv->win; |
10810 | 4955 conv = gtkconv->active_conv; /* Gross hack */ |
11581 | 4956 /* Maybe we should just ignore it if conv != gtkconv->active_conv, |
4957 * instead of the gross hack? | |
4958 */ | |
4359 | 4959 |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4960 if (type == GAIM_CONV_UPDATE_ACCOUNT) |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4961 { |
4359 | 4962 gaim_conversation_autoset_title(conv); |
5881
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
4963 |
11338 | 4964 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
5881
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
4965 gaim_gtkconv_update_buddy_icon(conv); |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
4966 |
4359 | 4967 gaim_gtkconv_update_buttons_by_protocol(conv); |
4968 | |
11734 | 4969 update_send_to_selection(win); |
4359 | 4970 |
11525 | 4971 gaim_gtkthemes_smiley_themeize(gtkconv->imhtml); |
6394 | 4972 |
6395 | 4973 update_tab_icon(conv); |
4359 | 4974 } |
4975 else if (type == GAIM_CONV_UPDATE_TYPING || | |
8155
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
4976 type == GAIM_CONV_UPDATE_UNSEEN || |
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
4977 type == GAIM_CONV_UPDATE_TITLE) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4978 { |
9472 | 4979 char *title; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4980 GaimConvIm *im = NULL; |
9472 | 4981 GaimConnection *gc = gaim_conversation_get_gc(conv); |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4982 /* I think this is a little longer than it needs to be but I'm lazy. */ |
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4983 char style[51]; |
4736 | 4984 |
11338 | 4985 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4986 im = GAIM_CONV_IM(conv); |
4359 | 4987 |
11338 | 4988 if (!gc || ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) |
9472 | 4989 && gaim_conv_chat_has_left(GAIM_CONV_CHAT(conv)))) |
4990 title = g_strdup_printf("(%s)", gaim_conversation_get_title(conv)); | |
4991 else | |
4992 title = g_strdup(gaim_conversation_get_title(conv)); | |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4993 |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4994 *style = '\0'; |
4359 | 4995 |
4996 if (!GTK_WIDGET_REALIZED(gtkconv->tab_label)) | |
4997 gtk_widget_realize(gtkconv->tab_label); | |
4998 | |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4999 if (im != NULL && |
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
5000 gaim_conv_im_get_typing_state(im) == GAIM_TYPING) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5001 { |
11759 | 5002 strncpy(style, "color=\"#47A046\"", sizeof(style)); |
4359 | 5003 } |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
5004 else if (im != NULL && |
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
5005 gaim_conv_im_get_typing_state(im) == GAIM_TYPED) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5006 { |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
5007 strncpy(style, "color=\"#D1940C\"", sizeof(style)); |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5008 } |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5009 else if (gtkconv->unseen_state == GAIM_UNSEEN_NICK) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5010 { |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
5011 strncpy(style, "color=\"#0D4E91\" style=\"italic\" weight=\"bold\"", sizeof(style)); |
4359 | 5012 } |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5013 else if (gtkconv->unseen_state == GAIM_UNSEEN_TEXT) |
8252 | 5014 { |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
5015 strncpy(style, "color=\"#DF421E\" weight=\"bold\"", sizeof(style)); |
8252 | 5016 } |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5017 else if (gtkconv->unseen_state == GAIM_UNSEEN_EVENT) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5018 { |
11758 | 5019 strncpy(style, "color=\"#868272\" style=\"italic\"", sizeof(style)); |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5020 } |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5021 |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
5022 if (*style != '\0') |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5023 { |
8536 | 5024 char *html_title,*label; |
5025 | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10698
diff
changeset
|
5026 html_title = g_markup_escape_text(title, -1); |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5027 |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
5028 label = g_strdup_printf("<span %s>%s</span>", |
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
5029 style, html_title); |
8536 | 5030 g_free(html_title); |
7995
87d3260f961a
[gaim-migrate @ 8672]
Christian Hammond <chipx86@chipx86.com>
parents:
7990
diff
changeset
|
5031 gtk_label_set_markup(GTK_LABEL(gtkconv->tab_label), label); |
87d3260f961a
[gaim-migrate @ 8672]
Christian Hammond <chipx86@chipx86.com>
parents:
7990
diff
changeset
|
5032 g_free(label); |
4359 | 5033 } |
7995
87d3260f961a
[gaim-migrate @ 8672]
Christian Hammond <chipx86@chipx86.com>
parents:
7990
diff
changeset
|
5034 else |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5035 gtk_label_set_text(GTK_LABEL(gtkconv->tab_label), title); |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5036 |
11581 | 5037 if (conv == gaim_gtk_conv_window_get_active_conversation(win)) |
10810 | 5038 update_typing_icon(gtkconv); |
8155
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
5039 |
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
5040 if (type == GAIM_CONV_UPDATE_TITLE) { |
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
5041 gtk_label_set_text(GTK_LABEL(gtkconv->menu_label), title); |
11581 | 5042 if (conv == gaim_gtk_conv_window_get_active_conversation(win)) |
5043 gtk_window_set_title(GTK_WINDOW(win->window), title); | |
8155
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
5044 } |
9472 | 5045 |
5046 g_free(title); | |
4359 | 5047 } |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5048 else if (type == GAIM_CONV_UPDATE_TOPIC) |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5049 { |
7154 | 5050 const char *topic; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
5051 chat = GAIM_CONV_CHAT(conv); |
4359 | 5052 gtkchat = gtkconv->u.chat; |
5053 | |
7154 | 5054 topic = gaim_conv_chat_get_topic(chat); |
5055 | |
9554 | 5056 gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), topic ? topic : ""); |
7154 | 5057 gtk_tooltips_set_tip(gtkconv->tooltips, gtkchat->topic_text, |
9554 | 5058 topic ? topic : "", NULL); |
4359 | 5059 } |
5060 else if (type == GAIM_CONV_ACCOUNT_ONLINE || | |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5061 type == GAIM_CONV_ACCOUNT_OFFLINE) |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5062 { |
11581 | 5063 gray_stuff_out(GAIM_GTK_CONVERSATION(gaim_gtk_conv_window_get_active_conversation(win))); |
11594 | 5064 generate_send_to_items(win); |
8946 | 5065 update_tab_icon(conv); |
9472 | 5066 gaim_conversation_autoset_title(conv); |
6392
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
5067 } |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5068 else if (type == GAIM_CONV_UPDATE_AWAY) |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5069 { |
8946 | 5070 update_tab_icon(conv); |
4359 | 5071 } |
8256
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8253
diff
changeset
|
5072 else if (type == GAIM_CONV_UPDATE_ADD || type == GAIM_CONV_UPDATE_REMOVE || |
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8253
diff
changeset
|
5073 type == GAIM_CONV_UPDATE_CHATLEFT) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5074 { |
9472 | 5075 gaim_conversation_autoset_title(conv); |
10810 | 5076 gray_stuff_out(GAIM_GTK_CONVERSATION(conv)); |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
5077 } |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5078 else if (type == GAIM_CONV_UPDATE_ICON) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5079 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5080 gaim_gtkconv_update_buddy_icon(conv); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5081 } |
10665 | 5082 else if (type == GAIM_CONV_UPDATE_FEATURES) |
5083 { | |
10810 | 5084 gray_stuff_out(GAIM_GTK_CONVERSATION(conv)); |
10665 | 5085 } |
4359 | 5086 } |
5087 | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5088 static GaimConversationUiOps conversation_ui_ops = |
4359 | 5089 { |
11581 | 5090 gaim_gtkconv_new, |
4359 | 5091 gaim_gtkconv_destroy, /* destroy_conversation */ |
5092 gaim_gtkconv_write_chat, /* write_chat */ | |
5093 gaim_gtkconv_write_im, /* write_im */ | |
5094 gaim_gtkconv_write_conv, /* write_conv */ | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
5095 gaim_gtkconv_chat_add_users, /* chat_add_users */ |
4359 | 5096 gaim_gtkconv_chat_rename_user, /* chat_rename_user */ |
5097 gaim_gtkconv_chat_remove_user, /* chat_remove_user */ | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
5098 gaim_gtkconv_chat_remove_users, /* chat_remove_users */ |
9554 | 5099 gaim_gtkconv_chat_update_user, /* chat_update_user */ |
9260
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
5100 gaim_gtkconv_has_focus, /* has_focus */ |
10526 | 5101 gaim_gtkconv_custom_smiley_add, /* custom_smiley_add */ |
5102 gaim_gtkconv_custom_smiley_write, /* custom_smiley_write */ | |
5103 gaim_gtkconv_custom_smiley_close, /* custom_smiley_close */ | |
4359 | 5104 gaim_gtkconv_updated /* updated */ |
5105 }; | |
5106 | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5107 GaimConversationUiOps * |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7008
diff
changeset
|
5108 gaim_gtk_conversations_get_conv_ui_ops(void) |
4359 | 5109 { |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
5110 return &conversation_ui_ops; |
4359 | 5111 } |
5112 | |
5113 /************************************************************************** | |
5114 * Public conversation utility functions | |
5115 **************************************************************************/ | |
5116 void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5117 gaim_gtkconv_update_buddy_icon(GaimConversation *conv) |
4359 | 5118 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5119 GaimGtkConversation *gtkconv; |
11581 | 5120 GaimGtkWindow *win; |
4359 | 5121 |
10381 | 5122 GdkPixbufLoader *loader; |
5123 GdkPixbufAnimation *anim; | |
4359 | 5124 GError *err = NULL; |
5125 | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5126 const void *data; |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5127 size_t len; |
4359 | 5128 |
5129 GdkPixbuf *buf; | |
5130 | |
5131 GtkWidget *event; | |
5132 GtkWidget *frame; | |
5133 GdkPixbuf *scale; | |
5134 GdkPixmap *pm; | |
5135 GdkBitmap *bm; | |
9318 | 5136 int scale_width, scale_height; |
5137 | |
5138 GaimAccount *account; | |
5139 GaimPluginProtocolInfo *prpl_info = NULL; | |
4359 | 5140 |
9324 | 5141 GaimBuddyIcon *icon; |
5142 | |
5678
619bca773b2e
[gaim-migrate @ 6096]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
5143 g_return_if_fail(conv != NULL); |
619bca773b2e
[gaim-migrate @ 6096]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
5144 g_return_if_fail(GAIM_IS_GTK_CONVERSATION(conv)); |
11338 | 5145 g_return_if_fail(gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM); |
4359 | 5146 |
5147 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
11581 | 5148 win = gtkconv->win; |
10175 | 5149 |
9687 | 5150 if (!gtkconv->u.im->show_icon) |
5151 return; | |
5152 | |
9318 | 5153 account = gaim_conversation_get_account(conv); |
5154 if(account && account->gc) | |
5155 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl); | |
4359 | 5156 |
9845 | 5157 /* Remove the current icon stuff */ |
9885 | 5158 if (gtkconv->u.im->icon_container != NULL) |
5159 gtk_widget_destroy(gtkconv->u.im->icon_container); | |
5160 gtkconv->u.im->icon_container = NULL; | |
9845 | 5161 |
5162 if (gtkconv->u.im->anim != NULL) | |
5163 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); | |
5164 | |
9887 | 5165 gtkconv->u.im->anim = NULL; |
5166 | |
9845 | 5167 if (gtkconv->u.im->icon_timer != 0) |
5168 g_source_remove(gtkconv->u.im->icon_timer); | |
5169 | |
5170 gtkconv->u.im->icon_timer = 0; | |
5171 | |
5172 if (gtkconv->u.im->iter != NULL) | |
5173 g_object_unref(G_OBJECT(gtkconv->u.im->iter)); | |
4359 | 5174 |
10116 | 5175 gtkconv->u.im->iter = NULL; |
5176 | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
5177 if (!gaim_prefs_get_bool("/gaim/gtk/conversations/im/show_buddy_icons")) |
4359 | 5178 return; |
5179 | |
5180 if (gaim_conversation_get_gc(conv) == NULL) | |
5181 return; | |
5182 | |
9324 | 5183 icon = gaim_conv_im_get_icon(GAIM_CONV_IM(conv)); |
5184 | |
5185 if (icon == NULL) | |
5186 return; | |
5187 | |
5188 data = gaim_buddy_icon_get_data(icon, &len); | |
5189 | |
10381 | 5190 loader = gdk_pixbuf_loader_new(); |
5191 gdk_pixbuf_loader_write(loader, data, len, NULL); | |
5192 anim = gdk_pixbuf_loader_get_animation(loader); | |
5193 if (anim) | |
5194 g_object_ref(G_OBJECT(anim)); | |
5195 gdk_pixbuf_loader_close(loader, &err); | |
5196 g_object_unref(loader); | |
5197 | |
5198 if (!anim) | |
9324 | 5199 return; |
10381 | 5200 gtkconv->u.im->anim = anim; |
9324 | 5201 |
4359 | 5202 if (err) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
5203 gaim_debug(GAIM_DEBUG_ERROR, "gtkconv", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
5204 "Buddy icon error: %s\n", err->message); |
4359 | 5205 g_error_free(err); |
5206 } | |
5207 | |
5208 if (!gtkconv->u.im->anim) | |
5209 return; | |
5210 | |
5211 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) { | |
5212 gtkconv->u.im->iter = NULL; | |
5213 buf = gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); | |
5214 } else { | |
5215 gtkconv->u.im->iter = | |
8496 | 5216 gdk_pixbuf_animation_get_iter(gtkconv->u.im->anim, NULL); /* LEAK */ |
4359 | 5217 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter); |
8189 | 5218 if (gtkconv->u.im->animate) |
10810 | 5219 start_anim(NULL, gtkconv); |
4359 | 5220 } |
5221 | |
10483 | 5222 gaim_gtk_buddy_icon_get_scale_size(buf, prpl_info ? &prpl_info->icon_spec : |
9318 | 5223 NULL, &scale_width, &scale_height); |
4359 | 5224 scale = gdk_pixbuf_scale_simple(buf, |
9318 | 5225 MAX(gdk_pixbuf_get_width(buf) * scale_width / |
4359 | 5226 gdk_pixbuf_animation_get_width(gtkconv->u.im->anim), 1), |
9318 | 5227 MAX(gdk_pixbuf_get_height(buf) * scale_height / |
4359 | 5228 gdk_pixbuf_animation_get_height(gtkconv->u.im->anim), 1), |
11324 | 5229 GDK_INTERP_BILINEAR); |
4359 | 5230 |
5231 gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 100); | |
4793 | 5232 g_object_unref(G_OBJECT(scale)); |
4359 | 5233 |
8821 | 5234 |
9885 | 5235 gtkconv->u.im->icon_container = gtk_vbox_new(FALSE, 0); |
8821 | 5236 |
4359 | 5237 frame = gtk_frame_new(NULL); |
5238 gtk_frame_set_shadow_type(GTK_FRAME(frame), | |
5239 (bm ? GTK_SHADOW_NONE : GTK_SHADOW_IN)); | |
9885 | 5240 gtk_box_pack_start(GTK_BOX(gtkconv->u.im->icon_container), frame, |
5241 FALSE, FALSE, 0); | |
8821 | 5242 |
4359 | 5243 event = gtk_event_box_new(); |
5244 gtk_container_add(GTK_CONTAINER(frame), event); | |
5314
1f901484599d
[gaim-migrate @ 5686]
Christian Hammond <chipx86@chipx86.com>
parents:
5228
diff
changeset
|
5245 g_signal_connect(G_OBJECT(event), "button-press-event", |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
5246 G_CALLBACK(icon_menu), gtkconv); |
4359 | 5247 gtk_widget_show(event); |
5248 | |
4635 | 5249 gtkconv->u.im->icon = gtk_image_new_from_pixmap(pm, bm); |
9318 | 5250 gtk_widget_set_size_request(gtkconv->u.im->icon, scale_width, scale_height); |
4359 | 5251 gtk_container_add(GTK_CONTAINER(event), gtkconv->u.im->icon); |
5252 gtk_widget_show(gtkconv->u.im->icon); | |
5253 | |
4793 | 5254 g_object_unref(G_OBJECT(pm)); |
4359 | 5255 |
5256 if (bm) | |
4793 | 5257 g_object_unref(G_OBJECT(bm)); |
7143 | 5258 |
10356 | 5259 gtk_box_pack_start(GTK_BOX(gtkconv->lower_hbox), |
5260 gtkconv->u.im->icon_container, FALSE, FALSE, 0); | |
9332 | 5261 |
9885 | 5262 gtk_widget_show(gtkconv->u.im->icon_container); |
9332 | 5263 gtk_widget_show(frame); |
5264 | |
7143 | 5265 /* The buddy icon code needs badly to be fixed. */ |
5266 buf = gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); | |
11581 | 5267 if(conv == gaim_gtk_conv_window_get_active_conversation(gtkconv->win)) |
5268 gtk_window_set_icon(GTK_WINDOW(win->window), buf); | |
4359 | 5269 } |
5270 | |
5271 void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5272 gaim_gtkconv_update_buttons_by_protocol(GaimConversation *conv) |
4359 | 5273 { |
11581 | 5274 GaimGtkWindow *win; |
4359 | 5275 |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
5276 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 5277 return; |
5278 | |
11581 | 5279 win = GAIM_GTK_CONVERSATION(conv)->win; |
5280 | |
5281 if (win != NULL && gaim_gtk_conv_window_is_active_conversation(conv)) | |
10810 | 5282 gray_stuff_out(GAIM_GTK_CONVERSATION(conv)); |
4359 | 5283 } |
5284 | |
5285 int | |
11614 | 5286 gaim_gtkconv_get_tab_at_xy(GaimGtkWindow *win, int x, int y, gboolean *to_right) |
11581 | 5287 { |
4359 | 5288 gint nb_x, nb_y, x_rel, y_rel; |
5289 GtkNotebook *notebook; | |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5290 GtkWidget *page, *tab; |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5291 gint i, page_num = -1; |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5292 gint count; |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5293 gboolean horiz; |
4359 | 5294 |
11614 | 5295 if (to_right) |
5296 *to_right = FALSE; | |
5297 | |
11581 | 5298 notebook = GTK_NOTEBOOK(win->notebook); |
5299 | |
5300 gdk_window_get_origin(win->notebook->window, &nb_x, &nb_y); | |
4359 | 5301 x_rel = x - nb_x; |
5302 y_rel = y - nb_y; | |
5303 | |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5304 horiz = (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP || |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5305 gtk_notebook_get_tab_pos(notebook) == GTK_POS_BOTTOM); |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5306 |
11780 | 5307 #if GTK_CHECK_VERSION(2,2,0) |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5308 count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); |
11780 | 5309 #else |
5310 /* this is hacky, but it's only for Gtk 2.0.0... */ | |
5311 count = g_list_length(GTK_NOTEBOOK(notebook)->children); | |
5312 #endif | |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5313 |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5314 for (i = 0; i < count; i++) { |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5315 |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5316 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), i); |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5317 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), page); |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5318 |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5319 if (horiz) { |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5320 if (x_rel >= tab->allocation.x - GAIM_HIG_BOX_SPACE && |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5321 x_rel <= tab->allocation.x + tab->allocation.width + GAIM_HIG_BOX_SPACE) { |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5322 page_num = i; |
11614 | 5323 |
5324 if (to_right && x_rel >= tab->allocation.x + tab->allocation.width/2) | |
5325 *to_right = TRUE; | |
5326 | |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5327 break; |
4359 | 5328 } |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5329 } else { |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5330 if (y_rel >= tab->allocation.y - GAIM_HIG_BOX_SPACE && |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5331 y_rel <= tab->allocation.y + tab->allocation.height + GAIM_HIG_BOX_SPACE) { |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5332 page_num = i; |
11614 | 5333 |
5334 if (to_right && y_rel >= tab->allocation.y + tab->allocation.height/2) | |
5335 *to_right = TRUE; | |
5336 | |
4359 | 5337 break; |
5338 } | |
5339 } | |
5340 } | |
5341 | |
5342 return page_num; | |
5343 } | |
5344 | |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5345 static void |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5346 close_on_tabs_pref_cb(const char *name, GaimPrefType type, gpointer value, |
6392
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
5347 gpointer data) |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5348 { |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5349 GList *l; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5350 GaimConversation *conv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5351 GaimGtkConversation *gtkconv; |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5352 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5353 for (l = gaim_get_conversations(); l != NULL; l = l->next) { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5354 conv = (GaimConversation *)l->data; |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5355 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5356 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5357 continue; |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5358 |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5359 gtkconv = GAIM_GTK_CONVERSATION(conv); |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5360 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5361 if (value) |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5362 gtk_widget_show(gtkconv->close); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5363 else |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5364 gtk_widget_hide(gtkconv->close); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5365 } |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5366 } |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5367 |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5368 static void |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5369 spellcheck_pref_cb(const char *name, GaimPrefType type, gpointer value, |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5370 gpointer data) |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5371 { |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5372 #ifdef USE_GTKSPELL |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5373 GList *cl; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5374 GaimConversation *conv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5375 GaimGtkConversation *gtkconv; |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5376 GtkSpell *spell; |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5377 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5378 for (cl = gaim_get_conversations(); cl != NULL; cl = cl->next) { |
6725
e62a504c83d0
[gaim-migrate @ 7252]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
5379 |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5380 conv = (GaimConversation *)cl->data; |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5381 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5382 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5383 continue; |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5384 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5385 gtkconv = GAIM_GTK_CONVERSATION(conv); |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5386 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5387 if (value) |
7538
357eb1c39b72
[gaim-migrate @ 8151]
Christian Hammond <chipx86@chipx86.com>
parents:
7476
diff
changeset
|
5388 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(gtkconv->entry)); |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5389 else { |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5390 spell = gtkspell_get_from_text_view(GTK_TEXT_VIEW(gtkconv->entry)); |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5391 gtkspell_detach(spell); |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5392 } |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5393 } |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5394 #endif |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5395 } |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5396 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5397 static void |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5398 tab_side_pref_cb(const char *name, GaimPrefType type, gpointer value, |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5399 gpointer data) |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5400 { |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5401 GList *l; |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5402 GtkPositionType pos; |
11581 | 5403 GaimGtkWindow *win; |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5404 |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5405 pos = GPOINTER_TO_INT(value); |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5406 |
11581 | 5407 for (l = gaim_gtk_conv_windows_get_list(); l != NULL; l = l->next) { |
5408 win = l->data; | |
5409 | |
11619 | 5410 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(win->notebook), pos&~8); |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5411 } |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5412 } |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5413 |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5414 static void |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5415 show_formatting_toolbar_pref_cb(const char *name, GaimPrefType type, |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5416 gpointer value, gpointer data) |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5417 { |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5418 GList *l; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5419 GaimConversation *conv; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5420 GaimGtkConversation *gtkconv; |
11581 | 5421 GaimGtkWindow *win; |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5422 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5423 for (l = gaim_get_conversations(); l != NULL; l = l->next) |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5424 { |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5425 conv = (GaimConversation *)l->data; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5426 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5427 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5428 continue; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5429 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5430 gtkconv = GAIM_GTK_CONVERSATION(conv); |
11581 | 5431 win = gtkconv->win; |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5432 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5433 gtk_check_menu_item_set_active( |
11581 | 5434 GTK_CHECK_MENU_ITEM(win->menu.show_formatting_toolbar), |
5435 (gboolean)GPOINTER_TO_INT(value)); | |
10377 | 5436 |
5437 if ((gboolean)GPOINTER_TO_INT(value)) | |
8317 | 5438 gtk_widget_show(gtkconv->toolbar); |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5439 else |
8317 | 5440 gtk_widget_hide(gtkconv->toolbar); |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5441 } |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5442 } |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5443 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5444 static void |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5445 animate_buddy_icons_pref_cb(const char *name, GaimPrefType type, |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5446 gpointer value, gpointer data) |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5447 { |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5448 GList *l; |
8189 | 5449 GaimConversation *conv; |
5450 GaimGtkConversation *gtkconv; | |
11581 | 5451 GaimGtkWindow *win; |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5452 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5453 if (!gaim_prefs_get_bool("/gaim/gtk/conversations/im/show_buddy_icons")) |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5454 return; |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5455 |
8189 | 5456 /* Set the "animate" flag for each icon based on the new preference */ |
5457 for (l = gaim_get_ims(); l != NULL; l = l->next) { | |
5458 conv = (GaimConversation *)l->data; | |
5459 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
10112 | 5460 gtkconv->u.im->animate = GPOINTER_TO_INT(value); |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5461 } |
8189 | 5462 |
5463 /* Now either stop or start animation for the active conversation in each window */ | |
11581 | 5464 for (l = gaim_gtk_conv_windows_get_list(); l != NULL; l = l->next) { |
5465 win = l->data; | |
5466 conv = gaim_gtk_conv_window_get_active_conversation(win); | |
8189 | 5467 gaim_gtkconv_update_buddy_icon(conv); |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5468 } |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5469 } |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5470 |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5471 static void |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5472 show_buddy_icons_pref_cb(const char *name, GaimPrefType type, gpointer value, |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5473 gpointer data) |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5474 { |
5881
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5475 GList *l; |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5476 |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5477 for (l = gaim_get_conversations(); l != NULL; l = l->next) { |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5478 GaimConversation *conv = l->data; |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5479 |
11338 | 5480 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
5881
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5481 gaim_conversation_foreach(gaim_gtkconv_update_buddy_icon); |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5482 } |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5483 } |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5484 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5680
diff
changeset
|
5485 static void |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5486 conv_placement_pref_cb(const char *name, GaimPrefType type, |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5487 gpointer value, gpointer data) |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5488 { |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5489 GaimConvPlacementFunc func; |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5490 |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5491 if (strcmp(name, "/gaim/gtk/conversations/placement")) |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5492 return; |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5493 |
11581 | 5494 func = gaim_gtkconv_placement_get_fnc(value); |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5495 |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5496 if (func == NULL) |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5497 return; |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5498 |
11581 | 5499 gaim_gtkconv_placement_set_current_func(func); |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5500 } |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5501 |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5502 void * |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5503 gaim_gtk_conversations_get_handle(void) |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5504 { |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5505 static int handle; |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5506 |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5507 return &handle; |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5508 } |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5509 |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5510 void |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7008
diff
changeset
|
5511 gaim_gtk_conversations_init(void) |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5512 { |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5513 void *handle = gaim_gtk_conversations_get_handle(); |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5514 |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5515 /* Conversations */ |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5516 gaim_prefs_add_none("/gaim/gtk/conversations"); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5517 gaim_prefs_add_bool("/gaim/gtk/conversations/close_on_tabs", TRUE); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5518 gaim_prefs_add_bool("/gaim/gtk/conversations/send_bold", FALSE); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5519 gaim_prefs_add_bool("/gaim/gtk/conversations/send_italic", FALSE); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5520 gaim_prefs_add_bool("/gaim/gtk/conversations/send_underline", FALSE); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5521 gaim_prefs_add_bool("/gaim/gtk/conversations/spellcheck", TRUE); |
11267
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
5522 gaim_prefs_add_bool("/gaim/gtk/conversations/show_incoming_formatting", TRUE); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
5523 |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5524 gaim_prefs_add_bool("/gaim/gtk/conversations/show_formatting_toolbar", TRUE); |
9832 | 5525 gaim_prefs_add_bool("/gaim/gtk/conversations/passthrough_unknown_commands", FALSE); |
9130 | 5526 |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5527 gaim_prefs_add_string("/gaim/gtk/conversations/placement", "last"); |
8998 | 5528 gaim_prefs_add_int("/gaim/gtk/conversations/placement_number", 1); |
9025 | 5529 gaim_prefs_add_string("/gaim/gtk/conversations/bgcolor", ""); |
5530 gaim_prefs_add_string("/gaim/gtk/conversations/fgcolor", ""); | |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5531 gaim_prefs_add_string("/gaim/gtk/conversations/font_face", ""); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5532 gaim_prefs_add_int("/gaim/gtk/conversations/font_size", 3); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5533 gaim_prefs_add_bool("/gaim/gtk/conversations/tabs", TRUE); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5534 gaim_prefs_add_int("/gaim/gtk/conversations/tab_side", GTK_POS_TOP); |
11224
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
5535 gaim_prefs_add_int("/gaim/gtk/conversations/scrollback_lines", 4000); |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5536 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5537 /* Conversations -> Chat */ |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5538 gaim_prefs_add_none("/gaim/gtk/conversations/chat"); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5539 gaim_prefs_add_int("/gaim/gtk/conversations/chat/default_width", 410); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5540 gaim_prefs_add_int("/gaim/gtk/conversations/chat/default_height", 160); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5541 gaim_prefs_add_int("/gaim/gtk/conversations/chat/entry_height", 50); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5542 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5543 /* Conversations -> IM */ |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5544 gaim_prefs_add_none("/gaim/gtk/conversations/im"); |
9150 | 5545 |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5546 gaim_prefs_add_bool("/gaim/gtk/conversations/im/animate_buddy_icons", TRUE); |
9150 | 5547 |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5548 gaim_prefs_add_int("/gaim/gtk/conversations/im/default_width", 410); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5549 gaim_prefs_add_int("/gaim/gtk/conversations/im/default_height", 160); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5550 gaim_prefs_add_int("/gaim/gtk/conversations/im/entry_height", 50); |
9319 | 5551 gaim_prefs_add_bool("/gaim/gtk/conversations/im/show_buddy_icons", TRUE); |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5552 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5553 /* Connect callbacks. */ |
10087 | 5554 gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/close_on_tabs", |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5555 close_on_tabs_pref_cb, NULL); |
10087 | 5556 gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/show_formatting_toolbar", |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5557 show_formatting_toolbar_pref_cb, NULL); |
10087 | 5558 gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/spellcheck", |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5559 spellcheck_pref_cb, NULL); |
10087 | 5560 gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/tab_side", |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5561 tab_side_pref_cb, NULL); |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5562 |
10087 | 5563 gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/placement", |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5564 conv_placement_pref_cb, NULL); |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5565 gaim_prefs_trigger_callback("/gaim/gtk/conversations/placement"); |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5566 |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5567 /* IM callbacks */ |
10087 | 5568 gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/im/animate_buddy_icons", |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5569 animate_buddy_icons_pref_cb, NULL); |
10087 | 5570 gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/im/show_buddy_icons", |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5571 show_buddy_icons_pref_cb, NULL); |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5572 |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5573 |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5574 /********************************************************************** |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5575 * Register signals |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5576 **********************************************************************/ |
11447
ef6e94bdda08
[gaim-migrate @ 13686]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11338
diff
changeset
|
5577 gaim_signal_register(handle, "conversation-dragging", |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5578 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5579 gaim_value_new(GAIM_TYPE_SUBTYPE, |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5580 GAIM_SUBTYPE_CONV_WINDOW), |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5581 gaim_value_new(GAIM_TYPE_SUBTYPE, |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5582 GAIM_SUBTYPE_CONV_WINDOW)); |
9167 | 5583 |
5584 /********************************************************************** | |
5585 * Register commands | |
5586 **********************************************************************/ | |
9829 | 5587 gaim_cmd_register("say", "S", GAIM_CMD_P_DEFAULT, |
5588 GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, | |
5589 say_command_cb, _("say <message>: Send a message normally as if you weren't using a command."), NULL); | |
9213 | 5590 gaim_cmd_register("me", "S", GAIM_CMD_P_DEFAULT, |
5591 GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, | |
9597 | 5592 me_command_cb, _("me <action>: Send an IRC style action to a buddy or chat."), NULL); |
9213 | 5593 gaim_cmd_register("debug", "w", GAIM_CMD_P_DEFAULT, |
5594 GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, | |
9597 | 5595 debug_command_cb, _("debug <option>: Send various debug information to the current conversation."), NULL); |
11145
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
5596 gaim_cmd_register("clear", "", GAIM_CMD_P_DEFAULT, |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
5597 GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
5598 clear_command_cb, _("clear: Clears the conversation scrollback."), NULL); |
9213 | 5599 gaim_cmd_register("help", "w", GAIM_CMD_P_DEFAULT, |
9597 | 5600 GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, NULL, |
5601 help_command_cb, _("help <command>: Help on a specific command."), NULL); | |
11581 | 5602 |
5603 gaim_conversations_set_ui_ops(&conversation_ui_ops); | |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5604 } |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5605 |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5606 void |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5607 gaim_gtk_conversations_uninit(void) |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5608 { |
10443 | 5609 gaim_prefs_disconnect_by_handle(gaim_gtk_conversations_get_handle()); |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5610 gaim_signals_unregister_by_instance(gaim_gtk_conversations_get_handle()); |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5611 } |
11581 | 5612 |
5613 | |
5614 | |
5615 | |
5616 | |
5617 | |
5618 | |
5619 | |
5620 | |
5621 | |
5622 | |
5623 | |
5624 | |
5625 | |
5626 | |
5627 | |
5628 /* down here is where gtkconvwin.c ought to start. except they share like every freaking function, | |
5629 * and touch each others' private members all day long */ | |
5630 | |
5631 /** | |
5632 * @file gtkconvwin.c GTK+ Conversation Window API | |
5633 * @ingroup gtkui | |
5634 * | |
5635 * gaim | |
5636 * | |
5637 * Gaim is the legal property of its developers, whose names are too numerous | |
5638 * to list here. Please refer to the COPYRIGHT file distributed with this | |
5639 * source distribution. | |
5640 * | |
5641 * This program is free software; you can redistribute it and/or modify | |
5642 * it under the terms of the GNU General Public License as published by | |
5643 * the Free Software Foundation; either version 2 of the License, or | |
5644 * (at your option) any later version. | |
5645 * | |
5646 * This program is distributed in the hope that it will be useful, | |
5647 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
5648 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
5649 * GNU General Public License for more details. | |
5650 * | |
5651 * You should have received a copy of the GNU General Public License | |
5652 * along with this program; if not, write to the Free Software | |
5653 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
5654 * | |
5655 */ | |
5656 #include "internal.h" | |
5657 #include "gtkgaim.h" | |
5658 | |
5659 | |
5660 #include <gdk/gdkkeysyms.h> | |
5661 | |
5662 #include "account.h" | |
5663 #include "cmds.h" | |
5664 #include "debug.h" | |
5665 #include "imgstore.h" | |
5666 #include "log.h" | |
5667 #include "notify.h" | |
5668 #include "prpl.h" | |
5669 #include "request.h" | |
5670 #include "util.h" | |
5671 | |
5672 #include "gtkdnd-hints.h" | |
5673 #include "gtkblist.h" | |
5674 #include "gtkconv.h" | |
5675 #include "gtkdialogs.h" | |
5676 #include "gtkmenutray.h" | |
5677 #include "gtkpounce.h" | |
5678 #include "gtkprefs.h" | |
5679 #include "gtkprivacy.h" | |
5680 #include "gtkutils.h" | |
5681 #include "gtkstock.h" | |
5682 #include "gtkimhtml.h" | |
5683 #include "gtkimhtmltoolbar.h" | |
5684 | |
5685 static void | |
5686 do_close(GtkWidget *w, int resp, GaimGtkWindow *win) | |
5687 { | |
5688 gtk_widget_destroy(warn_close_dialog); | |
5689 warn_close_dialog = NULL; | |
5690 | |
5691 if (resp == GTK_RESPONSE_OK) | |
5692 gaim_gtk_conv_window_destroy(win); | |
5693 } | |
5694 | |
5695 static void | |
5696 build_warn_close_dialog(GaimGtkWindow *gtkwin) | |
5697 { | |
5698 GtkWidget *label; | |
5699 GtkWidget *vbox, *hbox; | |
5700 GtkWidget *img; | |
5701 | |
5702 g_return_if_fail(warn_close_dialog == NULL); | |
5703 | |
5704 | |
5705 warn_close_dialog = gtk_dialog_new_with_buttons( | |
5706 _("Confirm close"), | |
5707 GTK_WINDOW(gtkwin->window), GTK_DIALOG_MODAL, | |
5708 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
5709 GTK_STOCK_CLOSE, GTK_RESPONSE_OK, NULL); | |
5710 | |
5711 gtk_dialog_set_default_response(GTK_DIALOG(warn_close_dialog), | |
5712 GTK_RESPONSE_OK); | |
5713 | |
5714 gtk_container_set_border_width(GTK_CONTAINER(warn_close_dialog), | |
5715 6); | |
5716 gtk_window_set_resizable(GTK_WINDOW(warn_close_dialog), FALSE); | |
5717 gtk_dialog_set_has_separator(GTK_DIALOG(warn_close_dialog), | |
5718 FALSE); | |
5719 | |
5720 /* Setup the outside spacing. */ | |
5721 vbox = GTK_DIALOG(warn_close_dialog)->vbox; | |
5722 | |
5723 gtk_box_set_spacing(GTK_BOX(vbox), 12); | |
5724 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); | |
5725 | |
5726 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_WARNING, | |
5727 GTK_ICON_SIZE_DIALOG); | |
5728 /* Setup the inner hbox and put the dialog's icon in it. */ | |
5729 hbox = gtk_hbox_new(FALSE, 12); | |
5730 gtk_container_add(GTK_CONTAINER(vbox), hbox); | |
5731 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
5732 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
5733 | |
5734 /* Setup the right vbox. */ | |
5735 vbox = gtk_vbox_new(FALSE, 12); | |
5736 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
5737 | |
5738 label = gtk_label_new(_("You have unread messages. Are you sure you want to close the window?")); | |
5739 gtk_widget_set_size_request(label, 350, -1); | |
5740 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
5741 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
5742 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
5743 | |
5744 /* Connect the signals. */ | |
5745 g_signal_connect(G_OBJECT(warn_close_dialog), "response", | |
5746 G_CALLBACK(do_close), gtkwin); | |
5747 | |
5748 } | |
5749 | |
5750 /************************************************************************** | |
5751 * Callbacks | |
5752 **************************************************************************/ | |
5753 | |
5754 static gboolean | |
5755 close_win_cb(GtkWidget *w, GdkEventAny *e, gpointer d) | |
5756 { | |
5757 GaimGtkWindow *win = d; | |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5758 GList *l; |
11581 | 5759 |
5760 /* If there are unread messages then show a warning dialog */ | |
5761 for (l = gaim_gtk_conv_window_get_gtkconvs(win); | |
5762 l != NULL; l = l->next) | |
5763 { | |
5764 GaimGtkConversation *gtkconv = l->data; | |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5765 if (gaim_conversation_get_type(gtkconv->active_conv) == GAIM_CONV_TYPE_IM && |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5766 gtkconv->unseen_state == GAIM_UNSEEN_TEXT) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5767 { |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5768 build_warn_close_dialog(win); |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5769 gtk_widget_show_all(warn_close_dialog); |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5770 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5771 return TRUE; |
11581 | 5772 } |
5773 } | |
5774 | |
5775 gaim_gtk_conv_window_destroy(win); | |
5776 | |
5777 return TRUE; | |
5778 } | |
5779 | |
11604 | 5780 static void |
5781 gtkconv_set_unseen(GaimGtkConversation *gtkconv, GaimUnseenState state) | |
5782 { | |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5783 gtkconv->unseen_state = state; |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5784 |
11671
4ebd27e664c4
[gaim-migrate @ 13957]
Luke Schierer <lschiere@pidgin.im>
parents:
11669
diff
changeset
|
5785 gaim_conversation_update(gtkconv->active_conv, GAIM_CONV_UPDATE_UNSEEN); |
11604 | 5786 } |
11581 | 5787 /* |
5788 * When a conversation window is focused, we know the user | |
5789 * has looked at it so we know there are no longer unseen | |
5790 * messages. | |
5791 */ | |
5792 static gint | |
5793 focus_win_cb(GtkWidget *w, GdkEventFocus *e, gpointer d) | |
5794 { | |
5795 GaimGtkWindow *win = d; | |
11604 | 5796 GaimGtkConversation *gtkconv = gaim_gtk_conv_window_get_active_gtkconv(win); |
5797 | |
5798 gtkconv_set_unseen(gtkconv, GAIM_UNSEEN_NONE); | |
11581 | 5799 |
5800 return FALSE; | |
5801 } | |
5802 | |
5803 /* Courtesy of Galeon! */ | |
5804 static void | |
5805 tab_close_button_state_changed_cb(GtkWidget *widget, GtkStateType prev_state) | |
5806 { | |
5807 if (GTK_WIDGET_STATE(widget) == GTK_STATE_ACTIVE) | |
5808 gtk_widget_set_state(widget, GTK_STATE_NORMAL); | |
5809 } | |
5810 | |
5811 static void | |
5812 notebook_init_grab(GaimGtkWindow *gtkwin, GtkWidget *widget) | |
5813 { | |
5814 static GdkCursor *cursor = NULL; | |
5815 | |
5816 gtkwin->in_drag = TRUE; | |
5817 | |
5818 if (gtkwin->drag_leave_signal) { | |
5819 g_signal_handler_disconnect(G_OBJECT(widget), | |
5820 gtkwin->drag_leave_signal); | |
5821 gtkwin->drag_leave_signal = 0; | |
5822 } | |
5823 | |
5824 if (cursor == NULL) | |
5825 cursor = gdk_cursor_new(GDK_FLEUR); | |
5826 | |
5827 /* Grab the pointer */ | |
5828 gtk_grab_add(gtkwin->notebook); | |
5829 #ifndef _WIN32 | |
5830 /* Currently for win32 GTK+ (as of 2.2.1), gdk_pointer_is_grabbed will | |
5831 always be true after a button press. */ | |
5832 if (!gdk_pointer_is_grabbed()) | |
5833 #endif | |
5834 gdk_pointer_grab(gtkwin->notebook->window, FALSE, | |
5835 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, | |
5836 NULL, cursor, GDK_CURRENT_TIME); | |
5837 } | |
5838 | |
5839 static gboolean | |
5840 notebook_motion_cb(GtkWidget *widget, GdkEventButton *e, GaimGtkWindow *win) | |
5841 { | |
5842 | |
5843 /* | |
5844 * Make sure the user moved the mouse far enough for the | |
5845 * drag to be initiated. | |
5846 */ | |
5847 if (win->in_predrag) { | |
5848 if (e->x_root < win->drag_min_x || | |
5849 e->x_root >= win->drag_max_x || | |
5850 e->y_root < win->drag_min_y || | |
5851 e->y_root >= win->drag_max_y) { | |
5852 | |
5853 win->in_predrag = FALSE; | |
5854 notebook_init_grab(win, widget); | |
5855 } | |
5856 } | |
5857 else { /* Otherwise, draw the arrows. */ | |
5858 GaimGtkWindow *dest_win; | |
5859 GtkNotebook *dest_notebook; | |
5860 GtkWidget *tab; | |
5861 gint nb_x, nb_y, page_num; | |
5862 gint arrow1_x, arrow1_y, arrow2_x, arrow2_y; | |
5863 gboolean horiz_tabs = FALSE; | |
11614 | 5864 GaimGtkConversation *gtkconv; |
5865 gboolean to_right = FALSE; | |
11581 | 5866 |
5867 /* Get the window that the cursor is over. */ | |
5868 dest_win = gaim_gtk_conv_window_get_at_xy(e->x_root, e->y_root); | |
5869 | |
5870 if (dest_win == NULL) { | |
5871 dnd_hints_hide_all(); | |
5872 | |
5873 return TRUE; | |
5874 } | |
5875 | |
5876 dest_notebook = GTK_NOTEBOOK(dest_win->notebook); | |
5877 | |
5878 gdk_window_get_origin(GTK_WIDGET(dest_notebook)->window, &nb_x, &nb_y); | |
5879 | |
5880 arrow1_x = arrow2_x = nb_x; | |
5881 arrow1_y = arrow2_y = nb_y; | |
5882 | |
5883 page_num = gaim_gtkconv_get_tab_at_xy(dest_win, | |
11614 | 5884 e->x_root, e->y_root, &to_right); |
5885 to_right = to_right && (win != dest_win); | |
11581 | 5886 |
5887 if (gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_TOP || | |
5888 gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_BOTTOM) { | |
5889 | |
5890 horiz_tabs = TRUE; | |
5891 } | |
5892 | |
11614 | 5893 gtkconv = gaim_gtk_conv_window_get_gtkconv_at_index(dest_win, page_num); |
5894 tab = gtkconv->tabby; | |
11581 | 5895 |
5896 if (horiz_tabs) { | |
5897 arrow1_x = arrow2_x = nb_x + tab->allocation.x; | |
5898 | |
11614 | 5899 if (((gpointer)win == (gpointer)dest_win && win->drag_tab < page_num) || to_right) { |
11581 | 5900 arrow1_x += tab->allocation.width; |
5901 arrow2_x += tab->allocation.width; | |
5902 } | |
5903 | |
5904 arrow1_y = nb_y + tab->allocation.y; | |
5905 arrow2_y = nb_y + tab->allocation.y + | |
5906 tab->allocation.height; | |
5907 } else { | |
5908 arrow1_x = nb_x + tab->allocation.x; | |
5909 arrow2_x = nb_x + tab->allocation.x + | |
5910 tab->allocation.width; | |
5911 arrow1_y = arrow2_y = nb_y + tab->allocation.y + tab->allocation.height/2; | |
5912 | |
5913 if ((gpointer)win == (gpointer)dest_win && win->drag_tab < page_num) { | |
5914 arrow1_y += tab->allocation.height; | |
5915 arrow2_y += tab->allocation.height; | |
5916 } | |
5917 } | |
5918 | |
5919 if (horiz_tabs) { | |
5920 dnd_hints_show(HINT_ARROW_DOWN, arrow1_x, arrow1_y); | |
5921 dnd_hints_show(HINT_ARROW_UP, arrow2_x, arrow2_y); | |
5922 } else { | |
5923 dnd_hints_show(HINT_ARROW_RIGHT, arrow1_x, arrow1_y); | |
5924 dnd_hints_show(HINT_ARROW_LEFT, arrow2_x, arrow2_y); | |
5925 } | |
5926 } | |
5927 | |
5928 return TRUE; | |
5929 } | |
5930 | |
5931 static gboolean | |
5932 notebook_leave_cb(GtkWidget *widget, GdkEventCrossing *e, GaimGtkWindow *win) | |
5933 { | |
5934 if (win->in_drag) | |
5935 return FALSE; | |
5936 | |
5937 if (e->x_root < win->drag_min_x || | |
5938 e->x_root >= win->drag_max_x || | |
5939 e->y_root < win->drag_min_y || | |
5940 e->y_root >= win->drag_max_y) { | |
5941 | |
5942 win->in_predrag = FALSE; | |
5943 notebook_init_grab(win, widget); | |
5944 } | |
5945 | |
5946 return TRUE; | |
5947 } | |
5948 | |
5949 /* | |
5950 * THANK YOU GALEON! | |
5951 */ | |
5952 static gboolean | |
5953 notebook_press_cb(GtkWidget *widget, GdkEventButton *e, GaimGtkWindow *win) | |
5954 { | |
5955 gint nb_x, nb_y, x_rel, y_rel; | |
5956 int tab_clicked; | |
5957 GtkWidget *page; | |
5958 GtkWidget *tab; | |
5959 | |
5960 if (e->button != 1 || e->type != GDK_BUTTON_PRESS) | |
5961 return FALSE; | |
5962 | |
5963 | |
5964 if (win->in_drag) { | |
5965 gaim_debug(GAIM_DEBUG_WARNING, "gtkconv", | |
5966 "Already in the middle of a window drag at tab_press_cb\n"); | |
5967 return TRUE; | |
5968 } | |
5969 | |
5970 /* | |
5971 * Make sure a tab was actually clicked. The arrow buttons | |
5972 * mess things up. | |
5973 */ | |
11614 | 5974 tab_clicked = gaim_gtkconv_get_tab_at_xy(win, e->x_root, e->y_root, NULL); |
11581 | 5975 |
5976 if (tab_clicked == -1) | |
5977 return FALSE; | |
5978 | |
5979 /* | |
5980 * Get the relative position of the press event, with regards to | |
5981 * the position of the notebook. | |
5982 */ | |
5983 gdk_window_get_origin(win->notebook->window, &nb_x, &nb_y); | |
5984 | |
5985 x_rel = e->x_root - nb_x; | |
5986 y_rel = e->y_root - nb_y; | |
5987 | |
5988 /* Reset the min/max x/y */ | |
5989 win->drag_min_x = 0; | |
5990 win->drag_min_y = 0; | |
5991 win->drag_max_x = 0; | |
5992 win->drag_max_y = 0; | |
5993 | |
5994 /* Find out which tab was dragged. */ | |
5995 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), tab_clicked); | |
5996 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(win->notebook), page); | |
5997 | |
5998 win->drag_min_x = tab->allocation.x + nb_x; | |
5999 win->drag_min_y = tab->allocation.y + nb_y; | |
6000 win->drag_max_x = tab->allocation.width + win->drag_min_x; | |
6001 win->drag_max_y = tab->allocation.height + win->drag_min_y; | |
6002 | |
6003 /* Make sure the click occurred in the tab. */ | |
6004 if (e->x_root < win->drag_min_x || | |
6005 e->x_root >= win->drag_max_x || | |
6006 e->y_root < win->drag_min_y || | |
6007 e->y_root >= win->drag_max_y) { | |
6008 | |
6009 return FALSE; | |
6010 } | |
6011 | |
6012 win->in_predrag = TRUE; | |
6013 win->drag_tab = tab_clicked; | |
6014 | |
6015 /* Connect the new motion signals. */ | |
6016 win->drag_motion_signal = | |
6017 g_signal_connect(G_OBJECT(widget), "motion_notify_event", | |
6018 G_CALLBACK(notebook_motion_cb), win); | |
6019 | |
6020 win->drag_leave_signal = | |
6021 g_signal_connect(G_OBJECT(widget), "leave_notify_event", | |
6022 G_CALLBACK(notebook_leave_cb), win); | |
6023 | |
6024 return FALSE; | |
6025 } | |
6026 | |
6027 static gboolean | |
6028 notebook_release_cb(GtkWidget *widget, GdkEventButton *e, GaimGtkWindow *win) | |
6029 { | |
6030 GaimGtkWindow *dest_win; | |
6031 GaimConversation *conv; | |
6032 GaimGtkConversation *gtkconv; | |
6033 gint dest_page_num = 0; | |
6034 gboolean new_window = FALSE; | |
11614 | 6035 gboolean to_right = FALSE; |
11581 | 6036 |
6037 /* | |
6038 * Don't check to make sure that the event's window matches the | |
6039 * widget's, because we may be getting an event passed on from the | |
6040 * close button. | |
6041 */ | |
6042 if (e->button != 1 && e->type != GDK_BUTTON_RELEASE) | |
6043 return FALSE; | |
6044 | |
6045 if (gdk_pointer_is_grabbed()) { | |
6046 gdk_pointer_ungrab(GDK_CURRENT_TIME); | |
6047 gtk_grab_remove(widget); | |
6048 } | |
6049 | |
6050 if (!win->in_predrag && !win->in_drag) | |
6051 return FALSE; | |
6052 | |
6053 /* Disconnect the motion signal. */ | |
6054 if (win->drag_motion_signal) { | |
6055 g_signal_handler_disconnect(G_OBJECT(widget), | |
6056 win->drag_motion_signal); | |
6057 | |
6058 win->drag_motion_signal = 0; | |
6059 } | |
6060 | |
6061 /* | |
6062 * If we're in a pre-drag, we'll also need to disconnect the leave | |
6063 * signal. | |
6064 */ | |
6065 if (win->in_predrag) { | |
6066 win->in_predrag = FALSE; | |
6067 | |
6068 if (win->drag_leave_signal) { | |
6069 g_signal_handler_disconnect(G_OBJECT(widget), | |
6070 win->drag_leave_signal); | |
6071 | |
6072 win->drag_leave_signal = 0; | |
6073 } | |
6074 } | |
6075 | |
6076 /* If we're not in drag... */ | |
6077 /* We're perfectly normal people! */ | |
6078 if (!win->in_drag) | |
6079 return FALSE; | |
6080 | |
6081 win->in_drag = FALSE; | |
6082 | |
6083 dnd_hints_hide_all(); | |
6084 | |
6085 dest_win = gaim_gtk_conv_window_get_at_xy(e->x_root, e->y_root); | |
6086 | |
6087 conv = gaim_gtk_conv_window_get_active_conversation(win); | |
6088 | |
6089 if (dest_win == NULL) { | |
6090 /* If the current window doesn't have any other conversations, | |
6091 * there isn't much point transferring the conv to a new window. */ | |
6092 if (gaim_gtk_conv_window_get_gtkconv_count(win) > 1) { | |
6093 /* Make a new window to stick this to. */ | |
6094 dest_win = gaim_gtk_conv_window_new(); | |
6095 new_window = TRUE; | |
6096 } | |
6097 } | |
6098 | |
6099 if (dest_win == NULL) | |
6100 return FALSE; | |
6101 | |
6102 gaim_signal_emit(gaim_gtk_conversations_get_handle(), | |
6103 "conversation-dragging", win, dest_win); | |
6104 | |
6105 /* Get the destination page number. */ | |
6106 if (!new_window) | |
6107 dest_page_num = gaim_gtkconv_get_tab_at_xy(dest_win, | |
11614 | 6108 e->x_root, e->y_root, &to_right); |
11581 | 6109 |
6110 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
6111 | |
6112 if (win == dest_win) { | |
6113 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, dest_page_num); | |
6114 } else { | |
6115 gaim_gtk_conv_window_remove_gtkconv(win, gtkconv); | |
6116 gaim_gtk_conv_window_add_gtkconv(dest_win, gtkconv); | |
11614 | 6117 gtk_notebook_reorder_child(GTK_NOTEBOOK(dest_win->notebook), gtkconv->tab_cont, dest_page_num + to_right); |
11581 | 6118 gaim_gtk_conv_window_switch_gtkconv(dest_win, gtkconv); |
6119 if (new_window) { | |
6120 gint win_width, win_height; | |
6121 | |
6122 gtk_window_get_size(GTK_WINDOW(dest_win->window), | |
6123 &win_width, &win_height); | |
6124 | |
6125 gtk_window_move(GTK_WINDOW(dest_win->window), | |
6126 e->x_root - (win_width / 2), | |
6127 e->y_root - (win_height / 2)); | |
6128 | |
6129 gaim_gtk_conv_window_show(dest_win); | |
6130 } | |
6131 } | |
6132 | |
6133 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); | |
6134 | |
6135 return TRUE; | |
6136 } | |
6137 | |
6138 | |
6139 static void | |
6140 before_switch_conv_cb(GtkNotebook *notebook, GtkWidget *page, gint page_num, | |
6141 gpointer user_data) | |
6142 { | |
6143 GaimGtkWindow *win; | |
6144 GaimConversation *conv; | |
6145 GaimGtkConversation *gtkconv; | |
6146 | |
6147 win = user_data; | |
6148 conv = gaim_gtk_conv_window_get_active_conversation(win); | |
6149 | |
6150 g_return_if_fail(conv != NULL); | |
6151 | |
6152 if (gaim_conversation_get_type(conv) != GAIM_CONV_TYPE_IM) | |
6153 return; | |
6154 | |
6155 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
6156 | |
6157 stop_anim(NULL, gtkconv); | |
6158 } | |
6159 | |
6160 static void | |
6161 switch_conv_cb(GtkNotebook *notebook, GtkWidget *page, gint page_num, | |
6162 gpointer user_data) | |
6163 { | |
6164 GaimGtkWindow *win; | |
6165 GaimConversation *conv; | |
6166 GaimGtkConversation *gtkconv; | |
6167 | |
6168 win = user_data; | |
6169 gtkconv = gaim_gtk_conv_window_get_gtkconv_at_index(win, page_num); | |
6170 conv = gtkconv->active_conv; | |
6171 | |
6172 g_return_if_fail(conv != NULL); | |
6173 | |
6174 /* | |
6175 * Only set "unseen" to "none" if the window has focus | |
6176 */ | |
6177 if (gaim_gtk_conv_window_has_focus(win)) | |
11604 | 6178 gtkconv_set_unseen(gtkconv, GAIM_UNSEEN_NONE); |
11581 | 6179 |
6180 /* Update the menubar */ | |
6181 | |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
6182 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkconv->win->menu.logging), |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
6183 gaim_conversation_is_logging(conv)); |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
6184 |
11594 | 6185 generate_send_to_items(win); |
6186 | |
11604 | 6187 gaim_gtkconv_switch_active_conversation(conv); |
11581 | 6188 |
6189 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.sounds), | |
6190 gtkconv->make_sound); | |
6191 | |
6192 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.show_formatting_toolbar), | |
6193 gaim_prefs_get_bool("/gaim/gtk/conversations/show_formatting_toolbar")); | |
6194 | |
6195 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.show_timestamps), | |
6196 gtkconv->show_timestamps); | |
6197 | |
6198 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) | |
6199 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.show_icon), | |
6200 gtkconv->u.im->show_icon); | |
11604 | 6201 |
11581 | 6202 /* |
6203 * We pause icons when they are not visible. If this icon should | |
6204 * be animated then start it back up again. | |
6205 */ | |
6206 if ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) && | |
6207 (gtkconv->u.im->animate)) | |
6208 start_anim(NULL, gtkconv); | |
6209 } | |
6210 | |
6211 /************************************************************************** | |
6212 * GTK+ window ops | |
6213 **************************************************************************/ | |
6214 | |
6215 static GList *window_list = NULL; | |
6216 | |
6217 GList * | |
6218 gaim_gtk_conv_windows_get_list() | |
6219 { | |
6220 return window_list; | |
6221 } | |
6222 | |
6223 GaimGtkWindow * | |
6224 gaim_gtk_conv_window_new() | |
6225 { | |
6226 GaimGtkWindow *win; | |
6227 GtkPositionType pos; | |
6228 GtkWidget *testidea; | |
6229 GtkWidget *menubar; | |
6230 | |
6231 win = g_malloc0(sizeof(GaimGtkWindow)); | |
6232 | |
6233 window_list = g_list_append(window_list, win); | |
6234 | |
6235 /* Create the window. */ | |
6236 win->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
6237 gtk_window_set_role(GTK_WINDOW(win->window), "conversation"); | |
6238 gtk_window_set_resizable(GTK_WINDOW(win->window), TRUE); | |
6239 gtk_container_set_border_width(GTK_CONTAINER(win->window), 0); | |
6240 GTK_WINDOW(win->window)->allow_shrink = TRUE; | |
6241 | |
6242 g_signal_connect(G_OBJECT(win->window), "delete_event", | |
6243 G_CALLBACK(close_win_cb), win); | |
6244 | |
6245 g_signal_connect(G_OBJECT(win->window), "focus_in_event", | |
6246 G_CALLBACK(focus_win_cb), win); | |
6247 | |
6248 /* Create the notebook. */ | |
6249 win->notebook = gtk_notebook_new(); | |
6250 | |
6251 pos = gaim_prefs_get_int("/gaim/gtk/conversations/tab_side"); | |
6252 | |
6253 #if 0 | |
6254 gtk_notebook_set_tab_hborder(GTK_NOTEBOOK(win->notebook), 0); | |
6255 gtk_notebook_set_tab_vborder(GTK_NOTEBOOK(win->notebook), 0); | |
6256 #endif | |
6257 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(win->notebook), pos); | |
6258 gtk_notebook_set_scrollable(GTK_NOTEBOOK(win->notebook), TRUE); | |
6259 gtk_notebook_popup_enable(GTK_NOTEBOOK(win->notebook)); | |
6260 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE); | |
6261 gtk_notebook_set_show_border(GTK_NOTEBOOK(win->notebook), FALSE); | |
6262 | |
6263 gtk_widget_show(win->notebook); | |
6264 | |
6265 g_signal_connect(G_OBJECT(win->notebook), "switch_page", | |
6266 G_CALLBACK(before_switch_conv_cb), win); | |
6267 g_signal_connect_after(G_OBJECT(win->notebook), "switch_page", | |
6268 G_CALLBACK(switch_conv_cb), win); | |
6269 | |
6270 /* Setup the tab drag and drop signals. */ | |
6271 gtk_widget_add_events(win->notebook, | |
6272 GDK_BUTTON1_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); | |
6273 g_signal_connect(G_OBJECT(win->notebook), "button_press_event", | |
6274 G_CALLBACK(notebook_press_cb), win); | |
6275 g_signal_connect(G_OBJECT(win->notebook), "button_release_event", | |
6276 G_CALLBACK(notebook_release_cb), win); | |
6277 | |
6278 testidea = gtk_vbox_new(FALSE, 0); | |
6279 | |
6280 /* Setup the menubar. */ | |
6281 menubar = setup_menubar(win); | |
6282 gtk_box_pack_start(GTK_BOX(testidea), menubar, FALSE, TRUE, 0); | |
6283 | |
6284 gtk_box_pack_start(GTK_BOX(testidea), win->notebook, TRUE, TRUE, 0); | |
6285 | |
6286 gtk_container_add(GTK_CONTAINER(win->window), testidea); | |
6287 | |
6288 gtk_widget_show(testidea); | |
6289 | |
6290 return win; | |
6291 } | |
6292 | |
6293 void | |
6294 gaim_gtk_conv_window_destroy(GaimGtkWindow *win) | |
6295 { | |
6296 window_list = g_list_remove(window_list, win); | |
6297 | |
11611 | 6298 if (win->gtkconvs) { |
6299 while (win->gtkconvs) { | |
6300 GList *nextgtk = win->gtkconvs->next; | |
6301 GaimGtkConversation *gtkconv = win->gtkconvs->data; | |
6302 GList *nextcore = gtkconv->convs->next; | |
6303 GaimConversation *conv = gtkconv->convs->data; | |
6304 gaim_conversation_destroy(conv); | |
6305 if (!nextgtk && !nextcore) | |
6306 /* we'll end up invoking ourselves when we destroy our last child */ | |
6307 /* so don't destroy ourselves right now */ | |
6308 return; | |
6309 } | |
6310 return; | |
6311 } | |
11581 | 6312 gtk_widget_destroy(win->window); |
6313 | |
6314 g_object_unref(G_OBJECT(win->menu.item_factory)); | |
6315 | |
6316 g_free(win); | |
6317 } | |
6318 | |
6319 void | |
6320 gaim_gtk_conv_window_show(GaimGtkWindow *win) | |
6321 { | |
6322 gtk_widget_show(win->window); | |
6323 } | |
6324 | |
6325 void | |
6326 gaim_gtk_conv_window_hide(GaimGtkWindow *win) | |
6327 { | |
6328 gtk_widget_hide(win->window); | |
6329 } | |
6330 | |
6331 void | |
6332 gaim_gtk_conv_window_raise(GaimGtkWindow *win) | |
6333 { | |
6334 gtk_widget_show(win->window); | |
6335 gtk_window_deiconify(GTK_WINDOW(win->window)); | |
6336 gdk_window_raise(win->window->window); | |
6337 } | |
6338 | |
6339 void | |
6340 gaim_gtk_conv_window_switch_gtkconv(GaimGtkWindow *win, GaimGtkConversation *gtkconv) | |
6341 { | |
6342 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), | |
6343 gtk_notebook_page_num(GTK_NOTEBOOK(win->notebook), | |
6344 gtkconv->tab_cont)); | |
6345 } | |
6346 | |
6347 void | |
6348 gaim_gtk_conv_window_add_gtkconv(GaimGtkWindow *win, GaimGtkConversation *gtkconv) | |
6349 { | |
6350 GaimConversation *conv = gtkconv->active_conv; | |
6351 GaimGtkConversation *focus_gtkconv; | |
6352 GtkWidget *tabby, *menu_tabby; | |
6353 GtkWidget *tab_cont = gtkconv->tab_cont; | |
6354 GtkWidget *close_image; | |
6355 GaimConversationType conv_type; | |
6356 const char *name; | |
6357 const gchar *tmp_lab; | |
6358 gint close_button_width, close_button_height, focus_width, focus_pad; | |
11619 | 6359 gboolean tabs_side = FALSE; |
6360 gint angle = 0; | |
11581 | 6361 |
6362 name = gaim_conversation_get_name(conv); | |
6363 conv_type = gaim_conversation_get_type(conv); | |
6364 | |
6365 | |
6366 win->gtkconvs = g_list_append(win->gtkconvs, gtkconv); | |
6367 gtkconv->win = win; | |
6368 | |
11619 | 6369 if (gaim_prefs_get_int("/gaim/gtk/conversations/tab_side") == GTK_POS_LEFT || |
6370 gaim_prefs_get_int("/gaim/gtk/conversations/tab_side") == GTK_POS_RIGHT) | |
6371 tabs_side = TRUE; | |
6372 else if (gaim_prefs_get_int("/gaim/gtk/conversations/tab_side") == (GTK_POS_LEFT|8)) | |
6373 angle = 90; | |
6374 else if (gaim_prefs_get_int("/gaim/gtk/conversations/tab_side") == (GTK_POS_RIGHT|8)) | |
6375 angle = 270; | |
6376 | |
6377 if (angle) | |
6378 gtkconv->tabby = tabby = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
6379 else | |
6380 gtkconv->tabby = tabby = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
11581 | 6381 gtkconv->menu_tabby = menu_tabby = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
6382 | |
6383 /* Close button. */ | |
6384 gtkconv->close = gtk_button_new(); | |
6385 gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &close_button_width, &close_button_height); | |
6386 if (gtk_check_version(2, 4, 2) == NULL) { | |
6387 /* Need to account for extra padding around the gtkbutton */ | |
6388 gtk_widget_style_get(GTK_WIDGET(gtkconv->close), | |
6389 "focus-line-width", &focus_width, | |
6390 "focus-padding", &focus_pad, | |
6391 NULL); | |
6392 close_button_width += (focus_width + focus_pad) * 2; | |
6393 close_button_height += (focus_width + focus_pad) * 2; | |
6394 } | |
6395 gtk_widget_set_size_request(GTK_WIDGET(gtkconv->close), | |
6396 close_button_width, close_button_height); | |
6397 | |
6398 gtk_button_set_relief(GTK_BUTTON(gtkconv->close), GTK_RELIEF_NONE); | |
6399 close_image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); | |
6400 gtk_widget_show(close_image); | |
6401 gtk_container_add(GTK_CONTAINER(gtkconv->close), close_image); | |
6402 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->close, | |
6403 _("Close conversation"), NULL); | |
6404 | |
6405 g_signal_connect(G_OBJECT(gtkconv->close), "clicked", | |
6406 G_CALLBACK(close_conv_cb), gtkconv); | |
6407 | |
6408 /* | |
6409 * I love Galeon. They have a fix for that stupid annoying visible | |
6410 * border bug. I love you guys! -- ChipX86 | |
6411 */ | |
6412 g_signal_connect(G_OBJECT(gtkconv->close), "state_changed", | |
6413 G_CALLBACK(tab_close_button_state_changed_cb), NULL); | |
6414 | |
6415 /* Status icon. */ | |
6416 gtkconv->icon = gtk_image_new(); | |
6417 gtkconv->menu_icon = gtk_image_new(); | |
6418 update_tab_icon(conv); | |
6419 | |
6420 /* Tab label. */ | |
6421 gtkconv->tab_label = gtk_label_new(tmp_lab = gaim_conversation_get_title(conv)); | |
11619 | 6422 |
11581 | 6423 #if GTK_CHECK_VERSION(2,6,0) |
11619 | 6424 if (!angle) |
6425 g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); | |
11581 | 6426 gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), 6); |
11619 | 6427 if (tabs_side) { |
6428 gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), MIN(g_utf8_strlen(tmp_lab, -1), 18)); | |
6429 } | |
6430 if (angle) | |
6431 gtk_label_set_angle(GTK_LABEL(gtkconv->tab_label), angle); | |
11581 | 6432 #endif |
6433 gtkconv->menu_label = gtk_label_new(gaim_conversation_get_title(conv)); | |
6434 #if 0 | |
6435 gtk_misc_set_alignment(GTK_MISC(gtkconv->tab_label), 0.00, 0.5); | |
6436 gtk_misc_set_padding(GTK_MISC(gtkconv->tab_label), 4, 0); | |
6437 #endif | |
6438 | |
6439 /* Pack it all together. */ | |
11619 | 6440 if (angle == 90) |
6441 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); | |
6442 else | |
6443 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); | |
11581 | 6444 gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_icon, |
6445 FALSE, FALSE, 0); | |
6446 | |
6447 gtk_widget_show_all(gtkconv->icon); | |
6448 gtk_widget_show_all(gtkconv->menu_icon); | |
6449 | |
6450 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->tab_label, TRUE, TRUE, 0); | |
6451 gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_label, TRUE, TRUE, 0); | |
6452 gtk_widget_show(gtkconv->tab_label); | |
6453 gtk_widget_show(gtkconv->menu_label); | |
6454 gtk_misc_set_alignment(GTK_MISC(gtkconv->menu_label), 0, 0); | |
6455 | |
11619 | 6456 if (angle == 90) |
6457 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); | |
6458 else | |
6459 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); | |
11581 | 6460 if (gaim_prefs_get_bool("/gaim/gtk/conversations/close_on_tabs")) |
6461 gtk_widget_show(gtkconv->close); | |
6462 | |
6463 gtk_widget_show(tabby); | |
6464 gtk_widget_show(menu_tabby); | |
6465 | |
6466 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) | |
6467 gaim_gtkconv_update_buddy_icon(conv); | |
6468 | |
6469 /* Add this pane to the conversation's notebook. */ | |
6470 gtk_notebook_append_page_menu(GTK_NOTEBOOK(win->notebook), tab_cont, tabby, menu_tabby); | |
11619 | 6471 gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), tab_cont, !tabs_side && !angle, TRUE, GTK_PACK_START); |
11581 | 6472 |
6473 | |
6474 gtk_widget_show(tab_cont); | |
6475 | |
6476 if (gaim_gtk_conv_window_get_gtkconv_count(win) == 1) { | |
6477 /* Er, bug in notebooks? Switch to the page manually. */ | |
6478 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); | |
6479 | |
6480 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), | |
6481 gaim_prefs_get_bool("/gaim/gtk/conversations/tabs")); | |
6482 } else | |
6483 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), TRUE); | |
6484 | |
6485 focus_gtkconv = g_list_nth_data(gaim_gtk_conv_window_get_gtkconvs(win), | |
6486 gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook))); | |
6487 gtk_widget_grab_focus(focus_gtkconv->entry); | |
6488 | |
6489 if (gaim_gtk_conv_window_get_gtkconv_count(win) == 1) | |
11734 | 6490 update_send_to_selection(win); |
11581 | 6491 } |
6492 | |
6493 void | |
6494 gaim_gtk_conv_window_remove_gtkconv(GaimGtkWindow *win, GaimGtkConversation *gtkconv) | |
6495 { | |
6496 unsigned int index; | |
6497 GaimConversationType conv_type; | |
6498 | |
6499 conv_type = gaim_conversation_get_type(gtkconv->active_conv); | |
6500 index = gtk_notebook_page_num(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont); | |
6501 | |
6502 g_object_ref(gtkconv->tab_cont); | |
6503 gtk_object_sink(GTK_OBJECT(gtkconv->tab_cont)); | |
6504 | |
6505 gtk_notebook_remove_page(GTK_NOTEBOOK(win->notebook), index); | |
6506 | |
6507 /* go back to tabless if need be */ | |
6508 if (gaim_gtk_conv_window_get_gtkconv_count(win) <= 2) { | |
6509 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), | |
6510 gaim_prefs_get_bool("/gaim/gtk/conversations/tabs")); | |
6511 } | |
6512 | |
6513 win->gtkconvs = g_list_remove(win->gtkconvs, gtkconv); | |
11582 | 6514 |
6515 if (!win->gtkconvs) | |
6516 gaim_gtk_conv_window_destroy(win); | |
11581 | 6517 } |
6518 | |
6519 GaimGtkConversation * | |
6520 gaim_gtk_conv_window_get_gtkconv_at_index(const GaimGtkWindow *win, int index) | |
6521 { | |
6522 GtkWidget *tab_cont; | |
6523 | |
6524 if (index == -1) | |
6525 index = 0; | |
6526 tab_cont = gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), index); | |
11604 | 6527 return tab_cont ? g_object_get_data(G_OBJECT(tab_cont), "GaimGtkConversation") : NULL; |
11581 | 6528 } |
6529 | |
6530 GaimGtkConversation * | |
6531 gaim_gtk_conv_window_get_active_gtkconv(const GaimGtkWindow *win) | |
6532 { | |
6533 int index; | |
6534 GtkWidget *tab_cont; | |
6535 | |
6536 index = gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook)); | |
6537 if (index == -1) | |
6538 index = 0; | |
6539 tab_cont = gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), index); | |
6540 if (!tab_cont) | |
6541 return NULL; | |
6542 return g_object_get_data(G_OBJECT(tab_cont), "GaimGtkConversation"); | |
6543 } | |
6544 | |
6545 | |
6546 GaimConversation * | |
6547 gaim_gtk_conv_window_get_active_conversation(const GaimGtkWindow *win) | |
6548 { | |
6549 GaimGtkConversation *gtkconv; | |
6550 | |
6551 gtkconv = gaim_gtk_conv_window_get_active_gtkconv(win); | |
6552 return gtkconv ? gtkconv->active_conv : NULL; | |
6553 } | |
6554 | |
6555 gboolean | |
6556 gaim_gtk_conv_window_is_active_conversation(const GaimConversation *conv) | |
6557 { | |
6558 return conv == gaim_gtk_conv_window_get_active_conversation(GAIM_GTK_CONVERSATION(conv)->win); | |
6559 } | |
6560 | |
6561 gboolean | |
6562 gaim_gtk_conv_window_has_focus(GaimGtkWindow *win) | |
6563 { | |
6564 gboolean has_focus = FALSE; | |
6565 | |
6566 g_object_get(G_OBJECT(win->window), "has-toplevel-focus", &has_focus, NULL); | |
6567 | |
6568 return has_focus; | |
6569 } | |
6570 | |
6571 GaimGtkWindow * | |
6572 gaim_gtk_conv_window_get_at_xy(int x, int y) | |
6573 { | |
6574 GaimGtkWindow *win; | |
6575 GdkWindow *gdkwin; | |
6576 GList *l; | |
6577 | |
6578 gdkwin = gdk_window_at_pointer(&x, &y); | |
6579 | |
6580 if (gdkwin) | |
6581 gdkwin = gdk_window_get_toplevel(gdkwin); | |
6582 | |
6583 for (l = gaim_gtk_conv_windows_get_list(); l != NULL; l = l->next) { | |
6584 win = l->data; | |
6585 | |
6586 if (gdkwin == win->window->window) | |
6587 return win; | |
6588 } | |
6589 | |
6590 return NULL; | |
6591 } | |
6592 | |
6593 GList * | |
6594 gaim_gtk_conv_window_get_gtkconvs(GaimGtkWindow *win) | |
6595 { | |
6596 return win->gtkconvs; | |
6597 } | |
6598 | |
6599 guint | |
6600 gaim_gtk_conv_window_get_gtkconv_count(GaimGtkWindow *win) | |
6601 { | |
6602 return g_list_length(win->gtkconvs); | |
6603 } | |
6604 | |
6605 GaimGtkWindow * | |
6606 gaim_gtk_conv_window_first_with_type(GaimConversationType type) | |
6607 { | |
6608 GList *wins, *convs; | |
6609 GaimGtkWindow *win; | |
6610 GaimGtkConversation *conv; | |
6611 | |
6612 if (type == GAIM_CONV_TYPE_UNKNOWN) | |
6613 return NULL; | |
6614 | |
6615 for (wins = gaim_gtk_conv_windows_get_list(); wins != NULL; wins = wins->next) { | |
6616 win = wins->data; | |
6617 | |
6618 for (convs = win->gtkconvs; | |
6619 convs != NULL; | |
6620 convs = convs->next) { | |
6621 | |
6622 conv = convs->data; | |
6623 | |
6624 if (gaim_conversation_get_type(conv->active_conv) == type) | |
6625 return win; | |
6626 } | |
6627 } | |
6628 | |
6629 return NULL; | |
6630 } | |
6631 | |
6632 GaimGtkWindow * | |
6633 gaim_gtk_conv_window_last_with_type(GaimConversationType type) | |
6634 { | |
6635 GList *wins, *convs; | |
6636 GaimGtkWindow *win; | |
6637 GaimGtkConversation *conv; | |
6638 | |
6639 if (type == GAIM_CONV_TYPE_UNKNOWN) | |
6640 return NULL; | |
6641 | |
6642 for (wins = g_list_last(gaim_gtk_conv_windows_get_list()); | |
6643 wins != NULL; | |
6644 wins = wins->prev) { | |
6645 | |
6646 win = wins->data; | |
6647 | |
6648 for (convs = win->gtkconvs; | |
6649 convs != NULL; | |
6650 convs = convs->next) { | |
6651 | |
6652 conv = convs->data; | |
6653 | |
6654 if (gaim_conversation_get_type(conv->active_conv) == type) | |
6655 return win; | |
6656 } | |
6657 } | |
6658 | |
6659 return NULL; | |
6660 } | |
6661 | |
6662 | |
6663 /************************************************************************** | |
6664 * Conversation placement functions | |
6665 **************************************************************************/ | |
6666 typedef struct | |
6667 { | |
6668 char *id; | |
6669 char *name; | |
6670 GaimConvPlacementFunc fnc; | |
6671 | |
6672 } ConvPlacementData; | |
6673 | |
6674 static GList *conv_placement_fncs = NULL; | |
6675 static GaimConvPlacementFunc place_conv = NULL; | |
6676 | |
6677 /* This one places conversations in the last made window. */ | |
6678 static void | |
6679 conv_placement_last_created_win(GaimGtkConversation *conv) | |
6680 { | |
6681 GaimGtkWindow *win; | |
6682 | |
6683 GList *l = g_list_last(gaim_gtk_conv_windows_get_list()); | |
6684 win = l ? l->data : NULL;; | |
6685 | |
6686 if (win == NULL) { | |
6687 win = gaim_gtk_conv_window_new(); | |
6688 | |
6689 gaim_gtk_conv_window_add_gtkconv(win, conv); | |
6690 gaim_gtk_conv_window_show(win); | |
6691 } else { | |
6692 gaim_gtk_conv_window_add_gtkconv(win, conv); | |
6693 } | |
6694 } | |
6695 | |
6696 /* This one places conversations in the last made window of the same type. */ | |
6697 static void | |
6698 conv_placement_last_created_win_type(GaimGtkConversation *conv) | |
6699 { | |
6700 GaimGtkWindow *win; | |
6701 | |
6702 win = gaim_gtk_conv_window_last_with_type(gaim_conversation_get_type(conv->active_conv)); | |
6703 | |
6704 if (win == NULL) { | |
6705 win = gaim_gtk_conv_window_new(); | |
6706 | |
6707 gaim_gtk_conv_window_add_gtkconv(win, conv); | |
6708 gaim_gtk_conv_window_show(win); | |
6709 } else | |
6710 gaim_gtk_conv_window_add_gtkconv(win, conv); | |
6711 } | |
6712 | |
6713 /* This one places each conversation in its own window. */ | |
6714 static void | |
6715 conv_placement_new_window(GaimGtkConversation *conv) | |
6716 { | |
6717 GaimGtkWindow *win; | |
6718 | |
6719 win = gaim_gtk_conv_window_new(); | |
6720 | |
6721 gaim_gtk_conv_window_add_gtkconv(win, conv); | |
6722 | |
6723 gaim_gtk_conv_window_show(win); | |
6724 } | |
6725 | |
6726 static GaimGroup * | |
6727 conv_get_group(GaimGtkConversation *conv) | |
6728 { | |
6729 GaimGroup *group = NULL; | |
6730 | |
6731 if (gaim_conversation_get_type(conv->active_conv) == GAIM_CONV_TYPE_IM) { | |
6732 GaimBuddy *buddy; | |
6733 | |
6734 buddy = gaim_find_buddy(gaim_conversation_get_account(conv->active_conv), | |
6735 gaim_conversation_get_name(conv->active_conv)); | |
6736 | |
6737 if (buddy != NULL) | |
6738 group = gaim_find_buddys_group(buddy); | |
6739 | |
6740 } else if (gaim_conversation_get_type(conv->active_conv) == GAIM_CONV_TYPE_CHAT) { | |
6741 GaimChat *chat; | |
6742 | |
6743 chat = gaim_blist_find_chat(gaim_conversation_get_account(conv->active_conv), | |
6744 gaim_conversation_get_name(conv->active_conv)); | |
6745 | |
6746 if (chat != NULL) | |
6747 group = gaim_chat_get_group(chat); | |
6748 } | |
6749 | |
6750 return group; | |
6751 } | |
6752 | |
6753 /* | |
6754 * This groups things by, well, group. Buddies from groups will always be | |
6755 * grouped together, and a buddy from a group not belonging to any currently | |
6756 * open windows will get a new window. | |
6757 */ | |
6758 static void | |
6759 conv_placement_by_group(GaimGtkConversation *conv) | |
6760 { | |
6761 GaimConversationType type; | |
6762 GaimGroup *group = NULL; | |
6763 GList *wl, *cl; | |
6764 | |
6765 type = gaim_conversation_get_type(conv->active_conv); | |
6766 | |
6767 group = conv_get_group(conv); | |
6768 | |
6769 /* Go through the list of IMs and find one with this group. */ | |
6770 for (wl = gaim_gtk_conv_windows_get_list(); wl != NULL; wl = wl->next) { | |
6771 GaimGtkWindow *win2; | |
6772 GaimGtkConversation *conv2; | |
6773 GaimGroup *group2 = NULL; | |
6774 | |
6775 win2 = wl->data; | |
6776 | |
6777 for (cl = win2->gtkconvs; | |
6778 cl != NULL; | |
6779 cl = cl->next) { | |
6780 conv2 = cl->data; | |
6781 | |
6782 group2 = conv_get_group(conv2); | |
6783 | |
6784 if (group == group2) { | |
6785 gaim_gtk_conv_window_add_gtkconv(win2, conv); | |
6786 | |
6787 return; | |
6788 } | |
6789 } | |
6790 } | |
6791 | |
6792 /* Make a new window. */ | |
6793 conv_placement_new_window(conv); | |
6794 } | |
6795 | |
6796 /* This groups things by account. Otherwise, the same semantics as above */ | |
6797 static void | |
6798 conv_placement_by_account(GaimGtkConversation *conv) | |
6799 { | |
6800 GaimConversationType type; | |
6801 GList *wins, *convs; | |
6802 GaimAccount *account; | |
6803 | |
6804 account = gaim_conversation_get_account(conv->active_conv); | |
6805 type = gaim_conversation_get_type(conv->active_conv); | |
6806 | |
6807 /* Go through the list of IMs and find one with this group. */ | |
6808 for (wins = gaim_gtk_conv_windows_get_list(); wins != NULL; wins = wins->next) { | |
6809 GaimGtkWindow *win2; | |
6810 GaimGtkConversation *conv2; | |
6811 | |
6812 win2 = wins->data; | |
6813 | |
6814 for (convs = win2->gtkconvs; | |
6815 convs != NULL; | |
6816 convs = convs->next) { | |
6817 conv2 = convs->data; | |
6818 | |
6819 if (account == gaim_conversation_get_account(conv2->active_conv)) { | |
6820 gaim_gtk_conv_window_add_gtkconv(win2, conv); | |
6821 return; | |
6822 } | |
6823 } | |
6824 } | |
6825 | |
6826 /* Make a new window. */ | |
6827 conv_placement_new_window(conv); | |
6828 } | |
6829 | |
6830 static ConvPlacementData * | |
6831 get_conv_placement_data(const char *id) | |
6832 { | |
6833 ConvPlacementData *data = NULL; | |
6834 GList *n; | |
6835 | |
6836 for (n = conv_placement_fncs; n; n = n->next) { | |
6837 data = n->data; | |
6838 if (!strcmp(data->id, id)) | |
6839 return data; | |
6840 } | |
6841 | |
6842 return NULL; | |
6843 } | |
6844 | |
6845 static void | |
6846 add_conv_placement_fnc(const char *id, const char *name, | |
6847 GaimConvPlacementFunc fnc) | |
6848 { | |
6849 ConvPlacementData *data; | |
6850 | |
6851 data = g_new(ConvPlacementData, 1); | |
6852 | |
6853 data->id = g_strdup(id); | |
6854 data->name = g_strdup(name); | |
6855 data->fnc = fnc; | |
6856 | |
6857 conv_placement_fncs = g_list_append(conv_placement_fncs, data); | |
6858 } | |
6859 | |
6860 static void | |
6861 ensure_default_funcs(void) | |
6862 { | |
6863 if (conv_placement_fncs == NULL) { | |
6864 add_conv_placement_fnc("last", _("Last created window"), | |
6865 conv_placement_last_created_win); | |
6866 add_conv_placement_fnc("im_chat", _("Separate IM and Chat windows"), | |
6867 conv_placement_last_created_win_type); | |
6868 add_conv_placement_fnc("new", _("New window"), | |
6869 conv_placement_new_window); | |
6870 add_conv_placement_fnc("group", _("By group"), | |
6871 conv_placement_by_group); | |
6872 add_conv_placement_fnc("account", _("By account"), | |
6873 conv_placement_by_account); | |
6874 } | |
6875 } | |
6876 | |
6877 GList * | |
6878 gaim_gtkconv_placement_get_options(void) | |
6879 { | |
6880 GList *n, *list = NULL; | |
6881 ConvPlacementData *data; | |
6882 | |
6883 ensure_default_funcs(); | |
6884 | |
6885 for (n = conv_placement_fncs; n; n = n->next) { | |
6886 data = n->data; | |
6887 list = g_list_append(list, data->name); | |
6888 list = g_list_append(list, data->id); | |
6889 } | |
6890 | |
6891 return list; | |
6892 } | |
6893 | |
6894 | |
6895 void | |
6896 gaim_gtkconv_placement_add_fnc(const char *id, const char *name, | |
6897 GaimConvPlacementFunc fnc) | |
6898 { | |
6899 g_return_if_fail(id != NULL); | |
6900 g_return_if_fail(name != NULL); | |
6901 g_return_if_fail(fnc != NULL); | |
6902 | |
6903 ensure_default_funcs(); | |
6904 | |
6905 add_conv_placement_fnc(id, name, fnc); | |
6906 } | |
6907 | |
6908 void | |
6909 gaim_gtkconv_placement_remove_fnc(const char *id) | |
6910 { | |
6911 ConvPlacementData *data = get_conv_placement_data(id); | |
6912 | |
6913 if (data == NULL) | |
6914 return; | |
6915 | |
6916 conv_placement_fncs = g_list_remove(conv_placement_fncs, data); | |
6917 | |
6918 g_free(data->id); | |
6919 g_free(data->name); | |
6920 g_free(data); | |
6921 } | |
6922 | |
6923 const char * | |
6924 gaim_gtkconv_placement_get_name(const char *id) | |
6925 { | |
6926 ConvPlacementData *data; | |
6927 | |
6928 ensure_default_funcs(); | |
6929 | |
6930 data = get_conv_placement_data(id); | |
6931 | |
6932 if (data == NULL) | |
6933 return NULL; | |
6934 | |
6935 return data->name; | |
6936 } | |
6937 | |
6938 GaimConvPlacementFunc | |
6939 gaim_gtkconv_placement_get_fnc(const char *id) | |
6940 { | |
6941 ConvPlacementData *data; | |
6942 | |
6943 ensure_default_funcs(); | |
6944 | |
6945 data = get_conv_placement_data(id); | |
6946 | |
6947 if (data == NULL) | |
6948 return NULL; | |
6949 | |
6950 return data->fnc; | |
6951 } | |
6952 | |
6953 void | |
6954 gaim_gtkconv_placement_set_current_func(GaimConvPlacementFunc func) | |
6955 { | |
6956 g_return_if_fail(func != NULL); | |
6957 | |
6958 place_conv = func; | |
6959 } | |
6960 | |
6961 GaimConvPlacementFunc | |
6962 gaim_gtkconv_placement_get_current_func(void) | |
6963 { | |
6964 return place_conv; | |
6965 } | |
6966 | |
6967 void | |
6968 gaim_gtkconv_placement_place(GaimGtkConversation *gtkconv) | |
6969 { | |
6970 if (place_conv) | |
6971 place_conv(gtkconv); | |
6972 } |