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