Mercurial > pidgin.yaz
annotate src/gtkconv.c @ 11784:141368559673
[gaim-migrate @ 14075]
I don't like showing the "add an account!" dialog for new users
that have 0 accounts. I think showing 3 windows when a new
users starts Gaim is too many. It's distracting. It should
hopefully be obvious that they need to click the "add" button
to get started. If not, someone should modify the accounts list
to show a helpful message, like "Click the add button to get started"
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 24 Oct 2005 02:43:19 +0000 |
parents | 8cb75ba77f9d |
children | c9188d3eb9d3 |
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; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1209 |
11581 | 1210 conv = gaim_gtk_conv_window_get_active_conversation(win); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1211 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1212 if (conv == NULL) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1213 return; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1214 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1215 gaim_conversation_set_logging(conv, |
11581 | 1216 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1217 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1218 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1219 static void |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1220 menu_toolbar_cb(gpointer data, guint action, GtkWidget *widget) |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1221 { |
11581 | 1222 GaimGtkWindow *win = data; |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1223 GaimConversation *conv; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1224 GaimGtkConversation *gtkconv; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1225 |
11581 | 1226 conv = gaim_gtk_conv_window_get_active_conversation(win); |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1227 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1228 if (conv == NULL) |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1229 return; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1230 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1231 gtkconv = GAIM_GTK_CONVERSATION(conv); |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1232 |
10377 | 1233 gaim_prefs_set_bool("/gaim/gtk/conversations/show_formatting_toolbar", |
11581 | 1234 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
|
1235 } |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1236 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
1237 static void |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1238 menu_sounds_cb(gpointer data, guint action, GtkWidget *widget) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1239 { |
11581 | 1240 GaimGtkWindow *win = data; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1241 GaimConversation *conv; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1242 GaimGtkConversation *gtkconv; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1243 |
11581 | 1244 conv = gaim_gtk_conv_window_get_active_conversation(win); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1245 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1246 if (!conv) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1247 return; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1248 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1249 gtkconv = GAIM_GTK_CONVERSATION(conv); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1250 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1251 gtkconv->make_sound = |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1252 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1253 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1254 |
7961 | 1255 static void |
9188 | 1256 menu_timestamps_cb(gpointer data, guint action, GtkWidget *widget) |
1257 { | |
11581 | 1258 GaimGtkWindow *win = data; |
9188 | 1259 GaimConversation *conv; |
1260 GaimGtkConversation *gtkconv; | |
1261 | |
11581 | 1262 conv = gaim_gtk_conv_window_get_active_conversation(win); |
9188 | 1263 |
1264 if (!conv) | |
1265 return; | |
1266 | |
1267 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1268 | |
1269 gtkconv->show_timestamps = | |
1270 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); | |
1271 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), | |
1272 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))); | |
1273 } | |
1274 | |
1275 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1276 chat_do_im(GaimGtkConversation *gtkconv, const char *who) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1277 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1278 GaimConversation *conv = gtkconv->active_conv; |
10431 | 1279 GaimAccount *account; |
1280 GaimConnection *gc; | |
7961 | 1281 GaimPluginProtocolInfo *prpl_info = NULL; |
1282 char *real_who; | |
1283 | |
1284 account = gaim_conversation_get_account(conv); | |
10431 | 1285 g_return_if_fail(account != NULL); |
1286 | |
1287 gc = gaim_account_get_connection(account); | |
1288 g_return_if_fail(gc != NULL); | |
1289 | |
1290 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
1291 | |
1292 if (prpl_info && prpl_info->get_cb_real_name) | |
1293 real_who = prpl_info->get_cb_real_name(gc, | |
7961 | 1294 gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)), who); |
1295 else | |
1296 real_who = g_strdup(who); | |
1297 | |
1298 if(!real_who) | |
1299 return; | |
1300 | |
10431 | 1301 gaim_gtkdialogs_im_with_user(account, real_who); |
7961 | 1302 |
1303 g_free(real_who); | |
1304 } | |
1305 | |
1306 static void | |
10810 | 1307 chat_im_button_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
7961 | 1308 { |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1309 GaimGtkChatPane *gtkchat; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1310 GtkTreeIter iter; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1311 GtkTreeModel *model; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1312 GtkTreeSelection *sel; |
9554 | 1313 char *name; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1314 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1315 gtkchat = gtkconv->u.chat; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1316 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1317 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1318 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1319 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1320 if (gtk_tree_selection_get_selected(sel, NULL, &iter)) |
9498 | 1321 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
|
1322 else |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1323 return; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1324 |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1325 chat_do_im(gtkconv, name); |
9554 | 1326 g_free(name); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1327 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1328 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1329 static void |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1330 ignore_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1331 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1332 GaimConversation *conv = gtkconv->active_conv; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1333 GaimGtkChatPane *gtkchat; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1334 GaimConvChat *chat; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1335 GtkTreeIter iter; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1336 GtkTreeModel *model; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1337 GtkTreeSelection *sel; |
10504 | 1338 char *name; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1339 char *alias; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1340 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1341 chat = GAIM_CONV_CHAT(conv); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1342 gtkchat = gtkconv->u.chat; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1343 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1344 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1345 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1346 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1347 if (gtk_tree_selection_get_selected(sel, NULL, &iter)) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1348 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1349 CHAT_USERS_NAME_COLUMN, &name, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1350 CHAT_USERS_ALIAS_COLUMN, &alias, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1351 -1); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1352 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); |
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 else |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1355 return; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1356 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1357 if (gaim_conv_chat_is_user_ignored(chat, name)) |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1358 gaim_conv_chat_unignore(chat, name); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1359 else |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1360 gaim_conv_chat_ignore(chat, name); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1361 |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
1362 add_chat_buddy_common(conv, name, alias, NULL); |
10504 | 1363 g_free(name); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1364 g_free(alias); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1365 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1366 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1367 static void |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1368 menu_chat_im_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
7398 | 1369 { |
1370 const char *who = g_object_get_data(G_OBJECT(w), "user_data"); | |
1371 | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1372 chat_do_im(gtkconv, who); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1373 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1374 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1375 static void |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1376 menu_chat_send_file_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
9468 | 1377 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1378 GaimConversation *conv = gtkconv->active_conv; |
9468 | 1379 const char *who = g_object_get_data(G_OBJECT(w), "user_data"); |
1380 GaimConnection *gc = gaim_conversation_get_gc(conv); | |
1381 | |
1382 serv_send_file(gc, who, NULL); | |
1383 } | |
1384 | |
1385 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1386 menu_chat_info_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1387 { |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1388 char *who; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1389 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1390 who = g_object_get_data(G_OBJECT(w), "user_data"); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1391 |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1392 chat_do_info(gtkconv, who); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1393 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1394 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1395 static void |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1396 menu_chat_get_away_cb(GtkWidget *w, GaimGtkConversation *gtkconv) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1397 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1398 GaimConversation *conv = gtkconv->active_conv; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1399 GaimPluginProtocolInfo *prpl_info = NULL; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1400 GaimConnection *gc; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1401 char *who; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1402 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1403 gc = gaim_conversation_get_gc(conv); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1404 who = g_object_get_data(G_OBJECT(w), "user_data"); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1405 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1406 if (gc != NULL) { |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1407 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1408 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1409 /* |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1410 * 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
|
1411 */ |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1412 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1413 if (prpl_info->get_cb_away != NULL) |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1414 { |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1415 prpl_info->get_cb_away(gc, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1416 gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)), who); |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1417 } |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1418 } |
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_add_remove_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; |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1425 GaimAccount *account; |
6695 | 1426 GaimBuddy *b; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1427 char *name; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1428 |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1429 account = gaim_conversation_get_account(conv); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1430 name = g_object_get_data(G_OBJECT(w), "user_data"); |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1431 b = gaim_find_buddy(account, name); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1432 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1433 if (b != NULL) |
9730 | 1434 gaim_gtkdialogs_remove_buddy(b); |
7060
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1435 else if (account != NULL && gaim_account_is_connected(account)) |
9946001989a3
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
1436 gaim_blist_request_add_buddy(account, name, NULL, NULL); |
5908
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 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1439 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1440 |
8143 | 1441 static GtkWidget * |
10504 | 1442 create_chat_menu(GaimConversation *conv, const char *who, |
8143 | 1443 GaimPluginProtocolInfo *prpl_info, GaimConnection *gc) |
1444 { | |
1445 static GtkWidget *menu = NULL; | |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
1446 GaimConvChat *chat = GAIM_CONV_CHAT(conv); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1447 gboolean is_me = FALSE; |
8143 | 1448 GtkWidget *button; |
1449 | |
1450 /* | |
1451 * If a menu already exists, destroy it before creating a new one, | |
1452 * thus freeing-up the memory it occupied. | |
1453 */ | |
1454 if (menu) | |
1455 gtk_widget_destroy(menu); | |
1456 | |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
1457 if (!strcmp(chat->nick, gaim_normalize(conv->account, who))) |
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
1458 is_me = TRUE; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1459 |
8143 | 1460 menu = gtk_menu_new(); |
1461 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1462 if (!is_me) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1463 button = gaim_new_item_from_stock(menu, _("IM"), GAIM_STOCK_IM, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1464 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
|
1465 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
|
1466 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1467 if (prpl_info && prpl_info->send_file |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1468 && (!prpl_info->can_receive_file || prpl_info->can_receive_file(gc, who))) { |
11508 | 1469 button = gaim_new_item_from_stock(menu, _("Send File"), |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1470 GAIM_STOCK_FILE_TRANSFER, G_CALLBACK(menu_chat_send_file_cb), |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1471 GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1472 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
|
1473 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1474 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1475 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
|
1476 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
|
1477 G_CALLBACK(ignore_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1478 else |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1479 button = gaim_new_item_from_stock(menu, _("Ignore"), GAIM_STOCK_IGNORE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1480 G_CALLBACK(ignore_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
10504 | 1481 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); |
9468 | 1482 } |
9498 | 1483 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1484 if (prpl_info->get_info || prpl_info->get_cb_info) { |
10221 | 1485 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
|
1486 G_CALLBACK(menu_chat_info_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
10504 | 1487 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); |
8143 | 1488 } |
1489 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1490 if (prpl_info->get_cb_away) { |
10221 | 1491 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
|
1492 G_CALLBACK(menu_chat_get_away_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
10504 | 1493 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); |
8143 | 1494 } |
1495 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
1496 if (!is_me && !(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME)) { |
8143 | 1497 if (gaim_find_buddy(gc->account, who)) |
10221 | 1498 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
|
1499 G_CALLBACK(menu_chat_add_remove_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
8143 | 1500 else |
10221 | 1501 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
|
1502 G_CALLBACK(menu_chat_add_remove_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); |
10504 | 1503 g_object_set_data_full(G_OBJECT(button), "user_data", g_strdup(who), g_free); |
8143 | 1504 } |
1505 | |
1506 return menu; | |
1507 } | |
1508 | |
1509 | |
1510 static gint | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1511 gtkconv_chat_popup_menu_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
8143 | 1512 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1513 GaimConversation *conv = gtkconv->active_conv; |
8143 | 1514 GaimPluginProtocolInfo *prpl_info = NULL; |
1515 GaimGtkChatPane *gtkchat; | |
1516 GaimConnection *gc; | |
1517 GaimAccount *account; | |
1518 GtkTreeSelection *sel; | |
1519 GtkTreeIter iter; | |
1520 GtkTreeModel *model; | |
1521 GtkWidget *menu; | |
1522 gchar *who; | |
1523 | |
1524 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1525 gtkchat = gtkconv->u.chat; | |
1526 account = gaim_conversation_get_account(conv); | |
1527 gc = account->gc; | |
1528 | |
1529 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); | |
1530 | |
1531 if (gc != NULL) | |
1532 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
1533 | |
1534 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list)); | |
1535 if(!gtk_tree_selection_get_selected(sel, NULL, &iter)) | |
1536 return FALSE; | |
1537 | |
9498 | 1538 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &who, -1); |
8143 | 1539 menu = create_chat_menu (conv, who, prpl_info, gc); |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1540 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1541 gaim_gtk_treeview_popup_menu_position_func, widget, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1542 0, GDK_CURRENT_TIME); |
10504 | 1543 g_free(who); |
8143 | 1544 |
1545 return TRUE; | |
1546 } | |
1547 | |
1548 | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1549 static gint |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1550 right_click_chat_cb(GtkWidget *widget, GdkEventButton *event, |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1551 GaimGtkConversation *gtkconv) |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1552 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1553 GaimConversation *conv = gtkconv->active_conv; |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1554 GaimPluginProtocolInfo *prpl_info = NULL; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1555 GaimGtkChatPane *gtkchat; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1556 GaimConnection *gc; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1557 GaimAccount *account; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1558 GtkTreePath *path; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1559 GtkTreeIter iter; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1560 GtkTreeModel *model; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1561 GtkTreeViewColumn *column; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1562 gchar *who; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1563 int x, y; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1564 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1565 gtkchat = gtkconv->u.chat; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1566 account = gaim_conversation_get_account(conv); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1567 gc = account->gc; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1568 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1569 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1570 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1571 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
|
1572 event->x, event->y, &path, &column, &x, &y); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1573 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1574 if (path == NULL) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1575 return FALSE; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1576 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1577 if (gc != NULL) |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1578 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1579 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1580 gtk_tree_selection_select_path(GTK_TREE_SELECTION( |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1581 gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkchat->list))), path); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1582 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1583 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path); |
9498 | 1584 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
|
1585 |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1586 if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
1587 chat_do_im(gtkconv, who); |
7398 | 1588 } else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { |
8143 | 1589 GtkWidget *menu = create_chat_menu (conv, who, prpl_info, gc); |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1590 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1591 event->button, event->time); |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1592 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1593 |
10504 | 1594 g_free(who); |
1595 gtk_tree_path_free(path); | |
1596 | |
5908
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1597 return TRUE; |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1598 } |
ed8a9a3bf7e2
[gaim-migrate @ 6340]
Christian Hammond <chipx86@chipx86.com>
parents:
5907
diff
changeset
|
1599 |
8133 | 1600 static void |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1601 move_to_next_unread_tab(GaimGtkConversation *gtkconv, gboolean forward) |
8133 | 1602 { |
10827 | 1603 GaimGtkConversation *next_gtkconv = NULL; |
11581 | 1604 GaimGtkWindow *win; |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1605 int index, i, total, found = 0; |
8133 | 1606 |
11581 | 1607 win = gtkconv->win; |
1608 index = gtk_notebook_page_num(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont); | |
1609 total = gaim_gtk_conv_window_get_gtkconv_count(win); | |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1610 |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1611 /* 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
|
1612 for (i = forward ? index + 1 : index - 1; |
11581 | 1613 !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
|
1614 forward ? i++ : i--) { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1615 if (i == -1) { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1616 break; |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1617 } |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1618 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1619 if (next_gtkconv->unseen_state > 0) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1620 found = 1; |
8133 | 1621 } |
11252 | 1622 |
10893
3f85d6fc763a
[gaim-migrate @ 12606]
Luke Schierer <lschiere@pidgin.im>
parents:
10892
diff
changeset
|
1623 if (!found) { |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1624 /* 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
|
1625 for (i = forward ? 0 : total - 1; |
11620
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
1626 !found && (forward ? i < index : i >= 0) && |
fbc4eeab2227
[gaim-migrate @ 13894]
Luke Schierer <lschiere@pidgin.im>
parents:
11619
diff
changeset
|
1627 (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
|
1628 forward ? i++ : i--) { |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1629 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1630 if (next_gtkconv->unseen_state > 0) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
1631 found = 1; |
8133 | 1632 } |
10827 | 1633 |
10893
3f85d6fc763a
[gaim-migrate @ 12606]
Luke Schierer <lschiere@pidgin.im>
parents:
10892
diff
changeset
|
1634 if (!found) { |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1635 /* Okay, just grab the next (forward) or previous (!forward) conversation tab. */ |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1636 if (forward) { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1637 index++; |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1638 } |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1639 else { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1640 index = (index == 0) ? total - 1 : index - 1; |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1641 } |
11581 | 1642 if (!(next_gtkconv = gaim_gtk_conv_window_get_gtkconv_at_index(win, index))) |
1643 next_gtkconv = gaim_gtk_conv_window_get_gtkconv_at_index(win, 0); | |
10827 | 1644 } |
8133 | 1645 } |
1646 | |
10827 | 1647 if (next_gtkconv != NULL && next_gtkconv != gtkconv) |
11581 | 1648 gaim_gtk_conv_window_switch_gtkconv(win, next_gtkconv); |
8133 | 1649 } |
1650 | |
4359 | 1651 static gboolean |
8105 | 1652 entry_key_press_cb(GtkWidget *entry, GdkEventKey *event, gpointer data) |
4359 | 1653 { |
11581 | 1654 GaimGtkWindow *win; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
1655 GaimConversation *conv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
1656 GaimGtkConversation *gtkconv; |
8105 | 1657 int curconv; |
1658 | |
10810 | 1659 gtkconv = (GaimGtkConversation *)data; |
10849 | 1660 conv = gtkconv->active_conv; |
11581 | 1661 win = gtkconv->win; |
1662 curconv = gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook)); | |
10839 | 1663 |
8105 | 1664 /* If CTRL was held down... */ |
1665 if (event->state & GDK_CONTROL_MASK) { | |
4359 | 1666 switch (event->keyval) { |
1667 case GDK_Up: | |
1668 if (!conv->send_history) | |
1669 break; | |
1670 | |
1671 if (!conv->send_history->prev) { | |
1672 GtkTextIter start, end; | |
1673 | |
1674 if (conv->send_history->data) | |
1675 g_free(conv->send_history->data); | |
1676 | |
1677 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, | |
1678 &start); | |
1679 gtk_text_buffer_get_end_iter(gtkconv->entry_buffer, &end); | |
1680 | |
1681 conv->send_history->data = | |
8506 | 1682 gtk_imhtml_get_markup(GTK_IMHTML(gtkconv->entry)); |
4359 | 1683 } |
8677 | 1684 |
11276
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1685 if (conv->send_history->next && conv->send_history->next->data) { |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1686 GObject *object; |
8677 | 1687 GtkTextIter iter; |
1688 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); | |
4359 | 1689 |
1690 conv->send_history = conv->send_history->next; | |
11276
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1691 |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1692 /* Block the signal to prevent application of default formatting. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1693 object = g_object_ref(G_OBJECT(gtkconv->entry)); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1694 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
|
1695 NULL, gtkconv); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1696 /* Clear the formatting. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1697 gtk_imhtml_clear_formatting(GTK_IMHTML(gtkconv->entry)); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1698 /* Unblock the signal. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1699 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
|
1700 NULL, gtkconv); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1701 g_object_unref(object); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1702 |
8061 | 1703 gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1704 gtk_imhtml_append_text_with_images( |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1705 GTK_IMHTML(gtkconv->entry), conv->send_history->data, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1706 0, NULL); |
8677 | 1707 /* this is mainly just a hack so the formatting at the |
1708 * cursor gets picked up. */ | |
1709 gtk_text_buffer_get_end_iter(buffer, &iter); | |
1710 gtk_text_buffer_move_mark_by_name(buffer, "insert", &iter); | |
4359 | 1711 } |
1712 | |
8105 | 1713 return TRUE; |
4359 | 1714 break; |
1715 | |
1716 case GDK_Down: | |
1717 if (!conv->send_history) | |
1718 break; | |
1719 | |
11276
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1720 if (conv->send_history->prev && conv->send_history->prev->data) { |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1721 GObject *object; |
8677 | 1722 GtkTextIter iter; |
1723 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); | |
8105 | 1724 |
4359 | 1725 conv->send_history = conv->send_history->prev; |
11276
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1726 |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1727 /* Block the signal to prevent application of default formatting. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1728 object = g_object_ref(G_OBJECT(gtkconv->entry)); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1729 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
|
1730 NULL, gtkconv); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1731 /* Clear the formatting. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1732 gtk_imhtml_clear_formatting(GTK_IMHTML(gtkconv->entry)); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1733 /* Unblock the signal. */ |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1734 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
|
1735 NULL, gtkconv); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1736 g_object_unref(object); |
17ebda61c6ce
[gaim-migrate @ 13463]
Richard Laager <rlaager@wiktel.com>
parents:
11275
diff
changeset
|
1737 |
8105 | 1738 gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1739 gtk_imhtml_append_text_with_images( |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1740 GTK_IMHTML(gtkconv->entry), conv->send_history->data, |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1741 0, NULL); |
8677 | 1742 /* this is mainly just a hack so the formatting at the |
1743 * cursor gets picked up. */ | |
11267
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1744 if (*(char *)conv->send_history->data) { |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1745 gtk_text_buffer_get_end_iter(buffer, &iter); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1746 gtk_text_buffer_move_mark_by_name(buffer, "insert", &iter); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1747 } else { |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1748 /* Restore the default formatting */ |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1749 default_formatize(gtkconv); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
1750 } |
4359 | 1751 } |
1752 | |
8105 | 1753 return TRUE; |
4359 | 1754 break; |
8105 | 1755 |
8108 | 1756 case GDK_Page_Down: |
8143 | 1757 case ']': |
11581 | 1758 if (!gaim_gtk_conv_window_get_gtkconv_at_index(win, curconv + 1)) |
1759 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); | |
10827 | 1760 else |
11581 | 1761 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv + 1); |
8105 | 1762 return TRUE; |
1763 break; | |
1764 | |
8108 | 1765 case GDK_Page_Up: |
8143 | 1766 case '[': |
11581 | 1767 if (!gaim_gtk_conv_window_get_gtkconv_at_index(win, curconv - 1)) |
1768 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), -1); | |
10827 | 1769 else |
11581 | 1770 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), curconv - 1); |
8133 | 1771 return TRUE; |
1772 break; | |
1773 | |
8108 | 1774 case GDK_Tab: |
11467
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1775 case GDK_ISO_Left_Tab: |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1776 if (event->state & GDK_SHIFT_MASK) { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1777 move_to_next_unread_tab(gtkconv, FALSE); |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1778 } else { |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1779 move_to_next_unread_tab(gtkconv, TRUE); |
2952c6dfa738
[gaim-migrate @ 13707]
Luke Schierer <lschiere@pidgin.im>
parents:
11460
diff
changeset
|
1780 } |
8108 | 1781 |
1782 return TRUE; | |
1783 break; | |
1784 | |
11252 | 1785 case GDK_comma: |
11581 | 1786 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), |
1787 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), | |
11252 | 1788 curconv - 1); |
1789 break; | |
1790 | |
1791 case GDK_period: | |
11581 | 1792 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), |
1793 gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), curconv), | |
11780 | 1794 #if GTK_CHECK_VERSION(2,2,0) |
11581 | 1795 (curconv + 1) % gtk_notebook_get_n_pages(GTK_NOTEBOOK(win->notebook))); |
11780 | 1796 #else |
1797 (curconv + 1) % g_list_length(GTK_NOTEBOOK(win->notebook)->children)); | |
1798 #endif | |
11252 | 1799 break; |
1800 | |
8105 | 1801 } /* End of switch */ |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1802 } |
8758 | 1803 |
8105 | 1804 /* If ALT (or whatever) was held down... */ |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1805 else if (event->state & GDK_MOD1_MASK) |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1806 { |
10864 | 1807 if (event->keyval > '0' && event->keyval <= '9') |
1808 { | |
8105 | 1809 int switchto = event->keyval - '1'; |
11581 | 1810 if (switchto < gaim_gtk_conv_window_get_gtkconv_count(win)) |
1811 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), switchto); | |
4359 | 1812 |
1813 return TRUE; | |
1814 } | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1815 } |
8758 | 1816 |
8105 | 1817 /* If neither CTRL nor ALT were held down... */ |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1818 else |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1819 { |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1820 switch (event->keyval) |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1821 { |
10678
210e38f53b7b
[gaim-migrate @ 12221]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10666
diff
changeset
|
1822 case GDK_Tab: |
9605 | 1823 return tab_complete(conv); |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1824 break; |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1825 |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1826 case GDK_Page_Up: |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1827 gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml)); |
8105 | 1828 return TRUE; |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1829 break; |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1830 |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1831 case GDK_Page_Down: |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1832 gtk_imhtml_page_down(GTK_IMHTML(gtkconv->imhtml)); |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1833 return TRUE; |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1834 break; |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1835 |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1836 } |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
1837 } |
4359 | 1838 return FALSE; |
1839 } | |
1840 | |
1841 /* | |
1842 * NOTE: | |
6725
e62a504c83d0
[gaim-migrate @ 7252]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1843 * 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
|
1844 * further. I have no idea *why* we need this, but we do ... It |
4359 | 1845 * 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
|
1846 * going all the way down to the notebook. I suspect a bug in |
4359 | 1847 * GtkTextView, but I'm not ready to point any fingers yet. |
1848 */ | |
1849 static gboolean | |
1850 entry_stop_rclick_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) | |
1851 { | |
1852 if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { | |
1853 /* Right single click */ | |
1854 g_signal_stop_emission_by_name(G_OBJECT(widget), "button_press_event"); | |
1855 | |
1856 return TRUE; | |
1857 } | |
1858 | |
1859 return FALSE; | |
1860 } | |
1861 | |
8173 | 1862 /* |
1863 * If someone tries to type into the conversation backlog of a | |
1864 * conversation window then we yank focus from the conversation backlog | |
1865 * and give it to the text entry box so that people can type | |
1866 * all the live long day and it will get entered into the entry box. | |
1867 */ | |
6057 | 1868 static gboolean |
8105 | 1869 refocus_entry_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) |
6057 | 1870 { |
1871 GaimGtkConversation *gtkconv = data; | |
1872 | |
8237 | 1873 /* If we have a valid key for the conversation display, then exit */ |
8224 | 1874 if ((event->state & GDK_CONTROL_MASK) || |
8237 | 1875 (event->keyval == GDK_F10) || |
1876 (event->keyval == GDK_Shift_L) || | |
1877 (event->keyval == GDK_Shift_R) || | |
1878 (event->keyval == GDK_Escape) || | |
8177 | 1879 (event->keyval == GDK_Up) || |
1880 (event->keyval == GDK_Down) || | |
1881 (event->keyval == GDK_Left) || | |
8191 | 1882 (event->keyval == GDK_Right) || |
1883 (event->keyval == GDK_Home) || | |
9297 | 1884 (event->keyval == GDK_End) || |
1885 (event->keyval == GDK_Tab) || | |
1886 (event->keyval == GDK_ISO_Left_Tab)) | |
8177 | 1887 return FALSE; |
1888 | |
1889 if (event->type == GDK_KEY_RELEASE) | |
1890 gtk_widget_grab_focus(gtkconv->entry); | |
1891 | |
1892 gtk_widget_event(gtkconv->entry, (GdkEvent *)event); | |
1893 | |
1894 return TRUE; | |
6057 | 1895 } |
1896 | |
4359 | 1897 static void |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1898 gaim_gtkconv_set_active_conversation(GaimConversation *conv) |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1899 { |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1900 GaimGtkConversation *gtkconv; |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1901 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1902 g_return_if_fail(conv != NULL); |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1903 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1904 gtkconv = GAIM_GTK_CONVERSATION(conv); |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1905 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1906 if (gtkconv->active_conv == conv) |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1907 return; |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1908 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1909 gaim_conversation_close_logs(gtkconv->active_conv); |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1910 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1911 gtkconv->active_conv = conv; |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1912 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1913 gaim_conversation_set_logging(conv, |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1914 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
|
1915 } |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1916 |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1917 static void |
11604 | 1918 gaim_gtkconv_switch_active_conversation(GaimConversation *conv) |
1919 { | |
1920 GaimGtkConversation *gtkconv; | |
1921 | |
1922 g_return_if_fail(conv != NULL); | |
1923 | |
1924 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
1925 | |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
1926 gaim_gtkconv_set_active_conversation(conv); |
11604 | 1927 |
1928 gray_stuff_out(gtkconv); | |
1929 update_typing_icon(gtkconv); | |
1930 | |
1931 gtk_window_set_title(GTK_WINDOW(gtkconv->win->window), | |
1932 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label))); | |
1933 | |
11671
4ebd27e664c4
[gaim-migrate @ 13957]
Luke Schierer <lschiere@pidgin.im>
parents:
11669
diff
changeset
|
1934 gaim_conversation_update(conv, GAIM_CONV_UPDATE_ACCOUNT); |
11604 | 1935 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry), |
1936 gaim_account_get_protocol_name(conv->account)); | |
1937 } | |
1938 | |
1939 static void | |
4673 | 1940 menu_conv_sel_send_cb(GObject *m, gpointer data) |
4359 | 1941 { |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
1942 GaimAccount *account = g_object_get_data(m, "gaim_account"); |
11594 | 1943 gchar *name = g_object_get_data(m, "gaim_buddy_name"); |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
1944 GaimConversation *conv; |
4359 | 1945 |
10059
79fafe47d919
[gaim-migrate @ 11027]
Luke Schierer <lschiere@pidgin.im>
parents:
10053
diff
changeset
|
1946 if (gtk_check_menu_item_get_active((GtkCheckMenuItem*) m) == FALSE) |
79fafe47d919
[gaim-migrate @ 11027]
Luke Schierer <lschiere@pidgin.im>
parents:
10053
diff
changeset
|
1947 return; |
79fafe47d919
[gaim-migrate @ 11027]
Luke Schierer <lschiere@pidgin.im>
parents:
10053
diff
changeset
|
1948 |
11594 | 1949 conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, account, name); |
11604 | 1950 gaim_gtkconv_switch_active_conversation(conv); |
4359 | 1951 } |
1952 | |
1953 static void | |
1954 insert_text_cb(GtkTextBuffer *textbuffer, GtkTextIter *position, | |
1955 gchar *new_text, gint new_text_length, gpointer user_data) | |
1956 { | |
10810 | 1957 GaimGtkConversation *gtkconv = (GaimGtkConversation *)user_data; |
1958 GaimConversation *conv; | |
1959 | |
1960 g_return_if_fail(gtkconv != NULL); | |
11508 | 1961 |
10810 | 1962 conv = gtkconv->active_conv; |
4359 | 1963 |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
1964 if (!gaim_prefs_get_bool("/core/conversations/im/send_typing")) |
4359 | 1965 return; |
1966 | |
10810 | 1967 got_typing_keypress(gtkconv, (gtk_text_iter_is_start(position) && |
1968 gtk_text_iter_is_end(position))); | |
4359 | 1969 } |
1970 | |
1971 static void | |
1972 delete_text_cb(GtkTextBuffer *textbuffer, GtkTextIter *start_pos, | |
1973 GtkTextIter *end_pos, gpointer user_data) | |
1974 { | |
10810 | 1975 GaimGtkConversation *gtkconv = (GaimGtkConversation *)user_data; |
1976 GaimConversation *conv; | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1977 GaimConvIm *im; |
4359 | 1978 |
10810 | 1979 g_return_if_fail(gtkconv != NULL); |
11508 | 1980 |
10810 | 1981 conv = gtkconv->active_conv; |
4359 | 1982 |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
1983 if (!gaim_prefs_get_bool("/core/conversations/im/send_typing")) |
4359 | 1984 return; |
1985 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1986 im = GAIM_CONV_IM(conv); |
4359 | 1987 |
1988 if (gtk_text_iter_is_start(start_pos) && gtk_text_iter_is_end(end_pos)) { | |
1989 | |
1990 /* We deleted all the text, so turn off typing. */ | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1991 if (gaim_conv_im_get_type_again_timeout(im)) |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
1992 gaim_conv_im_stop_type_again_timeout(im); |
4359 | 1993 |
1994 serv_send_typing(gaim_conversation_get_gc(conv), | |
6695 | 1995 gaim_conversation_get_name(conv), |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
1996 GAIM_NOT_TYPING); |
4359 | 1997 } |
1998 else { | |
1999 /* We're deleting, but not all of it, so it counts as typing. */ | |
10810 | 2000 got_typing_keypress(gtkconv, FALSE); |
4359 | 2001 } |
2002 } | |
2003 | |
8189 | 2004 /************************************************************************** |
2005 * A bunch of buddy icon functions | |
2006 **************************************************************************/ | |
11581 | 2007 GdkPixbuf * |
2008 gaim_gtkconv_get_tab_icon(GaimConversation *conv, gboolean small_icon) | |
7143 | 2009 { |
10116 | 2010 GaimAccount *account = NULL; |
2011 const char *name = NULL; | |
7143 | 2012 GdkPixbuf *status = NULL; |
2013 | |
10116 | 2014 g_return_val_if_fail(conv != NULL, NULL); |
2015 | |
2016 account = gaim_conversation_get_account(conv); | |
2017 name = gaim_conversation_get_name(conv); | |
2018 | |
2019 g_return_val_if_fail(account != NULL, NULL); | |
2020 g_return_val_if_fail(name != NULL, NULL); | |
2021 | |
11338 | 2022 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { |
7143 | 2023 GaimBuddy *b = gaim_find_buddy(account, name); |
2024 if (b != NULL) { | |
2025 status = gaim_gtk_blist_get_status_icon((GaimBlistNode*)b, | |
8755
d0364feabf96
[gaim-migrate @ 9510]
Christian Hammond <chipx86@chipx86.com>
parents:
8748
diff
changeset
|
2026 (small_icon ? GAIM_STATUS_ICON_SMALL : GAIM_STATUS_ICON_LARGE)); |
7143 | 2027 } |
2028 } | |
2029 | |
2030 if (!status) { | |
2031 GdkPixbuf *pixbuf; | |
10884 | 2032 pixbuf = gaim_gtk_create_prpl_icon(account); |
7143 | 2033 |
8755
d0364feabf96
[gaim-migrate @ 9510]
Christian Hammond <chipx86@chipx86.com>
parents:
8748
diff
changeset
|
2034 if (small_icon && pixbuf != NULL) |
8748
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2035 { |
7143 | 2036 status = gdk_pixbuf_scale_simple(pixbuf, 15, 15, |
2037 GDK_INTERP_BILINEAR); | |
2038 g_object_unref(pixbuf); | |
2039 } | |
8748
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2040 else |
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2041 status = pixbuf; |
7143 | 2042 } |
2043 return status; | |
2044 } | |
2045 | |
8189 | 2046 static void |
2047 update_tab_icon(GaimConversation *conv) | |
2048 { | |
2049 GaimGtkConversation *gtkconv; | |
11581 | 2050 GaimGtkWindow *win; |
8189 | 2051 GaimAccount *account; |
2052 const char *name; | |
2053 GdkPixbuf *status = NULL; | |
2054 | |
10116 | 2055 g_return_if_fail(conv != NULL); |
2056 | |
8189 | 2057 gtkconv = GAIM_GTK_CONVERSATION(conv); |
11581 | 2058 win = gtkconv->win; |
8189 | 2059 name = gaim_conversation_get_name(conv); |
2060 account = gaim_conversation_get_account(conv); | |
2061 | |
11581 | 2062 status = gaim_gtkconv_get_tab_icon(conv, TRUE); |
8189 | 2063 |
10116 | 2064 g_return_if_fail(status != NULL); |
2065 | |
8189 | 2066 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->icon), status); |
2067 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->menu_icon), status); | |
2068 | |
8748
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2069 if (status != NULL) |
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2070 g_object_unref(status); |
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2071 |
11581 | 2072 if (gaim_gtk_conv_window_get_active_conversation(win) == conv && |
11338 | 2073 (gaim_conversation_get_type(conv) != GAIM_CONV_TYPE_IM || |
10504 | 2074 gtkconv->u.im->anim == NULL)) |
8748
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2075 { |
11581 | 2076 status = gaim_gtkconv_get_tab_icon(conv, FALSE); |
2077 | |
2078 gtk_window_set_icon(GTK_WINDOW(win->window), status); | |
8189 | 2079 |
8748
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2080 if (status != NULL) |
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2081 g_object_unref(status); |
13d592f485d1
[gaim-migrate @ 9503]
Christian Hammond <chipx86@chipx86.com>
parents:
8735
diff
changeset
|
2082 } |
8189 | 2083 } |
2084 | |
2085 static gboolean | |
2086 redraw_icon(gpointer data) | |
2087 { | |
10810 | 2088 GaimGtkConversation *gtkconv = (GaimGtkConversation *)data; |
2089 GaimConversation *conv = gtkconv->active_conv; | |
9318 | 2090 GaimAccount *account; |
2091 GaimPluginProtocolInfo *prpl_info = NULL; | |
8189 | 2092 |
2093 GdkPixbuf *buf; | |
2094 GdkPixbuf *scale; | |
2095 GdkPixmap *pm; | |
2096 GdkBitmap *bm; | |
2097 gint delay; | |
9318 | 2098 int scale_width, scale_height; |
8189 | 2099 |
2100 if (!g_list_find(gaim_get_ims(), conv)) { | |
2101 gaim_debug(GAIM_DEBUG_WARNING, "gtkconv", | |
2102 "Conversation not found in redraw_icon. I think this " | |
2103 "is a bug.\n"); | |
2104 return FALSE; | |
2105 } | |
2106 | |
2107 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
9318 | 2108 account = gaim_conversation_get_account(conv); |
2109 if(account && account->gc) | |
2110 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl); | |
8189 | 2111 |
2112 gdk_pixbuf_animation_iter_advance(gtkconv->u.im->iter, NULL); | |
2113 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter); | |
2114 | |
10483 | 2115 gaim_gtk_buddy_icon_get_scale_size(buf, prpl_info ? &prpl_info->icon_spec : |
9318 | 2116 NULL, &scale_width, &scale_height); |
2117 | |
2118 /* this code is ugly, and scares me */ | |
8189 | 2119 scale = gdk_pixbuf_scale_simple(buf, |
9318 | 2120 MAX(gdk_pixbuf_get_width(buf) * scale_width / |
8189 | 2121 gdk_pixbuf_animation_get_width(gtkconv->u.im->anim), 1), |
9318 | 2122 MAX(gdk_pixbuf_get_height(buf) * scale_height / |
8189 | 2123 gdk_pixbuf_animation_get_height(gtkconv->u.im->anim), 1), |
11324 | 2124 GDK_INTERP_BILINEAR); |
8189 | 2125 |
2126 gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 100); | |
2127 g_object_unref(G_OBJECT(scale)); | |
2128 gtk_image_set_from_pixmap(GTK_IMAGE(gtkconv->u.im->icon), pm, bm); | |
2129 g_object_unref(G_OBJECT(pm)); | |
2130 gtk_widget_queue_draw(gtkconv->u.im->icon); | |
2131 | |
2132 if (bm) | |
2133 g_object_unref(G_OBJECT(bm)); | |
2134 | |
9131 | 2135 delay = gdk_pixbuf_animation_iter_get_delay_time(gtkconv->u.im->iter); |
10639 | 2136 |
2137 if (delay < 100) | |
9131 | 2138 delay = 100; |
2139 | |
2140 gtkconv->u.im->icon_timer = g_timeout_add(delay, redraw_icon, conv); | |
8189 | 2141 |
2142 return FALSE; | |
2143 } | |
2144 | |
2145 static void | |
10810 | 2146 start_anim(GtkObject *obj, GaimGtkConversation *gtkconv) |
8189 | 2147 { |
10810 | 2148 GaimConversation *conv = gtkconv->active_conv; |
8189 | 2149 int delay; |
2150 | |
8228 | 2151 if (gtkconv->u.im->anim == NULL) |
2152 return; | |
2153 | |
8202 | 2154 if (gtkconv->u.im->icon_timer != 0) |
2155 return; | |
2156 | |
8189 | 2157 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) |
2158 return; | |
2159 | |
10639 | 2160 delay = gdk_pixbuf_animation_iter_get_delay_time(gtkconv->u.im->iter); |
2161 | |
2162 if (delay < 100) | |
2163 delay = 100; | |
2164 | |
10810 | 2165 gtkconv->u.im->icon_timer = g_timeout_add(delay, redraw_icon, conv); |
8189 | 2166 } |
2167 | |
2168 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2169 remove_icon(GaimGtkConversation *gtkconv) |
8189 | 2170 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2171 GaimConversation *conv = gtkconv->active_conv; |
10456 | 2172 GaimGtkWindow *gtkwin; |
2173 | |
2174 g_return_if_fail(conv != NULL); | |
2175 | |
9887 | 2176 if (gtkconv->u.im->icon_container != NULL) |
2177 gtk_widget_destroy(gtkconv->u.im->icon_container); | |
8189 | 2178 |
2179 if (gtkconv->u.im->anim != NULL) | |
2180 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); | |
2181 | |
2182 if (gtkconv->u.im->icon_timer != 0) | |
2183 g_source_remove(gtkconv->u.im->icon_timer); | |
2184 | |
2185 if (gtkconv->u.im->iter != NULL) | |
2186 g_object_unref(G_OBJECT(gtkconv->u.im->iter)); | |
2187 | |
2188 gtkconv->u.im->icon_timer = 0; | |
2189 gtkconv->u.im->icon = NULL; | |
2190 gtkconv->u.im->anim = NULL; | |
2191 gtkconv->u.im->iter = NULL; | |
10456 | 2192 gtkconv->u.im->icon_container = NULL; |
9687 | 2193 gtkconv->u.im->show_icon = FALSE; |
10456 | 2194 |
11581 | 2195 gtkwin = gtkconv->win; |
10456 | 2196 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtkwin->menu.show_icon), FALSE); |
8189 | 2197 } |
2198 | |
9497 | 2199 static void |
9504 | 2200 saveicon_writefile_cb(void *user_data, const char *filename) |
9497 | 2201 { |
10810 | 2202 GaimGtkConversation *gtkconv = (GaimGtkConversation *)user_data; |
2203 GaimConversation *conv = gtkconv->active_conv; | |
9497 | 2204 FILE *fp; |
2205 GaimBuddyIcon *icon; | |
2206 const void *data; | |
2207 size_t len; | |
2208 | |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10572
diff
changeset
|
2209 if ((fp = g_fopen(filename, "wb")) == NULL) { |
9504 | 2210 gaim_notify_error(conv, NULL, _("Unable to open file."), NULL); |
9497 | 2211 return; |
2212 } | |
2213 | |
2214 icon = gaim_conv_im_get_icon(GAIM_CONV_IM(conv)); | |
2215 data = gaim_buddy_icon_get_data(icon, &len); | |
2216 | |
2217 if ((len <= 0) || (data == NULL)) { | |
9504 | 2218 gaim_notify_error(conv, NULL, _("Unable to save icon file to disk."), NULL); |
9497 | 2219 return; |
2220 } | |
2221 | |
2222 fwrite(data, 1, len, fp); | |
2223 fclose(fp); | |
2224 } | |
2225 | |
2226 static void | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2227 icon_menu_save_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) |
9497 | 2228 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2229 GaimConversation *conv = gtkconv->active_conv; |
10953 | 2230 const gchar *ext; |
9497 | 2231 gchar *buf; |
2232 | |
2233 g_return_if_fail(conv != NULL); | |
9504 | 2234 |
10953 | 2235 ext = gaim_buddy_icon_get_type(gaim_conv_im_get_icon(GAIM_CONV_IM(conv))); |
2236 if (ext == NULL) | |
2237 ext = "icon"; | |
2238 | |
2239 buf = g_strdup_printf("%s.%s", gaim_normalize(conv->account, conv->name), ext); | |
9504 | 2240 |
2241 gaim_request_file(conv, _("Save Icon"), buf, TRUE, | |
2242 G_CALLBACK(saveicon_writefile_cb), NULL, conv); | |
9497 | 2243 |
2244 g_free(buf); | |
2245 } | |
2246 | |
11581 | 2247 static void |
2248 stop_anim(GtkObject *obj, GaimGtkConversation *gtkconv) | |
2249 { | |
2250 if (gtkconv->u.im->icon_timer != 0) | |
2251 g_source_remove(gtkconv->u.im->icon_timer); | |
2252 | |
2253 gtkconv->u.im->icon_timer = 0; | |
2254 } | |
2255 | |
2256 | |
2257 static void | |
2258 toggle_icon_animate_cb(GtkWidget *w, GaimGtkConversation *gtkconv) | |
2259 { | |
2260 gtkconv->u.im->animate = | |
2261 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w)); | |
2262 | |
2263 if (gtkconv->u.im->animate) | |
2264 start_anim(NULL, gtkconv); | |
2265 else | |
2266 stop_anim(NULL, gtkconv); | |
2267 } | |
2268 | |
8189 | 2269 static gboolean |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2270 icon_menu(GtkObject *obj, GdkEventButton *e, GaimGtkConversation *gtkconv) |
8189 | 2271 { |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2272 GaimConversation *conv = gtkconv->active_conv; |
8189 | 2273 static GtkWidget *menu = NULL; |
2274 GtkWidget *button; | |
2275 | |
2276 if (e->button != 3 || e->type != GDK_BUTTON_PRESS) | |
2277 return FALSE; | |
2278 | |
2279 /* | |
2280 * If a menu already exists, destroy it before creating a new one, | |
2281 * thus freeing-up the memory it occupied. | |
2282 */ | |
2283 if (menu != NULL) | |
2284 gtk_widget_destroy(menu); | |
2285 | |
2286 menu = gtk_menu_new(); | |
2287 | |
2288 if (gtkconv->u.im->anim && | |
2289 !(gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim))) | |
2290 { | |
2291 gaim_new_check_item(menu, _("Animate"), | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2292 G_CALLBACK(toggle_icon_animate_cb), conv, |
8189 | 2293 gtkconv->u.im->icon_timer); |
2294 } | |
2295 | |
2296 button = gtk_menu_item_new_with_label(_("Hide Icon")); | |
2297 g_signal_connect_swapped(G_OBJECT(button), "activate", | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2298 G_CALLBACK(remove_icon), gtkconv); |
8189 | 2299 gtk_menu_shell_append(GTK_MENU_SHELL(menu), button); |
2300 gtk_widget_show(button); | |
2301 | |
2302 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
|
2303 G_CALLBACK(icon_menu_save_cb), gtkconv, |
8189 | 2304 0, 0, NULL); |
2305 | |
2306 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); | |
2307 | |
2308 return TRUE; | |
2309 } | |
10456 | 2310 |
2311 static void | |
2312 menu_buddyicon_cb(gpointer data, guint action, GtkWidget *widget) | |
2313 { | |
11581 | 2314 GaimGtkWindow *win = data; |
10456 | 2315 GaimConversation *conv; |
2316 GaimGtkConversation *gtkconv; | |
2317 gboolean active; | |
2318 | |
11581 | 2319 conv = gaim_gtk_conv_window_get_active_conversation(win); |
10456 | 2320 |
2321 if (!conv) | |
2322 return; | |
2323 | |
11338 | 2324 g_return_if_fail(gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM); |
10456 | 2325 |
2326 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2327 | |
2328 active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); | |
2329 gtkconv->u.im->show_icon = active; | |
2330 if (active) | |
2331 gaim_gtkconv_update_buddy_icon(conv); | |
2332 else | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
2333 remove_icon(gtkconv); |
10456 | 2334 } |
2335 | |
8189 | 2336 /************************************************************************** |
2337 * End of the bunch of buddy icon functions | |
2338 **************************************************************************/ | |
2339 | |
11581 | 2340 GaimGtkWindow * |
2341 gaim_gtkconv_get_window(GaimGtkConversation *gtkconv) | |
2342 { | |
2343 g_return_val_if_fail(gtkconv != NULL, NULL); | |
2344 return gtkconv->win; | |
2345 } | |
2346 | |
2347 static GtkItemFactoryEntry menu_items[] = | |
2348 { | |
2349 /* Conversation menu */ | |
2350 { N_("/_Conversation"), NULL, NULL, 0, "<Branch>" }, | |
2351 | |
2352 { N_("/Conversation/New Instant _Message..."), "<CTL>M", menu_new_conv_cb, | |
2353 0, "<StockItem>", GAIM_STOCK_IM }, | |
2354 | |
2355 { "/Conversation/sep0", NULL, NULL, 0, "<Separator>" }, | |
2356 | |
2357 { N_("/Conversation/_Find..."), NULL, menu_find_cb, 0, | |
2358 "<StockItem>", GTK_STOCK_FIND }, | |
2359 { N_("/Conversation/View _Log"), NULL, menu_view_log_cb, 0, NULL }, | |
2360 { N_("/Conversation/_Save As..."), NULL, menu_save_as_cb, 0, | |
2361 "<StockItem>", GTK_STOCK_SAVE_AS }, | |
2362 { N_("/Conversation/Clear"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR }, | |
2363 | |
2364 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>" }, | |
2365 | |
2366 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", GAIM_STOCK_FILE_TRANSFER }, | |
2367 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, | |
2368 0, NULL }, | |
2369 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0, | |
2370 "<StockItem>", GAIM_STOCK_INFO }, | |
2371 { N_("/Conversation/In_vite..."), NULL, menu_invite_cb, 0, | |
2372 "<StockItem>", GAIM_STOCK_INVITE }, | |
2373 | |
2374 { "/Conversation/sep2", NULL, NULL, 0, "<Separator>" }, | |
2375 | |
2376 { N_("/Conversation/Al_ias..."), NULL, menu_alias_cb, 0, | |
2377 "<StockItem>", GAIM_STOCK_EDIT }, | |
2378 { N_("/Conversation/_Block..."), NULL, menu_block_cb, 0, | |
2379 "<StockItem>", GAIM_STOCK_BLOCK }, | |
2380 { N_("/Conversation/_Add..."), NULL, menu_add_remove_cb, 0, | |
2381 "<StockItem>", GTK_STOCK_ADD }, | |
2382 { N_("/Conversation/_Remove..."), NULL, menu_add_remove_cb, 0, | |
2383 "<StockItem>", GTK_STOCK_REMOVE }, | |
2384 | |
2385 { "/Conversation/sep3", NULL, NULL, 0, "<Separator>" }, | |
2386 | |
2387 { N_("/Conversation/Insert Lin_k..."), NULL, menu_insert_link_cb, 0, | |
2388 "<StockItem>", GAIM_STOCK_LINK }, | |
2389 { N_("/Conversation/Insert Imag_e..."), NULL, menu_insert_image_cb, 0, | |
2390 "<StockItem>", GAIM_STOCK_IMAGE }, | |
2391 | |
2392 { "/Conversation/sep4", NULL, NULL, 0, "<Separator>" }, | |
2393 | |
2394 { N_("/Conversation/_Close"), NULL, menu_close_conv_cb, 0, | |
2395 "<StockItem>", GTK_STOCK_CLOSE }, | |
2396 | |
2397 /* Options */ | |
2398 { N_("/_Options"), NULL, NULL, 0, "<Branch>" }, | |
2399 { N_("/Options/Enable _Logging"), NULL, menu_logging_cb, 0, "<CheckItem>" }, | |
2400 { N_("/Options/Enable _Sounds"), NULL, menu_sounds_cb, 0, "<CheckItem>" }, | |
2401 { N_("/Options/Show Formatting _Toolbars"), NULL, menu_toolbar_cb, 0, "<CheckItem>" }, | |
2402 { N_("/Options/Show Ti_mestamps"), "F2", menu_timestamps_cb, 0, "<CheckItem>" }, | |
2403 { N_("/Options/Show Buddy _Icon"), NULL, menu_buddyicon_cb, 0, "<CheckItem>" }, | |
2404 }; | |
2405 | |
2406 static const int menu_item_count = | |
2407 sizeof(menu_items) / sizeof(*menu_items); | |
2408 | |
2409 static char * | |
2410 item_factory_translate_func (const char *path, gpointer func_data) | |
2411 { | |
2412 return _((char *)path); | |
2413 } | |
2414 | |
2415 static GtkWidget * | |
2416 setup_menubar(GaimGtkWindow *win) | |
2417 { | |
2418 GtkAccelGroup *accel_group; | |
2419 | |
2420 accel_group = gtk_accel_group_new (); | |
2421 gtk_window_add_accel_group(GTK_WINDOW(win->window), accel_group); | |
2422 g_object_unref(accel_group); | |
2423 | |
2424 win->menu.item_factory = | |
2425 gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group); | |
2426 | |
2427 gtk_item_factory_set_translate_func(win->menu.item_factory, | |
2428 item_factory_translate_func, | |
2429 NULL, NULL); | |
2430 | |
2431 gtk_item_factory_create_items(win->menu.item_factory, menu_item_count, | |
2432 menu_items, win); | |
2433 g_signal_connect(G_OBJECT(accel_group), "accel-changed", | |
2434 G_CALLBACK(gaim_gtk_save_accels_cb), NULL); | |
2435 | |
2436 | |
2437 win->menu.menubar = | |
2438 gtk_item_factory_get_widget(win->menu.item_factory, "<main>"); | |
2439 | |
2440 | |
2441 win->menu.view_log = | |
2442 gtk_item_factory_get_widget(win->menu.item_factory, | |
2443 N_("/Conversation/View Log")); | |
2444 | |
2445 /* --- */ | |
2446 | |
2447 win->menu.send_file = | |
2448 gtk_item_factory_get_widget(win->menu.item_factory, | |
2449 N_("/Conversation/Send File...")); | |
2450 | |
2451 win->menu.add_pounce = | |
2452 gtk_item_factory_get_widget(win->menu.item_factory, | |
2453 N_("/Conversation/Add Buddy Pounce...")); | |
2454 | |
2455 /* --- */ | |
2456 | |
2457 win->menu.get_info = | |
2458 gtk_item_factory_get_widget(win->menu.item_factory, | |
2459 N_("/Conversation/Get Info")); | |
2460 | |
2461 win->menu.invite = | |
2462 gtk_item_factory_get_widget(win->menu.item_factory, | |
2463 N_("/Conversation/Invite...")); | |
2464 | |
2465 /* --- */ | |
2466 | |
2467 win->menu.alias = | |
2468 gtk_item_factory_get_widget(win->menu.item_factory, | |
2469 N_("/Conversation/Alias...")); | |
2470 | |
2471 win->menu.block = | |
2472 gtk_item_factory_get_widget(win->menu.item_factory, | |
2473 N_("/Conversation/Block...")); | |
2474 | |
2475 win->menu.add = | |
2476 gtk_item_factory_get_widget(win->menu.item_factory, | |
2477 N_("/Conversation/Add...")); | |
2478 | |
2479 win->menu.remove = | |
2480 gtk_item_factory_get_widget(win->menu.item_factory, | |
2481 N_("/Conversation/Remove...")); | |
2482 | |
2483 /* --- */ | |
2484 | |
2485 win->menu.insert_link = | |
2486 gtk_item_factory_get_widget(win->menu.item_factory, | |
2487 N_("/Conversation/Insert Link...")); | |
2488 | |
2489 win->menu.insert_image = | |
2490 gtk_item_factory_get_widget(win->menu.item_factory, | |
2491 N_("/Conversation/Insert Image...")); | |
2492 | |
2493 /* --- */ | |
2494 | |
2495 win->menu.logging = | |
2496 gtk_item_factory_get_widget(win->menu.item_factory, | |
2497 N_("/Options/Enable Logging")); | |
2498 win->menu.sounds = | |
2499 gtk_item_factory_get_widget(win->menu.item_factory, | |
2500 N_("/Options/Enable Sounds")); | |
2501 win->menu.show_formatting_toolbar = | |
2502 gtk_item_factory_get_widget(win->menu.item_factory, | |
2503 N_("/Options/Show Formatting Toolbars")); | |
2504 win->menu.show_timestamps = | |
2505 gtk_item_factory_get_widget(win->menu.item_factory, | |
2506 N_("/Options/Show Timestamps")); | |
2507 win->menu.show_icon = | |
2508 gtk_item_factory_get_widget(win->menu.item_factory, | |
2509 N_("/Options/Show Buddy Icon")); | |
2510 | |
2511 | |
2512 win->menu.tray = gaim_gtk_menu_tray_new(); | |
2513 gtk_menu_shell_append(GTK_MENU_SHELL(win->menu.menubar), | |
2514 win->menu.tray); | |
2515 gtk_widget_show(win->menu.tray); | |
2516 | |
11686 | 2517 win->menu.typing_icon = gtk_image_new_from_stock(GAIM_STOCK_MENU_ICON_BLANK, |
2518 GTK_ICON_SIZE_MENU); | |
2519 gtk_widget_show(win->menu.typing_icon); | |
2520 gaim_gtk_menu_tray_append(GAIM_GTK_MENU_TRAY(win->menu.tray), | |
2521 win->menu.typing_icon); | |
2522 | |
11581 | 2523 gtk_widget_show(win->menu.menubar); |
2524 | |
2525 return win->menu.menubar; | |
2526 } | |
2527 | |
4359 | 2528 |
2529 /************************************************************************** | |
2530 * Utility functions | |
2531 **************************************************************************/ | |
2532 | |
2533 static void | |
10810 | 2534 got_typing_keypress(GaimGtkConversation *gtkconv, gboolean first) |
4359 | 2535 { |
10810 | 2536 GaimConversation *conv = gtkconv->active_conv; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2537 GaimConvIm *im; |
4685 | 2538 |
4359 | 2539 /* |
2540 * 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
|
2541 * send GAIM_TYPED any time soon. |
4359 | 2542 */ |
2543 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2544 im = GAIM_CONV_IM(conv); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2545 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2546 if (gaim_conv_im_get_type_again_timeout(im)) |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2547 gaim_conv_im_stop_type_again_timeout(im); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2548 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2549 gaim_conv_im_start_type_again_timeout(im); |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2550 |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2551 if (first || (gaim_conv_im_get_type_again(im) != 0 && |
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2552 time(NULL) > gaim_conv_im_get_type_again(im))) { |
4359 | 2553 |
2554 int timeout = serv_send_typing(gaim_conversation_get_gc(conv), | |
2555 (char *)gaim_conversation_get_name(conv), | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5860
diff
changeset
|
2556 GAIM_TYPING); |
4359 | 2557 |
2558 if (timeout) | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2559 gaim_conv_im_set_type_again(im, time(NULL) + timeout); |
4359 | 2560 else |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2561 gaim_conv_im_set_type_again(im, 0); |
4359 | 2562 } |
2563 } | |
2564 | |
4736 | 2565 static void |
10810 | 2566 update_typing_icon(GaimGtkConversation *gtkconv) |
4736 | 2567 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2568 GaimGtkWindow *gtkwin; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2569 GaimConvIm *im = NULL; |
10810 | 2570 GaimConversation *conv = gtkconv->active_conv; |
11508 | 2571 |
11581 | 2572 gtkwin = gtkconv->win; |
4736 | 2573 |
11338 | 2574 if(gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2575 im = GAIM_CONV_IM(conv); |
4736 | 2576 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2577 if(im && gaim_conv_im_get_typing_state(im) == GAIM_TYPING) { |
11689
9c0612901c3e
[gaim-migrate @ 13975]
Gary Kramlich <grim@reaperworld.com>
parents:
11686
diff
changeset
|
2578 gtk_image_set_from_stock(GTK_IMAGE(gtkwin->menu.typing_icon), |
9c0612901c3e
[gaim-migrate @ 13975]
Gary Kramlich <grim@reaperworld.com>
parents:
11686
diff
changeset
|
2579 GAIM_STOCK_TYPING, |
11686 | 2580 GTK_ICON_SIZE_MENU); |
4757 | 2581 gtk_tooltips_set_tip(gtkconv->tooltips, gtkwin->menu.typing_icon, |
4736 | 2582 _("User is typing..."), NULL); |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2583 } else if(im && gaim_conv_im_get_typing_state(im) == GAIM_TYPED) { |
11689
9c0612901c3e
[gaim-migrate @ 13975]
Gary Kramlich <grim@reaperworld.com>
parents:
11686
diff
changeset
|
2584 gtk_image_set_from_stock(GTK_IMAGE(gtkwin->menu.typing_icon), |
9c0612901c3e
[gaim-migrate @ 13975]
Gary Kramlich <grim@reaperworld.com>
parents:
11686
diff
changeset
|
2585 GAIM_STOCK_TYPED, |
11686 | 2586 GTK_ICON_SIZE_MENU); |
4757 | 2587 gtk_tooltips_set_tip(gtkconv->tooltips, gtkwin->menu.typing_icon, |
4736 | 2588 _("User has typed something and paused"), NULL); |
11686 | 2589 } else { |
11689
9c0612901c3e
[gaim-migrate @ 13975]
Gary Kramlich <grim@reaperworld.com>
parents:
11686
diff
changeset
|
2590 gtk_image_set_from_stock(GTK_IMAGE(gtkwin->menu.typing_icon), |
9c0612901c3e
[gaim-migrate @ 13975]
Gary Kramlich <grim@reaperworld.com>
parents:
11686
diff
changeset
|
2591 GAIM_STOCK_MENU_ICON_BLANK, |
11686 | 2592 GTK_ICON_SIZE_MENU); |
2593 gtk_tooltips_set_tip(gtkconv->tooltips, gtkwin->menu.typing_icon, | |
2594 "", NULL); | |
4736 | 2595 } |
2596 } | |
2597 | |
4685 | 2598 static gboolean |
11594 | 2599 update_send_to_selection(GaimGtkWindow *win) |
4359 | 2600 { |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
2601 GaimAccount *account; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2602 GaimConversation *conv; |
4359 | 2603 GtkWidget *menu; |
2604 GList *child; | |
11594 | 2605 GaimBuddy *b; |
11581 | 2606 |
2607 conv = gaim_gtk_conv_window_get_active_conversation(win); | |
4359 | 2608 |
5860
52d5fad43950
[gaim-migrate @ 6291]
Christian Hammond <chipx86@chipx86.com>
parents:
5858
diff
changeset
|
2609 if (conv == NULL) |
52d5fad43950
[gaim-migrate @ 6291]
Christian Hammond <chipx86@chipx86.com>
parents:
5858
diff
changeset
|
2610 return FALSE; |
5678
619bca773b2e
[gaim-migrate @ 6096]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
2611 |
619bca773b2e
[gaim-migrate @ 6096]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
2612 account = gaim_conversation_get_account(conv); |
11581 | 2613 |
11594 | 2614 if (win->menu.send_to == NULL) |
4685 | 2615 return FALSE; |
4364
fa56829b9587
[gaim-migrate @ 4630]
Christian Hammond <chipx86@chipx86.com>
parents:
4363
diff
changeset
|
2616 |
11594 | 2617 if (!(b = gaim_find_buddy(account, conv->name))) |
2618 return FALSE; | |
2619 | |
2620 | |
2621 gtk_widget_show(win->menu.send_to); | |
4359 | 2622 |
2623 menu = gtk_menu_item_get_submenu( | |
11594 | 2624 GTK_MENU_ITEM(win->menu.send_to)); |
4359 | 2625 |
2626 for (child = gtk_container_get_children(GTK_CONTAINER(menu)); | |
2627 child != NULL; | |
2628 child = child->next) { | |
2629 | |
2630 GtkWidget *item = child->data; | |
11594 | 2631 GaimBuddy *item_buddy; |
2632 GaimAccount *item_account = g_object_get_data(G_OBJECT(item), "gaim_account"); | |
2633 gchar *buddy_name = g_object_get_data(G_OBJECT(item), | |
2634 "gaim_buddy_name"); | |
2635 item_buddy = gaim_find_buddy(item_account, buddy_name); | |
2636 | |
2637 if (b == item_buddy) { | |
4359 | 2638 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); |
2639 break; | |
2640 } | |
2641 } | |
6030
54c37db13279
[gaim-migrate @ 6480]
Christian Hammond <chipx86@chipx86.com>
parents:
6016
diff
changeset
|
2642 |
4685 | 2643 return FALSE; |
4359 | 2644 } |
2645 | |
2646 static void | |
11594 | 2647 create_sendto_item(GtkWidget *menu, GtkSizeGroup *sg, GSList **group, GaimBuddy *bud) |
2648 { | |
2649 GaimAccount *account; | |
2650 GtkWidget *box; | |
2651 GtkWidget *label; | |
2652 GtkWidget *image; | |
2653 GtkWidget *menuitem; | |
11625 | 2654 GdkPixbuf *pixbuf; |
11616 | 2655 gchar *text; |
11594 | 2656 |
2657 account = bud->account; | |
2658 | |
2659 /* Create a pixmap for the protocol icon. */ | |
11625 | 2660 pixbuf = gaim_gtk_blist_get_status_icon((GaimBlistNode*)bud, GAIM_STATUS_ICON_SMALL); |
11594 | 2661 /* Now convert it to GtkImage */ |
2662 if (pixbuf == NULL) | |
2663 image = gtk_image_new(); | |
2664 else | |
11625 | 2665 image = gtk_image_new_from_pixbuf(pixbuf); |
11594 | 2666 |
2667 gtk_size_group_add_widget(sg, image); | |
2668 | |
2669 g_object_unref(G_OBJECT(pixbuf)); | |
2670 | |
2671 /* Make our menu item */ | |
11616 | 2672 text = g_strdup_printf("%s (%s)", gaim_buddy_get_name(bud), gaim_account_get_username(bud->account)); |
2673 menuitem = gtk_radio_menu_item_new_with_label(*group, text); | |
2674 g_free(text); | |
11594 | 2675 *group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); |
2676 | |
2677 /* Do some evil, see some evil, speak some evil. */ | |
2678 box = gtk_hbox_new(FALSE, 0); | |
2679 | |
2680 label = gtk_bin_get_child(GTK_BIN(menuitem)); | |
2681 g_object_ref(label); | |
2682 gtk_container_remove(GTK_CONTAINER(menuitem), label); | |
2683 | |
2684 gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); | |
2685 gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 4); | |
2686 | |
2687 g_object_unref(label); | |
2688 | |
2689 gtk_container_add(GTK_CONTAINER(menuitem), box); | |
2690 | |
2691 gtk_widget_show(label); | |
2692 gtk_widget_show(image); | |
2693 gtk_widget_show(box); | |
2694 | |
2695 /* Set our data and callbacks. */ | |
2696 g_object_set_data(G_OBJECT(menuitem), "gaim_account", account); | |
2697 g_object_set_data_full(G_OBJECT(menuitem), "gaim_buddy_name", g_strdup(gaim_buddy_get_name(bud)), g_free); | |
2698 | |
2699 g_signal_connect(G_OBJECT(menuitem), "activate", | |
2700 G_CALLBACK(menu_conv_sel_send_cb), NULL); | |
2701 | |
2702 gtk_widget_show(menuitem); | |
2703 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | |
2704 } | |
2705 | |
2706 static void | |
2707 generate_send_to_items(GaimGtkWindow *win) | |
11581 | 2708 { |
4359 | 2709 GtkWidget *menu; |
2710 GSList *group = NULL; | |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2711 GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
11594 | 2712 GaimGtkConversation *gtkconv; |
2713 GSList *l, *buds; | |
2714 | |
2715 g_return_if_fail(win != NULL); | |
2716 | |
2717 gtkconv = gaim_gtk_conv_window_get_active_gtkconv(win); | |
2718 | |
11604 | 2719 g_return_if_fail(gtkconv != NULL); |
2720 | |
11594 | 2721 if (win->menu.send_to != NULL) |
2722 gtk_widget_destroy(win->menu.send_to); | |
2723 | |
4359 | 2724 |
2725 /* Build the Send As menu */ | |
11594 | 2726 win->menu.send_to = gtk_menu_item_new_with_mnemonic(_("_Send To")); |
2727 gtk_widget_show(win->menu.send_to); | |
4359 | 2728 |
2729 menu = gtk_menu_new(); | |
11581 | 2730 gtk_menu_shell_insert(GTK_MENU_SHELL(win->menu.menubar), |
11594 | 2731 win->menu.send_to, 2); |
2732 gtk_menu_item_set_submenu(GTK_MENU_ITEM(win->menu.send_to), menu); | |
4359 | 2733 |
2734 gtk_widget_show(menu); | |
2735 | |
11604 | 2736 if (gtkconv->active_conv->type == GAIM_CONV_TYPE_IM) { |
2737 buds = gaim_find_buddies(gtkconv->active_conv->account, gtkconv->active_conv->name); | |
2738 for (l = buds; l != NULL; l = l->next) { | |
2739 GaimBuddy *b; | |
2740 GaimBlistNode *node; | |
2741 | |
2742 b = l->data; | |
2743 node = (GaimBlistNode *) gaim_buddy_get_contact(b); | |
2744 | |
2745 for (node = node->child; node != NULL; node = node->next) | |
2746 if (GAIM_BLIST_NODE_IS_BUDDY(node) && gaim_account_is_connected(((GaimBuddy *)node)->account)) | |
2747 create_sendto_item(menu, sg, &group, (GaimBuddy *) node); | |
2748 } | |
2749 | |
2750 g_slist_free(buds); | |
4359 | 2751 } |
2752 | |
4669
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2753 g_object_unref(sg); |
d715736164ae
[gaim-migrate @ 4980]
Christian Hammond <chipx86@chipx86.com>
parents:
4668
diff
changeset
|
2754 |
11594 | 2755 gtk_widget_show(win->menu.send_to); |
2756 if (!group) | |
2757 gtk_widget_set_sensitive(win->menu.send_to, FALSE); | |
2758 update_send_to_selection(win); | |
4359 | 2759 } |
2760 | |
2761 static GList * | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
2762 generate_invite_user_names(GaimConnection *gc) |
4359 | 2763 { |
6695 | 2764 GaimBlistNode *gnode,*cnode,*bnode; |
4359 | 2765 static GList *tmp = NULL; |
2766 | |
2767 if (tmp) | |
2768 g_list_free(tmp); | |
2769 | |
2770 tmp = g_list_append(NULL, ""); | |
2771 | |
2772 if (gc != NULL) { | |
4785 | 2773 for(gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { |
2774 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
2775 continue; | |
6695 | 2776 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
2777 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
4785 | 2778 continue; |
6695 | 2779 for(bnode = cnode->child; bnode; bnode = bnode->next) { |
2780 GaimBuddy *buddy; | |
2781 | |
2782 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
2783 continue; | |
2784 | |
2785 buddy = (GaimBuddy *)bnode; | |
2786 | |
2787 if (buddy->account == gc->account && | |
2788 GAIM_BUDDY_IS_ONLINE(buddy)) | |
10572 | 2789 tmp = g_list_insert_sorted(tmp, buddy->name, |
2790 (GCompareFunc)g_utf8_collate); | |
6695 | 2791 } |
4359 | 2792 } |
2793 } | |
2794 } | |
2795 | |
2796 return tmp; | |
2797 } | |
2798 | |
9498 | 2799 static GdkPixbuf * |
9554 | 2800 get_chat_buddy_status_icon(GaimConvChat *chat, const char *name, GaimConvChatBuddyFlags flags) |
9498 | 2801 { |
9554 | 2802 GdkPixbuf *pixbuf, *scale, *scale2; |
9498 | 2803 char *filename; |
10274 | 2804 const char *image = NULL; |
9554 | 2805 |
2806 if (flags & GAIM_CBFLAGS_FOUNDER) { | |
10274 | 2807 image = "founder.png"; |
9554 | 2808 } else if (flags & GAIM_CBFLAGS_OP) { |
10274 | 2809 image = "op.png"; |
9554 | 2810 } else if (flags & GAIM_CBFLAGS_HALFOP) { |
10274 | 2811 image = "halfop.png"; |
9554 | 2812 } else if (flags & GAIM_CBFLAGS_VOICE) { |
10274 | 2813 image = "voice.png"; |
9554 | 2814 } else if ((!flags) && gaim_conv_chat_is_user_ignored(chat, name)) { |
10274 | 2815 image = "ignored.png"; |
2816 } else { | |
2817 return NULL; | |
9554 | 2818 } |
10274 | 2819 |
2820 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
2821 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); | |
2822 g_free(filename); | |
2823 | |
2824 if (!pixbuf) | |
2825 return NULL; | |
2826 | |
2827 scale = gdk_pixbuf_scale_simple(pixbuf, 15, 15, GDK_INTERP_BILINEAR); | |
2828 g_object_unref(pixbuf); | |
2829 | |
2830 if (flags && gaim_conv_chat_is_user_ignored(chat, name)) { | |
2831 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "ignored.png", NULL); | |
9498 | 2832 pixbuf = gdk_pixbuf_new_from_file(filename, NULL); |
2833 g_free(filename); | |
10274 | 2834 scale2 = gdk_pixbuf_scale_simple(pixbuf, 15, 15, GDK_INTERP_BILINEAR); |
9498 | 2835 g_object_unref(pixbuf); |
10274 | 2836 gdk_pixbuf_composite(scale2, scale, 0, 0, 15, 15, 0, 0, 1, 1, GDK_INTERP_BILINEAR, 192); |
2837 g_object_unref(scale2); | |
9498 | 2838 } |
2839 | |
10274 | 2840 return scale; |
9498 | 2841 } |
2842 | |
4359 | 2843 static void |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
2844 add_chat_buddy_common(GaimConversation *conv, const char *name, const char *alias, const char *old_name) |
4359 | 2845 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2846 GaimGtkConversation *gtkconv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2847 GaimGtkChatPane *gtkchat; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2848 GaimConvChat *chat; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2849 GaimConnection *gc; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2850 GaimPluginProtocolInfo *prpl_info; |
9554 | 2851 GaimConvChatBuddyFlags flags; |
4359 | 2852 GtkListStore *ls; |
9498 | 2853 GdkPixbuf *pixbuf; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2854 GtkTreeIter iter; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2855 gboolean is_me = FALSE; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2856 gboolean is_buddy; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2857 GdkColor send_color; |
11508 | 2858 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2859 gdk_color_parse(SEND_COLOR, &send_color); |
4359 | 2860 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
2861 chat = GAIM_CONV_CHAT(conv); |
4359 | 2862 gtkconv = GAIM_GTK_CONVERSATION(conv); |
2863 gtkchat = gtkconv->u.chat; | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2864 gc = gaim_conversation_get_gc(conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2865 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2866 if (!gc || !(prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl))) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2867 return; |
4359 | 2868 |
2869 ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list))); | |
2870 | |
9554 | 2871 flags = gaim_conv_chat_user_get_flags(chat, name); |
2872 pixbuf = get_chat_buddy_status_icon(chat, name, flags); | |
9498 | 2873 |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
2874 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
|
2875 is_me = TRUE; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2876 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2877 is_buddy = (gaim_find_buddy(conv->account, name) != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2878 |
4359 | 2879 gtk_list_store_append(ls, &iter); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2880 gtk_list_store_set(ls, &iter, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2881 CHAT_USERS_ICON_COLUMN, pixbuf, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2882 CHAT_USERS_ALIAS_COLUMN, alias, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2883 CHAT_USERS_NAME_COLUMN, name, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2884 CHAT_USERS_FLAGS_COLUMN, flags, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2885 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
|
2886 CHAT_USERS_BUDDY_COLUMN, is_buddy, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2887 -1); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2888 |
9554 | 2889 if (pixbuf) |
2890 g_object_unref(pixbuf); | |
4359 | 2891 } |
2892 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2893 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2894 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
|
2895 GList **matches, gboolean command, char *name) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2896 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2897 strncpy(nick_partial, name, strlen(entered)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2898 nick_partial[strlen(entered)] = '\0'; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2899 if (gaim_utf8_strcasecmp(nick_partial, entered)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2900 return; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2901 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2902 /* if we're here, it's a possible completion */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2903 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2904 if (*most_matched == -1) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2905 /* |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2906 * this will only get called once, since from now |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2907 * on *most_matched is >= 0 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2908 */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2909 *most_matched = strlen(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2910 *partial = g_strdup(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2911 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2912 else if (*most_matched) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2913 char *tmp = g_strdup(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2914 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2915 while (gaim_utf8_strcasecmp(tmp, *partial)) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2916 (*partial)[*most_matched] = '\0'; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2917 if (*most_matched < strlen(tmp)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2918 tmp[*most_matched] = '\0'; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2919 (*most_matched)--; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2920 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2921 (*most_matched)++; |
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 g_free(tmp); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2924 } |
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 *matches = g_list_insert_sorted(*matches, g_strdup(name), |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2927 (GCompareFunc)gaim_utf8_strcasecmp); |
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 |
9605 | 2930 static gboolean |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2931 tab_complete(GaimConversation *conv) |
4359 | 2932 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
2933 GaimGtkConversation *gtkconv; |
4359 | 2934 GtkTextIter cursor, word_start, start_buffer; |
2935 int start; | |
2936 int most_matched = -1; | |
2937 char *entered, *partial = NULL; | |
2938 char *text; | |
8021 | 2939 char *nick_partial; |
9605 | 2940 const char *prefix; |
4359 | 2941 GList *matches = NULL; |
9605 | 2942 gboolean command = FALSE; |
4359 | 2943 |
2944 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2945 | |
2946 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, &start_buffer); | |
2947 gtk_text_buffer_get_iter_at_mark(gtkconv->entry_buffer, &cursor, | |
2948 gtk_text_buffer_get_insert(gtkconv->entry_buffer)); | |
2949 | |
2950 word_start = cursor; | |
2951 | |
2952 /* if there's nothing there just return */ | |
2953 if (!gtk_text_iter_compare(&cursor, &start_buffer)) | |
11338 | 2954 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
|
2955 |
4359 | 2956 text = gtk_text_buffer_get_text(gtkconv->entry_buffer, &start_buffer, |
2957 &cursor, FALSE); | |
2958 | |
2959 /* if we're at the end of ": " we need to move back 2 spaces */ | |
2960 start = strlen(text) - 1; | |
2961 | |
8021 | 2962 if (strlen(text) >= 2 && !strncmp(&text[start-1], ": ", 2)) { |
4359 | 2963 gtk_text_iter_backward_chars(&word_start, 2); |
8021 | 2964 start-=2; |
2965 } | |
4359 | 2966 |
2967 /* find the start of the word that we're tabbing */ | |
2968 while (start >= 0 && text[start] != ' ') { | |
2969 gtk_text_iter_backward_char(&word_start); | |
2970 start--; | |
2971 } | |
2972 | |
9605 | 2973 prefix = gaim_gtk_get_cmd_prefix(); |
2974 if (start == -1 && (strlen(text) >= strlen(prefix)) && !strncmp(text, prefix, strlen(prefix))) { | |
2975 command = TRUE; | |
2976 gtk_text_iter_forward_chars(&word_start, strlen(prefix)); | |
2977 } | |
2978 | |
4359 | 2979 g_free(text); |
2980 | |
2981 entered = gtk_text_buffer_get_text(gtkconv->entry_buffer, &word_start, | |
2982 &cursor, FALSE); | |
2983 | |
8021 | 2984 if (!g_utf8_strlen(entered, -1)) { |
4359 | 2985 g_free(entered); |
11338 | 2986 return (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) ? TRUE : FALSE; |
4359 | 2987 } |
2988 | |
8021 | 2989 nick_partial = g_malloc(strlen(entered)+1); |
2990 | |
9605 | 2991 if (command) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2992 GList *list = gaim_cmd_list(conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2993 GList *l; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2994 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2995 /* Commands */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2996 for (l = list; l != NULL; l = l->next) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2997 tab_complete_process_item(&most_matched, entered, &partial, nick_partial, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2998 &matches, TRUE, l->data); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
2999 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3000 g_list_free(list); |
11338 | 3001 } 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
|
3002 GaimConvChat *chat = GAIM_CONV_CHAT(conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3003 GList *l = gaim_conv_chat_get_users(chat); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3004 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
|
3005 GtkTreeIter iter; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3006 int f; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3007 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3008 /* Users */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3009 for (; l != NULL; l = l->next) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3010 tab_complete_process_item(&most_matched, entered, &partial, nick_partial, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3011 &matches, TRUE, ((GaimConvChatBuddy *)l->data)->name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3012 } |
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 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3015 /* Aliases */ |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3016 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
|
3017 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3018 do { |
11460
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3019 char *name; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3020 char *alias; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3021 |
11460
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3022 gtk_tree_model_get(model, &iter, |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3023 CHAT_USERS_NAME_COLUMN, &name, |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3024 CHAT_USERS_ALIAS_COLUMN, &alias, |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3025 -1); |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3026 |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3027 if (strcmp(name, alias)) |
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3028 tab_complete_process_item(&most_matched, entered, &partial, nick_partial, |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3029 &matches, FALSE, alias); |
11460
d68ca756e983
[gaim-migrate @ 13699]
Richard Laager <rlaager@wiktel.com>
parents:
11454
diff
changeset
|
3030 g_free(name); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3031 g_free(alias); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3032 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3033 f = gtk_tree_model_iter_next(model, &iter); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3034 } while (f != 0); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3035 } |
9605 | 3036 } else { |
3037 g_free(nick_partial); | |
3038 g_free(entered); | |
3039 return FALSE; | |
3040 } | |
3041 | |
8021 | 3042 g_free(nick_partial); |
3043 | |
4359 | 3044 /* we're only here if we're doing new style */ |
3045 | |
3046 /* if there weren't any matches, return */ | |
3047 if (!matches) { | |
3048 /* if matches isn't set partials won't be either */ | |
3049 g_free(entered); | |
11338 | 3050 return (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) ? TRUE : FALSE; |
4359 | 3051 } |
3052 | |
3053 gtk_text_buffer_delete(gtkconv->entry_buffer, &word_start, &cursor); | |
3054 | |
3055 if (!matches->next) { | |
3056 /* there was only one match. fill it in. */ | |
3057 gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, &start_buffer); | |
3058 gtk_text_buffer_get_iter_at_mark(gtkconv->entry_buffer, &cursor, | |
3059 gtk_text_buffer_get_insert(gtkconv->entry_buffer)); | |
3060 | |
3061 if (!gtk_text_iter_compare(&cursor, &start_buffer)) { | |
3062 char *tmp = g_strdup_printf("%s: ", (char *)matches->data); | |
3063 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, tmp, -1); | |
3064 g_free(tmp); | |
3065 } | |
3066 else | |
3067 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, | |
3068 matches->data, -1); | |
3069 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3070 g_free(matches->data); |
4359 | 3071 matches = g_list_remove(matches, matches->data); |
3072 } | |
3073 else { | |
3074 /* | |
3075 * there were lots of matches, fill in as much as possible | |
3076 * and display all of them | |
3077 */ | |
3078 char *addthis = g_malloc0(1); | |
3079 | |
3080 while (matches) { | |
3081 char *tmp = addthis; | |
3082 addthis = g_strconcat(tmp, matches->data, " ", NULL); | |
3083 g_free(tmp); | |
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 | |
6982 | 3088 gaim_conversation_write(conv, NULL, addthis, GAIM_MESSAGE_NO_LOG, |
4359 | 3089 time(NULL)); |
3090 gtk_text_buffer_insert_at_cursor(gtkconv->entry_buffer, partial, -1); | |
3091 g_free(addthis); | |
3092 } | |
3093 | |
3094 g_free(entered); | |
3095 g_free(partial); | |
9605 | 3096 |
3097 return TRUE; | |
4359 | 3098 } |
3099 | |
10810 | 3100 static void topic_callback(GtkWidget *w, GaimGtkConversation *gtkconv) |
7971 | 3101 { |
3102 GaimPluginProtocolInfo *prpl_info = NULL; | |
3103 GaimConnection *gc; | |
10810 | 3104 GaimConversation *conv = gtkconv->active_conv; |
7971 | 3105 GaimGtkChatPane *gtkchat; |
11261
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3106 char *new_topic; |
8858 | 3107 const char *current_topic; |
7971 | 3108 |
3109 gc = gaim_conversation_get_gc(conv); | |
3110 | |
3111 if(!gc || !(prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl))) | |
3112 return; | |
3113 | |
3114 if(prpl_info->set_chat_topic == NULL) | |
3115 return; | |
3116 | |
3117 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
3118 gtkchat = gtkconv->u.chat; | |
11261
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3119 new_topic = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtkchat->topic_text))); |
8858 | 3120 current_topic = gaim_conv_chat_get_topic(GAIM_CONV_CHAT(conv)); |
3121 | |
11261
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3122 if(current_topic && !g_utf8_collate(new_topic, current_topic)){ |
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3123 g_free(new_topic); |
7971 | 3124 return; |
11261
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3125 } |
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3126 |
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3127 gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), current_topic); |
7971 | 3128 |
8858 | 3129 prpl_info->set_chat_topic(gc, gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)), |
3130 new_topic); | |
11261
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3131 |
b53606580f68
[gaim-migrate @ 13439]
Richard Laager <rlaager@wiktel.com>
parents:
11257
diff
changeset
|
3132 g_free(new_topic); |
7971 | 3133 } |
3134 | |
9554 | 3135 static gint |
3136 sort_chat_users(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata) | |
3137 { | |
3138 GaimConvChatBuddyFlags f1 = 0, f2 = 0; | |
3139 char *user1 = NULL, *user2 = NULL; | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3140 gboolean buddy1 = FALSE, buddy2 = FALSE; |
9554 | 3141 gint ret = 0; |
3142 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3143 gtk_tree_model_get(model, a, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3144 CHAT_USERS_ALIAS_COLUMN, &user1, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3145 CHAT_USERS_FLAGS_COLUMN, &f1, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3146 CHAT_USERS_BUDDY_COLUMN, &buddy1, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3147 -1); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3148 gtk_tree_model_get(model, b, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3149 CHAT_USERS_ALIAS_COLUMN, &user2, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3150 CHAT_USERS_FLAGS_COLUMN, &f2, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3151 CHAT_USERS_BUDDY_COLUMN, &buddy2, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3152 -1); |
9554 | 3153 |
3154 if (user1 == NULL || user2 == NULL) { | |
3155 if (!(user1 == NULL && user2 == NULL)) | |
3156 ret = (user1 == NULL) ? -1: 1; | |
3157 } else if (f1 != f2) { | |
3158 /* sort more important users first */ | |
3159 ret = (f1 > f2) ? -1 : 1; | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3160 } else if (buddy1 != buddy2) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3161 ret = buddy1 ? -1 : 1; |
9554 | 3162 } else { |
10904 | 3163 ret = gaim_utf8_strcasecmp(user1, user2); |
9554 | 3164 } |
3165 | |
3166 g_free(user1); | |
3167 g_free(user2); | |
3168 | |
3169 return ret; | |
3170 } | |
3171 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3172 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3173 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
|
3174 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3175 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
3176 GaimConvChat *chat = GAIM_CONV_CHAT(conv); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3177 GtkTreeModel *model; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3178 char *normalized_name; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3179 GtkTreeIter iter; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3180 int f; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3181 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3182 g_return_if_fail(buddy != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3183 g_return_if_fail(conv != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3184 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3185 /* 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
|
3186 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
|
3187 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3188 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
|
3189 return; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3190 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3191 normalized_name = g_strdup(gaim_normalize(conv->account, buddy->name)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3192 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3193 do { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3194 char *name; |
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 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
|
3197 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3198 if (!strcmp(normalized_name, gaim_normalize(conv->account, name))) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3199 const char *alias = name; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3200 GaimBuddy *buddy2; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3201 |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
3202 if (strcmp(chat->nick, gaim_normalize(conv->account, name))) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3203 /* This user is not me, so look into updating the alias. */ |
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 if ((buddy2 = gaim_find_buddy(conv->account, name)) != NULL) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3206 alias = gaim_buddy_get_contact_alias(buddy2); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3207 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3208 gtk_list_store_set(GTK_LIST_STORE(model), &iter, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3209 CHAT_USERS_ALIAS_COLUMN, alias, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3210 CHAT_USERS_COLOR_COLUMN, get_nick_color(gtkconv, alias), |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3211 -1); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3212 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3213 g_free(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3214 break; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3215 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3216 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3217 f = gtk_tree_model_iter_next(model, &iter); |
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 g_free(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3220 } while (f != 0); |
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 g_free(normalized_name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3223 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3224 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3225 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3226 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
|
3227 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3228 GaimConnection *gc; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3229 GaimPluginProtocolInfo *prpl_info; |
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 g_return_if_fail(node != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3232 g_return_if_fail(conv != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3233 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3234 gc = gaim_conversation_get_gc(conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3235 g_return_if_fail(gc != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3236 g_return_if_fail(gc->prpl != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3237 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
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 if (prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3240 return; |
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 if (GAIM_BLIST_NODE_IS_CONTACT(node)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3243 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3244 GaimBlistNode *bnode; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3245 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3246 for(bnode = node->child; bnode; bnode = bnode->next) { |
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 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3249 continue; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3250 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3251 update_chat_alias((GaimBuddy *)bnode, conv, gc, prpl_info); |
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 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3254 else if (GAIM_BLIST_NODE_IS_BUDDY(node)) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3255 update_chat_alias((GaimBuddy *)node, conv, gc, prpl_info); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3256 } |
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 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3259 buddy_cb_common(GaimBuddy *buddy, GaimConversation *conv, gboolean is_buddy) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3260 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3261 GtkTreeModel *model; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3262 char *normalized_name; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3263 GtkTreeIter iter; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3264 int f; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3265 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3266 g_return_if_fail(buddy != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3267 g_return_if_fail(conv != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3268 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3269 /* 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
|
3270 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
|
3271 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3272 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
|
3273 return; |
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 normalized_name = g_strdup(gaim_normalize(conv->account, buddy->name)); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3276 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3277 do { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3278 char *name; |
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 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
|
3281 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3282 if (!strcmp(normalized_name, gaim_normalize(conv->account, name))) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3283 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
|
3284 g_free(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3285 break; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3286 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3287 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3288 f = gtk_tree_model_iter_next(model, &iter); |
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 g_free(name); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3291 } while (f != 0); |
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 g_free(normalized_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 blist_node_aliased_cb((GaimBlistNode *)buddy, NULL, conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3296 } |
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 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3299 buddy_added_cb(GaimBuddy *buddy, GaimConversation *conv) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3300 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3301 buddy_cb_common(buddy, conv, TRUE); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3302 } |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3303 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3304 static void |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3305 buddy_removed_cb(GaimBuddy *buddy, GaimConversation *conv) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3306 { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3307 /* 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
|
3308 if (gaim_find_buddy(buddy->account, buddy->name) != NULL) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3309 return; |
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 buddy_cb_common(buddy, conv, FALSE); |
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 |
4359 | 3314 static GtkWidget * |
10810 | 3315 setup_chat_pane(GaimGtkConversation *gtkconv) |
4359 | 3316 { |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5204
diff
changeset
|
3317 GaimPluginProtocolInfo *prpl_info = NULL; |
10810 | 3318 GaimConversation *conv = gtkconv->active_conv; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3319 GaimGtkChatPane *gtkchat; |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
3320 GaimConnection *gc; |
4359 | 3321 GtkWidget *vpaned, *hpaned; |
10175 | 3322 GtkWidget *vbox, *hbox, *frame; |
4359 | 3323 GtkWidget *lbox, *bbox; |
3324 GtkWidget *label; | |
3325 GtkWidget *list; | |
3326 GtkWidget *button; | |
7949 | 3327 GtkWidget *sw; |
4359 | 3328 GtkListStore *ls; |
3329 GtkCellRenderer *rend; | |
3330 GtkTreeViewColumn *col; | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3331 void *blist_handle = gaim_blist_get_handle(); |
9080 | 3332 GList *focus_chain = NULL; |
4359 | 3333 |
3334 gtkchat = gtkconv->u.chat; | |
3335 gc = gaim_conversation_get_gc(conv); | |
3336 | |
3337 /* Setup the outer pane. */ | |
3338 vpaned = gtk_vpaned_new(); | |
3339 gtk_widget_show(vpaned); | |
3340 | |
3341 /* Setup the top part of the pane. */ | |
11243 | 3342 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
8914 | 3343 gtk_paned_pack1(GTK_PANED(vpaned), vbox, TRUE, TRUE); |
4359 | 3344 gtk_widget_show(vbox); |
3345 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5204
diff
changeset
|
3346 if (gc != NULL) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5204
diff
changeset
|
3347 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5204
diff
changeset
|
3348 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5204
diff
changeset
|
3349 if (prpl_info->options & OPT_PROTO_CHAT_TOPIC) |
4359 | 3350 { |
11243 | 3351 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
8253
0c5977fd3101
[gaim-migrate @ 8976]
Christian Hammond <chipx86@chipx86.com>
parents:
8252
diff
changeset
|
3352 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
4359 | 3353 gtk_widget_show(hbox); |
3354 | |
3355 label = gtk_label_new(_("Topic:")); | |
8253
0c5977fd3101
[gaim-migrate @ 8976]
Christian Hammond <chipx86@chipx86.com>
parents:
8252
diff
changeset
|
3356 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
4359 | 3357 gtk_widget_show(label); |
3358 | |
3359 gtkchat->topic_text = gtk_entry_new(); | |
8253
0c5977fd3101
[gaim-migrate @ 8976]
Christian Hammond <chipx86@chipx86.com>
parents:
8252
diff
changeset
|
3360 |
7971 | 3361 if(prpl_info->set_chat_topic == NULL) { |
3362 gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE); | |
3363 } else { | |
3364 g_signal_connect(GTK_OBJECT(gtkchat->topic_text), "activate", | |
10810 | 3365 G_CALLBACK(topic_callback), gtkconv); |
7971 | 3366 } |
3367 | |
8253
0c5977fd3101
[gaim-migrate @ 8976]
Christian Hammond <chipx86@chipx86.com>
parents:
8252
diff
changeset
|
3368 gtk_box_pack_start(GTK_BOX(hbox), gtkchat->topic_text, TRUE, TRUE, 0); |
4359 | 3369 gtk_widget_show(gtkchat->topic_text); |
3370 } | |
3371 | |
3372 /* Setup the horizontal pane. */ | |
3373 hpaned = gtk_hpaned_new(); | |
8253
0c5977fd3101
[gaim-migrate @ 8976]
Christian Hammond <chipx86@chipx86.com>
parents:
8252
diff
changeset
|
3374 gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0); |
4359 | 3375 gtk_widget_show(hpaned); |
3376 | |
10175 | 3377 /* Setup gtkihmtml. */ |
3378 frame = gaim_gtk_create_imhtml(FALSE, >kconv->imhtml, NULL); | |
3379 gtk_widget_set_name(gtkconv->imhtml, "gaim_gtkconv_imhtml"); | |
10389 | 3380 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), TRUE); |
10175 | 3381 gtk_paned_pack1(GTK_PANED(hpaned), frame, TRUE, TRUE); |
3382 gtk_widget_show(frame); | |
3383 | |
3384 gtk_widget_set_size_request(gtkconv->imhtml, | |
5550
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5546
diff
changeset
|
3385 gaim_prefs_get_int("/gaim/gtk/conversations/chat/default_width"), |
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5546
diff
changeset
|
3386 gaim_prefs_get_int("/gaim/gtk/conversations/chat/default_height")); |
10175 | 3387 g_signal_connect(G_OBJECT(gtkconv->imhtml), "size-allocate", |
10810 | 3388 G_CALLBACK(size_allocate_cb), gtkconv); |
8914 | 3389 |
4359 | 3390 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event", |
3391 G_CALLBACK(entry_stop_rclick_cb), NULL); | |
8105 | 3392 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_press_event", |
6057 | 3393 G_CALLBACK(refocus_entry_cb), gtkconv); |
8109 | 3394 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_release_event", |
3395 G_CALLBACK(refocus_entry_cb), gtkconv); | |
4359 | 3396 |
3397 /* Build the right pane. */ | |
11243 | 3398 lbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
4409
0521eec12c33
[gaim-migrate @ 4682]
Christian Hammond <chipx86@chipx86.com>
parents:
4398
diff
changeset
|
3399 gtk_paned_pack2(GTK_PANED(hpaned), lbox, FALSE, TRUE); |
4359 | 3400 gtk_widget_show(lbox); |
3401 | |
3402 /* Setup the label telling how many people are in the room. */ | |
3403 gtkchat->count = gtk_label_new(_("0 people in room")); | |
3404 gtk_box_pack_start(GTK_BOX(lbox), gtkchat->count, FALSE, FALSE, 0); | |
3405 gtk_widget_show(gtkchat->count); | |
3406 | |
3407 /* Setup the list of users. */ | |
7949 | 3408 sw = gtk_scrolled_window_new(NULL, NULL); |
3409 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
8076 | 3410 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
7949 | 3411 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); |
3412 gtk_box_pack_start(GTK_BOX(lbox), sw, TRUE, TRUE, 0); | |
3413 gtk_widget_show(sw); | |
4359 | 3414 |
9554 | 3415 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
|
3416 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
|
3417 gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_COLUMN, |
9554 | 3418 sort_chat_users, NULL, NULL); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3419 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_COLUMN, |
4359 | 3420 GTK_SORT_ASCENDING); |
3421 | |
3422 list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls)); | |
3423 | |
9498 | 3424 rend = gtk_cell_renderer_pixbuf_new(); |
3425 | |
4359 | 3426 col = gtk_tree_view_column_new_with_attributes(NULL, rend, |
9498 | 3427 "pixbuf", CHAT_USERS_ICON_COLUMN, NULL); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3428 gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_AUTOSIZE); |
9498 | 3429 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); |
4359 | 3430 |
3431 g_signal_connect(G_OBJECT(list), "button_press_event", | |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
3432 G_CALLBACK(right_click_chat_cb), gtkconv); |
8143 | 3433 g_signal_connect(G_OBJECT(list), "popup-menu", |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
3434 G_CALLBACK(gtkconv_chat_popup_menu_cb), gtkconv); |
4359 | 3435 |
9498 | 3436 rend = gtk_cell_renderer_text_new(); |
3437 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3438 g_object_set(rend, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3439 "foreground-set", TRUE, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3440 "weight", PANGO_WEIGHT_BOLD, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3441 NULL); |
4359 | 3442 col = gtk_tree_view_column_new_with_attributes(NULL, rend, |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3443 "text", CHAT_USERS_ALIAS_COLUMN, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3444 "foreground-gdk", CHAT_USERS_COLOR_COLUMN, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3445 "weight-set", CHAT_USERS_BUDDY_COLUMN, |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3446 NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3447 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3448 gaim_signal_connect(blist_handle, "buddy-added", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3449 gtkchat, GAIM_CALLBACK(buddy_added_cb), conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3450 gaim_signal_connect(blist_handle, "buddy-removed", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3451 gtkchat, GAIM_CALLBACK(buddy_removed_cb), conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3452 gaim_signal_connect(blist_handle, "blist-node-aliased", |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3453 gtkchat, GAIM_CALLBACK(blist_node_aliased_cb), conv); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3454 |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3455 #if GTK_CHECK_VERSION(2,6,0) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3456 gtk_tree_view_column_set_expand(col, TRUE); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3457 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
3458 #endif |
4359 | 3459 |
3460 gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); | |
3461 | |
3462 gtk_widget_set_size_request(list, 150, -1); | |
3463 | |
3464 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE); | |
3465 gtk_widget_show(list); | |
3466 | |
3467 gtkchat->list = list; | |
3468 | |
7949 | 3469 gtk_container_add(GTK_CONTAINER(sw), list); |
4359 | 3470 |
3471 /* Setup the user list toolbar. */ | |
11243 | 3472 bbox = gtk_hbox_new(TRUE, GAIM_HIG_BOX_SPACE); |
4359 | 3473 gtk_box_pack_start(GTK_BOX(lbox), bbox, FALSE, FALSE, 0); |
3474 gtk_widget_show(bbox); | |
3475 | |
3476 /* IM */ | |
10221 | 3477 button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_IM, |
4359 | 3478 GAIM_BUTTON_VERTICAL); |
10500 | 3479 gtkchat->userlist_im = button; |
4359 | 3480 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
3481 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
|
3482 gtk_tooltips_set_tip(gtkconv->tooltips, button, _("IM the user"), NULL); |
4359 | 3483 g_signal_connect(G_OBJECT(button), "clicked", |
10810 | 3484 G_CALLBACK(chat_im_button_cb), gtkconv); |
4359 | 3485 |
3486 gtk_widget_show(button); | |
3487 | |
3488 /* Ignore */ | |
3489 button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_IGNORE, | |
3490 GAIM_BUTTON_VERTICAL); | |
10500 | 3491 gtkchat->userlist_ignore = button; |
4359 | 3492 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
3493 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
|
3494 gtk_tooltips_set_tip(gtkconv->tooltips, button, |
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
3495 _("Ignore the user"), NULL); |
4359 | 3496 g_signal_connect(G_OBJECT(button), "clicked", |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
3497 G_CALLBACK(ignore_cb), gtkconv); |
4359 | 3498 gtk_widget_show(button); |
3499 | |
3500 /* Info */ | |
3501 button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_INFO, | |
3502 GAIM_BUTTON_VERTICAL); | |
10500 | 3503 gtkchat->userlist_info = button; |
4359 | 3504 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
3505 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
3506 gtk_tooltips_set_tip(gtkconv->tooltips, button, | |
4370
d856987c72ca
[gaim-migrate @ 4636]
Christian Hammond <chipx86@chipx86.com>
parents:
4369
diff
changeset
|
3507 _("Get the user's information"), NULL); |
4359 | 3508 g_signal_connect(G_OBJECT(button), "clicked", |
10810 | 3509 G_CALLBACK(info_cb), gtkconv); |
4359 | 3510 |
3511 gtk_widget_show(button); | |
3512 | |
10175 | 3513 /* Setup the bottom half of the conversation window */ |
11243 | 3514 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
8914 | 3515 gtk_paned_pack2(GTK_PANED(vpaned), vbox, FALSE, TRUE); |
4963
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3516 gtk_widget_show(vbox); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3517 |
11243 | 3518 gtkconv->lower_hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
9332 | 3519 gtk_box_pack_start(GTK_BOX(vbox), gtkconv->lower_hbox, TRUE, TRUE, 0); |
3520 gtk_widget_show(gtkconv->lower_hbox); | |
3521 | |
11243 | 3522 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
9332 | 3523 gtk_box_pack_end(GTK_BOX(gtkconv->lower_hbox), vbox, TRUE, TRUE, 0); |
3524 gtk_widget_show(vbox); | |
3525 | |
10175 | 3526 /* Setup the toolbar, entry widget and all signals */ |
3527 frame = gaim_gtk_create_imhtml(TRUE, >kconv->entry, >kconv->toolbar); | |
10080 | 3528 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
10175 | 3529 gtk_widget_show(frame); |
3530 | |
9005 | 3531 gtk_widget_set_name(gtkconv->entry, "gaim_gtkconv_entry"); |
8456 | 3532 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry), |
9699 | 3533 gaim_account_get_protocol_name(conv->account)); |
10175 | 3534 gtk_widget_set_size_request(gtkconv->entry, -1, |
3535 gaim_prefs_get_int("/gaim/gtk/conversations/chat/entry_height")); | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
3536 gtkconv->entry_buffer = |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
3537 gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); |
10810 | 3538 g_object_set_data(G_OBJECT(gtkconv->entry_buffer), "user_data", gtkconv); |
7949 | 3539 |
3540 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", | |
10810 | 3541 G_CALLBACK(entry_key_press_cb), gtkconv); |
10115 | 3542 g_signal_connect(G_OBJECT(gtkconv->entry), "message_send", |
10810 | 3543 G_CALLBACK(send_cb), gtkconv); |
4359 | 3544 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", |
10810 | 3545 G_CALLBACK(entry_stop_rclick_cb), NULL); |
8914 | 3546 g_signal_connect(G_OBJECT(gtkconv->entry), "size-allocate", |
10810 | 3547 G_CALLBACK(size_allocate_cb), gtkconv); |
3548 | |
3549 default_formatize(gtkconv); | |
4359 | 3550 |
9080 | 3551 /* |
3552 * Focus for chat windows should be as follows: | |
3553 * Tab title -> chat topic -> conversation scrollback -> user list -> | |
3554 * user list buttons -> entry -> buttons at bottom | |
3555 */ | |
9332 | 3556 focus_chain = g_list_prepend(focus_chain, gtkconv->entry); |
9080 | 3557 gtk_container_set_focus_chain(GTK_CONTAINER(vbox), focus_chain); |
3558 | |
4359 | 3559 return vpaned; |
3560 } | |
3561 | |
3562 static GtkWidget * | |
10810 | 3563 setup_im_pane(GaimGtkConversation *gtkconv) |
4359 | 3564 { |
10810 | 3565 GaimConversation *conv = gtkconv->active_conv; |
10175 | 3566 GtkWidget *frame; |
4359 | 3567 GtkWidget *paned; |
10175 | 3568 GtkWidget *vbox; |
3569 GtkWidget *vbox2; | |
9080 | 3570 GList *focus_chain = NULL; |
4359 | 3571 |
10175 | 3572 /* Setup the outer pane */ |
4359 | 3573 paned = gtk_vpaned_new(); |
3574 gtk_widget_show(paned); | |
3575 | |
10175 | 3576 /* Setup the top part of the pane */ |
11243 | 3577 vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
4409
0521eec12c33
[gaim-migrate @ 4682]
Christian Hammond <chipx86@chipx86.com>
parents:
4398
diff
changeset
|
3578 gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE); |
4359 | 3579 gtk_widget_show(vbox); |
3580 | |
10175 | 3581 /* Setup the gtkimhtml widget */ |
3582 frame = gaim_gtk_create_imhtml(FALSE, >kconv->imhtml, NULL); | |
3583 gtk_widget_set_name(gtkconv->imhtml, "gaim_gtkconv_imhtml"); | |
10389 | 3584 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml),TRUE); |
10175 | 3585 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); |
3586 gtk_widget_show(frame); | |
3587 | |
3588 gtk_widget_set_size_request(gtkconv->imhtml, | |
5550
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5546
diff
changeset
|
3589 gaim_prefs_get_int("/gaim/gtk/conversations/im/default_width"), |
b18c2a37cc96
[gaim-migrate @ 5951]
Christian Hammond <chipx86@chipx86.com>
parents:
5546
diff
changeset
|
3590 gaim_prefs_get_int("/gaim/gtk/conversations/im/default_height")); |
10175 | 3591 g_signal_connect(G_OBJECT(gtkconv->imhtml), "size-allocate", |
10810 | 3592 G_CALLBACK(size_allocate_cb), gtkconv); |
4359 | 3593 |
3594 g_signal_connect_after(G_OBJECT(gtkconv->imhtml), "button_press_event", | |
10810 | 3595 G_CALLBACK(entry_stop_rclick_cb), NULL); |
8105 | 3596 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_press_event", |
10810 | 3597 G_CALLBACK(refocus_entry_cb), gtkconv); |
8109 | 3598 g_signal_connect(G_OBJECT(gtkconv->imhtml), "key_release_event", |
10810 | 3599 G_CALLBACK(refocus_entry_cb), gtkconv); |
4359 | 3600 |
10175 | 3601 /* Setup the bottom half of the conversation window */ |
11243 | 3602 vbox2 = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
8914 | 3603 gtk_paned_pack2(GTK_PANED(paned), vbox2, FALSE, TRUE); |
4963
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3604 gtk_widget_show(vbox2); |
7f5e7f2ef317
[gaim-migrate @ 5297]
Christian Hammond <chipx86@chipx86.com>
parents:
4958
diff
changeset
|
3605 |
11243 | 3606 gtkconv->lower_hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
9332 | 3607 gtk_box_pack_start(GTK_BOX(vbox2), gtkconv->lower_hbox, TRUE, TRUE, 0); |
3608 gtk_widget_show(gtkconv->lower_hbox); | |
3609 | |
11243 | 3610 vbox2 = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
9332 | 3611 gtk_box_pack_end(GTK_BOX(gtkconv->lower_hbox), vbox2, TRUE, TRUE, 0); |
3612 gtk_widget_show(vbox2); | |
8821 | 3613 |
10175 | 3614 /* Setup the toolbar, entry widget and all signals */ |
3615 frame = gaim_gtk_create_imhtml(TRUE, >kconv->entry, >kconv->toolbar); | |
10080 | 3616 gtk_box_pack_start(GTK_BOX(vbox2), frame, TRUE, TRUE, 0); |
10175 | 3617 gtk_widget_show(frame); |
3618 | |
9005 | 3619 gtk_widget_set_name(gtkconv->entry, "gaim_gtkconv_entry"); |
8456 | 3620 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->entry), |
9699 | 3621 gaim_account_get_protocol_name(conv->account)); |
10175 | 3622 gtk_widget_set_size_request(gtkconv->entry, -1, |
3623 gaim_prefs_get_int("/gaim/gtk/conversations/im/entry_height")); | |
8407
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
3624 gtkconv->entry_buffer = |
15614a7cdc13
[gaim-migrate @ 9137]
Christian Hammond <chipx86@chipx86.com>
parents:
8380
diff
changeset
|
3625 gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); |
10810 | 3626 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
|
3627 |
4359 | 3628 g_signal_connect(G_OBJECT(gtkconv->entry), "key_press_event", |
10810 | 3629 G_CALLBACK(entry_key_press_cb), gtkconv); |
3630 g_signal_connect(G_OBJECT(gtkconv->entry), "message_send", G_CALLBACK(send_cb), gtkconv); | |
4359 | 3631 g_signal_connect_after(G_OBJECT(gtkconv->entry), "button_press_event", |
10810 | 3632 G_CALLBACK(entry_stop_rclick_cb), NULL); |
8914 | 3633 g_signal_connect(G_OBJECT(gtkconv->entry), "size-allocate", |
10810 | 3634 G_CALLBACK(size_allocate_cb), gtkconv); |
4359 | 3635 |
3636 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "insert_text", | |
10810 | 3637 G_CALLBACK(insert_text_cb), gtkconv); |
4359 | 3638 g_signal_connect(G_OBJECT(gtkconv->entry_buffer), "delete_range", |
10810 | 3639 G_CALLBACK(delete_text_cb), gtkconv); |
4359 | 3640 |
8481 | 3641 /* had to move this after the imtoolbar is attached so that the |
3642 * signals get fired to toggle the buttons on the toolbar as well. | |
3643 */ | |
10810 | 3644 default_formatize(gtkconv); |
4359 | 3645 |
11275
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
3646 g_signal_connect_after(G_OBJECT(gtkconv->entry), "format_function_clear", |
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
3647 G_CALLBACK(clear_formatting_cb), gtkconv); |
ffc86d9ad8b7
[gaim-migrate @ 13461]
Richard Laager <rlaager@wiktel.com>
parents:
11269
diff
changeset
|
3648 |
8758 | 3649 gtkconv->u.im->animate = gaim_prefs_get_bool("/gaim/gtk/conversations/im/animate_buddy_icons"); |
9687 | 3650 gtkconv->u.im->show_icon = TRUE; |
4359 | 3651 |
9080 | 3652 /* |
3653 * Focus for IM windows should be as follows: | |
10356 | 3654 * Tab title -> conversation scrollback -> entry |
9080 | 3655 */ |
9332 | 3656 focus_chain = g_list_prepend(focus_chain, gtkconv->entry); |
9080 | 3657 gtk_container_set_focus_chain(GTK_CONTAINER(vbox2), focus_chain); |
8143 | 3658 |
4359 | 3659 return paned; |
3660 } | |
3661 | |
3662 static void | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3663 conv_dnd_recv(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, |
10810 | 3664 GtkSelectionData *sd, guint info, guint t, |
3665 GaimGtkConversation *gtkconv) | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3666 { |
10810 | 3667 GaimConversation *conv = gtkconv->active_conv; |
11581 | 3668 GaimGtkWindow *win = gtkconv->win; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3669 GaimConversation *c; |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3670 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3671 { |
4781 | 3672 GaimBlistNode *n = NULL; |
6695 | 3673 GaimBuddy *b; |
11581 | 3674 GaimGtkConversation *gtkconv = NULL; |
9622 | 3675 |
4781 | 3676 memcpy(&n, sd->data, sizeof(n)); |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3677 |
6695 | 3678 if (GAIM_BLIST_NODE_IS_CONTACT(n)) |
3679 b = gaim_contact_get_priority_buddy((GaimContact*)n); | |
3680 else if (GAIM_BLIST_NODE_IS_BUDDY(n)) | |
3681 b = (GaimBuddy*)n; | |
3682 else | |
4781 | 3683 return; |
4939
4d50e125b0fa
[gaim-migrate @ 5273]
Christian Hammond <chipx86@chipx86.com>
parents:
4931
diff
changeset
|
3684 |
9622 | 3685 /* |
3686 * If we already have an open conversation with this buddy, then | |
3687 * just move the conv to this window. Otherwise, create a new | |
3688 * conv and add it to this window. | |
3689 */ | |
11338 | 3690 c = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, b->name, b->account); |
9622 | 3691 if (c != NULL) { |
11581 | 3692 GaimGtkWindow *oldwin; |
3693 gtkconv = GAIM_GTK_CONVERSATION(c); | |
3694 oldwin = gtkconv->win; | |
9622 | 3695 if (oldwin != win) { |
11581 | 3696 gaim_gtk_conv_window_remove_gtkconv(oldwin, gtkconv); |
3697 gaim_gtk_conv_window_add_gtkconv(win, gtkconv); | |
9622 | 3698 } |
3699 } else { | |
11338 | 3700 c = gaim_conversation_new(GAIM_CONV_TYPE_IM, b->account, b->name); |
11581 | 3701 gtkconv = GAIM_GTK_CONVERSATION(c); |
3702 gaim_gtk_conv_window_add_gtkconv(win, gtkconv); | |
9622 | 3703 } |
3704 | |
3705 /* Make this conversation the active conversation */ | |
11581 | 3706 gaim_gtk_conv_window_switch_gtkconv(win, gtkconv); |
8802
1076cd8579ea
[gaim-migrate @ 9564]
Christian Hammond <chipx86@chipx86.com>
parents:
8758
diff
changeset
|
3707 |
1076cd8579ea
[gaim-migrate @ 9564]
Christian Hammond <chipx86@chipx86.com>
parents:
8758
diff
changeset
|
3708 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
4702 | 3709 } |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3710 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
|
3711 { |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3712 char *protocol = NULL; |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3713 char *username = NULL; |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3714 GaimAccount *account; |
11581 | 3715 GaimGtkConversation *gtkconv; |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3716 |
11137 | 3717 if (gaim_gtk_parse_x_im_contact((const char *)sd->data, FALSE, &account, |
7718 | 3718 &protocol, &username, NULL)) |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3719 { |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3720 if (account == NULL) |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3721 { |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3722 gaim_notify_error(NULL, NULL, |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3723 _("You are not currently signed on with an account that " |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3724 "can add that buddy."), NULL); |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3725 } |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3726 else |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3727 { |
11338 | 3728 c = gaim_conversation_new(GAIM_CONV_TYPE_IM, account, username); |
11581 | 3729 gtkconv = GAIM_GTK_CONVERSATION(c); |
3730 gaim_gtk_conv_window_add_gtkconv(win, gtkconv); | |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3731 } |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3732 } |
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 if (username != NULL) g_free(username); |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3735 if (protocol != NULL) g_free(protocol); |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3736 |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3737 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7700
diff
changeset
|
3738 } |
9525 | 3739 else if (sd->target == gdk_atom_intern("text/uri-list", FALSE)) { |
11338 | 3740 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
10229 | 3741 gaim_dnd_file_manage(sd, gaim_conversation_get_account(conv), gaim_conversation_get_name(conv)); |
10145 | 3742 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
9495 | 3743 } |
10145 | 3744 else |
3745 gtk_drag_finish(dc, FALSE, FALSE, t); | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3746 } |
4359 | 3747 |
3748 | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3749 static const GtkTargetEntry te[] = |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3750 { |
10145 | 3751 GTK_IMHTML_DND_TARGETS, |
3752 {"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, GTK_IMHTML_DRAG_NUM}, | |
3753 {"application/x-im-contact", 0, GTK_IMHTML_DRAG_NUM + 1} | |
4689
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3754 }; |
69b19e132df0
[gaim-migrate @ 5000]
Christian Hammond <chipx86@chipx86.com>
parents:
4687
diff
changeset
|
3755 |
10810 | 3756 static GaimGtkConversation * |
3757 gaim_gtk_conv_find_gtkconv(GaimConversation * conv) | |
3758 { | |
3759 GaimBuddy *bud = gaim_find_buddy(conv->account, conv->name), *b; | |
3760 GaimContact *c; | |
3761 GaimBlistNode *cn; | |
10935 | 3762 |
10810 | 3763 if (!bud) |
3764 return NULL; | |
10935 | 3765 |
10810 | 3766 if (!(c = gaim_buddy_get_contact(bud))) |
3767 return NULL; | |
10935 | 3768 |
10810 | 3769 cn = (GaimBlistNode *)c; |
3770 for (b = (GaimBuddy *)cn->child; b; b = (GaimBuddy *) ((GaimBlistNode *)b)->next) { | |
3771 GaimConversation *conv; | |
11338 | 3772 if ((conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, b->name, b->account))) { |
10810 | 3773 if (conv->ui_data) |
3774 return conv->ui_data; | |
3775 } | |
3776 } | |
10935 | 3777 |
10810 | 3778 return NULL; |
3779 } | |
3780 | |
11581 | 3781 /************************************************************************** |
3782 * Conversation UI operations | |
3783 **************************************************************************/ | |
3784 void | |
3785 gaim_gtkconv_new(GaimConversation *conv) | |
3786 { | |
3787 GaimGtkConversation *gtkconv; | |
3788 GaimConversationType conv_type = gaim_conversation_get_type(conv); | |
4359 | 3789 GtkWidget *pane = NULL; |
3790 GtkWidget *tab_cont; | |
11581 | 3791 |
3792 if (conv_type == GAIM_CONV_TYPE_IM && (gtkconv = gaim_gtk_conv_find_gtkconv(conv))) { | |
10810 | 3793 conv->ui_data = gtkconv; |
3794 if (!g_list_find(gtkconv->convs, conv)) | |
3795 gtkconv->convs = g_list_prepend(gtkconv->convs, conv); | |
11604 | 3796 gaim_gtkconv_switch_active_conversation(conv); |
10810 | 3797 return; |
4359 | 3798 } |
3799 | |
11581 | 3800 gtkconv = g_new0(GaimGtkConversation, 1); |
3801 conv->ui_data = gtkconv; | |
3802 gtkconv->active_conv = conv; | |
3803 gtkconv->convs = g_list_prepend(gtkconv->convs, conv); | |
3804 | |
3805 /* Setup some initial variables. */ | |
3806 gtkconv->sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); | |
3807 gtkconv->tooltips = gtk_tooltips_new(); | |
3808 | |
3809 if (conv_type == GAIM_CONV_TYPE_IM) { | |
3810 gtkconv->u.im = g_malloc0(sizeof(GaimGtkImPane)); | |
3811 | |
3812 pane = setup_im_pane(gtkconv); | |
3813 } else if (conv_type == GAIM_CONV_TYPE_CHAT) { | |
3814 gtkconv->u.chat = g_malloc0(sizeof(GaimGtkChatPane)); | |
3815 pane = setup_chat_pane(gtkconv); | |
3816 } | |
3817 | |
3818 if (pane == NULL) { | |
3819 if (conv_type == GAIM_CONV_TYPE_CHAT) | |
3820 g_free(gtkconv->u.chat); | |
3821 else if (conv_type == GAIM_CONV_TYPE_IM) | |
3822 g_free(gtkconv->u.im); | |
3823 | |
3824 g_free(gtkconv); | |
3825 conv->ui_data = NULL; | |
3826 return; | |
10449 | 3827 } |
11581 | 3828 |
3829 /* Setup drag-and-drop */ | |
3830 gtk_drag_dest_set(pane, | |
3831 GTK_DEST_DEFAULT_MOTION | | |
3832 GTK_DEST_DEFAULT_DROP, | |
3833 te, sizeof(te) / sizeof(GtkTargetEntry), | |
3834 GDK_ACTION_COPY); | |
3835 gtk_drag_dest_set(pane, | |
3836 GTK_DEST_DEFAULT_MOTION | | |
3837 GTK_DEST_DEFAULT_DROP, | |
3838 te, sizeof(te) / sizeof(GtkTargetEntry), | |
3839 GDK_ACTION_COPY); | |
3840 gtk_drag_dest_set(gtkconv->imhtml, 0, | |
3841 te, sizeof(te) / sizeof(GtkTargetEntry), | |
3842 GDK_ACTION_COPY); | |
3843 | |
3844 gtk_drag_dest_set(gtkconv->entry, 0, | |
3845 te, sizeof(te) / sizeof(GtkTargetEntry), | |
3846 GDK_ACTION_COPY); | |
3847 | |
3848 g_signal_connect(G_OBJECT(pane), "drag_data_received", | |
3849 G_CALLBACK(conv_dnd_recv), gtkconv); | |
3850 g_signal_connect(G_OBJECT(gtkconv->imhtml), "drag_data_received", | |
3851 G_CALLBACK(conv_dnd_recv), gtkconv); | |
3852 g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", | |
3853 G_CALLBACK(conv_dnd_recv), gtkconv); | |
3854 | |
3855 /* Setup the container for the tab. */ | |
3856 gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
3857 g_object_set_data(G_OBJECT(tab_cont), "GaimGtkConversation", gtkconv); | |
3858 gtk_container_set_border_width(GTK_CONTAINER(tab_cont), GAIM_HIG_BOX_SPACE); | |
3859 gtk_container_add(GTK_CONTAINER(tab_cont), pane); | |
3860 gtk_widget_show(pane); | |
3861 | |
3862 gtkconv->make_sound = TRUE; | |
3863 | |
3864 if (gaim_prefs_get_bool("/gaim/gtk/conversations/show_formatting_toolbar")) | |
3865 gtk_widget_show(gtkconv->toolbar); | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
3866 else |
11581 | 3867 gtk_widget_hide(gtkconv->toolbar); |
3868 | |
3869 gtkconv->show_timestamps = TRUE; | |
3870 gtk_imhtml_show_comments(GTK_IMHTML(gtkconv->imhtml), TRUE); | |
11603
b97545f21b4c
[gaim-migrate @ 13874]
Gary Kramlich <grim@reaperworld.com>
parents:
11602
diff
changeset
|
3871 gtk_imhtml_set_protocol_name(GTK_IMHTML(gtkconv->imhtml), |
b97545f21b4c
[gaim-migrate @ 13874]
Gary Kramlich <grim@reaperworld.com>
parents:
11602
diff
changeset
|
3872 gaim_account_get_protocol_name(conv->account)); |
11581 | 3873 |
3874 g_signal_connect_swapped(G_OBJECT(pane), "focus", | |
3875 G_CALLBACK(gtk_widget_grab_focus), | |
3876 gtkconv->entry); | |
3877 | |
3878 gaim_gtkconv_placement_place(gtkconv); | |
3879 } | |
3880 | |
4359 | 3881 static void |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3882 gaim_gtkconv_destroy(GaimConversation *conv) |
4359 | 3883 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3884 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
4359 | 3885 |
10810 | 3886 gtkconv->convs = g_list_remove(gtkconv->convs, conv); |
3887 /* Don't destroy ourselves until all our convos are gone */ | |
3888 if (gtkconv->convs) | |
3889 return; | |
11508 | 3890 |
11581 | 3891 gaim_gtk_conv_window_remove_gtkconv(gtkconv->win, gtkconv); |
3892 | |
9504 | 3893 /* If the "Save Conversation" or "Save Icon" dialogs are open then close them */ |
3894 gaim_request_close_with_handle(conv); | |
4359 | 3895 |
4571
51e988d015ed
[gaim-migrate @ 4852]
Christian Hammond <chipx86@chipx86.com>
parents:
4561
diff
changeset
|
3896 gtk_widget_destroy(gtkconv->tab_cont); |
4892 | 3897 g_object_unref(gtkconv->tab_cont); |
4571
51e988d015ed
[gaim-migrate @ 4852]
Christian Hammond <chipx86@chipx86.com>
parents:
4561
diff
changeset
|
3898 |
11338 | 3899 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { |
4755 | 3900 if (gtkconv->u.im->icon_timer != 0) |
3901 g_source_remove(gtkconv->u.im->icon_timer); | |
3902 | |
4359 | 3903 if (gtkconv->u.im->anim != NULL) |
4793 | 3904 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); |
4359 | 3905 |
3906 g_free(gtkconv->u.im); | |
11581 | 3907 } 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
|
3908 gaim_signals_disconnect_by_handle(gtkconv->u.chat); |
4359 | 3909 g_free(gtkconv->u.chat); |
3910 } | |
3911 | |
4633 | 3912 gtk_object_sink(GTK_OBJECT(gtkconv->tooltips)); |
3913 | |
4359 | 3914 g_free(gtkconv); |
3915 } | |
3916 | |
3917 static void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3918 gaim_gtkconv_write_im(GaimConversation *conv, const char *who, |
6982 | 3919 const char *message, GaimMessageFlags flags, |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3920 time_t mtime) |
4359 | 3921 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3922 GaimGtkConversation *gtkconv; |
4359 | 3923 |
3924 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
3925 gaim_gtkconv_set_active_conversation(conv); |
4359 | 3926 |
6982 | 3927 gaim_conversation_write(conv, who, message, flags, mtime); |
4359 | 3928 } |
3929 | |
3930 static void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3931 gaim_gtkconv_write_chat(GaimConversation *conv, const char *who, |
6621 | 3932 const char *message, GaimMessageFlags flags, time_t mtime) |
4359 | 3933 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
3934 GaimGtkConversation *gtkconv; |
4359 | 3935 |
3936 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
3937 gaim_gtkconv_set_active_conversation(conv); |
4359 | 3938 |
10398 | 3939 flags |= GAIM_MESSAGE_COLORIZE; |
4359 | 3940 |
6982 | 3941 gaim_conversation_write(conv, who, message, flags, mtime); |
4359 | 3942 } |
3943 | |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3944 /* The callback for an event on a link tag. */ |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3945 static gboolean buddytag_event(GtkTextTag *tag, GObject *imhtml, |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3946 GdkEvent *event, GtkTextIter *arg2, gpointer data) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3947 if (event->type == GDK_BUTTON_PRESS |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3948 || event->type == GDK_2BUTTON_PRESS) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3949 GdkEventButton *btn_event = (GdkEventButton*) event; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3950 GaimConversation *conv = data; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3951 char *buddyname; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3952 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3953 /* strlen("BUDDY ") == 6 */ |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3954 g_return_val_if_fail((tag->name != NULL) |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3955 && (strlen(tag->name) > 6), FALSE); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3956 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3957 buddyname = (tag->name) + 6; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3958 |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
3959 if (btn_event->button == 2 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3960 && event->type == GDK_2BUTTON_PRESS) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3961 chat_do_info(GAIM_GTK_CONVERSATION(conv), buddyname); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3962 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3963 return TRUE; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3964 } else if (btn_event->button == 3 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3965 && event->type == GDK_BUTTON_PRESS) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3966 GtkTextIter start, end; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3967 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3968 /* we shouldn't display the popup |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3969 * if the user has selected something: */ |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3970 if (!gtk_text_buffer_get_selection_bounds( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3971 gtk_text_iter_get_buffer(arg2), |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3972 &start, &end)) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3973 GaimPluginProtocolInfo *prpl_info = NULL; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3974 GtkWidget *menu = NULL; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3975 GaimConnection *gc = |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3976 gaim_conversation_get_gc(conv); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3977 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3978 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3979 if (gc != NULL) |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3980 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3981 gc->prpl); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3982 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3983 menu = create_chat_menu(conv, buddyname, |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3984 prpl_info, gc); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3985 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
3986 NULL, GTK_WIDGET(imhtml), |
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
3987 btn_event->button, |
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
3988 btn_event->time); |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3989 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3990 /* Don't propagate the event any further */ |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3991 return TRUE; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3992 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3993 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3994 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3995 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3996 return FALSE; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3997 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3998 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
3999 static GtkTextTag *get_buddy_tag(GaimConversation *conv, const char *who) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4000 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4001 GtkTextTag *buddytag; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4002 /* strlen("BUDDY ") == 6 */ |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4003 gchar str[strlen(who) + 7]; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4004 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4005 g_snprintf(str, sizeof(str), "BUDDY %s", who); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4006 str[sizeof(str)] = '\0'; |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4007 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4008 buddytag = gtk_text_tag_table_lookup( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4009 gtk_text_buffer_get_tag_table( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4010 GTK_IMHTML(gtkconv->imhtml)->text_buffer), str); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4011 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4012 if (buddytag == NULL) { |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4013 buddytag = gtk_text_buffer_create_tag( |
11096 | 4014 GTK_IMHTML(gtkconv->imhtml)->text_buffer, str, NULL); |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4015 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4016 g_signal_connect(G_OBJECT(buddytag), "event", |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4017 G_CALLBACK(buddytag_event), conv); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4018 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4019 |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4020 return buddytag; |
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 |
4359 | 4023 static void |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4024 gaim_gtkconv_write_conv(GaimConversation *conv, const char *name, const char *alias, |
6982 | 4025 const char *message, GaimMessageFlags flags, |
4359 | 4026 time_t mtime) |
4027 { | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4028 GaimGtkConversation *gtkconv; |
11581 | 4029 GaimGtkWindow *win; |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5551
diff
changeset
|
4030 GaimConnection *gc; |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4031 GaimAccount *account; |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4032 GaimPluginProtocolInfo *prpl_info; |
4359 | 4033 int gtk_font_options = 0; |
11224
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4034 int max_scrollback_lines = gaim_prefs_get_int( |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4035 "/gaim/gtk/conversations/scrollback_lines"); |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4036 int line_count; |
4359 | 4037 char buf2[BUF_LONG]; |
4038 char mdate[64]; | |
4039 char color[10]; | |
4040 char *str; | |
4041 char *with_font_tag; | |
4896 | 4042 char *sml_attrib = NULL; |
6982 | 4043 size_t length = strlen(message) + 1; |
4895 | 4044 |
4359 | 4045 gtkconv = GAIM_GTK_CONVERSATION(conv); |
11581 | 4046 |
4047 /* Set the active conversation to the one that just messaged us. */ | |
4048 /* 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
|
4049 gaim_gtkconv_set_active_conversation(conv); |
11581 | 4050 |
4359 | 4051 gc = gaim_conversation_get_gc(conv); |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4052 account = gaim_conversation_get_account(conv); |
11581 | 4053 win = gtkconv->win; |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4054 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
4055 |
11224
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4056 line_count = gtk_text_buffer_get_line_count( |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4057 gtk_text_view_get_buffer(GTK_TEXT_VIEW( |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4058 gtkconv->imhtml))); |
11227
8b3d1b2c2c43
[gaim-migrate @ 13365]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11224
diff
changeset
|
4059 |
11224
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4060 /* 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
|
4061 max scrollback, trim down to max scrollback */ |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4062 if (max_scrollback_lines > 0 |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4063 && line_count > (max_scrollback_lines + 100)) { |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4064 GtkTextBuffer *text_buffer = gtk_text_view_get_buffer( |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4065 GTK_TEXT_VIEW(gtkconv->imhtml)); |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4066 GtkTextIter start, end; |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4067 |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4068 gtk_text_buffer_get_start_iter(text_buffer, &start); |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4069 gtk_text_buffer_get_iter_at_line(text_buffer, &end, |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4070 (line_count - max_scrollback_lines)); |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4071 gtk_imhtml_delete(GTK_IMHTML(gtkconv->imhtml), &start, &end); |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4072 } |
409d6a11da51
[gaim-migrate @ 13360]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11209
diff
changeset
|
4073 |
8677 | 4074 if (gtk_text_buffer_get_char_count(gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml)))) |
4075 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), "<BR>", 0); | |
4076 | |
5133 | 4077 if(time(NULL) > mtime + 20*60) /* show date if older than 20 minutes */ |
4078 strftime(mdate, sizeof(mdate), "%Y-%m-%d %H:%M:%S", localtime(&mtime)); | |
4079 else | |
4080 strftime(mdate, sizeof(mdate), "%H:%M:%S", localtime(&mtime)); | |
4359 | 4081 |
4896 | 4082 if(gc) |
9699 | 4083 sml_attrib = g_strdup_printf("sml=\"%s\"", |
4084 gaim_account_get_protocol_name(conv->account)); | |
7440 | 4085 |
10503 | 4086 gtk_font_options |= GTK_IMHTML_NO_COMMENTS; |
4359 | 4087 |
11267
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
4088 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
|
4089 gtk_font_options |= GTK_IMHTML_NO_COLOURS | GTK_IMHTML_NO_FONTS | GTK_IMHTML_NO_SIZES | GTK_IMHTML_NO_FORMATTING; |
4359 | 4090 |
7956 | 4091 /* this is gonna crash one day, I can feel it. */ |
4092 if (GAIM_PLUGIN_PROTOCOL_INFO(gaim_find_prpl(gaim_account_get_protocol_id(conv->account)))->options & | |
7431 | 4093 OPT_PROTO_USE_POINTSIZE) { |
10503 | 4094 gtk_font_options |= GTK_IMHTML_USE_POINTSIZE; |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
4095 } |
4359 | 4096 |
10737 | 4097 /* TODO: These colors should not be hardcoded so log.c can use them */ |
6621 | 4098 if (flags & GAIM_MESSAGE_SYSTEM) { |
4359 | 4099 g_snprintf(buf2, sizeof(buf2), |
8690 | 4100 "<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
|
4101 sml_attrib ? sml_attrib : "", mdate, message); |
7440 | 4102 |
8962 | 4103 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, 0); |
7440 | 4104 |
8722 | 4105 } else if (flags & GAIM_MESSAGE_ERROR) { |
4106 g_snprintf(buf2, sizeof(buf2), | |
9627 | 4107 "<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
|
4108 sml_attrib ? sml_attrib : "", mdate, message); |
9554 | 4109 |
8962 | 4110 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, 0); |
4111 | |
7431 | 4112 } else if (flags & GAIM_MESSAGE_NO_LOG) { |
10884 | 4113 g_snprintf(buf2, BUF_LONG, |
8690 | 4114 "<B><FONT %s COLOR=\"#777777\">%s</FONT></B>", |
10854
bdd72261ec8c
[gaim-migrate @ 12529]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10849
diff
changeset
|
4115 sml_attrib ? sml_attrib : "", message); |
7440 | 4116 |
10884 | 4117 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, 0); |
10346 | 4118 } else if (flags & GAIM_MESSAGE_RAW) { |
10348 | 4119 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), message, 0); |
10346 | 4120 } else { |
4895 | 4121 char *new_message = g_memdup(message, length); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4122 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
|
4123 /* The initial offset is to deal with |
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4124 * escaped entities making the string longer */ |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4125 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
|
4126 int tag_end_offset = 0; |
7440 | 4127 |
6621 | 4128 if (flags & GAIM_MESSAGE_WHISPER) { |
4359 | 4129 str = g_malloc(1024); |
7440 | 4130 |
4359 | 4131 /* If we're whispering, it's not an autoresponse. */ |
10504 | 4132 if (gaim_message_meify(new_message, -1 )) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4133 g_snprintf(str, 1024, "***%s", alias_escaped); |
4359 | 4134 strcpy(color, "#6C2585"); |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4135 tag_start_offset += 3; |
4359 | 4136 } |
4137 else { | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4138 g_snprintf(str, 1024, "*%s*:", alias_escaped); |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4139 tag_start_offset += 1; |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4140 tag_end_offset = 2; |
4359 | 4141 strcpy(color, "#00FF00"); |
4142 } | |
7440 | 4143 } |
4359 | 4144 else { |
10504 | 4145 if (gaim_message_meify(new_message, -1)) { |
4359 | 4146 str = g_malloc(1024); |
7440 | 4147 |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4148 if (flags & GAIM_MESSAGE_AUTO_RESP) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4149 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
|
4150 tag_start_offset += 4 |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4151 + strlen(AUTO_RESPONSE); |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4152 } else { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4153 g_snprintf(str, 1024, "***%s", alias_escaped); |
10999
56cfc50d2a81
[gaim-migrate @ 12841]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10971
diff
changeset
|
4154 tag_start_offset += 3; |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4155 } |
7440 | 4156 |
6621 | 4157 if (flags & GAIM_MESSAGE_NICK) |
4359 | 4158 strcpy(color, "#AF7F00"); |
4159 else | |
4160 strcpy(color, "#062585"); | |
4161 } | |
4162 else { | |
4163 str = g_malloc(1024); | |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4164 if (flags & GAIM_MESSAGE_AUTO_RESP) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4165 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
|
4166 tag_start_offset += 1 |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4167 + strlen(AUTO_RESPONSE); |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4168 } else { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4169 g_snprintf(str, 1024, "%s:", alias_escaped); |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4170 tag_end_offset = 1; |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4171 } |
6621 | 4172 if (flags & GAIM_MESSAGE_NICK) |
4359 | 4173 strcpy(color, "#AF7F00"); |
6621 | 4174 else if (flags & GAIM_MESSAGE_RECV) { |
10108 | 4175 if (flags & GAIM_MESSAGE_COLORIZE) { |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4176 GdkColor *col = get_nick_color(gtkconv, alias); |
10346 | 4177 |
10108 | 4178 g_snprintf(color, sizeof(color), "#%02X%02X%02X", |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4179 col->red >> 8, col->green >> 8, col->blue >> 8); |
10108 | 4180 } else |
7854 | 4181 strcpy(color, RECV_COLOR); |
4359 | 4182 } |
6621 | 4183 else if (flags & GAIM_MESSAGE_SEND) |
7854 | 4184 strcpy(color, SEND_COLOR); |
10892 | 4185 else { |
4186 gaim_debug_error("gtkconv", "message missing flags\n"); | |
4187 strcpy(color, "#000000"); | |
4188 } | |
4359 | 4189 } |
4190 } | |
10892 | 4191 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4192 if(alias_escaped) |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4193 g_free(alias_escaped); |
11508 | 4194 |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4195 /* 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
|
4196 if (!(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME) && |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4197 gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4198 |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4199 /* Bold buddies to make them stand out from non-buddies. */ |
11581 | 4200 if (flags & GAIM_MESSAGE_SEND || |
11530
2a13cfe607b5
[gaim-migrate @ 13779]
Richard Laager <rlaager@wiktel.com>
parents:
11525
diff
changeset
|
4201 flags & GAIM_MESSAGE_NICK || |
2a13cfe607b5
[gaim-migrate @ 13779]
Richard Laager <rlaager@wiktel.com>
parents:
11525
diff
changeset
|
4202 gaim_find_buddy(account, name) != NULL) { |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4203 g_snprintf(buf2, BUF_LONG, |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4204 "<FONT COLOR=\"%s\" %s><FONT SIZE=\"2\"><!--(%s) --></FONT>" |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4205 "<B>%s</B></FONT> ", |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4206 color, sml_attrib ? sml_attrib : "", mdate, str); |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4207 } else { |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4208 g_snprintf(buf2, BUF_LONG, |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4209 "<FONT COLOR=\"%s\" %s><FONT SIZE=\"2\"><!--(%s) --></FONT>" |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4210 "%s</FONT> ", |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4211 color, sml_attrib ? sml_attrib : "", mdate, str); |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4212 |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4213 } |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4214 } else { |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4215 /* 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
|
4216 g_snprintf(buf2, BUF_LONG, |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4217 "<FONT COLOR=\"%s\" %s><FONT SIZE=\"2\"><!--(%s) --></FONT>" |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4218 "<B>%s</B></FONT> ", |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4219 color, sml_attrib ? sml_attrib : "", mdate, str); |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4220 } |
7440 | 4221 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4222 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), buf2, 0); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4223 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4224 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT && |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4225 !(flags & GAIM_MESSAGE_SEND)) { |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4226 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4227 GtkTextIter start, end; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4228 GtkTextTag *buddytag = get_buddy_tag(conv, name); |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4229 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4230 gtk_text_buffer_get_end_iter( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4231 GTK_IMHTML(gtkconv->imhtml)->text_buffer, |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4232 &end); |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4233 gtk_text_iter_backward_chars(&end, |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4234 tag_end_offset + 1); |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4235 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4236 gtk_text_buffer_get_end_iter( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4237 GTK_IMHTML(gtkconv->imhtml)->text_buffer, |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4238 &start); |
10964
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4239 gtk_text_iter_backward_chars(&start, |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4240 strlen(str) + 1 - tag_start_offset); |
aae07c7e23a3
[gaim-migrate @ 12771]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10961
diff
changeset
|
4241 |
10961
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4242 gtk_text_buffer_apply_tag( |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4243 GTK_IMHTML(gtkconv->imhtml)->text_buffer, |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4244 buddytag, &start, &end); |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4245 } |
42769b481935
[gaim-migrate @ 12764]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10953
diff
changeset
|
4246 |
4359 | 4247 g_free(str); |
4248 | |
4895 | 4249 if(gc){ |
4896 | 4250 char *pre = g_strdup_printf("<font %s>", sml_attrib ? sml_attrib : ""); |
4895 | 4251 char *post = "</font>"; |
4252 int pre_len = strlen(pre); | |
4253 int post_len = strlen(post); | |
7440 | 4254 |
4895 | 4255 with_font_tag = g_malloc(length + pre_len + post_len + 1); |
7440 | 4256 |
4895 | 4257 strcpy(with_font_tag, pre); |
4258 memcpy(with_font_tag + pre_len, new_message, length); | |
4259 strcpy(with_font_tag + pre_len + length, post); | |
7440 | 4260 |
4895 | 4261 length += pre_len + post_len; |
4262 g_free(pre); | |
4263 } | |
4608 | 4264 else |
4895 | 4265 with_font_tag = g_memdup(new_message, length); |
7440 | 4266 |
8962 | 4267 gtk_imhtml_append_text(GTK_IMHTML(gtkconv->imhtml), |
4268 with_font_tag, gtk_font_options); | |
7440 | 4269 |
4270 g_free(with_font_tag); | |
7447 | 4271 g_free(new_message); |
7440 | 4272 } |
4273 | |
5012 | 4274 if(sml_attrib) |
4275 g_free(sml_attrib); | |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4276 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4277 /* Tab highlighting stuff */ |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4278 if (!gaim_gtkconv_has_focus(conv)) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4279 { |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4280 GaimUnseenState unseen = GAIM_UNSEEN_NONE; |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4281 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4282 if ((flags & GAIM_MESSAGE_NICK) == GAIM_MESSAGE_NICK || |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4283 gtkconv->unseen_state == GAIM_UNSEEN_NICK) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4284 unseen = GAIM_UNSEEN_NICK; |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4285 else if ((((flags & GAIM_MESSAGE_SYSTEM) == GAIM_MESSAGE_SYSTEM) || |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4286 ((flags & GAIM_MESSAGE_ERROR) == GAIM_MESSAGE_ERROR)) && |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4287 gtkconv->unseen_state != GAIM_UNSEEN_TEXT) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4288 unseen = GAIM_UNSEEN_EVENT; |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4289 else |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4290 unseen = GAIM_UNSEEN_TEXT; |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4291 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4292 gtkconv_set_unseen(gtkconv, unseen); |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4293 } |
4359 | 4294 } |
4295 | |
4296 static void | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4297 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
|
4298 { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4299 GaimConvChat *chat; |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4300 GaimGtkConversation *gtkconv; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4301 GaimGtkChatPane *gtkchat; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4302 GList *l; |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4303 GList *ll; |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4304 char tmp[BUF_LONG]; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4305 int num_users; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4306 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4307 chat = GAIM_CONV_CHAT(conv); |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4308 gtkconv = GAIM_GTK_CONVERSATION(conv); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4309 gtkchat = gtkconv->u.chat; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4310 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4311 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
|
4312 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4313 g_snprintf(tmp, sizeof(tmp), |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4314 ngettext("%d person in room", "%d people in room", |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4315 num_users), |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4316 num_users); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4317 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4318 gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4319 |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4320 l = users; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4321 ll = aliases; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4322 while (l != NULL && ll != NULL) { |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
4323 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
|
4324 l = l->next; |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4325 ll = ll->next; |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4326 } |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4327 } |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4328 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4329 static void |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4330 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
|
4331 const char *new_name, const char *new_alias) |
4359 | 4332 { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4333 GaimConvChat *chat; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4334 GaimGtkConversation *gtkconv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4335 GaimGtkChatPane *gtkchat; |
4359 | 4336 GtkTreeIter iter; |
4337 GtkTreeModel *model; | |
4338 int f = 1; | |
4339 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4340 chat = GAIM_CONV_CHAT(conv); |
4359 | 4341 gtkconv = GAIM_GTK_CONVERSATION(conv); |
4342 gtkchat = gtkconv->u.chat; | |
4343 | |
9554 | 4344 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
4345 | |
4346 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) | |
4347 return; | |
4348 | |
4349 while (f != 0) { | |
4350 char *val; | |
4351 | |
4352 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &val, -1); | |
4353 | |
4354 if (!gaim_utf8_strcasecmp(old_name, val)) { | |
4355 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
4356 g_free(val); | |
4359 | 4357 break; |
4358 } | |
9554 | 4359 |
4360 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4361 | |
4362 g_free(val); | |
4359 | 4363 } |
4364 | |
9554 | 4365 if (!gaim_conv_chat_find_user(chat, old_name)) |
4359 | 4366 return; |
4367 | |
11485
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4368 g_return_if_fail(new_alias != NULL); |
16b0da1f376f
[gaim-migrate @ 13727]
Richard Laager <rlaager@wiktel.com>
parents:
11480
diff
changeset
|
4369 |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
4370 add_chat_buddy_common(conv, new_name, new_alias, old_name); |
4359 | 4371 } |
4372 | |
4373 static void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4374 gaim_gtkconv_chat_remove_user(GaimConversation *conv, const char *user) |
4359 | 4375 { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4376 GaimConvChat *chat; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4377 GaimGtkConversation *gtkconv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4378 GaimGtkChatPane *gtkchat; |
4359 | 4379 GtkTreeIter iter; |
4380 GtkTreeModel *model; | |
4381 char tmp[BUF_LONG]; | |
4382 int num_users; | |
4383 int f = 1; | |
4384 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4385 chat = GAIM_CONV_CHAT(conv); |
4359 | 4386 gtkconv = GAIM_GTK_CONVERSATION(conv); |
4387 gtkchat = gtkconv->u.chat; | |
4388 | |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4389 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
|
4390 |
9554 | 4391 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
4392 | |
4393 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) | |
4394 return; | |
4395 | |
4396 while (f != 0) { | |
4397 char *val; | |
4398 | |
4399 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &val, -1); | |
4400 | |
4401 if (!gaim_utf8_strcasecmp(user, val)) { | |
4402 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
4403 g_free(val); | |
4359 | 4404 break; |
4405 } | |
9554 | 4406 |
4407 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4408 | |
4409 g_free(val); | |
4359 | 4410 } |
4411 | |
9554 | 4412 if (!gaim_conv_chat_find_user(chat, user)) |
4359 | 4413 return; |
4414 | |
4415 g_snprintf(tmp, sizeof(tmp), | |
9554 | 4416 ngettext("%d person in room", "%d people in room", |
4417 num_users), num_users); | |
4359 | 4418 |
4419 gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); | |
4420 | |
4421 } | |
4422 | |
4423 static void | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4424 gaim_gtkconv_chat_remove_users(GaimConversation *conv, GList *users) |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4425 { |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4426 GaimConvChat *chat; |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4427 GaimGtkConversation *gtkconv; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4428 GaimGtkChatPane *gtkchat; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4429 GtkTreeIter iter; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4430 GtkTreeModel *model; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4431 GList *l; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4432 char tmp[BUF_LONG]; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4433 int num_users; |
8256
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8253
diff
changeset
|
4434 gboolean f; |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4435 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4436 chat = GAIM_CONV_CHAT(conv); |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4437 gtkconv = GAIM_GTK_CONVERSATION(conv); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4438 gtkchat = gtkconv->u.chat; |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4439 |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4440 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
|
4441 g_list_length(users); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4442 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4443 for (l = users; l != NULL; l = l->next) { |
9554 | 4444 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); |
4445 | |
10812
d087e928ffd1
[gaim-migrate @ 12465]
Luke Schierer <lschiere@pidgin.im>
parents:
10810
diff
changeset
|
4446 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) |
9554 | 4447 continue; |
4448 | |
4449 do { | |
4450 char *val; | |
4451 | |
4452 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, | |
4453 CHAT_USERS_NAME_COLUMN, &val, -1); | |
4454 | |
9696 | 4455 if (!gaim_utf8_strcasecmp((char *)l->data, val)) { |
4456 #if GTK_CHECK_VERSION(2,2,0) | |
9554 | 4457 f = gtk_list_store_remove(GTK_LIST_STORE(model), &iter); |
9696 | 4458 #else |
4459 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); | |
4460 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4461 #endif | |
4462 } | |
9554 | 4463 else |
4464 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4465 | |
4466 g_free(val); | |
4467 } while (f); | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4468 } |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4469 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4470 g_snprintf(tmp, sizeof(tmp), |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4471 ngettext("%d person in room", "%d people in room", |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4472 num_users), num_users); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4473 |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4474 gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4475 } |
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4476 |
9554 | 4477 static void |
4478 gaim_gtkconv_chat_update_user(GaimConversation *conv, const char *user) | |
4479 { | |
4480 GaimConvChat *chat; | |
4481 GaimGtkConversation *gtkconv; | |
4482 GaimGtkChatPane *gtkchat; | |
4483 GtkTreeIter iter; | |
4484 GtkTreeModel *model; | |
4485 int f = 1; | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4486 char *alias = NULL; |
9554 | 4487 |
4488 chat = GAIM_CONV_CHAT(conv); | |
4489 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4490 gtkchat = gtkconv->u.chat; | |
4491 | |
4492 model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); | |
4493 | |
4494 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) | |
4495 return; | |
4496 | |
4497 while (f != 0) { | |
4498 char *val; | |
4499 | |
4500 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_NAME_COLUMN, &val, -1); | |
4501 | |
4502 if (!gaim_utf8_strcasecmp(user, val)) { | |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
4503 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, CHAT_USERS_ALIAS_COLUMN, &alias, -1); |
9554 | 4504 gtk_list_store_remove(GTK_LIST_STORE(model), &iter); |
4505 g_free(val); | |
4506 break; | |
4507 } | |
4508 | |
4509 f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); | |
4510 | |
4511 g_free(val); | |
4512 } | |
4513 | |
4514 if (!gaim_conv_chat_find_user(chat, user)) | |
4515 return; | |
4516 | |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4517 g_return_if_fail(alias != NULL); |
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4518 |
11500
9fc7d0153332
[gaim-migrate @ 13745]
Richard Laager <rlaager@wiktel.com>
parents:
11486
diff
changeset
|
4519 add_chat_buddy_common(conv, user, alias, NULL); |
11454
201617d49573
[gaim-migrate @ 13693]
Richard Laager <rlaager@wiktel.com>
parents:
11453
diff
changeset
|
4520 g_free(alias); |
9554 | 4521 } |
4522 | |
11581 | 4523 gboolean |
9260
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4524 gaim_gtkconv_has_focus(GaimConversation *conv) |
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4525 { |
11581 | 4526 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
4527 GaimGtkWindow *win; | |
9260
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4528 gboolean has_focus; |
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4529 |
11581 | 4530 win = gtkconv->win; |
4531 | |
4532 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
|
4533 |
11684
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4534 if (has_focus) |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4535 { |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4536 GaimConversation *c = gaim_gtk_conv_window_get_active_conversation(win); |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4537 if (GAIM_GTK_CONVERSATION(c) == gtkconv) |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4538 return TRUE; |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4539 } |
c1906dc6257c
[gaim-migrate @ 13970]
Luke Schierer <lschiere@pidgin.im>
parents:
11672
diff
changeset
|
4540 return FALSE; |
9260
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4541 } |
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
4542 |
10526 | 4543 static gboolean |
4544 gaim_gtkconv_custom_smiley_add(GaimConversation *conv, const char *smile) | |
4545 { | |
4546 GaimGtkConversation *gtkconv; | |
4547 GtkIMHtmlSmiley *smiley; | |
4548 GdkPixbufLoader *loader; | |
11525 | 4549 struct smiley_list *list; |
4550 const char *sml = NULL, *conv_sml; | |
4551 | |
4552 if (!conv || !smile || !*smile) { | |
10526 | 4553 return FALSE; |
4554 } | |
4555 | |
11525 | 4556 /* If smileys are off, return false */ |
4557 if (gaim_gtkthemes_smileys_disabled()) | |
4558 return FALSE; | |
4559 | |
4560 /* If possible add this smiley to the current theme. | |
4561 * The addition is only temporary: custom smilies aren't saved to disk. */ | |
4562 conv_sml = gaim_account_get_protocol_name(conv->account); | |
10526 | 4563 gtkconv = GAIM_GTK_CONVERSATION(conv); |
11525 | 4564 |
4565 for (list = (struct smiley_list *)current_smiley_theme->list; list; list = list->next) { | |
4566 if (!strcmp(list->sml, conv_sml)) { | |
4567 sml = list->sml; | |
4568 break; | |
4569 } | |
4570 } | |
4571 | |
10526 | 4572 smiley = gtk_imhtml_smiley_get(GTK_IMHTML(gtkconv->imhtml), sml, smile); |
4573 | |
4574 if (smiley) { | |
11525 | 4575 |
4576 if (!(smiley->flags & GTK_IMHTML_SMILEY_CUSTOM)) { | |
4577 return FALSE; | |
4578 } | |
4579 | |
4580 /* Close the old GdkPixbufAnimation, then create a new one for | |
4581 * the smiley we are about to receive */ | |
4582 g_object_unref(G_OBJECT(smiley->icon)); | |
4583 | |
4584 smiley->loader = gdk_pixbuf_loader_new(); | |
4585 smiley->icon = gdk_pixbuf_loader_get_animation(smiley->loader); | |
4586 if (smiley->icon) | |
4587 g_object_ref(G_OBJECT(smiley->icon)); | |
4588 | |
4589 /* A custom smiley is already associated */ | |
4590 return TRUE; | |
10526 | 4591 } |
4592 | |
4593 loader = gdk_pixbuf_loader_new(); | |
4594 | |
4595 /* this is wrong, this file ought not call g_new on GtkIMHtmlSmiley */ | |
4596 /* 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
|
4597 GtkIMHtmlSmiley by opaque */ |
10526 | 4598 smiley = g_new0(GtkIMHtmlSmiley, 1); |
4599 smiley->file = NULL; | |
4600 smiley->smile = g_strdup(smile); | |
4601 smiley->loader = loader; | |
11525 | 4602 smiley->flags = smiley->flags | GTK_IMHTML_SMILEY_CUSTOM; |
10526 | 4603 |
4604 smiley->icon = gdk_pixbuf_loader_get_animation(loader); | |
4605 if (smiley->icon) | |
4606 g_object_ref(G_OBJECT(smiley->icon)); | |
4607 | |
11525 | 4608 |
10526 | 4609 gtk_imhtml_associate_smiley(GTK_IMHTML(gtkconv->imhtml), sml, smiley); |
10537 | 4610 |
10526 | 4611 return TRUE; |
4612 } | |
4613 | |
10537 | 4614 static void |
10526 | 4615 gaim_gtkconv_custom_smiley_write(GaimConversation *conv, const char *smile, |
11137 | 4616 const guchar *data, gsize size) |
10526 | 4617 { |
4618 GaimGtkConversation *gtkconv; | |
4619 GtkIMHtmlSmiley *smiley; | |
10537 | 4620 GdkPixbufLoader *loader; |
10526 | 4621 const char *sml; |
4622 | |
4623 sml = gaim_account_get_protocol_name(conv->account); | |
4624 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4625 smiley = gtk_imhtml_smiley_get(GTK_IMHTML(gtkconv->imhtml), sml, smile); | |
4626 | |
10537 | 4627 if (!smiley) |
10526 | 4628 return; |
10537 | 4629 |
10526 | 4630 loader = smiley->loader; |
10537 | 4631 if (!loader) |
10526 | 4632 return; |
4633 | |
4634 gdk_pixbuf_loader_write(loader, data, size, NULL); | |
4635 } | |
4636 | |
4637 static void | |
4638 gaim_gtkconv_custom_smiley_close(GaimConversation *conv, const char *smile) | |
4639 { | |
4640 GaimGtkConversation *gtkconv; | |
4641 GtkIMHtmlSmiley *smiley; | |
4642 GdkPixbufLoader *loader; | |
4643 const char *sml; | |
11525 | 4644 GtkWidget *icon = NULL; |
4645 GtkTextChildAnchor *anchor = NULL; | |
4646 GtkTextIter end; | |
4647 GtkIMHtml *imhtml; | |
4648 GSList *current = NULL; | |
10526 | 4649 |
4650 g_return_if_fail(conv != NULL); | |
4651 g_return_if_fail(smile != NULL); | |
4652 | |
4653 sml = gaim_account_get_protocol_name(conv->account); | |
4654 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
4655 smiley = gtk_imhtml_smiley_get(GTK_IMHTML(gtkconv->imhtml), sml, smile); | |
4656 | |
10537 | 4657 if (!smiley) |
10526 | 4658 return; |
4659 | |
4660 loader = smiley->loader; | |
4661 | |
10537 | 4662 if (!loader) |
10526 | 4663 return; |
10537 | 4664 |
11525 | 4665 smiley->icon = gdk_pixbuf_loader_get_animation(loader); |
4666 if (smiley->icon) | |
4667 g_object_ref(G_OBJECT(smiley->icon)); | |
4668 | |
4669 for (current = smiley->anchors; current != NULL; current = g_slist_next(current)) { | |
4670 | |
4671 icon = gtk_image_new_from_animation(smiley->icon); | |
4672 gtk_widget_show(icon); | |
4673 | |
4674 if (icon) { | |
4675 anchor = GTK_TEXT_CHILD_ANCHOR(current->data); | |
4676 | |
4677 g_object_set_data_full(G_OBJECT(anchor), "gtkimhtml_plaintext", g_strdup(gaim_unescape_html(smile)), g_free); | |
4678 g_object_set_data_full(G_OBJECT(anchor), "gtkimhtml_htmltext", g_strdup(smile), g_free); | |
4679 | |
4680 gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(gtkconv->imhtml), icon, anchor); | |
4681 } | |
4682 | |
4683 } | |
4684 | |
4685 g_slist_free(smiley->anchors); | |
4686 smiley->anchors = NULL; | |
4687 | |
4688 /* Scroll to the end of the widget in case the smiley height was big... */ | |
4689 /* FIXME: need to test this actually works, previous dealings with scrolling | |
4690 * makes me question it */ | |
4691 imhtml = GTK_IMHTML(gtkconv->imhtml); | |
4692 gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(imhtml->text_buffer), &end); | |
4693 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(gtkconv->imhtml), &end, 0, TRUE, 0, 0); | |
4694 | |
10526 | 4695 gaim_debug_info("gtkconv", "About to close the smiley pixbuf\n"); |
4696 | |
4697 gdk_pixbuf_loader_close(loader, NULL); | |
4698 g_object_unref(G_OBJECT(loader)); | |
4699 smiley->loader = NULL; | |
4700 } | |
4701 | |
11581 | 4702 /* |
4703 * Makes sure all the menu items and all the buttons are hidden/shown and | |
4704 * sensitive/insensitive. This is called after changing tabs and when an | |
4705 * account signs on or off. | |
4706 */ | |
4707 static void | |
4708 gray_stuff_out(GaimGtkConversation *gtkconv) | |
4709 { | |
4710 GaimGtkWindow *win; | |
4711 GaimConversation *conv = gtkconv->active_conv; | |
4712 GaimConnection *gc; | |
4713 GaimPluginProtocolInfo *prpl_info = NULL; | |
4714 GdkPixbuf *window_icon = NULL; | |
4715 GtkIMHtmlButtons buttons; | |
4716 GaimAccount *account; | |
4717 | |
4718 win = gaim_gtkconv_get_window(gtkconv); | |
4719 gc = gaim_conversation_get_gc(conv); | |
4720 account = gaim_conversation_get_account(conv); | |
4721 | |
4722 if (gc != NULL) | |
4723 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
4724 | |
11594 | 4725 if (win->menu.send_to != NULL) |
11734 | 4726 update_send_to_selection(win); |
11581 | 4727 |
4728 /* | |
4729 * Handle hiding and showing stuff based on what type of conv this is. | |
4730 * Stuff that Gaim IMs support in general should be shown for IM | |
4731 * conversations. Stuff that Gaim chats support in general should be | |
4732 * shown for chat conversations. It doesn't matter whether the PRPL | |
4733 * supports it or not--that only affects if the button or menu item | |
4734 * is sensitive or not. | |
4735 */ | |
4736 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { | |
4737 /* Show stuff that applies to IMs, hide stuff that applies to chats */ | |
4738 | |
4739 /* Deal with menu items */ | |
4740 gtk_widget_show(win->menu.view_log); | |
4741 gtk_widget_show(win->menu.send_file); | |
4742 gtk_widget_show(win->menu.add_pounce); | |
4743 gtk_widget_show(win->menu.get_info); | |
4744 gtk_widget_hide(win->menu.invite); | |
4745 gtk_widget_show(win->menu.alias); | |
4746 gtk_widget_show(win->menu.block); | |
4747 | |
4748 if (gaim_find_buddy(account, gaim_conversation_get_name(conv)) == NULL) { | |
4749 gtk_widget_show(win->menu.add); | |
4750 gtk_widget_hide(win->menu.remove); | |
4751 } else { | |
4752 gtk_widget_show(win->menu.remove); | |
4753 gtk_widget_hide(win->menu.add); | |
4754 } | |
4755 | |
4756 gtk_widget_show(win->menu.insert_link); | |
4757 gtk_widget_show(win->menu.insert_image); | |
4758 gtk_widget_show(win->menu.show_icon); | |
4759 } else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { | |
4760 /* Show stuff that applies to Chats, hide stuff that applies to IMs */ | |
4761 | |
4762 /* Deal with menu items */ | |
4763 gtk_widget_show(win->menu.view_log); | |
4764 gtk_widget_hide(win->menu.send_file); | |
4765 gtk_widget_hide(win->menu.add_pounce); | |
4766 gtk_widget_hide(win->menu.get_info); | |
4767 gtk_widget_show(win->menu.invite); | |
4768 gtk_widget_show(win->menu.alias); | |
4769 gtk_widget_hide(win->menu.block); | |
4770 gtk_widget_hide(win->menu.show_icon); | |
4771 | |
4772 if (gaim_blist_find_chat(account, gaim_conversation_get_name(conv)) == NULL) { | |
4773 /* If the chat is NOT in the buddy list */ | |
4774 gtk_widget_show(win->menu.add); | |
4775 gtk_widget_hide(win->menu.remove); | |
4776 } else { | |
4777 /* If the chat IS in the buddy list */ | |
4778 gtk_widget_hide(win->menu.add); | |
4779 gtk_widget_show(win->menu.remove); | |
4780 } | |
4781 | |
4782 gtk_widget_show(win->menu.insert_link); | |
4783 gtk_widget_hide(win->menu.insert_image); | |
4784 } | |
4785 | |
4786 /* | |
4787 * Handle graying stuff out based on whether an account is connected | |
4788 * and what features that account supports. | |
4789 */ | |
4790 if ((gc != NULL) && | |
4791 ( (gaim_conversation_get_type(conv) != GAIM_CONV_TYPE_CHAT) || | |
4792 !gaim_conv_chat_has_left(GAIM_CONV_CHAT(conv)) )) { | |
4793 /* Account is online */ | |
4794 /* Deal with the toolbar */ | |
4795 if (conv->features & GAIM_CONNECTION_HTML) { | |
4796 buttons = GTK_IMHTML_ALL; /* Everything on */ | |
4797 if (!(prpl_info->options & OPT_PROTO_IM_IMAGE) || | |
4798 conv->features & GAIM_CONNECTION_NO_IMAGES) | |
4799 buttons &= ~GTK_IMHTML_IMAGE; | |
4800 if (conv->features & GAIM_CONNECTION_NO_BGCOLOR) | |
4801 buttons &= ~GTK_IMHTML_BACKCOLOR; | |
4802 if (conv->features & GAIM_CONNECTION_NO_FONTSIZE) { | |
4803 buttons &= ~GTK_IMHTML_GROW; | |
4804 buttons &= ~GTK_IMHTML_SHRINK; | |
4805 } | |
4806 if (conv->features & GAIM_CONNECTION_NO_URLDESC) | |
4807 buttons &= ~GTK_IMHTML_LINKDESC; | |
4808 } else { | |
4809 buttons = GTK_IMHTML_SMILEY; | |
4810 } | |
4811 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); | |
4812 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), gaim_account_get_protocol_id(account)); | |
4813 | |
4814 /* Deal with menu items */ | |
4815 gtk_widget_set_sensitive(win->menu.view_log, TRUE); | |
4816 gtk_widget_set_sensitive(win->menu.add_pounce, TRUE); | |
4817 gtk_widget_set_sensitive(win->menu.get_info, (prpl_info->get_info != NULL)); | |
4818 gtk_widget_set_sensitive(win->menu.invite, (prpl_info->chat_invite != NULL)); | |
4819 gtk_widget_set_sensitive(win->menu.block, (prpl_info->add_deny != NULL)); | |
4820 gtk_widget_set_sensitive(win->menu.insert_link, (conv->features & GAIM_CONNECTION_HTML)); | |
4821 gtk_widget_set_sensitive(win->menu.insert_image, (prpl_info->options & OPT_PROTO_IM_IMAGE)); | |
4822 | |
4823 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) { | |
4824 gtk_widget_set_sensitive(win->menu.add, (prpl_info->add_buddy != NULL)); | |
4825 gtk_widget_set_sensitive(win->menu.remove, (prpl_info->remove_buddy != NULL)); | |
4826 gtk_widget_set_sensitive(win->menu.send_file, | |
4827 (prpl_info->send_file != NULL && (!prpl_info->can_receive_file || | |
4828 prpl_info->can_receive_file(gc, gaim_conversation_get_name(conv))))); | |
4829 gtk_widget_set_sensitive(win->menu.alias, | |
4830 (gaim_find_buddy(account, gaim_conversation_get_name(conv)) != NULL)); | |
4831 } else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) { | |
4832 gtk_widget_set_sensitive(win->menu.add, (prpl_info->join_chat != NULL)); | |
4833 gtk_widget_set_sensitive(win->menu.remove, (prpl_info->join_chat != NULL)); | |
4834 gtk_widget_set_sensitive(win->menu.alias, | |
4835 (gaim_blist_find_chat(account, gaim_conversation_get_name(conv)) != NULL)); | |
4836 } | |
4837 | |
4838 /* Deal with chat userlist buttons */ | |
4839 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) | |
4840 { | |
4841 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_im, TRUE); | |
4842 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_ignore, TRUE); | |
4843 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_info, (prpl_info->get_info != NULL)); | |
4844 } | |
4845 } else { | |
4846 /* Account is offline */ | |
4847 /* Or it's a chat that we've left. */ | |
4848 | |
4849 /* Then deal with menu items */ | |
4850 gtk_widget_set_sensitive(win->menu.view_log, TRUE); | |
4851 gtk_widget_set_sensitive(win->menu.send_file, FALSE); | |
4852 gtk_widget_set_sensitive(win->menu.add_pounce, TRUE); | |
4853 gtk_widget_set_sensitive(win->menu.get_info, FALSE); | |
4854 gtk_widget_set_sensitive(win->menu.invite, FALSE); | |
4855 gtk_widget_set_sensitive(win->menu.alias, FALSE); | |
4856 gtk_widget_set_sensitive(win->menu.block, FALSE); | |
4857 gtk_widget_set_sensitive(win->menu.add, FALSE); | |
4858 gtk_widget_set_sensitive(win->menu.remove, FALSE); | |
4859 gtk_widget_set_sensitive(win->menu.insert_link, TRUE); | |
4860 gtk_widget_set_sensitive(win->menu.insert_image, FALSE); | |
4861 | |
4862 /* Deal with chat userlist buttons */ | |
4863 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) | |
4864 { | |
4865 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_im, FALSE); | |
4866 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_ignore, FALSE); | |
4867 gtk_widget_set_sensitive(gtkconv->u.chat->userlist_info, FALSE); | |
4868 } | |
4869 } | |
4870 | |
4871 /* | |
4872 * Update the window's icon | |
4873 */ | |
4874 if ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) && | |
4875 (gtkconv->u.im->anim)) | |
4876 { | |
4877 window_icon = | |
4878 gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); | |
4879 g_object_ref(window_icon); | |
4880 } else { | |
4881 window_icon = gaim_gtkconv_get_tab_icon(conv, FALSE); | |
4882 } | |
4883 gtk_window_set_icon(GTK_WINDOW(win->window), window_icon); | |
4884 if (window_icon != NULL) | |
4885 g_object_unref(G_OBJECT(window_icon)); | |
4886 } | |
4887 | |
10526 | 4888 |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
4889 static void |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4890 gaim_gtkconv_updated(GaimConversation *conv, GaimConvUpdateType type) |
4359 | 4891 { |
11581 | 4892 GaimGtkWindow *win; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4893 GaimGtkConversation *gtkconv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
4894 GaimGtkChatPane *gtkchat; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4895 GaimConvChat *chat; |
4359 | 4896 |
10116 | 4897 g_return_if_fail(conv != NULL); |
4898 | |
4359 | 4899 gtkconv = GAIM_GTK_CONVERSATION(conv); |
11581 | 4900 win = gtkconv->win; |
10810 | 4901 conv = gtkconv->active_conv; /* Gross hack */ |
11581 | 4902 /* Maybe we should just ignore it if conv != gtkconv->active_conv, |
4903 * instead of the gross hack? | |
4904 */ | |
4359 | 4905 |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4906 if (type == GAIM_CONV_UPDATE_ACCOUNT) |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4907 { |
4359 | 4908 gaim_conversation_autoset_title(conv); |
5881
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
4909 |
11338 | 4910 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
5881
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
4911 gaim_gtkconv_update_buddy_icon(conv); |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
4912 |
4359 | 4913 gaim_gtkconv_update_buttons_by_protocol(conv); |
4914 | |
11734 | 4915 update_send_to_selection(win); |
4359 | 4916 |
11525 | 4917 gaim_gtkthemes_smiley_themeize(gtkconv->imhtml); |
6394 | 4918 |
6395 | 4919 update_tab_icon(conv); |
4359 | 4920 } |
4921 else if (type == GAIM_CONV_UPDATE_TYPING || | |
8155
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
4922 type == GAIM_CONV_UPDATE_UNSEEN || |
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
4923 type == GAIM_CONV_UPDATE_TITLE) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4924 { |
9472 | 4925 char *title; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4926 GaimConvIm *im = NULL; |
9472 | 4927 GaimConnection *gc = gaim_conversation_get_gc(conv); |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4928 /* 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
|
4929 char style[51]; |
4736 | 4930 |
11338 | 4931 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4932 im = GAIM_CONV_IM(conv); |
4359 | 4933 |
11338 | 4934 if (!gc || ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) |
9472 | 4935 && gaim_conv_chat_has_left(GAIM_CONV_CHAT(conv)))) |
4936 title = g_strdup_printf("(%s)", gaim_conversation_get_title(conv)); | |
4937 else | |
4938 title = g_strdup(gaim_conversation_get_title(conv)); | |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4939 |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4940 *style = '\0'; |
4359 | 4941 |
4942 if (!GTK_WIDGET_REALIZED(gtkconv->tab_label)) | |
4943 gtk_widget_realize(gtkconv->tab_label); | |
4944 | |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4945 if (im != NULL && |
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4946 gaim_conv_im_get_typing_state(im) == GAIM_TYPING) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4947 { |
11759 | 4948 strncpy(style, "color=\"#47A046\"", sizeof(style)); |
4359 | 4949 } |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4950 else if (im != NULL && |
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4951 gaim_conv_im_get_typing_state(im) == GAIM_TYPED) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4952 { |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4953 strncpy(style, "color=\"#D1940C\"", sizeof(style)); |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4954 } |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4955 else if (gtkconv->unseen_state == GAIM_UNSEEN_NICK) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4956 { |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4957 strncpy(style, "color=\"#0D4E91\" style=\"italic\" weight=\"bold\"", sizeof(style)); |
4359 | 4958 } |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4959 else if (gtkconv->unseen_state == GAIM_UNSEEN_TEXT) |
8252 | 4960 { |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4961 strncpy(style, "color=\"#DF421E\" weight=\"bold\"", sizeof(style)); |
8252 | 4962 } |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
4963 else if (gtkconv->unseen_state == GAIM_UNSEEN_EVENT) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4964 { |
11758 | 4965 strncpy(style, "color=\"#868272\" style=\"italic\"", sizeof(style)); |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4966 } |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4967 |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4968 if (*style != '\0') |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4969 { |
8536 | 4970 char *html_title,*label; |
4971 | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10698
diff
changeset
|
4972 html_title = g_markup_escape_text(title, -1); |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4973 |
11737
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4974 label = g_strdup_printf("<span %s>%s</span>", |
3959c29f340f
[gaim-migrate @ 14028]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11734
diff
changeset
|
4975 style, html_title); |
8536 | 4976 g_free(html_title); |
7995
87d3260f961a
[gaim-migrate @ 8672]
Christian Hammond <chipx86@chipx86.com>
parents:
7990
diff
changeset
|
4977 gtk_label_set_markup(GTK_LABEL(gtkconv->tab_label), label); |
87d3260f961a
[gaim-migrate @ 8672]
Christian Hammond <chipx86@chipx86.com>
parents:
7990
diff
changeset
|
4978 g_free(label); |
4359 | 4979 } |
7995
87d3260f961a
[gaim-migrate @ 8672]
Christian Hammond <chipx86@chipx86.com>
parents:
7990
diff
changeset
|
4980 else |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4981 gtk_label_set_text(GTK_LABEL(gtkconv->tab_label), title); |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4982 |
11581 | 4983 if (conv == gaim_gtk_conv_window_get_active_conversation(win)) |
10810 | 4984 update_typing_icon(gtkconv); |
8155
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
4985 |
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
4986 if (type == GAIM_CONV_UPDATE_TITLE) { |
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
4987 gtk_label_set_text(GTK_LABEL(gtkconv->menu_label), title); |
11581 | 4988 if (conv == gaim_gtk_conv_window_get_active_conversation(win)) |
4989 gtk_window_set_title(GTK_WINDOW(win->window), title); | |
8155
77d1252b3803
[gaim-migrate @ 8867]
Christian Hammond <chipx86@chipx86.com>
parents:
8143
diff
changeset
|
4990 } |
9472 | 4991 |
4992 g_free(title); | |
4359 | 4993 } |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4994 else if (type == GAIM_CONV_UPDATE_TOPIC) |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
4995 { |
7154 | 4996 const char *topic; |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7108
diff
changeset
|
4997 chat = GAIM_CONV_CHAT(conv); |
4359 | 4998 gtkchat = gtkconv->u.chat; |
4999 | |
7154 | 5000 topic = gaim_conv_chat_get_topic(chat); |
5001 | |
9554 | 5002 gtk_entry_set_text(GTK_ENTRY(gtkchat->topic_text), topic ? topic : ""); |
7154 | 5003 gtk_tooltips_set_tip(gtkconv->tooltips, gtkchat->topic_text, |
9554 | 5004 topic ? topic : "", NULL); |
4359 | 5005 } |
5006 else if (type == GAIM_CONV_ACCOUNT_ONLINE || | |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5007 type == GAIM_CONV_ACCOUNT_OFFLINE) |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5008 { |
11581 | 5009 gray_stuff_out(GAIM_GTK_CONVERSATION(gaim_gtk_conv_window_get_active_conversation(win))); |
11594 | 5010 generate_send_to_items(win); |
8946 | 5011 update_tab_icon(conv); |
9472 | 5012 gaim_conversation_autoset_title(conv); |
6392
e9974608b319
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
5013 } |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5014 else if (type == GAIM_CONV_UPDATE_AWAY) |
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5015 { |
8946 | 5016 update_tab_icon(conv); |
4359 | 5017 } |
8256
1d86096ae0f4
[gaim-migrate @ 8979]
Christian Hammond <chipx86@chipx86.com>
parents:
8253
diff
changeset
|
5018 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
|
5019 type == GAIM_CONV_UPDATE_CHATLEFT) |
8001
934f5df83b29
[gaim-migrate @ 8678]
Christian Hammond <chipx86@chipx86.com>
parents:
7996
diff
changeset
|
5020 { |
9472 | 5021 gaim_conversation_autoset_title(conv); |
10810 | 5022 gray_stuff_out(GAIM_GTK_CONVERSATION(conv)); |
4397
ce3a0eba91ef
[gaim-migrate @ 4666]
Christian Hammond <chipx86@chipx86.com>
parents:
4387
diff
changeset
|
5023 } |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5024 else if (type == GAIM_CONV_UPDATE_ICON) |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5025 { |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5026 gaim_gtkconv_update_buddy_icon(conv); |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5027 } |
10665 | 5028 else if (type == GAIM_CONV_UPDATE_FEATURES) |
5029 { | |
10810 | 5030 gray_stuff_out(GAIM_GTK_CONVERSATION(conv)); |
10665 | 5031 } |
4359 | 5032 } |
5033 | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5034 static GaimConversationUiOps conversation_ui_ops = |
4359 | 5035 { |
11581 | 5036 gaim_gtkconv_new, |
4359 | 5037 gaim_gtkconv_destroy, /* destroy_conversation */ |
5038 gaim_gtkconv_write_chat, /* write_chat */ | |
5039 gaim_gtkconv_write_im, /* write_im */ | |
5040 gaim_gtkconv_write_conv, /* write_conv */ | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
5041 gaim_gtkconv_chat_add_users, /* chat_add_users */ |
4359 | 5042 gaim_gtkconv_chat_rename_user, /* chat_rename_user */ |
5043 gaim_gtkconv_chat_remove_user, /* chat_remove_user */ | |
6407
ba0b99a72be2
[gaim-migrate @ 6913]
Christian Hammond <chipx86@chipx86.com>
parents:
6405
diff
changeset
|
5044 gaim_gtkconv_chat_remove_users, /* chat_remove_users */ |
9554 | 5045 gaim_gtkconv_chat_update_user, /* chat_update_user */ |
9260
947876140943
[gaim-migrate @ 10059]
Christian Hammond <chipx86@chipx86.com>
parents:
9247
diff
changeset
|
5046 gaim_gtkconv_has_focus, /* has_focus */ |
10526 | 5047 gaim_gtkconv_custom_smiley_add, /* custom_smiley_add */ |
5048 gaim_gtkconv_custom_smiley_write, /* custom_smiley_write */ | |
5049 gaim_gtkconv_custom_smiley_close, /* custom_smiley_close */ | |
4359 | 5050 gaim_gtkconv_updated /* updated */ |
5051 }; | |
5052 | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5053 GaimConversationUiOps * |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7008
diff
changeset
|
5054 gaim_gtk_conversations_get_conv_ui_ops(void) |
4359 | 5055 { |
4465
6e37eb000b7a
[gaim-migrate @ 4740]
Christian Hammond <chipx86@chipx86.com>
parents:
4454
diff
changeset
|
5056 return &conversation_ui_ops; |
4359 | 5057 } |
5058 | |
5059 /************************************************************************** | |
5060 * Public conversation utility functions | |
5061 **************************************************************************/ | |
5062 void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5063 gaim_gtkconv_update_buddy_icon(GaimConversation *conv) |
4359 | 5064 { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5065 GaimGtkConversation *gtkconv; |
11581 | 5066 GaimGtkWindow *win; |
4359 | 5067 |
10381 | 5068 GdkPixbufLoader *loader; |
5069 GdkPixbufAnimation *anim; | |
4359 | 5070 GError *err = NULL; |
5071 | |
6846
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5072 const void *data; |
8ab95f4c9800
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6771
diff
changeset
|
5073 size_t len; |
4359 | 5074 |
5075 GdkPixbuf *buf; | |
5076 | |
5077 GtkWidget *event; | |
5078 GtkWidget *frame; | |
5079 GdkPixbuf *scale; | |
5080 GdkPixmap *pm; | |
5081 GdkBitmap *bm; | |
9318 | 5082 int scale_width, scale_height; |
5083 | |
5084 GaimAccount *account; | |
5085 GaimPluginProtocolInfo *prpl_info = NULL; | |
4359 | 5086 |
9324 | 5087 GaimBuddyIcon *icon; |
5088 | |
5678
619bca773b2e
[gaim-migrate @ 6096]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
5089 g_return_if_fail(conv != NULL); |
619bca773b2e
[gaim-migrate @ 6096]
Christian Hammond <chipx86@chipx86.com>
parents:
5676
diff
changeset
|
5090 g_return_if_fail(GAIM_IS_GTK_CONVERSATION(conv)); |
11338 | 5091 g_return_if_fail(gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM); |
4359 | 5092 |
5093 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
11581 | 5094 win = gtkconv->win; |
10175 | 5095 |
9687 | 5096 if (!gtkconv->u.im->show_icon) |
5097 return; | |
5098 | |
9318 | 5099 account = gaim_conversation_get_account(conv); |
5100 if(account && account->gc) | |
5101 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl); | |
4359 | 5102 |
9845 | 5103 /* Remove the current icon stuff */ |
9885 | 5104 if (gtkconv->u.im->icon_container != NULL) |
5105 gtk_widget_destroy(gtkconv->u.im->icon_container); | |
5106 gtkconv->u.im->icon_container = NULL; | |
9845 | 5107 |
5108 if (gtkconv->u.im->anim != NULL) | |
5109 g_object_unref(G_OBJECT(gtkconv->u.im->anim)); | |
5110 | |
9887 | 5111 gtkconv->u.im->anim = NULL; |
5112 | |
9845 | 5113 if (gtkconv->u.im->icon_timer != 0) |
5114 g_source_remove(gtkconv->u.im->icon_timer); | |
5115 | |
5116 gtkconv->u.im->icon_timer = 0; | |
5117 | |
5118 if (gtkconv->u.im->iter != NULL) | |
5119 g_object_unref(G_OBJECT(gtkconv->u.im->iter)); | |
4359 | 5120 |
10116 | 5121 gtkconv->u.im->iter = NULL; |
5122 | |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5484
diff
changeset
|
5123 if (!gaim_prefs_get_bool("/gaim/gtk/conversations/im/show_buddy_icons")) |
4359 | 5124 return; |
5125 | |
5126 if (gaim_conversation_get_gc(conv) == NULL) | |
5127 return; | |
5128 | |
9324 | 5129 icon = gaim_conv_im_get_icon(GAIM_CONV_IM(conv)); |
5130 | |
5131 if (icon == NULL) | |
5132 return; | |
5133 | |
5134 data = gaim_buddy_icon_get_data(icon, &len); | |
5135 | |
10381 | 5136 loader = gdk_pixbuf_loader_new(); |
5137 gdk_pixbuf_loader_write(loader, data, len, NULL); | |
5138 anim = gdk_pixbuf_loader_get_animation(loader); | |
5139 if (anim) | |
5140 g_object_ref(G_OBJECT(anim)); | |
5141 gdk_pixbuf_loader_close(loader, &err); | |
5142 g_object_unref(loader); | |
5143 | |
5144 if (!anim) | |
9324 | 5145 return; |
10381 | 5146 gtkconv->u.im->anim = anim; |
9324 | 5147 |
4359 | 5148 if (err) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
5149 gaim_debug(GAIM_DEBUG_ERROR, "gtkconv", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
5150 "Buddy icon error: %s\n", err->message); |
4359 | 5151 g_error_free(err); |
5152 } | |
5153 | |
5154 if (!gtkconv->u.im->anim) | |
5155 return; | |
5156 | |
5157 if (gdk_pixbuf_animation_is_static_image(gtkconv->u.im->anim)) { | |
5158 gtkconv->u.im->iter = NULL; | |
5159 buf = gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); | |
5160 } else { | |
5161 gtkconv->u.im->iter = | |
8496 | 5162 gdk_pixbuf_animation_get_iter(gtkconv->u.im->anim, NULL); /* LEAK */ |
4359 | 5163 buf = gdk_pixbuf_animation_iter_get_pixbuf(gtkconv->u.im->iter); |
8189 | 5164 if (gtkconv->u.im->animate) |
10810 | 5165 start_anim(NULL, gtkconv); |
4359 | 5166 } |
5167 | |
10483 | 5168 gaim_gtk_buddy_icon_get_scale_size(buf, prpl_info ? &prpl_info->icon_spec : |
9318 | 5169 NULL, &scale_width, &scale_height); |
4359 | 5170 scale = gdk_pixbuf_scale_simple(buf, |
9318 | 5171 MAX(gdk_pixbuf_get_width(buf) * scale_width / |
4359 | 5172 gdk_pixbuf_animation_get_width(gtkconv->u.im->anim), 1), |
9318 | 5173 MAX(gdk_pixbuf_get_height(buf) * scale_height / |
4359 | 5174 gdk_pixbuf_animation_get_height(gtkconv->u.im->anim), 1), |
11324 | 5175 GDK_INTERP_BILINEAR); |
4359 | 5176 |
5177 gdk_pixbuf_render_pixmap_and_mask(scale, &pm, &bm, 100); | |
4793 | 5178 g_object_unref(G_OBJECT(scale)); |
4359 | 5179 |
8821 | 5180 |
9885 | 5181 gtkconv->u.im->icon_container = gtk_vbox_new(FALSE, 0); |
8821 | 5182 |
4359 | 5183 frame = gtk_frame_new(NULL); |
5184 gtk_frame_set_shadow_type(GTK_FRAME(frame), | |
5185 (bm ? GTK_SHADOW_NONE : GTK_SHADOW_IN)); | |
9885 | 5186 gtk_box_pack_start(GTK_BOX(gtkconv->u.im->icon_container), frame, |
5187 FALSE, FALSE, 0); | |
8821 | 5188 |
4359 | 5189 event = gtk_event_box_new(); |
5190 gtk_container_add(GTK_CONTAINER(frame), event); | |
5314
1f901484599d
[gaim-migrate @ 5686]
Christian Hammond <chipx86@chipx86.com>
parents:
5228
diff
changeset
|
5191 g_signal_connect(G_OBJECT(event), "button-press-event", |
10883
b0fdadf463d4
[gaim-migrate @ 12581]
Gary Kramlich <grim@reaperworld.com>
parents:
10879
diff
changeset
|
5192 G_CALLBACK(icon_menu), gtkconv); |
4359 | 5193 gtk_widget_show(event); |
5194 | |
4635 | 5195 gtkconv->u.im->icon = gtk_image_new_from_pixmap(pm, bm); |
9318 | 5196 gtk_widget_set_size_request(gtkconv->u.im->icon, scale_width, scale_height); |
4359 | 5197 gtk_container_add(GTK_CONTAINER(event), gtkconv->u.im->icon); |
5198 gtk_widget_show(gtkconv->u.im->icon); | |
5199 | |
4793 | 5200 g_object_unref(G_OBJECT(pm)); |
4359 | 5201 |
5202 if (bm) | |
4793 | 5203 g_object_unref(G_OBJECT(bm)); |
7143 | 5204 |
10356 | 5205 gtk_box_pack_start(GTK_BOX(gtkconv->lower_hbox), |
5206 gtkconv->u.im->icon_container, FALSE, FALSE, 0); | |
9332 | 5207 |
9885 | 5208 gtk_widget_show(gtkconv->u.im->icon_container); |
9332 | 5209 gtk_widget_show(frame); |
5210 | |
7143 | 5211 /* The buddy icon code needs badly to be fixed. */ |
5212 buf = gdk_pixbuf_animation_get_static_image(gtkconv->u.im->anim); | |
11581 | 5213 if(conv == gaim_gtk_conv_window_get_active_conversation(gtkconv->win)) |
5214 gtk_window_set_icon(GTK_WINDOW(win->window), buf); | |
4359 | 5215 } |
5216 | |
5217 void | |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5218 gaim_gtkconv_update_buttons_by_protocol(GaimConversation *conv) |
4359 | 5219 { |
11581 | 5220 GaimGtkWindow *win; |
4359 | 5221 |
4398
a8249a5250b6
[gaim-migrate @ 4667]
Christian Hammond <chipx86@chipx86.com>
parents:
4397
diff
changeset
|
5222 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
4359 | 5223 return; |
5224 | |
11581 | 5225 win = GAIM_GTK_CONVERSATION(conv)->win; |
5226 | |
5227 if (win != NULL && gaim_gtk_conv_window_is_active_conversation(conv)) | |
10810 | 5228 gray_stuff_out(GAIM_GTK_CONVERSATION(conv)); |
4359 | 5229 } |
5230 | |
5231 int | |
11614 | 5232 gaim_gtkconv_get_tab_at_xy(GaimGtkWindow *win, int x, int y, gboolean *to_right) |
11581 | 5233 { |
4359 | 5234 gint nb_x, nb_y, x_rel, y_rel; |
5235 GtkNotebook *notebook; | |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5236 GtkWidget *page, *tab; |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5237 gint i, page_num = -1; |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5238 gint count; |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5239 gboolean horiz; |
4359 | 5240 |
11614 | 5241 if (to_right) |
5242 *to_right = FALSE; | |
5243 | |
11581 | 5244 notebook = GTK_NOTEBOOK(win->notebook); |
5245 | |
5246 gdk_window_get_origin(win->notebook->window, &nb_x, &nb_y); | |
4359 | 5247 x_rel = x - nb_x; |
5248 y_rel = y - nb_y; | |
5249 | |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5250 horiz = (gtk_notebook_get_tab_pos(notebook) == GTK_POS_TOP || |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5251 gtk_notebook_get_tab_pos(notebook) == GTK_POS_BOTTOM); |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5252 |
11780 | 5253 #if GTK_CHECK_VERSION(2,2,0) |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5254 count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); |
11780 | 5255 #else |
5256 /* this is hacky, but it's only for Gtk 2.0.0... */ | |
5257 count = g_list_length(GTK_NOTEBOOK(notebook)->children); | |
5258 #endif | |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5259 |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5260 for (i = 0; i < count; i++) { |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5261 |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5262 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), i); |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5263 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), page); |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5264 |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5265 if (horiz) { |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5266 if (x_rel >= tab->allocation.x - GAIM_HIG_BOX_SPACE && |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5267 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
|
5268 page_num = i; |
11614 | 5269 |
5270 if (to_right && x_rel >= tab->allocation.x + tab->allocation.width/2) | |
5271 *to_right = TRUE; | |
5272 | |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5273 break; |
4359 | 5274 } |
11279
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5275 } else { |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5276 if (y_rel >= tab->allocation.y - GAIM_HIG_BOX_SPACE && |
ed5302df41b0
[gaim-migrate @ 13474]
Luke Schierer <lschiere@pidgin.im>
parents:
11276
diff
changeset
|
5277 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
|
5278 page_num = i; |
11614 | 5279 |
5280 if (to_right && y_rel >= tab->allocation.y + tab->allocation.height/2) | |
5281 *to_right = TRUE; | |
5282 | |
4359 | 5283 break; |
5284 } | |
5285 } | |
5286 } | |
5287 | |
5288 return page_num; | |
5289 } | |
5290 | |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5291 static void |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5292 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
|
5293 gpointer data) |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5294 { |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5295 GList *l; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5296 GaimConversation *conv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5297 GaimGtkConversation *gtkconv; |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5298 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5299 for (l = gaim_get_conversations(); l != NULL; l = l->next) { |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5300 conv = (GaimConversation *)l->data; |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5301 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5302 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5303 continue; |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5304 |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5305 gtkconv = GAIM_GTK_CONVERSATION(conv); |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5306 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5307 if (value) |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5308 gtk_widget_show(gtkconv->close); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5309 else |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5310 gtk_widget_hide(gtkconv->close); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5311 } |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5312 } |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5313 |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5314 static void |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5315 spellcheck_pref_cb(const char *name, GaimPrefType type, gpointer value, |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5316 gpointer data) |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5317 { |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5318 #ifdef USE_GTKSPELL |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5319 GList *cl; |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5320 GaimConversation *conv; |
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5321 GaimGtkConversation *gtkconv; |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5322 GtkSpell *spell; |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5323 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5324 for (cl = gaim_get_conversations(); cl != NULL; cl = cl->next) { |
6725
e62a504c83d0
[gaim-migrate @ 7252]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
5325 |
5676
dae79aefac8d
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5675
diff
changeset
|
5326 conv = (GaimConversation *)cl->data; |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5327 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5328 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5329 continue; |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5330 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5331 gtkconv = GAIM_GTK_CONVERSATION(conv); |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5332 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5333 if (value) |
7538
357eb1c39b72
[gaim-migrate @ 8151]
Christian Hammond <chipx86@chipx86.com>
parents:
7476
diff
changeset
|
5334 gaim_gtk_setup_gtkspell(GTK_TEXT_VIEW(gtkconv->entry)); |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5335 else { |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5336 spell = gtkspell_get_from_text_view(GTK_TEXT_VIEW(gtkconv->entry)); |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5337 gtkspell_detach(spell); |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5338 } |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5339 } |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5340 #endif |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5341 } |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5342 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5343 static void |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5344 tab_side_pref_cb(const char *name, GaimPrefType type, gpointer value, |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5345 gpointer data) |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5346 { |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5347 GList *l; |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5348 GtkPositionType pos; |
11581 | 5349 GaimGtkWindow *win; |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5350 |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5351 pos = GPOINTER_TO_INT(value); |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5352 |
11581 | 5353 for (l = gaim_gtk_conv_windows_get_list(); l != NULL; l = l->next) { |
5354 win = l->data; | |
5355 | |
11619 | 5356 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
|
5357 } |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5358 } |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5359 |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5360 static void |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5361 show_formatting_toolbar_pref_cb(const char *name, GaimPrefType type, |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5362 gpointer value, gpointer data) |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5363 { |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5364 GList *l; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5365 GaimConversation *conv; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5366 GaimGtkConversation *gtkconv; |
11581 | 5367 GaimGtkWindow *win; |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5368 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5369 for (l = gaim_get_conversations(); l != NULL; l = l->next) |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5370 { |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5371 conv = (GaimConversation *)l->data; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5372 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5373 if (!GAIM_IS_GTK_CONVERSATION(conv)) |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5374 continue; |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5375 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5376 gtkconv = GAIM_GTK_CONVERSATION(conv); |
11581 | 5377 win = gtkconv->win; |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5378 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5379 gtk_check_menu_item_set_active( |
11581 | 5380 GTK_CHECK_MENU_ITEM(win->menu.show_formatting_toolbar), |
5381 (gboolean)GPOINTER_TO_INT(value)); | |
10377 | 5382 |
5383 if ((gboolean)GPOINTER_TO_INT(value)) | |
8317 | 5384 gtk_widget_show(gtkconv->toolbar); |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5385 else |
8317 | 5386 gtk_widget_hide(gtkconv->toolbar); |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5387 } |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5388 } |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5389 |
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5390 static void |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5391 animate_buddy_icons_pref_cb(const char *name, GaimPrefType type, |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5392 gpointer value, gpointer data) |
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 GList *l; |
8189 | 5395 GaimConversation *conv; |
5396 GaimGtkConversation *gtkconv; | |
11581 | 5397 GaimGtkWindow *win; |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5398 |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5399 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
|
5400 return; |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5401 |
8189 | 5402 /* Set the "animate" flag for each icon based on the new preference */ |
5403 for (l = gaim_get_ims(); l != NULL; l = l->next) { | |
5404 conv = (GaimConversation *)l->data; | |
5405 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
10112 | 5406 gtkconv->u.im->animate = GPOINTER_TO_INT(value); |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5407 } |
8189 | 5408 |
5409 /* Now either stop or start animation for the active conversation in each window */ | |
11581 | 5410 for (l = gaim_gtk_conv_windows_get_list(); l != NULL; l = l->next) { |
5411 win = l->data; | |
5412 conv = gaim_gtk_conv_window_get_active_conversation(win); | |
8189 | 5413 gaim_gtkconv_update_buddy_icon(conv); |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5414 } |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5415 } |
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5416 |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5417 static void |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5418 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
|
5419 gpointer data) |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5420 { |
5881
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5421 GList *l; |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5422 |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5423 for (l = gaim_get_conversations(); l != NULL; l = l->next) { |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5424 GaimConversation *conv = l->data; |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5425 |
11338 | 5426 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) |
5881
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5427 gaim_conversation_foreach(gaim_gtkconv_update_buddy_icon); |
cc7870e1e3b3
[gaim-migrate @ 6313]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
5428 } |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5429 } |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5430 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5680
diff
changeset
|
5431 static void |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5432 conv_placement_pref_cb(const char *name, GaimPrefType type, |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5433 gpointer value, gpointer data) |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5434 { |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5435 GaimConvPlacementFunc func; |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5436 |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5437 if (strcmp(name, "/gaim/gtk/conversations/placement")) |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5438 return; |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5439 |
11581 | 5440 func = gaim_gtkconv_placement_get_fnc(value); |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5441 |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5442 if (func == NULL) |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5443 return; |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5444 |
11581 | 5445 gaim_gtkconv_placement_set_current_func(func); |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5446 } |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5447 |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5448 void * |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5449 gaim_gtk_conversations_get_handle(void) |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5450 { |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5451 static int handle; |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5452 |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5453 return &handle; |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5454 } |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5455 |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5456 void |
7035
feb3d21a7794
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7008
diff
changeset
|
5457 gaim_gtk_conversations_init(void) |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5458 { |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5459 void *handle = gaim_gtk_conversations_get_handle(); |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5460 |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5461 /* Conversations */ |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5462 gaim_prefs_add_none("/gaim/gtk/conversations"); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5463 gaim_prefs_add_bool("/gaim/gtk/conversations/close_on_tabs", TRUE); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5464 gaim_prefs_add_bool("/gaim/gtk/conversations/send_bold", FALSE); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5465 gaim_prefs_add_bool("/gaim/gtk/conversations/send_italic", FALSE); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5466 gaim_prefs_add_bool("/gaim/gtk/conversations/send_underline", FALSE); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5467 gaim_prefs_add_bool("/gaim/gtk/conversations/spellcheck", TRUE); |
11267
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
5468 gaim_prefs_add_bool("/gaim/gtk/conversations/show_incoming_formatting", TRUE); |
477e5cca8287
[gaim-migrate @ 13449]
Richard Laager <rlaager@wiktel.com>
parents:
11261
diff
changeset
|
5469 |
7326
00a9ab26d607
[gaim-migrate @ 7912]
Christian Hammond <chipx86@chipx86.com>
parents:
7322
diff
changeset
|
5470 gaim_prefs_add_bool("/gaim/gtk/conversations/show_formatting_toolbar", TRUE); |
9832 | 5471 gaim_prefs_add_bool("/gaim/gtk/conversations/passthrough_unknown_commands", FALSE); |
9130 | 5472 |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5473 gaim_prefs_add_string("/gaim/gtk/conversations/placement", "last"); |
8998 | 5474 gaim_prefs_add_int("/gaim/gtk/conversations/placement_number", 1); |
9025 | 5475 gaim_prefs_add_string("/gaim/gtk/conversations/bgcolor", ""); |
5476 gaim_prefs_add_string("/gaim/gtk/conversations/fgcolor", ""); | |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5477 gaim_prefs_add_string("/gaim/gtk/conversations/font_face", ""); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5478 gaim_prefs_add_int("/gaim/gtk/conversations/font_size", 3); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5479 gaim_prefs_add_bool("/gaim/gtk/conversations/tabs", TRUE); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5480 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
|
5481 gaim_prefs_add_int("/gaim/gtk/conversations/scrollback_lines", 4000); |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5482 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5483 /* Conversations -> Chat */ |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5484 gaim_prefs_add_none("/gaim/gtk/conversations/chat"); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5485 gaim_prefs_add_int("/gaim/gtk/conversations/chat/default_width", 410); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5486 gaim_prefs_add_int("/gaim/gtk/conversations/chat/default_height", 160); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5487 gaim_prefs_add_int("/gaim/gtk/conversations/chat/entry_height", 50); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5488 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5489 /* Conversations -> IM */ |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5490 gaim_prefs_add_none("/gaim/gtk/conversations/im"); |
9150 | 5491 |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5492 gaim_prefs_add_bool("/gaim/gtk/conversations/im/animate_buddy_icons", TRUE); |
9150 | 5493 |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5494 gaim_prefs_add_int("/gaim/gtk/conversations/im/default_width", 410); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5495 gaim_prefs_add_int("/gaim/gtk/conversations/im/default_height", 160); |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5496 gaim_prefs_add_int("/gaim/gtk/conversations/im/entry_height", 50); |
9319 | 5497 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
|
5498 |
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5499 /* Connect callbacks. */ |
10087 | 5500 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
|
5501 close_on_tabs_pref_cb, NULL); |
10087 | 5502 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
|
5503 show_formatting_toolbar_pref_cb, NULL); |
10087 | 5504 gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/spellcheck", |
5674
2d86a5fa6fef
[gaim-migrate @ 6092]
Christian Hammond <chipx86@chipx86.com>
parents:
5673
diff
changeset
|
5505 spellcheck_pref_cb, NULL); |
10087 | 5506 gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/tab_side", |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5507 tab_side_pref_cb, NULL); |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5508 |
10087 | 5509 gaim_prefs_connect_callback(handle, "/gaim/gtk/conversations/placement", |
7561
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5510 conv_placement_pref_cb, NULL); |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5511 gaim_prefs_trigger_callback("/gaim/gtk/conversations/placement"); |
cdfdbabd3266
[gaim-migrate @ 8175]
Christian Hammond <chipx86@chipx86.com>
parents:
7538
diff
changeset
|
5512 |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5513 /* IM callbacks */ |
10087 | 5514 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
|
5515 animate_buddy_icons_pref_cb, NULL); |
10087 | 5516 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
|
5517 show_buddy_icons_pref_cb, NULL); |
5675
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5518 |
17e345ffeddb
[gaim-migrate @ 6093]
Christian Hammond <chipx86@chipx86.com>
parents:
5674
diff
changeset
|
5519 |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5520 /********************************************************************** |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5521 * Register signals |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5522 **********************************************************************/ |
11447
ef6e94bdda08
[gaim-migrate @ 13686]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11338
diff
changeset
|
5523 gaim_signal_register(handle, "conversation-dragging", |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5524 gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5525 gaim_value_new(GAIM_TYPE_SUBTYPE, |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5526 GAIM_SUBTYPE_CONV_WINDOW), |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5527 gaim_value_new(GAIM_TYPE_SUBTYPE, |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5528 GAIM_SUBTYPE_CONV_WINDOW)); |
9167 | 5529 |
5530 /********************************************************************** | |
5531 * Register commands | |
5532 **********************************************************************/ | |
9829 | 5533 gaim_cmd_register("say", "S", GAIM_CMD_P_DEFAULT, |
5534 GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, | |
5535 say_command_cb, _("say <message>: Send a message normally as if you weren't using a command."), NULL); | |
9213 | 5536 gaim_cmd_register("me", "S", GAIM_CMD_P_DEFAULT, |
5537 GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, | |
9597 | 5538 me_command_cb, _("me <action>: Send an IRC style action to a buddy or chat."), NULL); |
9213 | 5539 gaim_cmd_register("debug", "w", GAIM_CMD_P_DEFAULT, |
5540 GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, | |
9597 | 5541 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
|
5542 gaim_cmd_register("clear", "", GAIM_CMD_P_DEFAULT, |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
5543 GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM, NULL, |
dbc518c453f2
[gaim-migrate @ 13209]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11137
diff
changeset
|
5544 clear_command_cb, _("clear: Clears the conversation scrollback."), NULL); |
9213 | 5545 gaim_cmd_register("help", "w", GAIM_CMD_P_DEFAULT, |
9597 | 5546 GAIM_CMD_FLAG_CHAT | GAIM_CMD_FLAG_IM | GAIM_CMD_FLAG_ALLOW_WRONG_ARGS, NULL, |
5547 help_command_cb, _("help <command>: Help on a specific command."), NULL); | |
11581 | 5548 |
5549 gaim_conversations_set_ui_ops(&conversation_ui_ops); | |
5673
62f57ec16f29
[gaim-migrate @ 6091]
Christian Hammond <chipx86@chipx86.com>
parents:
5629
diff
changeset
|
5550 } |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5551 |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5552 void |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5553 gaim_gtk_conversations_uninit(void) |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5554 { |
10443 | 5555 gaim_prefs_disconnect_by_handle(gaim_gtk_conversations_get_handle()); |
8582
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5556 gaim_signals_unregister_by_instance(gaim_gtk_conversations_get_handle()); |
d7c85220c685
[gaim-migrate @ 9332]
Christian Hammond <chipx86@chipx86.com>
parents:
8573
diff
changeset
|
5557 } |
11581 | 5558 |
5559 | |
5560 | |
5561 | |
5562 | |
5563 | |
5564 | |
5565 | |
5566 | |
5567 | |
5568 | |
5569 | |
5570 | |
5571 | |
5572 | |
5573 | |
5574 /* down here is where gtkconvwin.c ought to start. except they share like every freaking function, | |
5575 * and touch each others' private members all day long */ | |
5576 | |
5577 /** | |
5578 * @file gtkconvwin.c GTK+ Conversation Window API | |
5579 * @ingroup gtkui | |
5580 * | |
5581 * gaim | |
5582 * | |
5583 * Gaim is the legal property of its developers, whose names are too numerous | |
5584 * to list here. Please refer to the COPYRIGHT file distributed with this | |
5585 * source distribution. | |
5586 * | |
5587 * This program is free software; you can redistribute it and/or modify | |
5588 * it under the terms of the GNU General Public License as published by | |
5589 * the Free Software Foundation; either version 2 of the License, or | |
5590 * (at your option) any later version. | |
5591 * | |
5592 * This program is distributed in the hope that it will be useful, | |
5593 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
5594 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
5595 * GNU General Public License for more details. | |
5596 * | |
5597 * You should have received a copy of the GNU General Public License | |
5598 * along with this program; if not, write to the Free Software | |
5599 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
5600 * | |
5601 */ | |
5602 #include "internal.h" | |
5603 #include "gtkgaim.h" | |
5604 | |
5605 | |
5606 #include <gdk/gdkkeysyms.h> | |
5607 | |
5608 #include "account.h" | |
5609 #include "cmds.h" | |
5610 #include "debug.h" | |
5611 #include "imgstore.h" | |
5612 #include "log.h" | |
5613 #include "notify.h" | |
5614 #include "prpl.h" | |
5615 #include "request.h" | |
5616 #include "util.h" | |
5617 | |
5618 #include "gtkdnd-hints.h" | |
5619 #include "gtkblist.h" | |
5620 #include "gtkconv.h" | |
5621 #include "gtkdialogs.h" | |
5622 #include "gtkmenutray.h" | |
5623 #include "gtkpounce.h" | |
5624 #include "gtkprefs.h" | |
5625 #include "gtkprivacy.h" | |
5626 #include "gtkutils.h" | |
5627 #include "gtkstock.h" | |
5628 #include "gtkimhtml.h" | |
5629 #include "gtkimhtmltoolbar.h" | |
5630 | |
5631 static void | |
5632 do_close(GtkWidget *w, int resp, GaimGtkWindow *win) | |
5633 { | |
5634 gtk_widget_destroy(warn_close_dialog); | |
5635 warn_close_dialog = NULL; | |
5636 | |
5637 if (resp == GTK_RESPONSE_OK) | |
5638 gaim_gtk_conv_window_destroy(win); | |
5639 } | |
5640 | |
5641 static void | |
5642 build_warn_close_dialog(GaimGtkWindow *gtkwin) | |
5643 { | |
5644 GtkWidget *label; | |
5645 GtkWidget *vbox, *hbox; | |
5646 GtkWidget *img; | |
5647 | |
5648 g_return_if_fail(warn_close_dialog == NULL); | |
5649 | |
5650 | |
5651 warn_close_dialog = gtk_dialog_new_with_buttons( | |
5652 _("Confirm close"), | |
5653 GTK_WINDOW(gtkwin->window), GTK_DIALOG_MODAL, | |
5654 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
5655 GTK_STOCK_CLOSE, GTK_RESPONSE_OK, NULL); | |
5656 | |
5657 gtk_dialog_set_default_response(GTK_DIALOG(warn_close_dialog), | |
5658 GTK_RESPONSE_OK); | |
5659 | |
5660 gtk_container_set_border_width(GTK_CONTAINER(warn_close_dialog), | |
5661 6); | |
5662 gtk_window_set_resizable(GTK_WINDOW(warn_close_dialog), FALSE); | |
5663 gtk_dialog_set_has_separator(GTK_DIALOG(warn_close_dialog), | |
5664 FALSE); | |
5665 | |
5666 /* Setup the outside spacing. */ | |
5667 vbox = GTK_DIALOG(warn_close_dialog)->vbox; | |
5668 | |
5669 gtk_box_set_spacing(GTK_BOX(vbox), 12); | |
5670 gtk_container_set_border_width(GTK_CONTAINER(vbox), 6); | |
5671 | |
5672 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_WARNING, | |
5673 GTK_ICON_SIZE_DIALOG); | |
5674 /* Setup the inner hbox and put the dialog's icon in it. */ | |
5675 hbox = gtk_hbox_new(FALSE, 12); | |
5676 gtk_container_add(GTK_CONTAINER(vbox), hbox); | |
5677 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
5678 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
5679 | |
5680 /* Setup the right vbox. */ | |
5681 vbox = gtk_vbox_new(FALSE, 12); | |
5682 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
5683 | |
5684 label = gtk_label_new(_("You have unread messages. Are you sure you want to close the window?")); | |
5685 gtk_widget_set_size_request(label, 350, -1); | |
5686 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
5687 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
5688 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
5689 | |
5690 /* Connect the signals. */ | |
5691 g_signal_connect(G_OBJECT(warn_close_dialog), "response", | |
5692 G_CALLBACK(do_close), gtkwin); | |
5693 | |
5694 } | |
5695 | |
5696 /************************************************************************** | |
5697 * Callbacks | |
5698 **************************************************************************/ | |
5699 | |
5700 static gboolean | |
5701 close_win_cb(GtkWidget *w, GdkEventAny *e, gpointer d) | |
5702 { | |
5703 GaimGtkWindow *win = d; | |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5704 GList *l; |
11581 | 5705 |
5706 /* If there are unread messages then show a warning dialog */ | |
5707 for (l = gaim_gtk_conv_window_get_gtkconvs(win); | |
5708 l != NULL; l = l->next) | |
5709 { | |
5710 GaimGtkConversation *gtkconv = l->data; | |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5711 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
|
5712 gtkconv->unseen_state == GAIM_UNSEEN_TEXT) |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5713 { |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5714 build_warn_close_dialog(win); |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5715 gtk_widget_show_all(warn_close_dialog); |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5716 |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5717 return TRUE; |
11581 | 5718 } |
5719 } | |
5720 | |
5721 gaim_gtk_conv_window_destroy(win); | |
5722 | |
5723 return TRUE; | |
5724 } | |
5725 | |
11604 | 5726 static void |
5727 gtkconv_set_unseen(GaimGtkConversation *gtkconv, GaimUnseenState state) | |
5728 { | |
11664
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5729 gtkconv->unseen_state = state; |
38bbb0f15453
[gaim-migrate @ 13949]
Luke Schierer <lschiere@pidgin.im>
parents:
11657
diff
changeset
|
5730 |
11671
4ebd27e664c4
[gaim-migrate @ 13957]
Luke Schierer <lschiere@pidgin.im>
parents:
11669
diff
changeset
|
5731 gaim_conversation_update(gtkconv->active_conv, GAIM_CONV_UPDATE_UNSEEN); |
11604 | 5732 } |
11581 | 5733 /* |
5734 * When a conversation window is focused, we know the user | |
5735 * has looked at it so we know there are no longer unseen | |
5736 * messages. | |
5737 */ | |
5738 static gint | |
5739 focus_win_cb(GtkWidget *w, GdkEventFocus *e, gpointer d) | |
5740 { | |
5741 GaimGtkWindow *win = d; | |
11604 | 5742 GaimGtkConversation *gtkconv = gaim_gtk_conv_window_get_active_gtkconv(win); |
5743 | |
5744 gtkconv_set_unseen(gtkconv, GAIM_UNSEEN_NONE); | |
11581 | 5745 |
5746 return FALSE; | |
5747 } | |
5748 | |
5749 /* Courtesy of Galeon! */ | |
5750 static void | |
5751 tab_close_button_state_changed_cb(GtkWidget *widget, GtkStateType prev_state) | |
5752 { | |
5753 if (GTK_WIDGET_STATE(widget) == GTK_STATE_ACTIVE) | |
5754 gtk_widget_set_state(widget, GTK_STATE_NORMAL); | |
5755 } | |
5756 | |
5757 static void | |
5758 notebook_init_grab(GaimGtkWindow *gtkwin, GtkWidget *widget) | |
5759 { | |
5760 static GdkCursor *cursor = NULL; | |
5761 | |
5762 gtkwin->in_drag = TRUE; | |
5763 | |
5764 if (gtkwin->drag_leave_signal) { | |
5765 g_signal_handler_disconnect(G_OBJECT(widget), | |
5766 gtkwin->drag_leave_signal); | |
5767 gtkwin->drag_leave_signal = 0; | |
5768 } | |
5769 | |
5770 if (cursor == NULL) | |
5771 cursor = gdk_cursor_new(GDK_FLEUR); | |
5772 | |
5773 /* Grab the pointer */ | |
5774 gtk_grab_add(gtkwin->notebook); | |
5775 #ifndef _WIN32 | |
5776 /* Currently for win32 GTK+ (as of 2.2.1), gdk_pointer_is_grabbed will | |
5777 always be true after a button press. */ | |
5778 if (!gdk_pointer_is_grabbed()) | |
5779 #endif | |
5780 gdk_pointer_grab(gtkwin->notebook->window, FALSE, | |
5781 GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, | |
5782 NULL, cursor, GDK_CURRENT_TIME); | |
5783 } | |
5784 | |
5785 static gboolean | |
5786 notebook_motion_cb(GtkWidget *widget, GdkEventButton *e, GaimGtkWindow *win) | |
5787 { | |
5788 | |
5789 /* | |
5790 * Make sure the user moved the mouse far enough for the | |
5791 * drag to be initiated. | |
5792 */ | |
5793 if (win->in_predrag) { | |
5794 if (e->x_root < win->drag_min_x || | |
5795 e->x_root >= win->drag_max_x || | |
5796 e->y_root < win->drag_min_y || | |
5797 e->y_root >= win->drag_max_y) { | |
5798 | |
5799 win->in_predrag = FALSE; | |
5800 notebook_init_grab(win, widget); | |
5801 } | |
5802 } | |
5803 else { /* Otherwise, draw the arrows. */ | |
5804 GaimGtkWindow *dest_win; | |
5805 GtkNotebook *dest_notebook; | |
5806 GtkWidget *tab; | |
5807 gint nb_x, nb_y, page_num; | |
5808 gint arrow1_x, arrow1_y, arrow2_x, arrow2_y; | |
5809 gboolean horiz_tabs = FALSE; | |
11614 | 5810 GaimGtkConversation *gtkconv; |
5811 gboolean to_right = FALSE; | |
11581 | 5812 |
5813 /* Get the window that the cursor is over. */ | |
5814 dest_win = gaim_gtk_conv_window_get_at_xy(e->x_root, e->y_root); | |
5815 | |
5816 if (dest_win == NULL) { | |
5817 dnd_hints_hide_all(); | |
5818 | |
5819 return TRUE; | |
5820 } | |
5821 | |
5822 dest_notebook = GTK_NOTEBOOK(dest_win->notebook); | |
5823 | |
5824 gdk_window_get_origin(GTK_WIDGET(dest_notebook)->window, &nb_x, &nb_y); | |
5825 | |
5826 arrow1_x = arrow2_x = nb_x; | |
5827 arrow1_y = arrow2_y = nb_y; | |
5828 | |
5829 page_num = gaim_gtkconv_get_tab_at_xy(dest_win, | |
11614 | 5830 e->x_root, e->y_root, &to_right); |
5831 to_right = to_right && (win != dest_win); | |
11581 | 5832 |
5833 if (gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_TOP || | |
5834 gtk_notebook_get_tab_pos(dest_notebook) == GTK_POS_BOTTOM) { | |
5835 | |
5836 horiz_tabs = TRUE; | |
5837 } | |
5838 | |
11614 | 5839 gtkconv = gaim_gtk_conv_window_get_gtkconv_at_index(dest_win, page_num); |
5840 tab = gtkconv->tabby; | |
11581 | 5841 |
5842 if (horiz_tabs) { | |
5843 arrow1_x = arrow2_x = nb_x + tab->allocation.x; | |
5844 | |
11614 | 5845 if (((gpointer)win == (gpointer)dest_win && win->drag_tab < page_num) || to_right) { |
11581 | 5846 arrow1_x += tab->allocation.width; |
5847 arrow2_x += tab->allocation.width; | |
5848 } | |
5849 | |
5850 arrow1_y = nb_y + tab->allocation.y; | |
5851 arrow2_y = nb_y + tab->allocation.y + | |
5852 tab->allocation.height; | |
5853 } else { | |
5854 arrow1_x = nb_x + tab->allocation.x; | |
5855 arrow2_x = nb_x + tab->allocation.x + | |
5856 tab->allocation.width; | |
5857 arrow1_y = arrow2_y = nb_y + tab->allocation.y + tab->allocation.height/2; | |
5858 | |
5859 if ((gpointer)win == (gpointer)dest_win && win->drag_tab < page_num) { | |
5860 arrow1_y += tab->allocation.height; | |
5861 arrow2_y += tab->allocation.height; | |
5862 } | |
5863 } | |
5864 | |
5865 if (horiz_tabs) { | |
5866 dnd_hints_show(HINT_ARROW_DOWN, arrow1_x, arrow1_y); | |
5867 dnd_hints_show(HINT_ARROW_UP, arrow2_x, arrow2_y); | |
5868 } else { | |
5869 dnd_hints_show(HINT_ARROW_RIGHT, arrow1_x, arrow1_y); | |
5870 dnd_hints_show(HINT_ARROW_LEFT, arrow2_x, arrow2_y); | |
5871 } | |
5872 } | |
5873 | |
5874 return TRUE; | |
5875 } | |
5876 | |
5877 static gboolean | |
5878 notebook_leave_cb(GtkWidget *widget, GdkEventCrossing *e, GaimGtkWindow *win) | |
5879 { | |
5880 if (win->in_drag) | |
5881 return FALSE; | |
5882 | |
5883 if (e->x_root < win->drag_min_x || | |
5884 e->x_root >= win->drag_max_x || | |
5885 e->y_root < win->drag_min_y || | |
5886 e->y_root >= win->drag_max_y) { | |
5887 | |
5888 win->in_predrag = FALSE; | |
5889 notebook_init_grab(win, widget); | |
5890 } | |
5891 | |
5892 return TRUE; | |
5893 } | |
5894 | |
5895 /* | |
5896 * THANK YOU GALEON! | |
5897 */ | |
5898 static gboolean | |
5899 notebook_press_cb(GtkWidget *widget, GdkEventButton *e, GaimGtkWindow *win) | |
5900 { | |
5901 gint nb_x, nb_y, x_rel, y_rel; | |
5902 int tab_clicked; | |
5903 GtkWidget *page; | |
5904 GtkWidget *tab; | |
5905 | |
5906 if (e->button != 1 || e->type != GDK_BUTTON_PRESS) | |
5907 return FALSE; | |
5908 | |
5909 | |
5910 if (win->in_drag) { | |
5911 gaim_debug(GAIM_DEBUG_WARNING, "gtkconv", | |
5912 "Already in the middle of a window drag at tab_press_cb\n"); | |
5913 return TRUE; | |
5914 } | |
5915 | |
5916 /* | |
5917 * Make sure a tab was actually clicked. The arrow buttons | |
5918 * mess things up. | |
5919 */ | |
11614 | 5920 tab_clicked = gaim_gtkconv_get_tab_at_xy(win, e->x_root, e->y_root, NULL); |
11581 | 5921 |
5922 if (tab_clicked == -1) | |
5923 return FALSE; | |
5924 | |
5925 /* | |
5926 * Get the relative position of the press event, with regards to | |
5927 * the position of the notebook. | |
5928 */ | |
5929 gdk_window_get_origin(win->notebook->window, &nb_x, &nb_y); | |
5930 | |
5931 x_rel = e->x_root - nb_x; | |
5932 y_rel = e->y_root - nb_y; | |
5933 | |
5934 /* Reset the min/max x/y */ | |
5935 win->drag_min_x = 0; | |
5936 win->drag_min_y = 0; | |
5937 win->drag_max_x = 0; | |
5938 win->drag_max_y = 0; | |
5939 | |
5940 /* Find out which tab was dragged. */ | |
5941 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), tab_clicked); | |
5942 tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(win->notebook), page); | |
5943 | |
5944 win->drag_min_x = tab->allocation.x + nb_x; | |
5945 win->drag_min_y = tab->allocation.y + nb_y; | |
5946 win->drag_max_x = tab->allocation.width + win->drag_min_x; | |
5947 win->drag_max_y = tab->allocation.height + win->drag_min_y; | |
5948 | |
5949 /* Make sure the click occurred in the tab. */ | |
5950 if (e->x_root < win->drag_min_x || | |
5951 e->x_root >= win->drag_max_x || | |
5952 e->y_root < win->drag_min_y || | |
5953 e->y_root >= win->drag_max_y) { | |
5954 | |
5955 return FALSE; | |
5956 } | |
5957 | |
5958 win->in_predrag = TRUE; | |
5959 win->drag_tab = tab_clicked; | |
5960 | |
5961 /* Connect the new motion signals. */ | |
5962 win->drag_motion_signal = | |
5963 g_signal_connect(G_OBJECT(widget), "motion_notify_event", | |
5964 G_CALLBACK(notebook_motion_cb), win); | |
5965 | |
5966 win->drag_leave_signal = | |
5967 g_signal_connect(G_OBJECT(widget), "leave_notify_event", | |
5968 G_CALLBACK(notebook_leave_cb), win); | |
5969 | |
5970 return FALSE; | |
5971 } | |
5972 | |
5973 static gboolean | |
5974 notebook_release_cb(GtkWidget *widget, GdkEventButton *e, GaimGtkWindow *win) | |
5975 { | |
5976 GaimGtkWindow *dest_win; | |
5977 GaimConversation *conv; | |
5978 GaimGtkConversation *gtkconv; | |
5979 gint dest_page_num = 0; | |
5980 gboolean new_window = FALSE; | |
11614 | 5981 gboolean to_right = FALSE; |
11581 | 5982 |
5983 /* | |
5984 * Don't check to make sure that the event's window matches the | |
5985 * widget's, because we may be getting an event passed on from the | |
5986 * close button. | |
5987 */ | |
5988 if (e->button != 1 && e->type != GDK_BUTTON_RELEASE) | |
5989 return FALSE; | |
5990 | |
5991 if (gdk_pointer_is_grabbed()) { | |
5992 gdk_pointer_ungrab(GDK_CURRENT_TIME); | |
5993 gtk_grab_remove(widget); | |
5994 } | |
5995 | |
5996 if (!win->in_predrag && !win->in_drag) | |
5997 return FALSE; | |
5998 | |
5999 /* Disconnect the motion signal. */ | |
6000 if (win->drag_motion_signal) { | |
6001 g_signal_handler_disconnect(G_OBJECT(widget), | |
6002 win->drag_motion_signal); | |
6003 | |
6004 win->drag_motion_signal = 0; | |
6005 } | |
6006 | |
6007 /* | |
6008 * If we're in a pre-drag, we'll also need to disconnect the leave | |
6009 * signal. | |
6010 */ | |
6011 if (win->in_predrag) { | |
6012 win->in_predrag = FALSE; | |
6013 | |
6014 if (win->drag_leave_signal) { | |
6015 g_signal_handler_disconnect(G_OBJECT(widget), | |
6016 win->drag_leave_signal); | |
6017 | |
6018 win->drag_leave_signal = 0; | |
6019 } | |
6020 } | |
6021 | |
6022 /* If we're not in drag... */ | |
6023 /* We're perfectly normal people! */ | |
6024 if (!win->in_drag) | |
6025 return FALSE; | |
6026 | |
6027 win->in_drag = FALSE; | |
6028 | |
6029 dnd_hints_hide_all(); | |
6030 | |
6031 dest_win = gaim_gtk_conv_window_get_at_xy(e->x_root, e->y_root); | |
6032 | |
6033 conv = gaim_gtk_conv_window_get_active_conversation(win); | |
6034 | |
6035 if (dest_win == NULL) { | |
6036 /* If the current window doesn't have any other conversations, | |
6037 * there isn't much point transferring the conv to a new window. */ | |
6038 if (gaim_gtk_conv_window_get_gtkconv_count(win) > 1) { | |
6039 /* Make a new window to stick this to. */ | |
6040 dest_win = gaim_gtk_conv_window_new(); | |
6041 new_window = TRUE; | |
6042 } | |
6043 } | |
6044 | |
6045 if (dest_win == NULL) | |
6046 return FALSE; | |
6047 | |
6048 gaim_signal_emit(gaim_gtk_conversations_get_handle(), | |
6049 "conversation-dragging", win, dest_win); | |
6050 | |
6051 /* Get the destination page number. */ | |
6052 if (!new_window) | |
6053 dest_page_num = gaim_gtkconv_get_tab_at_xy(dest_win, | |
11614 | 6054 e->x_root, e->y_root, &to_right); |
11581 | 6055 |
6056 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
6057 | |
6058 if (win == dest_win) { | |
6059 gtk_notebook_reorder_child(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, dest_page_num); | |
6060 } else { | |
6061 gaim_gtk_conv_window_remove_gtkconv(win, gtkconv); | |
6062 gaim_gtk_conv_window_add_gtkconv(dest_win, gtkconv); | |
11614 | 6063 gtk_notebook_reorder_child(GTK_NOTEBOOK(dest_win->notebook), gtkconv->tab_cont, dest_page_num + to_right); |
11581 | 6064 gaim_gtk_conv_window_switch_gtkconv(dest_win, gtkconv); |
6065 if (new_window) { | |
6066 gint win_width, win_height; | |
6067 | |
6068 gtk_window_get_size(GTK_WINDOW(dest_win->window), | |
6069 &win_width, &win_height); | |
6070 | |
6071 gtk_window_move(GTK_WINDOW(dest_win->window), | |
6072 e->x_root - (win_width / 2), | |
6073 e->y_root - (win_height / 2)); | |
6074 | |
6075 gaim_gtk_conv_window_show(dest_win); | |
6076 } | |
6077 } | |
6078 | |
6079 gtk_widget_grab_focus(GAIM_GTK_CONVERSATION(conv)->entry); | |
6080 | |
6081 return TRUE; | |
6082 } | |
6083 | |
6084 | |
6085 static void | |
6086 before_switch_conv_cb(GtkNotebook *notebook, GtkWidget *page, gint page_num, | |
6087 gpointer user_data) | |
6088 { | |
6089 GaimGtkWindow *win; | |
6090 GaimConversation *conv; | |
6091 GaimGtkConversation *gtkconv; | |
6092 | |
6093 win = user_data; | |
6094 conv = gaim_gtk_conv_window_get_active_conversation(win); | |
6095 | |
6096 g_return_if_fail(conv != NULL); | |
6097 | |
6098 if (gaim_conversation_get_type(conv) != GAIM_CONV_TYPE_IM) | |
6099 return; | |
6100 | |
6101 gtkconv = GAIM_GTK_CONVERSATION(conv); | |
6102 | |
6103 stop_anim(NULL, gtkconv); | |
6104 } | |
6105 | |
6106 static void | |
6107 switch_conv_cb(GtkNotebook *notebook, GtkWidget *page, gint page_num, | |
6108 gpointer user_data) | |
6109 { | |
6110 GaimGtkWindow *win; | |
6111 GaimConversation *conv; | |
6112 GaimGtkConversation *gtkconv; | |
6113 | |
6114 win = user_data; | |
6115 gtkconv = gaim_gtk_conv_window_get_gtkconv_at_index(win, page_num); | |
6116 conv = gtkconv->active_conv; | |
6117 | |
6118 g_return_if_fail(conv != NULL); | |
6119 | |
6120 /* | |
6121 * Only set "unseen" to "none" if the window has focus | |
6122 */ | |
6123 if (gaim_gtk_conv_window_has_focus(win)) | |
11604 | 6124 gtkconv_set_unseen(gtkconv, GAIM_UNSEEN_NONE); |
11581 | 6125 |
6126 /* Update the menubar */ | |
6127 | |
11672
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
6128 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
|
6129 gaim_conversation_is_logging(conv)); |
04e0189bb519
[gaim-migrate @ 13958]
Richard Laager <rlaager@wiktel.com>
parents:
11671
diff
changeset
|
6130 |
11594 | 6131 generate_send_to_items(win); |
6132 | |
11604 | 6133 gaim_gtkconv_switch_active_conversation(conv); |
11581 | 6134 |
6135 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.sounds), | |
6136 gtkconv->make_sound); | |
6137 | |
6138 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.show_formatting_toolbar), | |
6139 gaim_prefs_get_bool("/gaim/gtk/conversations/show_formatting_toolbar")); | |
6140 | |
6141 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.show_timestamps), | |
6142 gtkconv->show_timestamps); | |
6143 | |
6144 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) | |
6145 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(win->menu.show_icon), | |
6146 gtkconv->u.im->show_icon); | |
11604 | 6147 |
11581 | 6148 /* |
6149 * We pause icons when they are not visible. If this icon should | |
6150 * be animated then start it back up again. | |
6151 */ | |
6152 if ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) && | |
6153 (gtkconv->u.im->animate)) | |
6154 start_anim(NULL, gtkconv); | |
6155 } | |
6156 | |
6157 /************************************************************************** | |
6158 * GTK+ window ops | |
6159 **************************************************************************/ | |
6160 | |
6161 static GList *window_list = NULL; | |
6162 | |
6163 GList * | |
6164 gaim_gtk_conv_windows_get_list() | |
6165 { | |
6166 return window_list; | |
6167 } | |
6168 | |
6169 GaimGtkWindow * | |
6170 gaim_gtk_conv_window_new() | |
6171 { | |
6172 GaimGtkWindow *win; | |
6173 GtkPositionType pos; | |
6174 GtkWidget *testidea; | |
6175 GtkWidget *menubar; | |
6176 | |
6177 win = g_malloc0(sizeof(GaimGtkWindow)); | |
6178 | |
6179 window_list = g_list_append(window_list, win); | |
6180 | |
6181 /* Create the window. */ | |
6182 win->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
6183 gtk_window_set_role(GTK_WINDOW(win->window), "conversation"); | |
6184 gtk_window_set_resizable(GTK_WINDOW(win->window), TRUE); | |
6185 gtk_container_set_border_width(GTK_CONTAINER(win->window), 0); | |
6186 GTK_WINDOW(win->window)->allow_shrink = TRUE; | |
6187 | |
6188 g_signal_connect(G_OBJECT(win->window), "delete_event", | |
6189 G_CALLBACK(close_win_cb), win); | |
6190 | |
6191 g_signal_connect(G_OBJECT(win->window), "focus_in_event", | |
6192 G_CALLBACK(focus_win_cb), win); | |
6193 | |
6194 /* Create the notebook. */ | |
6195 win->notebook = gtk_notebook_new(); | |
6196 | |
6197 pos = gaim_prefs_get_int("/gaim/gtk/conversations/tab_side"); | |
6198 | |
6199 #if 0 | |
6200 gtk_notebook_set_tab_hborder(GTK_NOTEBOOK(win->notebook), 0); | |
6201 gtk_notebook_set_tab_vborder(GTK_NOTEBOOK(win->notebook), 0); | |
6202 #endif | |
6203 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(win->notebook), pos); | |
6204 gtk_notebook_set_scrollable(GTK_NOTEBOOK(win->notebook), TRUE); | |
6205 gtk_notebook_popup_enable(GTK_NOTEBOOK(win->notebook)); | |
6206 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), FALSE); | |
6207 gtk_notebook_set_show_border(GTK_NOTEBOOK(win->notebook), FALSE); | |
6208 | |
6209 gtk_widget_show(win->notebook); | |
6210 | |
6211 g_signal_connect(G_OBJECT(win->notebook), "switch_page", | |
6212 G_CALLBACK(before_switch_conv_cb), win); | |
6213 g_signal_connect_after(G_OBJECT(win->notebook), "switch_page", | |
6214 G_CALLBACK(switch_conv_cb), win); | |
6215 | |
6216 /* Setup the tab drag and drop signals. */ | |
6217 gtk_widget_add_events(win->notebook, | |
6218 GDK_BUTTON1_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); | |
6219 g_signal_connect(G_OBJECT(win->notebook), "button_press_event", | |
6220 G_CALLBACK(notebook_press_cb), win); | |
6221 g_signal_connect(G_OBJECT(win->notebook), "button_release_event", | |
6222 G_CALLBACK(notebook_release_cb), win); | |
6223 | |
6224 testidea = gtk_vbox_new(FALSE, 0); | |
6225 | |
6226 /* Setup the menubar. */ | |
6227 menubar = setup_menubar(win); | |
6228 gtk_box_pack_start(GTK_BOX(testidea), menubar, FALSE, TRUE, 0); | |
6229 | |
6230 gtk_box_pack_start(GTK_BOX(testidea), win->notebook, TRUE, TRUE, 0); | |
6231 | |
6232 gtk_container_add(GTK_CONTAINER(win->window), testidea); | |
6233 | |
6234 gtk_widget_show(testidea); | |
6235 | |
6236 return win; | |
6237 } | |
6238 | |
6239 void | |
6240 gaim_gtk_conv_window_destroy(GaimGtkWindow *win) | |
6241 { | |
6242 window_list = g_list_remove(window_list, win); | |
6243 | |
11611 | 6244 if (win->gtkconvs) { |
6245 while (win->gtkconvs) { | |
6246 GList *nextgtk = win->gtkconvs->next; | |
6247 GaimGtkConversation *gtkconv = win->gtkconvs->data; | |
6248 GList *nextcore = gtkconv->convs->next; | |
6249 GaimConversation *conv = gtkconv->convs->data; | |
6250 gaim_conversation_destroy(conv); | |
6251 if (!nextgtk && !nextcore) | |
6252 /* we'll end up invoking ourselves when we destroy our last child */ | |
6253 /* so don't destroy ourselves right now */ | |
6254 return; | |
6255 } | |
6256 return; | |
6257 } | |
11581 | 6258 gtk_widget_destroy(win->window); |
6259 | |
6260 g_object_unref(G_OBJECT(win->menu.item_factory)); | |
6261 | |
6262 g_free(win); | |
6263 } | |
6264 | |
6265 void | |
6266 gaim_gtk_conv_window_show(GaimGtkWindow *win) | |
6267 { | |
6268 gtk_widget_show(win->window); | |
6269 } | |
6270 | |
6271 void | |
6272 gaim_gtk_conv_window_hide(GaimGtkWindow *win) | |
6273 { | |
6274 gtk_widget_hide(win->window); | |
6275 } | |
6276 | |
6277 void | |
6278 gaim_gtk_conv_window_raise(GaimGtkWindow *win) | |
6279 { | |
6280 gtk_widget_show(win->window); | |
6281 gtk_window_deiconify(GTK_WINDOW(win->window)); | |
6282 gdk_window_raise(win->window->window); | |
6283 } | |
6284 | |
6285 void | |
6286 gaim_gtk_conv_window_switch_gtkconv(GaimGtkWindow *win, GaimGtkConversation *gtkconv) | |
6287 { | |
6288 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), | |
6289 gtk_notebook_page_num(GTK_NOTEBOOK(win->notebook), | |
6290 gtkconv->tab_cont)); | |
6291 } | |
6292 | |
6293 void | |
6294 gaim_gtk_conv_window_add_gtkconv(GaimGtkWindow *win, GaimGtkConversation *gtkconv) | |
6295 { | |
6296 GaimConversation *conv = gtkconv->active_conv; | |
6297 GaimGtkConversation *focus_gtkconv; | |
6298 GtkWidget *tabby, *menu_tabby; | |
6299 GtkWidget *tab_cont = gtkconv->tab_cont; | |
6300 GtkWidget *close_image; | |
6301 GaimConversationType conv_type; | |
6302 const char *name; | |
6303 const gchar *tmp_lab; | |
6304 gint close_button_width, close_button_height, focus_width, focus_pad; | |
11619 | 6305 gboolean tabs_side = FALSE; |
6306 gint angle = 0; | |
11581 | 6307 |
6308 name = gaim_conversation_get_name(conv); | |
6309 conv_type = gaim_conversation_get_type(conv); | |
6310 | |
6311 | |
6312 win->gtkconvs = g_list_append(win->gtkconvs, gtkconv); | |
6313 gtkconv->win = win; | |
6314 | |
11619 | 6315 if (gaim_prefs_get_int("/gaim/gtk/conversations/tab_side") == GTK_POS_LEFT || |
6316 gaim_prefs_get_int("/gaim/gtk/conversations/tab_side") == GTK_POS_RIGHT) | |
6317 tabs_side = TRUE; | |
6318 else if (gaim_prefs_get_int("/gaim/gtk/conversations/tab_side") == (GTK_POS_LEFT|8)) | |
6319 angle = 90; | |
6320 else if (gaim_prefs_get_int("/gaim/gtk/conversations/tab_side") == (GTK_POS_RIGHT|8)) | |
6321 angle = 270; | |
6322 | |
6323 if (angle) | |
6324 gtkconv->tabby = tabby = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
6325 else | |
6326 gtkconv->tabby = tabby = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); | |
11581 | 6327 gtkconv->menu_tabby = menu_tabby = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
6328 | |
6329 /* Close button. */ | |
6330 gtkconv->close = gtk_button_new(); | |
6331 gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &close_button_width, &close_button_height); | |
6332 if (gtk_check_version(2, 4, 2) == NULL) { | |
6333 /* Need to account for extra padding around the gtkbutton */ | |
6334 gtk_widget_style_get(GTK_WIDGET(gtkconv->close), | |
6335 "focus-line-width", &focus_width, | |
6336 "focus-padding", &focus_pad, | |
6337 NULL); | |
6338 close_button_width += (focus_width + focus_pad) * 2; | |
6339 close_button_height += (focus_width + focus_pad) * 2; | |
6340 } | |
6341 gtk_widget_set_size_request(GTK_WIDGET(gtkconv->close), | |
6342 close_button_width, close_button_height); | |
6343 | |
6344 gtk_button_set_relief(GTK_BUTTON(gtkconv->close), GTK_RELIEF_NONE); | |
6345 close_image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); | |
6346 gtk_widget_show(close_image); | |
6347 gtk_container_add(GTK_CONTAINER(gtkconv->close), close_image); | |
6348 gtk_tooltips_set_tip(gtkconv->tooltips, gtkconv->close, | |
6349 _("Close conversation"), NULL); | |
6350 | |
6351 g_signal_connect(G_OBJECT(gtkconv->close), "clicked", | |
6352 G_CALLBACK(close_conv_cb), gtkconv); | |
6353 | |
6354 /* | |
6355 * I love Galeon. They have a fix for that stupid annoying visible | |
6356 * border bug. I love you guys! -- ChipX86 | |
6357 */ | |
6358 g_signal_connect(G_OBJECT(gtkconv->close), "state_changed", | |
6359 G_CALLBACK(tab_close_button_state_changed_cb), NULL); | |
6360 | |
6361 /* Status icon. */ | |
6362 gtkconv->icon = gtk_image_new(); | |
6363 gtkconv->menu_icon = gtk_image_new(); | |
6364 update_tab_icon(conv); | |
6365 | |
6366 /* Tab label. */ | |
6367 gtkconv->tab_label = gtk_label_new(tmp_lab = gaim_conversation_get_title(conv)); | |
11619 | 6368 |
11581 | 6369 #if GTK_CHECK_VERSION(2,6,0) |
11619 | 6370 if (!angle) |
6371 g_object_set(G_OBJECT(gtkconv->tab_label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); | |
11581 | 6372 gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), 6); |
11619 | 6373 if (tabs_side) { |
6374 gtk_label_set_width_chars(GTK_LABEL(gtkconv->tab_label), MIN(g_utf8_strlen(tmp_lab, -1), 18)); | |
6375 } | |
6376 if (angle) | |
6377 gtk_label_set_angle(GTK_LABEL(gtkconv->tab_label), angle); | |
11581 | 6378 #endif |
6379 gtkconv->menu_label = gtk_label_new(gaim_conversation_get_title(conv)); | |
6380 #if 0 | |
6381 gtk_misc_set_alignment(GTK_MISC(gtkconv->tab_label), 0.00, 0.5); | |
6382 gtk_misc_set_padding(GTK_MISC(gtkconv->tab_label), 4, 0); | |
6383 #endif | |
6384 | |
6385 /* Pack it all together. */ | |
11619 | 6386 if (angle == 90) |
6387 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); | |
6388 else | |
6389 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); | |
11581 | 6390 gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_icon, |
6391 FALSE, FALSE, 0); | |
6392 | |
6393 gtk_widget_show_all(gtkconv->icon); | |
6394 gtk_widget_show_all(gtkconv->menu_icon); | |
6395 | |
6396 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->tab_label, TRUE, TRUE, 0); | |
6397 gtk_box_pack_start(GTK_BOX(menu_tabby), gtkconv->menu_label, TRUE, TRUE, 0); | |
6398 gtk_widget_show(gtkconv->tab_label); | |
6399 gtk_widget_show(gtkconv->menu_label); | |
6400 gtk_misc_set_alignment(GTK_MISC(gtkconv->menu_label), 0, 0); | |
6401 | |
11619 | 6402 if (angle == 90) |
6403 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->icon, FALSE, FALSE, 0); | |
6404 else | |
6405 gtk_box_pack_start(GTK_BOX(tabby), gtkconv->close, FALSE, FALSE, 0); | |
11581 | 6406 if (gaim_prefs_get_bool("/gaim/gtk/conversations/close_on_tabs")) |
6407 gtk_widget_show(gtkconv->close); | |
6408 | |
6409 gtk_widget_show(tabby); | |
6410 gtk_widget_show(menu_tabby); | |
6411 | |
6412 if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) | |
6413 gaim_gtkconv_update_buddy_icon(conv); | |
6414 | |
6415 /* Add this pane to the conversation's notebook. */ | |
6416 gtk_notebook_append_page_menu(GTK_NOTEBOOK(win->notebook), tab_cont, tabby, menu_tabby); | |
11619 | 6417 gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), tab_cont, !tabs_side && !angle, TRUE, GTK_PACK_START); |
11581 | 6418 |
6419 | |
6420 gtk_widget_show(tab_cont); | |
6421 | |
6422 if (gaim_gtk_conv_window_get_gtkconv_count(win) == 1) { | |
6423 /* Er, bug in notebooks? Switch to the page manually. */ | |
6424 gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0); | |
6425 | |
6426 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), | |
6427 gaim_prefs_get_bool("/gaim/gtk/conversations/tabs")); | |
6428 } else | |
6429 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), TRUE); | |
6430 | |
6431 focus_gtkconv = g_list_nth_data(gaim_gtk_conv_window_get_gtkconvs(win), | |
6432 gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook))); | |
6433 gtk_widget_grab_focus(focus_gtkconv->entry); | |
6434 | |
6435 if (gaim_gtk_conv_window_get_gtkconv_count(win) == 1) | |
11734 | 6436 update_send_to_selection(win); |
11581 | 6437 } |
6438 | |
6439 void | |
6440 gaim_gtk_conv_window_remove_gtkconv(GaimGtkWindow *win, GaimGtkConversation *gtkconv) | |
6441 { | |
6442 unsigned int index; | |
6443 GaimConversationType conv_type; | |
6444 | |
6445 conv_type = gaim_conversation_get_type(gtkconv->active_conv); | |
6446 index = gtk_notebook_page_num(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont); | |
6447 | |
6448 g_object_ref(gtkconv->tab_cont); | |
6449 gtk_object_sink(GTK_OBJECT(gtkconv->tab_cont)); | |
6450 | |
6451 gtk_notebook_remove_page(GTK_NOTEBOOK(win->notebook), index); | |
6452 | |
6453 /* go back to tabless if need be */ | |
6454 if (gaim_gtk_conv_window_get_gtkconv_count(win) <= 2) { | |
6455 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), | |
6456 gaim_prefs_get_bool("/gaim/gtk/conversations/tabs")); | |
6457 } | |
6458 | |
6459 win->gtkconvs = g_list_remove(win->gtkconvs, gtkconv); | |
11582 | 6460 |
6461 if (!win->gtkconvs) | |
6462 gaim_gtk_conv_window_destroy(win); | |
11581 | 6463 } |
6464 | |
6465 GaimGtkConversation * | |
6466 gaim_gtk_conv_window_get_gtkconv_at_index(const GaimGtkWindow *win, int index) | |
6467 { | |
6468 GtkWidget *tab_cont; | |
6469 | |
6470 if (index == -1) | |
6471 index = 0; | |
6472 tab_cont = gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), index); | |
11604 | 6473 return tab_cont ? g_object_get_data(G_OBJECT(tab_cont), "GaimGtkConversation") : NULL; |
11581 | 6474 } |
6475 | |
6476 GaimGtkConversation * | |
6477 gaim_gtk_conv_window_get_active_gtkconv(const GaimGtkWindow *win) | |
6478 { | |
6479 int index; | |
6480 GtkWidget *tab_cont; | |
6481 | |
6482 index = gtk_notebook_get_current_page(GTK_NOTEBOOK(win->notebook)); | |
6483 if (index == -1) | |
6484 index = 0; | |
6485 tab_cont = gtk_notebook_get_nth_page(GTK_NOTEBOOK(win->notebook), index); | |
6486 if (!tab_cont) | |
6487 return NULL; | |
6488 return g_object_get_data(G_OBJECT(tab_cont), "GaimGtkConversation"); | |
6489 } | |
6490 | |
6491 | |
6492 GaimConversation * | |
6493 gaim_gtk_conv_window_get_active_conversation(const GaimGtkWindow *win) | |
6494 { | |
6495 GaimGtkConversation *gtkconv; | |
6496 | |
6497 gtkconv = gaim_gtk_conv_window_get_active_gtkconv(win); | |
6498 return gtkconv ? gtkconv->active_conv : NULL; | |
6499 } | |
6500 | |
6501 gboolean | |
6502 gaim_gtk_conv_window_is_active_conversation(const GaimConversation *conv) | |
6503 { | |
6504 return conv == gaim_gtk_conv_window_get_active_conversation(GAIM_GTK_CONVERSATION(conv)->win); | |
6505 } | |
6506 | |
6507 gboolean | |
6508 gaim_gtk_conv_window_has_focus(GaimGtkWindow *win) | |
6509 { | |
6510 gboolean has_focus = FALSE; | |
6511 | |
6512 g_object_get(G_OBJECT(win->window), "has-toplevel-focus", &has_focus, NULL); | |
6513 | |
6514 return has_focus; | |
6515 } | |
6516 | |
6517 GaimGtkWindow * | |
6518 gaim_gtk_conv_window_get_at_xy(int x, int y) | |
6519 { | |
6520 GaimGtkWindow *win; | |
6521 GdkWindow *gdkwin; | |
6522 GList *l; | |
6523 | |
6524 gdkwin = gdk_window_at_pointer(&x, &y); | |
6525 | |
6526 if (gdkwin) | |
6527 gdkwin = gdk_window_get_toplevel(gdkwin); | |
6528 | |
6529 for (l = gaim_gtk_conv_windows_get_list(); l != NULL; l = l->next) { | |
6530 win = l->data; | |
6531 | |
6532 if (gdkwin == win->window->window) | |
6533 return win; | |
6534 } | |
6535 | |
6536 return NULL; | |
6537 } | |
6538 | |
6539 GList * | |
6540 gaim_gtk_conv_window_get_gtkconvs(GaimGtkWindow *win) | |
6541 { | |
6542 return win->gtkconvs; | |
6543 } | |
6544 | |
6545 guint | |
6546 gaim_gtk_conv_window_get_gtkconv_count(GaimGtkWindow *win) | |
6547 { | |
6548 return g_list_length(win->gtkconvs); | |
6549 } | |
6550 | |
6551 GaimGtkWindow * | |
6552 gaim_gtk_conv_window_first_with_type(GaimConversationType type) | |
6553 { | |
6554 GList *wins, *convs; | |
6555 GaimGtkWindow *win; | |
6556 GaimGtkConversation *conv; | |
6557 | |
6558 if (type == GAIM_CONV_TYPE_UNKNOWN) | |
6559 return NULL; | |
6560 | |
6561 for (wins = gaim_gtk_conv_windows_get_list(); wins != NULL; wins = wins->next) { | |
6562 win = wins->data; | |
6563 | |
6564 for (convs = win->gtkconvs; | |
6565 convs != NULL; | |
6566 convs = convs->next) { | |
6567 | |
6568 conv = convs->data; | |
6569 | |
6570 if (gaim_conversation_get_type(conv->active_conv) == type) | |
6571 return win; | |
6572 } | |
6573 } | |
6574 | |
6575 return NULL; | |
6576 } | |
6577 | |
6578 GaimGtkWindow * | |
6579 gaim_gtk_conv_window_last_with_type(GaimConversationType type) | |
6580 { | |
6581 GList *wins, *convs; | |
6582 GaimGtkWindow *win; | |
6583 GaimGtkConversation *conv; | |
6584 | |
6585 if (type == GAIM_CONV_TYPE_UNKNOWN) | |
6586 return NULL; | |
6587 | |
6588 for (wins = g_list_last(gaim_gtk_conv_windows_get_list()); | |
6589 wins != NULL; | |
6590 wins = wins->prev) { | |
6591 | |
6592 win = wins->data; | |
6593 | |
6594 for (convs = win->gtkconvs; | |
6595 convs != NULL; | |
6596 convs = convs->next) { | |
6597 | |
6598 conv = convs->data; | |
6599 | |
6600 if (gaim_conversation_get_type(conv->active_conv) == type) | |
6601 return win; | |
6602 } | |
6603 } | |
6604 | |
6605 return NULL; | |
6606 } | |
6607 | |
6608 | |
6609 /************************************************************************** | |
6610 * Conversation placement functions | |
6611 **************************************************************************/ | |
6612 typedef struct | |
6613 { | |
6614 char *id; | |
6615 char *name; | |
6616 GaimConvPlacementFunc fnc; | |
6617 | |
6618 } ConvPlacementData; | |
6619 | |
6620 static GList *conv_placement_fncs = NULL; | |
6621 static GaimConvPlacementFunc place_conv = NULL; | |
6622 | |
6623 /* This one places conversations in the last made window. */ | |
6624 static void | |
6625 conv_placement_last_created_win(GaimGtkConversation *conv) | |
6626 { | |
6627 GaimGtkWindow *win; | |
6628 | |
6629 GList *l = g_list_last(gaim_gtk_conv_windows_get_list()); | |
6630 win = l ? l->data : NULL;; | |
6631 | |
6632 if (win == NULL) { | |
6633 win = gaim_gtk_conv_window_new(); | |
6634 | |
6635 gaim_gtk_conv_window_add_gtkconv(win, conv); | |
6636 gaim_gtk_conv_window_show(win); | |
6637 } else { | |
6638 gaim_gtk_conv_window_add_gtkconv(win, conv); | |
6639 } | |
6640 } | |
6641 | |
6642 /* This one places conversations in the last made window of the same type. */ | |
6643 static void | |
6644 conv_placement_last_created_win_type(GaimGtkConversation *conv) | |
6645 { | |
6646 GaimGtkWindow *win; | |
6647 | |
6648 win = gaim_gtk_conv_window_last_with_type(gaim_conversation_get_type(conv->active_conv)); | |
6649 | |
6650 if (win == NULL) { | |
6651 win = gaim_gtk_conv_window_new(); | |
6652 | |
6653 gaim_gtk_conv_window_add_gtkconv(win, conv); | |
6654 gaim_gtk_conv_window_show(win); | |
6655 } else | |
6656 gaim_gtk_conv_window_add_gtkconv(win, conv); | |
6657 } | |
6658 | |
6659 /* This one places each conversation in its own window. */ | |
6660 static void | |
6661 conv_placement_new_window(GaimGtkConversation *conv) | |
6662 { | |
6663 GaimGtkWindow *win; | |
6664 | |
6665 win = gaim_gtk_conv_window_new(); | |
6666 | |
6667 gaim_gtk_conv_window_add_gtkconv(win, conv); | |
6668 | |
6669 gaim_gtk_conv_window_show(win); | |
6670 } | |
6671 | |
6672 static GaimGroup * | |
6673 conv_get_group(GaimGtkConversation *conv) | |
6674 { | |
6675 GaimGroup *group = NULL; | |
6676 | |
6677 if (gaim_conversation_get_type(conv->active_conv) == GAIM_CONV_TYPE_IM) { | |
6678 GaimBuddy *buddy; | |
6679 | |
6680 buddy = gaim_find_buddy(gaim_conversation_get_account(conv->active_conv), | |
6681 gaim_conversation_get_name(conv->active_conv)); | |
6682 | |
6683 if (buddy != NULL) | |
6684 group = gaim_find_buddys_group(buddy); | |
6685 | |
6686 } else if (gaim_conversation_get_type(conv->active_conv) == GAIM_CONV_TYPE_CHAT) { | |
6687 GaimChat *chat; | |
6688 | |
6689 chat = gaim_blist_find_chat(gaim_conversation_get_account(conv->active_conv), | |
6690 gaim_conversation_get_name(conv->active_conv)); | |
6691 | |
6692 if (chat != NULL) | |
6693 group = gaim_chat_get_group(chat); | |
6694 } | |
6695 | |
6696 return group; | |
6697 } | |
6698 | |
6699 /* | |
6700 * This groups things by, well, group. Buddies from groups will always be | |
6701 * grouped together, and a buddy from a group not belonging to any currently | |
6702 * open windows will get a new window. | |
6703 */ | |
6704 static void | |
6705 conv_placement_by_group(GaimGtkConversation *conv) | |
6706 { | |
6707 GaimConversationType type; | |
6708 GaimGroup *group = NULL; | |
6709 GList *wl, *cl; | |
6710 | |
6711 type = gaim_conversation_get_type(conv->active_conv); | |
6712 | |
6713 group = conv_get_group(conv); | |
6714 | |
6715 /* Go through the list of IMs and find one with this group. */ | |
6716 for (wl = gaim_gtk_conv_windows_get_list(); wl != NULL; wl = wl->next) { | |
6717 GaimGtkWindow *win2; | |
6718 GaimGtkConversation *conv2; | |
6719 GaimGroup *group2 = NULL; | |
6720 | |
6721 win2 = wl->data; | |
6722 | |
6723 for (cl = win2->gtkconvs; | |
6724 cl != NULL; | |
6725 cl = cl->next) { | |
6726 conv2 = cl->data; | |
6727 | |
6728 group2 = conv_get_group(conv2); | |
6729 | |
6730 if (group == group2) { | |
6731 gaim_gtk_conv_window_add_gtkconv(win2, conv); | |
6732 | |
6733 return; | |
6734 } | |
6735 } | |
6736 } | |
6737 | |
6738 /* Make a new window. */ | |
6739 conv_placement_new_window(conv); | |
6740 } | |
6741 | |
6742 /* This groups things by account. Otherwise, the same semantics as above */ | |
6743 static void | |
6744 conv_placement_by_account(GaimGtkConversation *conv) | |
6745 { | |
6746 GaimConversationType type; | |
6747 GList *wins, *convs; | |
6748 GaimAccount *account; | |
6749 | |
6750 account = gaim_conversation_get_account(conv->active_conv); | |
6751 type = gaim_conversation_get_type(conv->active_conv); | |
6752 | |
6753 /* Go through the list of IMs and find one with this group. */ | |
6754 for (wins = gaim_gtk_conv_windows_get_list(); wins != NULL; wins = wins->next) { | |
6755 GaimGtkWindow *win2; | |
6756 GaimGtkConversation *conv2; | |
6757 | |
6758 win2 = wins->data; | |
6759 | |
6760 for (convs = win2->gtkconvs; | |
6761 convs != NULL; | |
6762 convs = convs->next) { | |
6763 conv2 = convs->data; | |
6764 | |
6765 if (account == gaim_conversation_get_account(conv2->active_conv)) { | |
6766 gaim_gtk_conv_window_add_gtkconv(win2, conv); | |
6767 return; | |
6768 } | |
6769 } | |
6770 } | |
6771 | |
6772 /* Make a new window. */ | |
6773 conv_placement_new_window(conv); | |
6774 } | |
6775 | |
6776 static ConvPlacementData * | |
6777 get_conv_placement_data(const char *id) | |
6778 { | |
6779 ConvPlacementData *data = NULL; | |
6780 GList *n; | |
6781 | |
6782 for (n = conv_placement_fncs; n; n = n->next) { | |
6783 data = n->data; | |
6784 if (!strcmp(data->id, id)) | |
6785 return data; | |
6786 } | |
6787 | |
6788 return NULL; | |
6789 } | |
6790 | |
6791 static void | |
6792 add_conv_placement_fnc(const char *id, const char *name, | |
6793 GaimConvPlacementFunc fnc) | |
6794 { | |
6795 ConvPlacementData *data; | |
6796 | |
6797 data = g_new(ConvPlacementData, 1); | |
6798 | |
6799 data->id = g_strdup(id); | |
6800 data->name = g_strdup(name); | |
6801 data->fnc = fnc; | |
6802 | |
6803 conv_placement_fncs = g_list_append(conv_placement_fncs, data); | |
6804 } | |
6805 | |
6806 static void | |
6807 ensure_default_funcs(void) | |
6808 { | |
6809 if (conv_placement_fncs == NULL) { | |
6810 add_conv_placement_fnc("last", _("Last created window"), | |
6811 conv_placement_last_created_win); | |
6812 add_conv_placement_fnc("im_chat", _("Separate IM and Chat windows"), | |
6813 conv_placement_last_created_win_type); | |
6814 add_conv_placement_fnc("new", _("New window"), | |
6815 conv_placement_new_window); | |
6816 add_conv_placement_fnc("group", _("By group"), | |
6817 conv_placement_by_group); | |
6818 add_conv_placement_fnc("account", _("By account"), | |
6819 conv_placement_by_account); | |
6820 } | |
6821 } | |
6822 | |
6823 GList * | |
6824 gaim_gtkconv_placement_get_options(void) | |
6825 { | |
6826 GList *n, *list = NULL; | |
6827 ConvPlacementData *data; | |
6828 | |
6829 ensure_default_funcs(); | |
6830 | |
6831 for (n = conv_placement_fncs; n; n = n->next) { | |
6832 data = n->data; | |
6833 list = g_list_append(list, data->name); | |
6834 list = g_list_append(list, data->id); | |
6835 } | |
6836 | |
6837 return list; | |
6838 } | |
6839 | |
6840 | |
6841 void | |
6842 gaim_gtkconv_placement_add_fnc(const char *id, const char *name, | |
6843 GaimConvPlacementFunc fnc) | |
6844 { | |
6845 g_return_if_fail(id != NULL); | |
6846 g_return_if_fail(name != NULL); | |
6847 g_return_if_fail(fnc != NULL); | |
6848 | |
6849 ensure_default_funcs(); | |
6850 | |
6851 add_conv_placement_fnc(id, name, fnc); | |
6852 } | |
6853 | |
6854 void | |
6855 gaim_gtkconv_placement_remove_fnc(const char *id) | |
6856 { | |
6857 ConvPlacementData *data = get_conv_placement_data(id); | |
6858 | |
6859 if (data == NULL) | |
6860 return; | |
6861 | |
6862 conv_placement_fncs = g_list_remove(conv_placement_fncs, data); | |
6863 | |
6864 g_free(data->id); | |
6865 g_free(data->name); | |
6866 g_free(data); | |
6867 } | |
6868 | |
6869 const char * | |
6870 gaim_gtkconv_placement_get_name(const char *id) | |
6871 { | |
6872 ConvPlacementData *data; | |
6873 | |
6874 ensure_default_funcs(); | |
6875 | |
6876 data = get_conv_placement_data(id); | |
6877 | |
6878 if (data == NULL) | |
6879 return NULL; | |
6880 | |
6881 return data->name; | |
6882 } | |
6883 | |
6884 GaimConvPlacementFunc | |
6885 gaim_gtkconv_placement_get_fnc(const char *id) | |
6886 { | |
6887 ConvPlacementData *data; | |
6888 | |
6889 ensure_default_funcs(); | |
6890 | |
6891 data = get_conv_placement_data(id); | |
6892 | |
6893 if (data == NULL) | |
6894 return NULL; | |
6895 | |
6896 return data->fnc; | |
6897 } | |
6898 | |
6899 void | |
6900 gaim_gtkconv_placement_set_current_func(GaimConvPlacementFunc func) | |
6901 { | |
6902 g_return_if_fail(func != NULL); | |
6903 | |
6904 place_conv = func; | |
6905 } | |
6906 | |
6907 GaimConvPlacementFunc | |
6908 gaim_gtkconv_placement_get_current_func(void) | |
6909 { | |
6910 return place_conv; | |
6911 } | |
6912 | |
6913 void | |
6914 gaim_gtkconv_placement_place(GaimGtkConversation *gtkconv) | |
6915 { | |
6916 if (place_conv) | |
6917 place_conv(gtkconv); | |
6918 } |