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