Mercurial > pidgin.yaz
annotate src/gtkblist.c @ 13968:6fc412e59214
[gaim-migrate @ 16525]
A bunch of little things
* Use GAIM_CONNECTION_IS_VALID(gc) in a lot of places where
we were doing g_list_find(gaim_connections_get_all(), gc)
* Get rid of a lot of places where we were doing
g_list_find(gaim_connections_get_all(), gc). The handle used
by the request API ensures that the ok and cancel callback
functions won't be called if the gc is destroyed. However,
GAIM_CONNECTION_IS_VALID(gc) is still very important for
callback functions where we can't cancel the request.
For example, gaim_proxy_connect() callback functions.
* "Added" a function to Yahoo! that should help us notice
when our buddies change their buddy icon/display picture
* Some comments in a few places
* Changed GAIM_CONNECTION_IS_VALID(gc) to only look through
the list of "all" connections and not the list of
"connecting" connections. Some time ago we changed how
this was done so that the list of "all" connections now
includes the "connection" connections.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 20 Jul 2006 08:11:54 +0000 |
parents | dc4db4925249 |
children | 8bda65b88e49 |
rev | line source |
---|---|
5228 | 1 /* |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10288
diff
changeset
|
2 * @file gtkblist.c GTK+ BuddyList API |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10288
diff
changeset
|
3 * @ingroup gtkui |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10288
diff
changeset
|
4 * |
5228 | 5 * gaim |
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. | |
5228 | 10 * |
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" | |
7620 | 28 |
29 #include "account.h" | |
9015 | 30 #include "connection.h" |
7620 | 31 #include "core.h" |
32 #include "debug.h" | |
33 #include "notify.h" | |
34 #include "prpl.h" | |
35 #include "prefs.h" | |
8986 | 36 #include "plugin.h" |
7620 | 37 #include "request.h" |
38 #include "signals.h" | |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10288
diff
changeset
|
39 #include "gtkstock.h" |
7620 | 40 #include "util.h" |
41 | |
42 #include "gtkaccount.h" | |
43 #include "gtkblist.h" | |
44 #include "gtkconv.h" | |
45 #include "gtkdebug.h" | |
9709 | 46 #include "gtkdialogs.h" |
7620 | 47 #include "gtkft.h" |
48 #include "gtklog.h" | |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
49 #include "gtkmenutray.h" |
7620 | 50 #include "gtkpounce.h" |
11740 | 51 #include "gtkplugin.h" |
7620 | 52 #include "gtkprefs.h" |
53 #include "gtkprivacy.h" | |
8113 | 54 #include "gtkroomlist.h" |
10643 | 55 #include "gtkstatusbox.h" |
7620 | 56 #include "gtkutils.h" |
57 | |
5228 | 58 #include <gdk/gdkkeysyms.h> |
59 #include <gtk/gtk.h> | |
7620 | 60 #include <gdk/gdk.h> |
61 | |
62 typedef struct | |
63 { | |
64 GaimAccount *account; | |
65 | |
66 GtkWidget *window; | |
67 GtkWidget *combo; | |
68 GtkWidget *entry; | |
69 GtkWidget *entry_for_alias; | |
70 GtkWidget *account_box; | |
71 | |
72 } GaimGtkAddBuddyData; | |
73 | |
74 typedef struct | |
75 { | |
9811 | 76 GaimAccount *account; |
9812 | 77 gchar *default_chat_name; |
9811 | 78 |
79 GtkWidget *window; | |
7620 | 80 GtkWidget *account_menu; |
81 GtkWidget *alias_entry; | |
82 GtkWidget *group_combo; | |
83 GtkWidget *entries_box; | |
84 GtkSizeGroup *sg; | |
85 | |
86 GList *entries; | |
87 | |
88 } GaimGtkAddChatData; | |
89 | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
90 typedef struct |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
91 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
92 GaimAccount *account; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
93 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
94 GtkWidget *window; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
95 GtkWidget *account_menu; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
96 GtkWidget *entries_box; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
97 GtkSizeGroup *sg; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
98 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
99 GList *entries; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
100 } GaimGtkJoinChatData; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
101 |
7620 | 102 |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
103 static GtkWidget *accountmenu = NULL; |
5228 | 104 |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
105 static guint visibility_manager_count = 0; |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
106 static gboolean gtk_blist_obscured = FALSE; |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
107 |
11796 | 108 static GList *gaim_gtk_blist_sort_methods = NULL; |
5422 | 109 static struct gaim_gtk_blist_sort_method *current_sort_method = NULL; |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
110 static void sort_method_none(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter); |
7620 | 111 |
112 /* The functions we use for sorting aren't available in gtk 2.0.x, and | |
113 * segfault in 2.2.0. 2.2.1 is known to work, so I'll require that */ | |
114 #if GTK_CHECK_VERSION(2,2,1) | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
115 static void sort_method_alphabetical(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
116 static void sort_method_status(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
117 static void sort_method_log(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter); |
7620 | 118 #endif |
119 static GaimGtkBuddyList *gtkblist = NULL; | |
5228 | 120 |
13889 | 121 static gboolean gaim_gtk_blist_refresh_timer(GaimBuddyList *list); |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
122 static void gaim_gtk_blist_update_buddy(GaimBuddyList *list, GaimBlistNode *node); |
5228 | 123 static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data); |
7620 | 124 static void gaim_gtk_blist_update(GaimBuddyList *list, GaimBlistNode *node); |
13889 | 125 static void gaim_gtk_blist_update_contact(GaimBuddyList *list, GaimBlistNode *node); |
12530 | 126 static char *gaim_get_tooltip_text(GaimBlistNode *node, gboolean full); |
13106
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
127 static const char *item_factory_translate_func (const char *path, gpointer func_data); |
5273 | 128 static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter); |
7620 | 129 static void redo_buddy_list(GaimBuddyList *list, gboolean remove); |
130 static void gaim_gtk_blist_collapse_contact_cb(GtkWidget *w, GaimBlistNode *node); | |
131 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
132 static void gaim_gtk_blist_tooltip_destroy(void); |
11059
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
133 |
5256 | 134 struct _gaim_gtk_blist_node { |
135 GtkTreeRowReference *row; | |
7620 | 136 gboolean contact_expanded; |
11910 | 137 gboolean recent_signonoff; |
138 gint recent_signonoff_timer; | |
5256 | 139 }; |
140 | |
10968
e0d5038fbb7e
[gaim-migrate @ 12789]
Christopher O'Brien <siege@pidgin.im>
parents:
10924
diff
changeset
|
141 |
10118 | 142 static char dim_grey_string[8] = ""; |
10144 | 143 static char *dim_grey() |
10118 | 144 { |
145 if (!gtkblist) | |
146 return "dim grey"; | |
147 if (!dim_grey_string[0]) { | |
148 GtkStyle *style = gtk_widget_get_style(gtkblist->treeview); | |
149 snprintf(dim_grey_string, sizeof(dim_grey_string), "#%02x%02x%02x", | |
150 style->text_aa[GTK_STATE_NORMAL].red >> 8, | |
151 style->text_aa[GTK_STATE_NORMAL].green >> 8, | |
152 style->text_aa[GTK_STATE_NORMAL].blue >> 8); | |
153 } | |
154 return dim_grey_string; | |
155 } | |
10144 | 156 |
5228 | 157 /*************************************************** |
158 * Callbacks * | |
159 ***************************************************/ | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
160 static gboolean gtk_blist_visibility_cb(GtkWidget *w, GdkEventVisibility *event, gpointer data) |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
161 { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
162 if (event->state == GDK_VISIBILITY_FULLY_OBSCURED) |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
163 gtk_blist_obscured = TRUE; |
13889 | 164 else if (gtk_blist_obscured) { |
165 gtk_blist_obscured = FALSE; | |
166 gaim_gtk_blist_refresh_timer(gaim_get_blist()); | |
167 } | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
168 |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
169 /* continue to handle event normally */ |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
170 return FALSE; |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
171 } |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
172 |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
173 static gboolean gtk_blist_window_state_cb(GtkWidget *w, GdkEventWindowState *event, gpointer data) |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
174 { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
175 if(event->changed_mask & GDK_WINDOW_STATE_WITHDRAWN) { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
176 if(event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
177 gaim_prefs_set_bool("/gaim/gtk/blist/list_visible", FALSE); |
13889 | 178 else { |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
179 gaim_prefs_set_bool("/gaim/gtk/blist/list_visible", TRUE); |
13889 | 180 gaim_gtk_blist_refresh_timer(gaim_get_blist()); |
181 } | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
182 } |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
183 |
12279 | 184 if(event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) { |
185 if(event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) | |
186 gaim_prefs_set_bool("/gaim/gtk/blist/list_maximized", TRUE); | |
187 else | |
188 gaim_prefs_set_bool("/gaim/gtk/blist/list_maximized", FALSE); | |
189 } | |
13889 | 190 |
191 /* Refresh gtkblist if un-iconifying */ | |
192 if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED){ | |
193 if (!(event->new_window_state & GDK_WINDOW_STATE_ICONIFIED)) | |
194 gaim_gtk_blist_refresh_timer(gaim_get_blist()); | |
195 } | |
196 | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
197 return FALSE; |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
198 } |
5228 | 199 |
200 static gboolean gtk_blist_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data) | |
201 { | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
202 if(visibility_manager_count) |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
203 gaim_blist_set_visible(FALSE); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
204 else |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
205 gaim_core_quit(); |
5228 | 206 |
207 /* we handle everything, event should not propogate further */ | |
208 return TRUE; | |
209 } | |
210 | |
211 static gboolean gtk_blist_configure_cb(GtkWidget *w, GdkEventConfigure *event, gpointer data) | |
212 { | |
213 /* unfortunately GdkEventConfigure ignores the window gravity, but * | |
214 * the only way we have of setting the position doesn't. we have to * | |
7620 | 215 * call get_position because it does pay attention to the gravity. * |
216 * this is inefficient and I agree it sucks, but it's more likely * | |
217 * to work correctly. - Robot101 */ | |
5228 | 218 gint x, y; |
219 | |
220 /* check for visibility because when we aren't visible, this will * | |
221 * give us bogus (0,0) coordinates. - xOr */ | |
7620 | 222 if (GTK_WIDGET_VISIBLE(w)) |
5228 | 223 gtk_window_get_position(GTK_WINDOW(w), &x, &y); |
7620 | 224 else |
225 return FALSE; /* carry on normally */ | |
226 | |
13766
e55e52d41287
[gaim-migrate @ 16178]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13755
diff
changeset
|
227 #ifdef _WIN32 |
e55e52d41287
[gaim-migrate @ 16178]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13755
diff
changeset
|
228 /* Workaround for GTK+ bug # 169811 - "configure_event" is fired |
e55e52d41287
[gaim-migrate @ 16178]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13755
diff
changeset
|
229 * when the window is being maximized */ |
e55e52d41287
[gaim-migrate @ 16178]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13755
diff
changeset
|
230 if (gdk_window_get_state(w->window) |
e55e52d41287
[gaim-migrate @ 16178]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13755
diff
changeset
|
231 & GDK_WINDOW_STATE_MAXIMIZED) { |
e55e52d41287
[gaim-migrate @ 16178]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13755
diff
changeset
|
232 return FALSE; |
e55e52d41287
[gaim-migrate @ 16178]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13755
diff
changeset
|
233 } |
e55e52d41287
[gaim-migrate @ 16178]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13755
diff
changeset
|
234 #endif |
e55e52d41287
[gaim-migrate @ 16178]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13755
diff
changeset
|
235 |
7620 | 236 /* don't save if nothing changed */ |
237 if (x == gaim_prefs_get_int("/gaim/gtk/blist/x") && | |
238 y == gaim_prefs_get_int("/gaim/gtk/blist/y") && | |
239 event->width == gaim_prefs_get_int("/gaim/gtk/blist/width") && | |
240 event->height == gaim_prefs_get_int("/gaim/gtk/blist/height")) { | |
241 | |
242 return FALSE; /* carry on normally */ | |
5228 | 243 } |
244 | |
7620 | 245 /* don't save off-screen positioning */ |
246 if (x + event->width < 0 || | |
9811 | 247 y + event->height < 0 || |
248 x > gdk_screen_width() || | |
249 y > gdk_screen_height()) { | |
7620 | 250 |
251 return FALSE; /* carry on normally */ | |
252 } | |
253 | |
12279 | 254 /* ignore changes when maximized */ |
255 if(gaim_prefs_get_bool("/gaim/gtk/blist/list_maximized")) | |
256 return FALSE; | |
257 | |
7620 | 258 /* store the position */ |
259 gaim_prefs_set_int("/gaim/gtk/blist/x", x); | |
260 gaim_prefs_set_int("/gaim/gtk/blist/y", y); | |
261 gaim_prefs_set_int("/gaim/gtk/blist/width", event->width); | |
262 gaim_prefs_set_int("/gaim/gtk/blist/height", event->height); | |
263 | |
5228 | 264 /* continue to handle event normally */ |
265 return FALSE; | |
266 } | |
267 | |
7620 | 268 static void gtk_blist_menu_info_cb(GtkWidget *w, GaimBuddy *b) |
5228 | 269 { |
270 serv_get_info(b->account->gc, b->name); | |
271 } | |
272 | |
7620 | 273 static void gtk_blist_menu_im_cb(GtkWidget *w, GaimBuddy *b) |
5228 | 274 { |
9728 | 275 gaim_gtkdialogs_im_with_user(b->account, b->name); |
5228 | 276 } |
277 | |
9466 | 278 static void gtk_blist_menu_send_file_cb(GtkWidget *w, GaimBuddy *b) |
279 { | |
280 serv_send_file(b->account->gc, b->name, NULL); | |
281 } | |
282 | |
7620 | 283 static void gtk_blist_menu_autojoin_cb(GtkWidget *w, GaimChat *chat) |
284 { | |
7693 | 285 gaim_blist_node_set_bool((GaimBlistNode*)chat, "gtk-autojoin", |
286 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w))); | |
7620 | 287 } |
288 | |
12576
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
289 static void gtk_blist_join_chat(GaimChat *chat) |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
290 { |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
291 GaimConversation *conv; |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
292 |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
293 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_CHAT, |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
294 gaim_chat_get_name(chat), |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
295 chat->account); |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
296 |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
297 if (conv != NULL) |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
298 gaim_gtkconv_present_conversation(conv); |
12592
37160dd563fa
[gaim-migrate @ 14922]
Richard Laager <rlaager@wiktel.com>
parents:
12589
diff
changeset
|
299 |
37160dd563fa
[gaim-migrate @ 14922]
Richard Laager <rlaager@wiktel.com>
parents:
12589
diff
changeset
|
300 serv_join_chat(chat->account->gc, chat->components); |
12576
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
301 } |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
302 |
7620 | 303 static void gtk_blist_menu_join_cb(GtkWidget *w, GaimChat *chat) |
5228 | 304 { |
12576
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
305 gtk_blist_join_chat(chat); |
5234 | 306 } |
307 | |
11016 | 308 static void gtk_blist_renderer_edited_cb(GtkCellRendererText *text_rend, char *arg1, |
309 char *arg2, gpointer nada) | |
310 { | |
311 GtkTreeIter iter; | |
312 GtkTreePath *path; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
313 GValue val; |
11016 | 314 GaimBlistNode *node; |
315 | |
316 path = gtk_tree_path_new_from_string (arg1); | |
317 gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
318 gtk_tree_path_free (path); | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
319 val.g_type = 0; |
11016 | 320 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
321 node = g_value_get_pointer(&val); | |
322 gtk_tree_view_set_enable_search (GTK_TREE_VIEW(gtkblist->treeview), TRUE); | |
323 g_object_set(G_OBJECT(gtkblist->text_rend), "editable", FALSE, NULL); | |
12319
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
324 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
325 switch (node->type) |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
326 { |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
327 case GAIM_BLIST_CONTACT_NODE: |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
328 { |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
329 GaimContact *contact = (GaimContact *)node; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
330 struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
331 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
332 if (contact->alias || gtknode->contact_expanded) |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
333 gaim_blist_alias_contact(contact, arg2); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
334 else |
12478
8489040cf97b
[gaim-migrate @ 14789]
Richard Laager <rlaager@wiktel.com>
parents:
12474
diff
changeset
|
335 { |
8489040cf97b
[gaim-migrate @ 14789]
Richard Laager <rlaager@wiktel.com>
parents:
12474
diff
changeset
|
336 GaimBuddy *buddy = gaim_contact_get_priority_buddy(contact); |
8489040cf97b
[gaim-migrate @ 14789]
Richard Laager <rlaager@wiktel.com>
parents:
12474
diff
changeset
|
337 gaim_blist_alias_buddy(buddy, arg2); |
8489040cf97b
[gaim-migrate @ 14789]
Richard Laager <rlaager@wiktel.com>
parents:
12474
diff
changeset
|
338 serv_alias_buddy(buddy); |
8489040cf97b
[gaim-migrate @ 14789]
Richard Laager <rlaager@wiktel.com>
parents:
12474
diff
changeset
|
339 } |
12319
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
340 } |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
341 break; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
342 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
343 case GAIM_BLIST_BUDDY_NODE: |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
344 gaim_blist_alias_buddy((GaimBuddy*)node, arg2); |
12478
8489040cf97b
[gaim-migrate @ 14789]
Richard Laager <rlaager@wiktel.com>
parents:
12474
diff
changeset
|
345 serv_alias_buddy((GaimBuddy *)node); |
12319
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
346 break; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
347 case GAIM_BLIST_GROUP_NODE: |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
348 gaim_blist_rename_group((GaimGroup*)node, arg2); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
349 break; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
350 case GAIM_BLIST_CHAT_NODE: |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
351 gaim_blist_alias_chat((GaimChat*)node, arg2); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
352 break; |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
353 default: |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
354 break; |
11016 | 355 } |
356 } | |
357 | |
5234 | 358 static void gtk_blist_menu_alias_cb(GtkWidget *w, GaimBlistNode *node) |
359 { | |
11016 | 360 GtkTreeIter iter; |
361 GtkTreePath *path; | |
11258 | 362 const char *text = NULL; |
13509
56abb67edec9
[gaim-migrate @ 15885]
Richard Laager <rlaager@wiktel.com>
parents:
13478
diff
changeset
|
363 char *esc; |
11494 | 364 |
11258 | 365 if (!(get_iter_from_node(node, &iter))) { |
11016 | 366 /* This is either a bug, or the buddy is in a collapsed contact */ |
367 node = node->parent; | |
368 if (!get_iter_from_node(node, &iter)) | |
369 /* Now it's definitely a bug */ | |
370 return; | |
371 } | |
11258 | 372 |
373 switch (node->type) { | |
374 case GAIM_BLIST_BUDDY_NODE: | |
375 text = gaim_buddy_get_alias((GaimBuddy *)node); | |
376 break; | |
377 case GAIM_BLIST_CONTACT_NODE: | |
12319
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
378 text = gaim_contact_get_alias((GaimContact *)node); |
11258 | 379 break; |
380 case GAIM_BLIST_GROUP_NODE: | |
381 text = ((GaimGroup *)node)->name; | |
382 break; | |
383 case GAIM_BLIST_CHAT_NODE: | |
384 text = gaim_chat_get_name((GaimChat *)node); | |
385 break; | |
386 default: | |
387 g_return_if_reached(); | |
388 } | |
389 | |
13509
56abb67edec9
[gaim-migrate @ 15885]
Richard Laager <rlaager@wiktel.com>
parents:
13478
diff
changeset
|
390 esc = g_markup_escape_text(text, -1); |
56abb67edec9
[gaim-migrate @ 15885]
Richard Laager <rlaager@wiktel.com>
parents:
13478
diff
changeset
|
391 gtk_tree_store_set(gtkblist->treemodel, &iter, NAME_COLUMN, esc, -1); |
56abb67edec9
[gaim-migrate @ 15885]
Richard Laager <rlaager@wiktel.com>
parents:
13478
diff
changeset
|
392 g_free(esc); |
11258 | 393 |
11016 | 394 path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter); |
395 g_object_set(G_OBJECT(gtkblist->text_rend), "editable", TRUE, NULL); | |
396 gtk_tree_view_set_enable_search (GTK_TREE_VIEW(gtkblist->treeview), FALSE); | |
397 gtk_widget_grab_focus(gtkblist->treeview); | |
398 gtk_tree_view_set_cursor(GTK_TREE_VIEW(gtkblist->treeview), path, gtkblist->text_column, TRUE); | |
399 gtk_tree_path_free(path); | |
5228 | 400 } |
401 | |
7620 | 402 static void gtk_blist_menu_bp_cb(GtkWidget *w, GaimBuddy *b) |
5228 | 403 { |
12136
370f9d7868f9
[gaim-migrate @ 14436]
Richard Laager <rlaager@wiktel.com>
parents:
12133
diff
changeset
|
404 gaim_gtk_pounce_editor_show(b->account, b->name, NULL); |
5228 | 405 } |
406 | |
9917 | 407 static void gtk_blist_menu_showlog_cb(GtkWidget *w, GaimBlistNode *node) |
5228 | 408 { |
9917 | 409 GaimLogType type; |
410 GaimAccount *account; | |
411 char *name = NULL; | |
10663 | 412 |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
413 gaim_gtk_set_cursor(gtkblist->window, GDK_WATCH); |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
12226
diff
changeset
|
414 |
9917 | 415 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
416 GaimBuddy *b = (GaimBuddy*) node; | |
417 type = GAIM_LOG_IM; | |
418 name = g_strdup(b->name); | |
419 account = b->account; | |
420 } else if (GAIM_BLIST_NODE_IS_CHAT(node)) { | |
421 GaimChat *c = (GaimChat*) node; | |
422 GaimPluginProtocolInfo *prpl_info = NULL; | |
423 type = GAIM_LOG_CHAT; | |
424 account = c->account; | |
425 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gaim_find_prpl(gaim_account_get_protocol_id(account))); | |
426 if (prpl_info && prpl_info->get_chat_name) { | |
427 name = prpl_info->get_chat_name(c->components); | |
428 } | |
10663 | 429 } else if (GAIM_BLIST_NODE_IS_CONTACT(node)) { |
430 gaim_gtk_log_show_contact((GaimContact *)node); | |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
431 gaim_gtk_clear_cursor(gtkblist->window); |
10663 | 432 return; |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
12226
diff
changeset
|
433 } else { |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
434 gaim_gtk_clear_cursor(gtkblist->window); |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
12226
diff
changeset
|
435 |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
12226
diff
changeset
|
436 /* This callback should not have been registered for a node |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
12226
diff
changeset
|
437 * that doesn't match the type of one of the blocks above. */ |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
12226
diff
changeset
|
438 g_return_if_reached(); |
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
12226
diff
changeset
|
439 } |
9917 | 440 |
441 if (name && account) { | |
442 gaim_gtk_log_show(type, name, account); | |
443 g_free(name); | |
12232
375f1f3817a8
[gaim-migrate @ 14534]
Richard Laager <rlaager@wiktel.com>
parents:
12226
diff
changeset
|
444 |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
445 gaim_gtk_clear_cursor(gtkblist->window); |
9917 | 446 } |
7620 | 447 } |
448 | |
5228 | 449 static void gtk_blist_show_systemlog_cb() |
450 { | |
8573 | 451 gaim_gtk_syslog_show(); |
5228 | 452 } |
453 | |
454 static void gtk_blist_show_onlinehelp_cb() | |
455 { | |
10240
95ca0db2d01d
[gaim-migrate @ 11377]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10229
diff
changeset
|
456 gaim_notify_uri(NULL, GAIM_WEBSITE "documentation.php"); |
5228 | 457 } |
458 | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
459 static void |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
460 do_join_chat(GaimGtkJoinChatData *data) |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
461 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
462 if (data) |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
463 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
464 GHashTable *components = |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
465 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
466 GList *tmp; |
12576
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
467 GaimChat *chat; |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
468 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
469 for (tmp = data->entries; tmp != NULL; tmp = tmp->next) |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
470 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
471 if (g_object_get_data(tmp->data, "is_spin")) |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
472 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
473 g_hash_table_replace(components, |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
474 g_strdup(g_object_get_data(tmp->data, "identifier")), |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
475 g_strdup_printf("%d", |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
476 gtk_spin_button_get_value_as_int(tmp->data))); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
477 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
478 else |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
479 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
480 g_hash_table_replace(components, |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
481 g_strdup(g_object_get_data(tmp->data, "identifier")), |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
482 g_strdup(gtk_entry_get_text(tmp->data))); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
483 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
484 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
485 |
12576
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
486 chat = gaim_chat_new(data->account, NULL, components); |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
487 gtk_blist_join_chat(chat); |
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
488 gaim_blist_remove_chat(chat); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
489 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
490 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
491 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
492 static void |
8940 | 493 do_joinchat(GtkWidget *dialog, int id, GaimGtkJoinChatData *info) |
494 { | |
495 switch(id) | |
496 { | |
497 case GTK_RESPONSE_OK: | |
498 do_join_chat(info); | |
499 | |
500 break; | |
501 } | |
502 | |
503 gtk_widget_destroy(GTK_WIDGET(dialog)); | |
504 g_list_free(info->entries); | |
505 g_free(info); | |
506 } | |
507 | |
10475 | 508 /* |
509 * Check the values of all the text entry boxes. If any required input | |
510 * strings are empty then don't allow the user to click on "OK." | |
511 */ | |
512 static void | |
513 joinchat_set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data) | |
514 { | |
515 GaimGtkJoinChatData *data; | |
516 GList *tmp; | |
517 const char *text; | |
518 gboolean required; | |
519 gboolean sensitive = TRUE; | |
520 | |
521 data = user_data; | |
522 | |
523 for (tmp = data->entries; tmp != NULL; tmp = tmp->next) | |
524 { | |
525 if (!g_object_get_data(tmp->data, "is_spin")) | |
526 { | |
527 required = GPOINTER_TO_INT(g_object_get_data(tmp->data, "required")); | |
528 text = gtk_entry_get_text(tmp->data); | |
529 if (required && (*text == '\0')) | |
530 sensitive = FALSE; | |
531 } | |
532 } | |
533 | |
534 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_OK, sensitive); | |
535 } | |
536 | |
8940 | 537 static void |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
538 rebuild_joinchat_entries(GaimGtkJoinChatData *data) |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
539 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
540 GaimConnection *gc; |
9959 | 541 GList *list = NULL, *tmp = NULL; |
9770 | 542 GHashTable *defaults = NULL; |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
543 struct proto_chat_entry *pce; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
544 gboolean focus = TRUE; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
545 |
10127 | 546 g_return_if_fail(data->account != NULL); |
547 | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
548 gc = gaim_account_get_connection(data->account); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
549 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
550 while (GTK_BOX(data->entries_box)->children) |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
551 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
552 gtk_container_remove(GTK_CONTAINER(data->entries_box), |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
553 ((GtkBoxChild *)GTK_BOX(data->entries_box)->children->data)->widget); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
554 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
555 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
556 if (data->entries != NULL) |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
557 g_list_free(data->entries); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
558 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
559 data->entries = NULL; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
560 |
9987 | 561 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL) |
9959 | 562 list = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
563 |
9770 | 564 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) |
565 defaults = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, NULL); | |
566 | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
567 for (tmp = list; tmp; tmp = tmp->next) |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
568 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
569 GtkWidget *label; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
570 GtkWidget *rowbox; |
10475 | 571 GtkWidget *input; |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
572 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
573 pce = tmp->data; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
574 |
11243 | 575 rowbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
576 gtk_box_pack_start(GTK_BOX(data->entries_box), rowbox, FALSE, FALSE, 0); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
577 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
578 label = gtk_label_new_with_mnemonic(pce->label); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
579 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
580 gtk_size_group_add_widget(data->sg, label); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
581 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
582 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
583 if (pce->is_int) |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
584 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
585 GtkObject *adjust; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
586 adjust = gtk_adjustment_new(pce->min, pce->min, pce->max, |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
587 1, 10, 10); |
10475 | 588 input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); |
589 gtk_widget_set_size_request(input, 50, -1); | |
590 gtk_box_pack_end(GTK_BOX(rowbox), input, FALSE, FALSE, 0); | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
591 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
592 else |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
593 { |
9770 | 594 char *value; |
10475 | 595 input = gtk_entry_new(); |
596 gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE); | |
9770 | 597 value = g_hash_table_lookup(defaults, pce->identifier); |
598 if (value != NULL) | |
10475 | 599 gtk_entry_set_text(GTK_ENTRY(input), value); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
600 if (pce->secret) |
11986 | 601 { |
10475 | 602 gtk_entry_set_visibility(GTK_ENTRY(input), FALSE); |
11986 | 603 gtk_entry_set_invisible_char(GTK_ENTRY(input), GAIM_INVISIBLE_CHAR); |
604 } | |
10475 | 605 gtk_box_pack_end(GTK_BOX(rowbox), input, TRUE, TRUE, 0); |
606 g_signal_connect(G_OBJECT(input), "changed", | |
607 G_CALLBACK(joinchat_set_sensitive_if_input_cb), data); | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
608 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
609 |
10475 | 610 /* Do the following for any type of input widget */ |
611 if (focus) | |
612 { | |
613 gtk_widget_grab_focus(input); | |
614 focus = FALSE; | |
615 } | |
616 gtk_label_set_mnemonic_widget(GTK_LABEL(label), input); | |
617 gaim_set_accessible_label(input, label); | |
13106
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
618 g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier); |
10475 | 619 g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int)); |
620 g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required)); | |
621 data->entries = g_list_append(data->entries, input); | |
622 | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
623 g_free(pce); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
624 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
625 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
626 g_list_free(list); |
10475 | 627 g_hash_table_destroy(defaults); |
628 | |
629 /* Set whether the "OK" button should be clickable initially */ | |
630 joinchat_set_sensitive_if_input_cb(NULL, data); | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
631 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
632 gtk_widget_show_all(data->entries_box); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
633 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
634 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
635 static void |
8940 | 636 joinchat_select_account_cb(GObject *w, GaimAccount *account, |
13559
bbbde2f5c03b
[gaim-migrate @ 15938]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13545
diff
changeset
|
637 GaimGtkJoinChatData *data) |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
638 { |
13559
bbbde2f5c03b
[gaim-migrate @ 15938]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13545
diff
changeset
|
639 data->account = account; |
bbbde2f5c03b
[gaim-migrate @ 15938]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13545
diff
changeset
|
640 rebuild_joinchat_entries(data); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
641 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
642 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
643 static gboolean |
9987 | 644 chat_account_filter_func(GaimAccount *account) |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
645 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
646 GaimConnection *gc = gaim_account_get_connection(account); |
8940 | 647 GaimPluginProtocolInfo *prpl_info = NULL; |
648 | |
649 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
650 | |
651 return (prpl_info->chat_info != NULL); | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
652 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
653 |
8940 | 654 gboolean |
655 gaim_gtk_blist_joinchat_is_showable() | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
656 { |
8940 | 657 GList *c; |
658 GaimConnection *gc; | |
659 | |
660 for (c = gaim_connections_get_all(); c != NULL; c = c->next) { | |
661 gc = c->data; | |
662 | |
9987 | 663 if (chat_account_filter_func(gaim_connection_get_account(gc))) |
8940 | 664 return TRUE; |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
665 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
666 |
8940 | 667 return FALSE; |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
668 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
669 |
8305
57bdd25752c1
[gaim-migrate @ 9029]
Christian Hammond <chipx86@chipx86.com>
parents:
8303
diff
changeset
|
670 void |
8940 | 671 gaim_gtk_blist_joinchat_show(void) |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
672 { |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
673 GtkWidget *hbox, *vbox; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
674 GtkWidget *rowbox; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
675 GtkWidget *label; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
676 GaimGtkBuddyList *gtkblist; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
677 GtkWidget *img = NULL; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
678 GaimGtkJoinChatData *data = NULL; |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
679 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
680 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
681 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
682 GTK_ICON_SIZE_DIALOG); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
683 data = g_new0(GaimGtkJoinChatData, 1); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
684 |
8975 | 685 data->window = gtk_dialog_new_with_buttons(_("Join a Chat"), |
686 NULL, GTK_DIALOG_NO_SEPARATOR, | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
687 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
8308 | 688 GAIM_STOCK_CHAT, GTK_RESPONSE_OK, NULL); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
689 gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); |
11243 | 690 gtk_container_set_border_width(GTK_CONTAINER(data->window), GAIM_HIG_BOX_SPACE); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
691 gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); |
11243 | 692 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), GAIM_HIG_BORDER); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
693 gtk_container_set_border_width( |
11243 | 694 GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), GAIM_HIG_BOX_SPACE); |
8975 | 695 gtk_window_set_role(GTK_WINDOW(data->window), "join_chat"); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
696 |
11243 | 697 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
698 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
699 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
700 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
701 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
702 vbox = gtk_vbox_new(FALSE, 5); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
703 gtk_container_set_border_width(GTK_CONTAINER(vbox), 0); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
704 gtk_container_add(GTK_CONTAINER(hbox), vbox); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
705 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
706 label = gtk_label_new(_("Please enter the appropriate information " |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
707 "about the chat you would like to join.\n")); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
708 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
709 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
710 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
711 |
11243 | 712 rowbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
713 gtk_box_pack_start(GTK_BOX(vbox), rowbox, TRUE, TRUE, 0); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
714 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
715 data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
716 |
8940 | 717 label = gtk_label_new_with_mnemonic(_("_Account:")); |
718 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
719 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
720 gtk_size_group_add_widget(data->sg, label); | |
721 | |
722 data->account_menu = gaim_gtk_account_option_menu_new(NULL, FALSE, | |
723 G_CALLBACK(joinchat_select_account_cb), | |
9987 | 724 chat_account_filter_func, data); |
8940 | 725 gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); |
726 gtk_label_set_mnemonic_widget(GTK_LABEL(label), | |
727 GTK_WIDGET(data->account_menu)); | |
728 gaim_set_accessible_label (data->account_menu, label); | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
729 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
730 data->entries_box = gtk_vbox_new(FALSE, 5); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
731 gtk_container_add(GTK_CONTAINER(vbox), data->entries_box); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
732 gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
733 |
8940 | 734 data->account = gaim_gtk_account_option_menu_get_selected(data->account_menu); |
735 | |
8303
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
736 rebuild_joinchat_entries(data); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
737 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
738 g_signal_connect(G_OBJECT(data->window), "response", |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
739 G_CALLBACK(do_joinchat), data); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
740 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
741 g_object_unref(data->sg); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
742 |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
743 gtk_widget_show_all(data->window); |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
744 } |
4eb4b2a6c604
[gaim-migrate @ 9027]
Christian Hammond <chipx86@chipx86.com>
parents:
8302
diff
changeset
|
745 |
5228 | 746 static void gtk_blist_row_expanded_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) { |
747 GaimBlistNode *node; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
748 GValue val; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
749 |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
750 val.g_type = 0; |
5228 | 751 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val); |
752 | |
753 node = g_value_get_pointer(&val); | |
754 | |
755 if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
7693 | 756 gaim_blist_node_set_bool(node, "collapsed", FALSE); |
5228 | 757 } |
758 } | |
759 | |
760 static void gtk_blist_row_collapsed_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) { | |
761 GaimBlistNode *node; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
762 GValue val; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
763 |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
764 val.g_type = 0; |
5228 | 765 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val); |
766 | |
767 node = g_value_get_pointer(&val); | |
768 | |
769 if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
7693 | 770 gaim_blist_node_set_bool(node, "collapsed", TRUE); |
7620 | 771 } else if(GAIM_BLIST_NODE_IS_CONTACT(node)) { |
772 gaim_gtk_blist_collapse_contact_cb(NULL, node); | |
5228 | 773 } |
774 } | |
775 | |
776 static void gtk_blist_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { | |
777 GaimBlistNode *node; | |
778 GtkTreeIter iter; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
779 GValue val; |
5228 | 780 |
781 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
782 | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
783 val.g_type = 0; |
5228 | 784 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
785 node = g_value_get_pointer(&val); | |
786 | |
7620 | 787 if(GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_BUDDY(node)) { |
788 GaimBuddy *buddy; | |
789 | |
790 if(GAIM_BLIST_NODE_IS_CONTACT(node)) | |
791 buddy = gaim_contact_get_priority_buddy((GaimContact*)node); | |
792 else | |
793 buddy = (GaimBuddy*)node; | |
794 | |
9728 | 795 gaim_gtkdialogs_im_with_user(buddy->account, buddy->name); |
5234 | 796 } else if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
12576
1246935dd047
[gaim-migrate @ 14898]
Richard Laager <rlaager@wiktel.com>
parents:
12569
diff
changeset
|
797 gtk_blist_join_chat((GaimChat *)node); |
5228 | 798 } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
799 if (gtk_tree_view_row_expanded(tv, path)) | |
800 gtk_tree_view_collapse_row(tv, path); | |
801 else | |
802 gtk_tree_view_expand_row(tv,path,FALSE); | |
803 } | |
804 } | |
805 | |
5234 | 806 static void gaim_gtk_blist_add_chat_cb() |
807 { | |
808 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); | |
809 GtkTreeIter iter; | |
810 GaimBlistNode *node; | |
811 | |
812 if(gtk_tree_selection_get_selected(sel, NULL, &iter)){ | |
813 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); | |
7620 | 814 if (GAIM_BLIST_NODE_IS_BUDDY(node)) |
9754 | 815 gaim_blist_request_add_chat(NULL, (GaimGroup*)node->parent->parent, NULL, NULL); |
7620 | 816 if (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_CHAT(node)) |
9754 | 817 gaim_blist_request_add_chat(NULL, (GaimGroup*)node->parent, NULL, NULL); |
5234 | 818 else if (GAIM_BLIST_NODE_IS_GROUP(node)) |
9754 | 819 gaim_blist_request_add_chat(NULL, (GaimGroup*)node, NULL, NULL); |
5234 | 820 } |
821 else { | |
9754 | 822 gaim_blist_request_add_chat(NULL, NULL, NULL, NULL); |
5234 | 823 } |
824 } | |
825 | |
5228 | 826 static void gaim_gtk_blist_add_buddy_cb() |
827 { | |
828 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); | |
829 GtkTreeIter iter; | |
830 GaimBlistNode *node; | |
831 | |
832 if(gtk_tree_selection_get_selected(sel, NULL, &iter)){ | |
833 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); | |
7620 | 834 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { |
835 gaim_blist_request_add_buddy(NULL, NULL, ((GaimGroup*)node->parent->parent)->name, | |
836 NULL); | |
837 } else if (GAIM_BLIST_NODE_IS_CONTACT(node) | |
838 || GAIM_BLIST_NODE_IS_CHAT(node)) { | |
839 gaim_blist_request_add_buddy(NULL, NULL, ((GaimGroup*)node->parent)->name, NULL); | |
840 } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
841 gaim_blist_request_add_buddy(NULL, NULL, ((GaimGroup*)node)->name, NULL); | |
842 } | |
5228 | 843 } |
844 else { | |
7620 | 845 gaim_blist_request_add_buddy(NULL, NULL, NULL, NULL); |
846 } | |
847 } | |
848 | |
849 static void | |
850 gaim_gtk_blist_remove_cb (GtkWidget *w, GaimBlistNode *node) | |
851 { | |
852 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
9730 | 853 gaim_gtkdialogs_remove_buddy((GaimBuddy*)node); |
7620 | 854 } else if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
9730 | 855 gaim_gtkdialogs_remove_chat((GaimChat*)node); |
7620 | 856 } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
9730 | 857 gaim_gtkdialogs_remove_group((GaimGroup*)node); |
7620 | 858 } else if (GAIM_BLIST_NODE_IS_CONTACT(node)) { |
9730 | 859 gaim_gtkdialogs_remove_contact((GaimContact*)node); |
5228 | 860 } |
861 } | |
862 | |
863 static void | |
7620 | 864 gaim_gtk_blist_expand_contact_cb(GtkWidget *w, GaimBlistNode *node) |
5228 | 865 { |
7620 | 866 struct _gaim_gtk_blist_node *gtknode; |
9632 | 867 GtkTreeIter iter, parent; |
7620 | 868 GaimBlistNode *bnode; |
10325 | 869 GtkTreePath *path; |
7620 | 870 |
871 if(!GAIM_BLIST_NODE_IS_CONTACT(node)) | |
872 return; | |
873 | |
874 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
875 | |
876 gtknode->contact_expanded = TRUE; | |
877 | |
878 for(bnode = node->child; bnode; bnode = bnode->next) { | |
879 gaim_gtk_blist_update(NULL, bnode); | |
880 } | |
10353 | 881 |
9632 | 882 /* This ensures that the bottom buddy is visible, i.e. not scrolled off the alignment */ |
883 get_iter_from_node(node, &parent); | |
10353 | 884 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(gtkblist->treemodel), &iter, &parent, |
9811 | 885 gtk_tree_model_iter_n_children(GTK_TREE_MODEL(gtkblist->treemodel), &parent) -1); |
9632 | 886 path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter); |
887 /* Let the treeview draw so it knows where to scroll */ | |
888 while (gtk_events_pending()) | |
889 gtk_main_iteration(); | |
10353 | 890 gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(gtkblist->treeview), path, NULL, FALSE, 0, 0); |
891 | |
13889 | 892 gaim_gtk_blist_update_contact(NULL, node->child); |
9632 | 893 gtk_tree_path_free(path); |
7620 | 894 } |
895 | |
896 static void | |
897 gaim_gtk_blist_collapse_contact_cb(GtkWidget *w, GaimBlistNode *node) | |
898 { | |
899 GaimBlistNode *bnode; | |
900 struct _gaim_gtk_blist_node *gtknode; | |
901 | |
902 if(!GAIM_BLIST_NODE_IS_CONTACT(node)) | |
903 return; | |
904 | |
905 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
906 | |
907 gtknode->contact_expanded = FALSE; | |
908 | |
909 for(bnode = node->child; bnode; bnode = bnode->next) { | |
910 gaim_gtk_blist_update(NULL, bnode); | |
5228 | 911 } |
912 } | |
913 | |
9051 | 914 void |
10662
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10643
diff
changeset
|
915 gaim_gtk_append_blist_node_proto_menu(GtkWidget *menu, GaimConnection *gc, |
54ac161a876e
[gaim-migrate @ 12199]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10643
diff
changeset
|
916 GaimBlistNode *node) |
9030 | 917 { |
918 GList *l, *ll; | |
919 GaimPluginProtocolInfo *prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
920 | |
921 if(!prpl_info || !prpl_info->blist_node_menu) | |
922 return; | |
923 | |
924 for(l = ll = prpl_info->blist_node_menu(node); l; l = l->next) { | |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12883
diff
changeset
|
925 GaimMenuAction *act = (GaimMenuAction *) l->data; |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12883
diff
changeset
|
926 gaim_gtk_append_menu_action(menu, act, node); |
9030 | 927 } |
928 g_list_free(ll); | |
929 } | |
930 | |
9051 | 931 void |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12883
diff
changeset
|
932 gaim_gtk_append_blist_node_extended_menu(GtkWidget *menu, GaimBlistNode *node) |
9030 | 933 { |
934 GList *l, *ll; | |
935 | |
936 for(l = ll = gaim_blist_node_get_extended_menu(node); l; l = l->next) { | |
12919
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12883
diff
changeset
|
937 GaimMenuAction *act = (GaimMenuAction *) l->data; |
248b8b39c671
[gaim-migrate @ 15272]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12883
diff
changeset
|
938 gaim_gtk_append_menu_action(menu, act, node); |
9030 | 939 } |
940 g_list_free(ll); | |
941 } | |
942 | |
9774 | 943 void |
10484 | 944 gaim_gtk_blist_make_buddy_menu(GtkWidget *menu, GaimBuddy *buddy, gboolean sub) { |
9774 | 945 GaimPluginProtocolInfo *prpl_info; |
10663 | 946 GaimContact *contact; |
947 gboolean contact_expanded = FALSE; | |
9774 | 948 |
949 g_return_if_fail(menu); | |
950 g_return_if_fail(buddy); | |
951 | |
952 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(buddy->account->gc->prpl); | |
953 | |
10663 | 954 contact = gaim_buddy_get_contact(buddy); |
955 if (contact) { | |
956 contact_expanded = ((struct _gaim_gtk_blist_node *)(((GaimBlistNode*)contact)->ui_data))->contact_expanded; | |
957 } | |
958 | |
7620 | 959 if (prpl_info && prpl_info->get_info) { |
8137 | 960 gaim_new_item_from_stock(menu, _("Get _Info"), GAIM_STOCK_INFO, |
9774 | 961 G_CALLBACK(gtk_blist_menu_info_cb), buddy, 0, 0, NULL); |
7620 | 962 } |
8137 | 963 gaim_new_item_from_stock(menu, _("I_M"), GAIM_STOCK_IM, |
9774 | 964 G_CALLBACK(gtk_blist_menu_im_cb), buddy, 0, 0, NULL); |
9466 | 965 if (prpl_info && prpl_info->send_file) { |
9774 | 966 if (!prpl_info->can_receive_file || |
967 prpl_info->can_receive_file(buddy->account->gc, buddy->name)) | |
968 { | |
969 gaim_new_item_from_stock(menu, _("_Send File"), | |
970 GAIM_STOCK_FILE_TRANSFER, | |
971 G_CALLBACK(gtk_blist_menu_send_file_cb), | |
972 buddy, 0, 0, NULL); | |
9466 | 973 } |
974 } | |
12024 | 975 |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12179
diff
changeset
|
976 gaim_new_item_from_stock(menu, _("Add Buddy _Pounce"), GAIM_STOCK_POUNCE, |
9774 | 977 G_CALLBACK(gtk_blist_menu_bp_cb), buddy, 0, 0, NULL); |
10663 | 978 |
979 if(((GaimBlistNode*)buddy)->parent->child->next && !sub && !contact_expanded) { | |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12179
diff
changeset
|
980 gaim_new_item_from_stock(menu, _("View _Log"), GAIM_STOCK_LOG, |
10663 | 981 G_CALLBACK(gtk_blist_menu_showlog_cb), |
982 contact, 0, 0, NULL); | |
983 } else if (!sub) { | |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12179
diff
changeset
|
984 gaim_new_item_from_stock(menu, _("View _Log"), GAIM_STOCK_LOG, |
10663 | 985 G_CALLBACK(gtk_blist_menu_showlog_cb), buddy, 0, 0, NULL); |
986 } | |
9774 | 987 |
988 gaim_gtk_append_blist_node_proto_menu(menu, buddy->account->gc, | |
989 (GaimBlistNode *)buddy); | |
990 gaim_gtk_append_blist_node_extended_menu(menu, (GaimBlistNode *)buddy); | |
7620 | 991 |
12319
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
992 if (((GaimBlistNode*)buddy)->parent->child->next && !sub && !contact_expanded) { |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
993 gaim_separator(menu); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
994 |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
995 gaim_new_item_from_stock(menu, _("Alias..."), GAIM_STOCK_ALIAS, |
9925 | 996 G_CALLBACK(gtk_blist_menu_alias_cb), |
10663 | 997 contact, 0, 0, NULL); |
12319
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
998 gaim_new_item_from_stock(menu, _("Remove"), GTK_STOCK_REMOVE, |
9925 | 999 G_CALLBACK(gaim_gtk_blist_remove_cb), |
10663 | 1000 contact, 0, 0, NULL); |
12319
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
1001 } else if (!sub || contact_expanded) { |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
1002 gaim_separator(menu); |
7630a95f3b8b
[gaim-migrate @ 14623]
Richard Laager <rlaager@wiktel.com>
parents:
12302
diff
changeset
|
1003 |
9925 | 1004 gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, |
1005 G_CALLBACK(gtk_blist_menu_alias_cb), buddy, 0, 0, NULL); | |
1006 gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, | |
1007 G_CALLBACK(gaim_gtk_blist_remove_cb), buddy, | |
1008 0, 0, NULL); | |
1009 } | |
7620 | 1010 } |
1011 | |
9774 | 1012 static gboolean |
1013 gtk_blist_key_press_cb(GtkWidget *tv, GdkEventKey *event, gpointer data) { | |
7620 | 1014 GaimBlistNode *node; |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1015 GValue val; |
7620 | 1016 GtkTreeIter iter; |
1017 GtkTreeSelection *sel; | |
1018 | |
1019 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); | |
1020 if(!gtk_tree_selection_get_selected(sel, NULL, &iter)) | |
1021 return FALSE; | |
1022 | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1023 val.g_type = 0; |
7620 | 1024 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), &iter, |
1025 NODE_COLUMN, &val); | |
1026 node = g_value_get_pointer(&val); | |
1027 | |
1028 if(event->state & GDK_CONTROL_MASK && | |
1029 (event->keyval == 'o' || event->keyval == 'O')) { | |
1030 GaimBuddy *buddy; | |
1031 | |
1032 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
1033 buddy = gaim_contact_get_priority_buddy((GaimContact*)node); | |
1034 } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
1035 buddy = (GaimBuddy*)node; | |
1036 } else { | |
1037 return FALSE; | |
1038 } | |
1039 if(buddy) | |
1040 serv_get_info(buddy->account->gc, buddy->name); | |
1041 } | |
1042 | |
1043 return FALSE; | |
1044 } | |
1045 | |
9013 | 1046 |
8143 | 1047 static GtkWidget * |
8952 | 1048 create_group_menu (GaimBlistNode *node, GaimGroup *g) |
8143 | 1049 { |
1050 GtkWidget *menu; | |
11988 | 1051 GtkWidget *item; |
8143 | 1052 |
1053 menu = gtk_menu_new(); | |
1054 gaim_new_item_from_stock(menu, _("Add a _Buddy"), GTK_STOCK_ADD, | |
1055 G_CALLBACK(gaim_gtk_blist_add_buddy_cb), node, 0, 0, NULL); | |
11988 | 1056 item = gaim_new_item_from_stock(menu, _("Add a C_hat"), GTK_STOCK_ADD, |
8143 | 1057 G_CALLBACK(gaim_gtk_blist_add_chat_cb), node, 0, 0, NULL); |
11988 | 1058 gtk_widget_set_sensitive(item, gaim_gtk_blist_joinchat_is_showable()); |
8143 | 1059 gaim_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE, |
1060 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); | |
1061 gaim_new_item_from_stock(menu, _("_Rename"), NULL, | |
11016 | 1062 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); |
8952 | 1063 |
9051 | 1064 gaim_gtk_append_blist_node_extended_menu(menu, node); |
8952 | 1065 |
8143 | 1066 return menu; |
1067 } | |
1068 | |
8586 | 1069 |
8143 | 1070 static GtkWidget * |
9774 | 1071 create_chat_menu(GaimBlistNode *node, GaimChat *c) { |
8143 | 1072 GtkWidget *menu; |
9030 | 1073 gboolean autojoin; |
8143 | 1074 |
1075 menu = gtk_menu_new(); | |
9030 | 1076 autojoin = (gaim_blist_node_get_bool(node, "gtk-autojoin") || |
1077 (gaim_blist_node_get_string(node, "gtk-autojoin") != NULL)); | |
1078 | |
8143 | 1079 gaim_new_item_from_stock(menu, _("_Join"), GAIM_STOCK_CHAT, |
9030 | 1080 G_CALLBACK(gtk_blist_menu_join_cb), node, 0, 0, NULL); |
8143 | 1081 gaim_new_check_item(menu, _("Auto-Join"), |
9030 | 1082 G_CALLBACK(gtk_blist_menu_autojoin_cb), node, autojoin); |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12179
diff
changeset
|
1083 gaim_new_item_from_stock(menu, _("View _Log"), GAIM_STOCK_LOG, |
9917 | 1084 G_CALLBACK(gtk_blist_menu_showlog_cb), node, 0, 0, NULL); |
9030 | 1085 |
9051 | 1086 gaim_gtk_append_blist_node_proto_menu(menu, c->account->gc, node); |
1087 gaim_gtk_append_blist_node_extended_menu(menu, node); | |
8586 | 1088 |
1089 gaim_separator(menu); | |
9030 | 1090 |
8302
462ead6fc1a0
[gaim-migrate @ 9026]
Christian Hammond <chipx86@chipx86.com>
parents:
8259
diff
changeset
|
1091 gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, |
8143 | 1092 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); |
1093 gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, | |
1094 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); | |
8586 | 1095 |
8143 | 1096 return menu; |
1097 } | |
1098 | |
1099 static GtkWidget * | |
1100 create_contact_menu (GaimBlistNode *node) | |
1101 { | |
1102 GtkWidget *menu; | |
1103 | |
1104 menu = gtk_menu_new(); | |
10663 | 1105 |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12179
diff
changeset
|
1106 gaim_new_item_from_stock(menu, _("View _Log"), GAIM_STOCK_LOG, |
10663 | 1107 G_CALLBACK(gtk_blist_menu_showlog_cb), |
1108 node, 0, 0, NULL); | |
1109 | |
1110 gaim_separator(menu); | |
1111 | |
8302
462ead6fc1a0
[gaim-migrate @ 9026]
Christian Hammond <chipx86@chipx86.com>
parents:
8259
diff
changeset
|
1112 gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, |
8143 | 1113 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); |
10663 | 1114 gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, |
1115 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL); | |
1116 | |
1117 gaim_separator(menu); | |
1118 | |
8143 | 1119 gaim_new_item_from_stock(menu, _("_Collapse"), GTK_STOCK_ZOOM_OUT, |
1120 G_CALLBACK(gaim_gtk_blist_collapse_contact_cb), | |
1121 node, 0, 0, NULL); | |
9051 | 1122 |
1123 gaim_gtk_append_blist_node_extended_menu(menu, node); | |
1124 | |
8143 | 1125 return menu; |
1126 } | |
1127 | |
1128 static GtkWidget * | |
9774 | 1129 create_buddy_menu(GaimBlistNode *node, GaimBuddy *b) { |
8143 | 1130 struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; |
1131 GtkWidget *menu; | |
1132 GtkWidget *menuitem; | |
1133 gboolean show_offline = gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies"); | |
8470
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
1134 |
8143 | 1135 menu = gtk_menu_new(); |
10484 | 1136 gaim_gtk_blist_make_buddy_menu(menu, b, FALSE); |
8143 | 1137 |
1138 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
1139 gaim_separator(menu); | |
8470
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
1140 |
8143 | 1141 if(gtknode->contact_expanded) { |
1142 gaim_new_item_from_stock(menu, _("_Collapse"), | |
1143 GTK_STOCK_ZOOM_OUT, | |
1144 G_CALLBACK(gaim_gtk_blist_collapse_contact_cb), | |
1145 node, 0, 0, NULL); | |
1146 } else { | |
1147 gaim_new_item_from_stock(menu, _("_Expand"), | |
1148 GTK_STOCK_ZOOM_IN, | |
1149 G_CALLBACK(gaim_gtk_blist_expand_contact_cb), node, | |
1150 0, 0, NULL); | |
1151 } | |
1152 if(node->child->next) { | |
1153 GaimBlistNode *bnode; | |
1154 | |
1155 for(bnode = node->child; bnode; bnode = bnode->next) { | |
1156 GaimBuddy *buddy = (GaimBuddy*)bnode; | |
9340 | 1157 GdkPixbuf *buf; |
8143 | 1158 GtkWidget *submenu; |
1159 GtkWidget *image; | |
1160 | |
1161 if(buddy == b) | |
1162 continue; | |
1163 if(!buddy->account->gc) | |
1164 continue; | |
1165 if(!show_offline && !GAIM_BUDDY_IS_ONLINE(buddy)) | |
1166 continue; | |
1167 | |
1168 menuitem = gtk_image_menu_item_new_with_label(buddy->name); | |
9340 | 1169 buf = gaim_gtk_blist_get_status_icon(bnode, |
1170 GAIM_STATUS_ICON_SMALL); | |
1171 image = gtk_image_new_from_pixbuf(buf); | |
1172 g_object_unref(G_OBJECT(buf)); | |
8143 | 1173 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), |
9811 | 1174 image); |
8143 | 1175 gtk_widget_show(image); |
1176 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); | |
1177 gtk_widget_show(menuitem); | |
1178 | |
1179 submenu = gtk_menu_new(); | |
1180 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); | |
1181 gtk_widget_show(submenu); | |
1182 | |
10484 | 1183 gaim_gtk_blist_make_buddy_menu(submenu, buddy, TRUE); |
8143 | 1184 } |
1185 } | |
1186 } | |
1187 return menu; | |
1188 } | |
1189 | |
1190 static gboolean | |
1191 gaim_gtk_blist_show_context_menu(GaimBlistNode *node, | |
1192 GtkMenuPositionFunc func, | |
1193 GtkWidget *tv, | |
1194 guint button, | |
1195 guint32 time) | |
1196 { | |
1197 struct _gaim_gtk_blist_node *gtknode; | |
1198 GtkWidget *menu = NULL; | |
1199 gboolean handled = FALSE; | |
1200 | |
1201 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
1202 | |
1203 /* Create a menu based on the thing we right-clicked on */ | |
1204 if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
8952 | 1205 GaimGroup *g = (GaimGroup *)node; |
9774 | 1206 |
8952 | 1207 menu = create_group_menu(node, g); |
8143 | 1208 } else if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
8586 | 1209 GaimChat *c = (GaimChat *)node; |
9774 | 1210 |
1211 menu = create_chat_menu(node, c); | |
8143 | 1212 } else if ((GAIM_BLIST_NODE_IS_CONTACT(node)) && (gtknode->contact_expanded)) { |
1213 menu = create_contact_menu(node); | |
1214 } else if (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
1215 GaimBuddy *b; | |
1216 | |
1217 if (GAIM_BLIST_NODE_IS_CONTACT(node)) | |
1218 b = gaim_contact_get_priority_buddy((GaimContact*)node); | |
1219 else | |
1220 b = (GaimBuddy *)node; | |
1221 | |
9774 | 1222 menu = create_buddy_menu(node, b); |
8143 | 1223 } |
1224 | |
11059
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1225 #ifdef _WIN32 |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1226 /* Unhook the tooltip-timeout since we don't want a tooltip |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1227 * to appear and obscure the context menu we are about to show |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1228 This is a workaround for GTK+ bug 107320. */ |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1229 if (gtkblist->timeout) { |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1230 g_source_remove(gtkblist->timeout); |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1231 gtkblist->timeout = 0; |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1232 } |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1233 #endif |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1234 |
8143 | 1235 /* Now display the menu */ |
1236 if (menu != NULL) { | |
1237 gtk_widget_show_all(menu); | |
1238 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, func, tv, button, time); | |
1239 handled = TRUE; | |
1240 } | |
1241 | |
1242 return handled; | |
1243 } | |
1244 | |
1245 static gboolean gtk_blist_button_press_cb(GtkWidget *tv, GdkEventButton *event, gpointer user_data) | |
5228 | 1246 { |
1247 GtkTreePath *path; | |
1248 GaimBlistNode *node; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1249 GValue val; |
5228 | 1250 GtkTreeIter iter; |
1251 GtkTreeSelection *sel; | |
1252 GaimPlugin *prpl = NULL; | |
1253 GaimPluginProtocolInfo *prpl_info = NULL; | |
7620 | 1254 struct _gaim_gtk_blist_node *gtknode; |
1255 gboolean handled = FALSE; | |
5228 | 1256 |
1257 /* Here we figure out which node was clicked */ | |
1258 if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL)) | |
1259 return FALSE; | |
1260 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1261 val.g_type = 0; |
8143 | 1262 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
5228 | 1263 node = g_value_get_pointer(&val); |
7620 | 1264 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; |
1265 | |
8143 | 1266 /* Right click draws a context menu */ |
1267 if ((event->button == 3) && (event->type == GDK_BUTTON_PRESS)) { | |
1268 handled = gaim_gtk_blist_show_context_menu(node, NULL, tv, 3, event->time); | |
1269 | |
1270 /* CTRL+middle click expands or collapse a contact */ | |
1271 } else if ((event->button == 2) && (event->type == GDK_BUTTON_PRESS) && | |
1272 (event->state & GDK_CONTROL_MASK) && (GAIM_BLIST_NODE_IS_CONTACT(node))) { | |
1273 if (gtknode->contact_expanded) | |
7620 | 1274 gaim_gtk_blist_collapse_contact_cb(NULL, node); |
1275 else | |
1276 gaim_gtk_blist_expand_contact_cb(NULL, node); | |
1277 handled = TRUE; | |
8143 | 1278 |
1279 /* Double middle click gets info */ | |
1280 } else if ((event->button == 2) && (event->type == GDK_2BUTTON_PRESS) && | |
1281 ((GAIM_BLIST_NODE_IS_CONTACT(node)) || (GAIM_BLIST_NODE_IS_BUDDY(node)))) { | |
7620 | 1282 GaimBuddy *b; |
1283 if(GAIM_BLIST_NODE_IS_CONTACT(node)) | |
1284 b = gaim_contact_get_priority_buddy((GaimContact*)node); | |
1285 else | |
1286 b = (GaimBuddy *)node; | |
1287 | |
7956 | 1288 prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account)); |
5228 | 1289 if (prpl != NULL) |
1290 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
1291 | |
8143 | 1292 if (prpl && prpl_info->get_info) |
1293 serv_get_info(b->account->gc, b->name); | |
1294 handled = TRUE; | |
5228 | 1295 } |
1296 | |
8143 | 1297 #if (1) |
1298 /* | |
10814
364a2ef907ae
[gaim-migrate @ 12468]
Luke Schierer <lschiere@pidgin.im>
parents:
10780
diff
changeset
|
1299 * This code only exists because GTK+ doesn't work. If we return |
8143 | 1300 * FALSE here, as would be normal the event propoagates down and |
1301 * somehow gets interpreted as the start of a drag event. | |
1302 * | |
1303 * Um, isn't it _normal_ to return TRUE here? Since the event | |
1304 * was handled? --Mark | |
1305 */ | |
7620 | 1306 if(handled) { |
1307 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); | |
1308 gtk_tree_selection_select_path(sel, path); | |
1309 gtk_tree_path_free(path); | |
1310 return TRUE; | |
1311 } | |
5228 | 1312 #endif |
7753 | 1313 gtk_tree_path_free(path); |
8143 | 1314 |
7620 | 1315 return FALSE; |
5228 | 1316 } |
1317 | |
8143 | 1318 static gboolean |
1319 gaim_gtk_blist_popup_menu_cb(GtkWidget *tv, void *user_data) | |
1320 { | |
1321 GaimBlistNode *node; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1322 GValue val; |
8143 | 1323 GtkTreeIter iter; |
1324 GtkTreeSelection *sel; | |
1325 gboolean handled = FALSE; | |
1326 | |
1327 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); | |
1328 if (!gtk_tree_selection_get_selected(sel, NULL, &iter)) | |
1329 return FALSE; | |
1330 | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1331 val.g_type = 0; |
8143 | 1332 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), |
1333 &iter, NODE_COLUMN, &val); | |
1334 node = g_value_get_pointer(&val); | |
1335 | |
1336 /* Shift+F10 draws a context menu */ | |
1337 handled = gaim_gtk_blist_show_context_menu(node, gaim_gtk_treeview_popup_menu_position_func, tv, 0, GDK_CURRENT_TIME); | |
1338 | |
1339 return handled; | |
1340 } | |
1341 | |
11796 | 1342 static void gaim_gtk_blist_buddy_details_cb(gpointer data, guint action, GtkWidget *item) |
1343 { | |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
1344 gaim_gtk_set_cursor(gtkblist->window, GDK_WATCH); |
12569
853e85b6d98c
[gaim-migrate @ 14888]
Richard Laager <rlaager@wiktel.com>
parents:
12530
diff
changeset
|
1345 |
11796 | 1346 gaim_prefs_set_bool("/gaim/gtk/blist/show_buddy_icons", |
1347 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))); | |
12569
853e85b6d98c
[gaim-migrate @ 14888]
Richard Laager <rlaager@wiktel.com>
parents:
12530
diff
changeset
|
1348 |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
1349 gaim_gtk_clear_cursor(gtkblist->window); |
11796 | 1350 } |
1351 | |
12656 | 1352 static void gaim_gtk_blist_show_idle_time_cb(gpointer data, guint action, GtkWidget *item) |
1353 { | |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
1354 gaim_gtk_set_cursor(gtkblist->window, GDK_WATCH); |
12656 | 1355 |
1356 gaim_prefs_set_bool("/gaim/gtk/blist/show_idle_time", | |
1357 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))); | |
1358 | |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
1359 gaim_gtk_clear_cursor(gtkblist->window); |
12656 | 1360 } |
1361 | |
5228 | 1362 static void gaim_gtk_blist_show_empty_groups_cb(gpointer data, guint action, GtkWidget *item) |
1363 { | |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
1364 gaim_gtk_set_cursor(gtkblist->window, GDK_WATCH); |
12569
853e85b6d98c
[gaim-migrate @ 14888]
Richard Laager <rlaager@wiktel.com>
parents:
12530
diff
changeset
|
1365 |
7620 | 1366 gaim_prefs_set_bool("/gaim/gtk/blist/show_empty_groups", |
1367 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item))); | |
12569
853e85b6d98c
[gaim-migrate @ 14888]
Richard Laager <rlaager@wiktel.com>
parents:
12530
diff
changeset
|
1368 |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
1369 gaim_gtk_clear_cursor(gtkblist->window); |
5228 | 1370 } |
1371 | |
1372 static void gaim_gtk_blist_edit_mode_cb(gpointer callback_data, guint callback_action, | |
12569
853e85b6d98c
[gaim-migrate @ 14888]
Richard Laager <rlaager@wiktel.com>
parents:
12530
diff
changeset
|
1373 GtkWidget *checkitem) |
853e85b6d98c
[gaim-migrate @ 14888]
Richard Laager <rlaager@wiktel.com>
parents:
12530
diff
changeset
|
1374 { |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
1375 gaim_gtk_set_cursor(gtkblist->window, GDK_WATCH); |
5228 | 1376 |
7620 | 1377 gaim_prefs_set_bool("/gaim/gtk/blist/show_offline_buddies", |
1378 gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(checkitem))); | |
5228 | 1379 |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
1380 gaim_gtk_clear_cursor(gtkblist->window); |
5228 | 1381 } |
1382 | |
10074 | 1383 static void gaim_gtk_blist_mute_sounds_cb(gpointer data, guint action, GtkWidget *item) |
1384 { | |
1385 gaim_prefs_set_bool("/gaim/gtk/sound/mute", GTK_CHECK_MENU_ITEM(item)->active); | |
1386 } | |
1387 | |
12816 | 1388 static void |
1389 gaim_gtk_blist_mute_pref_cb(const char *name, GaimPrefType type, | |
1390 gconstpointer value, gpointer data) | |
10074 | 1391 { |
1392 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(gtkblist->ift, | |
1393 N_("/Tools/Mute Sounds"))), (gboolean)GPOINTER_TO_INT(value)); | |
1394 } | |
1395 | |
12816 | 1396 static void |
1397 gaim_gtk_blist_sound_method_pref_cb(const char *name, GaimPrefType type, | |
1398 gconstpointer value, gpointer data) | |
10074 | 1399 { |
1400 gboolean sensitive = TRUE; | |
1401 | |
1402 if(!strcmp(value, "none")) | |
1403 sensitive = FALSE; | |
1404 | |
1405 gtk_widget_set_sensitive(gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Mute Sounds")), sensitive); | |
1406 } | |
1407 | |
8089 | 1408 static void |
1409 add_buddies_from_vcard(const char *prpl_id, GaimGroup *group, GList *list, | |
1410 const char *alias) | |
1411 { | |
1412 GList *l; | |
1413 GaimAccount *account = NULL; | |
1414 GaimConnection *gc; | |
1415 | |
1416 if (list == NULL) | |
1417 return; | |
1418 | |
1419 for (l = gaim_connections_get_all(); l != NULL; l = l->next) | |
1420 { | |
1421 gc = (GaimConnection *)l->data; | |
1422 account = gaim_connection_get_account(gc); | |
1423 | |
1424 if (!strcmp(gaim_account_get_protocol_id(account), prpl_id)) | |
1425 break; | |
1426 | |
1427 account = NULL; | |
1428 } | |
1429 | |
1430 if (account != NULL) | |
1431 { | |
1432 for (l = list; l != NULL; l = l->next) | |
1433 { | |
1434 gaim_blist_request_add_buddy(account, l->data, | |
1435 (group ? group->name : NULL), | |
1436 alias); | |
1437 } | |
1438 } | |
1439 | |
1440 g_list_foreach(list, (GFunc)g_free, NULL); | |
1441 g_list_free(list); | |
1442 } | |
1443 | |
1444 static gboolean | |
1445 parse_vcard(const char *vcard, GaimGroup *group) | |
1446 { | |
1447 char *temp_vcard; | |
1448 char *s, *c; | |
1449 char *alias = NULL; | |
1450 GList *aims = NULL; | |
1451 GList *icqs = NULL; | |
1452 GList *yahoos = NULL; | |
1453 GList *msns = NULL; | |
1454 GList *jabbers = NULL; | |
1455 | |
1456 s = temp_vcard = g_strdup(vcard); | |
1457 | |
1458 while (*s != '\0' && strncmp(s, "END:vCard", strlen("END:vCard"))) | |
1459 { | |
1460 char *field, *value; | |
1461 | |
1462 field = s; | |
1463 | |
1464 /* Grab the field */ | |
1465 while (*s != '\r' && *s != '\n' && *s != '\0' && *s != ':') | |
1466 s++; | |
1467 | |
1468 if (*s == '\r') s++; | |
1469 if (*s == '\n') | |
1470 { | |
1471 s++; | |
1472 continue; | |
1473 } | |
1474 | |
1475 if (*s != '\0') *s++ = '\0'; | |
1476 | |
1477 if ((c = strchr(field, ';')) != NULL) | |
1478 *c = '\0'; | |
1479 | |
1480 /* Proceed to the end of the line */ | |
1481 value = s; | |
1482 | |
1483 while (*s != '\r' && *s != '\n' && *s != '\0') | |
1484 s++; | |
1485 | |
1486 if (*s == '\r') *s++ = '\0'; | |
1487 if (*s == '\n') *s++ = '\0'; | |
1488 | |
1489 /* We only want to worry about a few fields here. */ | |
1490 if (!strcmp(field, "FN")) | |
1491 alias = g_strdup(value); | |
1492 else if (!strcmp(field, "X-AIM") || !strcmp(field, "X-ICQ") || | |
1493 !strcmp(field, "X-YAHOO") || !strcmp(field, "X-MSN") || | |
1494 !strcmp(field, "X-JABBER")) | |
1495 { | |
1496 char **values = g_strsplit(value, ":", 0); | |
1497 char **im; | |
1498 | |
1499 for (im = values; *im != NULL; im++) | |
1500 { | |
1501 if (!strcmp(field, "X-AIM")) | |
1502 aims = g_list_append(aims, g_strdup(*im)); | |
1503 else if (!strcmp(field, "X-ICQ")) | |
1504 icqs = g_list_append(icqs, g_strdup(*im)); | |
1505 else if (!strcmp(field, "X-YAHOO")) | |
1506 yahoos = g_list_append(yahoos, g_strdup(*im)); | |
1507 else if (!strcmp(field, "X-MSN")) | |
1508 msns = g_list_append(msns, g_strdup(*im)); | |
1509 else if (!strcmp(field, "X-JABBER")) | |
1510 jabbers = g_list_append(jabbers, g_strdup(*im)); | |
1511 } | |
1512 | |
1513 g_strfreev(values); | |
1514 } | |
1515 } | |
1516 | |
1517 g_free(temp_vcard); | |
1518 | |
1519 if (aims == NULL && icqs == NULL && yahoos == NULL && | |
1520 msns == NULL && jabbers == NULL) | |
1521 { | |
1522 if (alias != NULL) | |
1523 g_free(alias); | |
1524 | |
1525 return FALSE; | |
1526 } | |
1527 | |
1528 add_buddies_from_vcard("prpl-oscar", group, aims, alias); | |
1529 add_buddies_from_vcard("prpl-oscar", group, icqs, alias); | |
1530 add_buddies_from_vcard("prpl-yahoo", group, yahoos, alias); | |
1531 add_buddies_from_vcard("prpl-msn", group, msns, alias); | |
1532 add_buddies_from_vcard("prpl-jabber", group, jabbers, alias); | |
1533 | |
1534 if (alias != NULL) | |
1535 g_free(alias); | |
1536 | |
1537 return TRUE; | |
1538 } | |
1539 | |
11059
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1540 #ifdef _WIN32 |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1541 static void gaim_gtk_blist_drag_begin(GtkWidget *widget, |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1542 GdkDragContext *drag_context, gpointer user_data) |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1543 { |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1544 gaim_gtk_blist_tooltip_destroy(); |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1545 |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1546 |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1547 /* Unhook the tooltip-timeout since we don't want a tooltip |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1548 * to appear and obscure the dragging operation. |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1549 * This is a workaround for GTK+ bug 107320. */ |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1550 if (gtkblist->timeout) { |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1551 g_source_remove(gtkblist->timeout); |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1552 gtkblist->timeout = 0; |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1553 } |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1554 } |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1555 #endif |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1556 |
9811 | 1557 static void gaim_gtk_blist_drag_data_get_cb(GtkWidget *widget, |
1558 GdkDragContext *dc, | |
1559 GtkSelectionData *data, | |
1560 guint info, | |
1561 guint time, | |
11059
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1562 gpointer null) |
5228 | 1563 { |
11059
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
1564 |
8089 | 1565 if (data->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) |
1566 { | |
5228 | 1567 GtkTreeRowReference *ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); |
1568 GtkTreePath *sourcerow = gtk_tree_row_reference_get_path(ref); | |
1569 GtkTreeIter iter; | |
1570 GaimBlistNode *node = NULL; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1571 GValue val; |
5273 | 1572 if(!sourcerow) |
1573 return; | |
5228 | 1574 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, sourcerow); |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1575 val.g_type = 0; |
5228 | 1576 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
1577 node = g_value_get_pointer(&val); | |
1578 gtk_selection_data_set (data, | |
1579 gdk_atom_intern ("GAIM_BLIST_NODE", FALSE), | |
1580 8, /* bits */ | |
1581 (void*)&node, | |
1582 sizeof (node)); | |
5273 | 1583 |
5228 | 1584 gtk_tree_path_free(sourcerow); |
1585 } | |
8089 | 1586 else if (data->target == gdk_atom_intern("application/x-im-contact", FALSE)) |
1587 { | |
7706 | 1588 GtkTreeRowReference *ref; |
1589 GtkTreePath *sourcerow; | |
1590 GtkTreeIter iter; | |
1591 GaimBlistNode *node = NULL; | |
1592 GaimBuddy *buddy; | |
1593 GaimConnection *gc; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1594 GValue val; |
7706 | 1595 GString *str; |
1596 const char *protocol; | |
1597 char *mime_str; | |
1598 | |
1599 ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); | |
1600 sourcerow = gtk_tree_row_reference_get_path(ref); | |
1601 | |
1602 if (!sourcerow) | |
1603 return; | |
1604 | |
1605 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, | |
1606 sourcerow); | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1607 val.g_type = 0; |
7706 | 1608 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), &iter, |
1609 NODE_COLUMN, &val); | |
1610 | |
1611 node = g_value_get_pointer(&val); | |
1612 | |
1613 if (GAIM_BLIST_NODE_IS_CONTACT(node)) | |
1614 { | |
1615 buddy = gaim_contact_get_priority_buddy((GaimContact *)node); | |
1616 } | |
1617 else if (!GAIM_BLIST_NODE_IS_BUDDY(node)) | |
1618 { | |
1619 gtk_tree_path_free(sourcerow); | |
1620 return; | |
1621 } | |
1622 else | |
1623 { | |
1624 buddy = (GaimBuddy *)node; | |
1625 } | |
1626 | |
1627 gc = gaim_account_get_connection(buddy->account); | |
1628 | |
1629 if (gc == NULL) | |
1630 { | |
1631 gtk_tree_path_free(sourcerow); | |
1632 return; | |
1633 } | |
1634 | |
1635 protocol = | |
1636 GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->list_icon(buddy->account, | |
1637 buddy); | |
1638 | |
1639 str = g_string_new(NULL); | |
1640 g_string_printf(str, | |
1641 "MIME-Version: 1.0\r\n" | |
1642 "Content-Type: application/x-im-contact\r\n" | |
1643 "X-IM-Protocol: %s\r\n" | |
1644 "X-IM-Username: %s\r\n", | |
1645 protocol, | |
1646 buddy->name); | |
1647 | |
1648 if (buddy->alias != NULL) | |
1649 { | |
1650 g_string_append_printf(str, | |
1651 "X-IM-Alias: %s\r\n", | |
1652 buddy->alias); | |
1653 } | |
1654 | |
1655 str = g_string_append(str, "\r\n"); | |
1656 | |
1657 mime_str = g_string_free(str, FALSE); | |
1658 | |
1659 gtk_selection_data_set(data, | |
1660 gdk_atom_intern("application/x-im-contact", FALSE), | |
1661 8, /* bits */ | |
11137 | 1662 (const guchar *)mime_str, |
7706 | 1663 strlen(mime_str) + 1); |
1664 | |
1665 g_free(mime_str); | |
1666 gtk_tree_path_free(sourcerow); | |
1667 } | |
5228 | 1668 } |
1669 | |
1670 static void gaim_gtk_blist_drag_data_rcv_cb(GtkWidget *widget, GdkDragContext *dc, guint x, guint y, | |
1671 GtkSelectionData *sd, guint info, guint t) | |
7620 | 1672 { |
13832
d1fdde7cfc0a
[gaim-migrate @ 16281]
Richard Laager <rlaager@wiktel.com>
parents:
13819
diff
changeset
|
1673 if (gtkblist->drag_timeout) { |
d1fdde7cfc0a
[gaim-migrate @ 16281]
Richard Laager <rlaager@wiktel.com>
parents:
13819
diff
changeset
|
1674 g_source_remove(gtkblist->drag_timeout); |
d1fdde7cfc0a
[gaim-migrate @ 16281]
Richard Laager <rlaager@wiktel.com>
parents:
13819
diff
changeset
|
1675 gtkblist->drag_timeout = 0; |
d1fdde7cfc0a
[gaim-migrate @ 16281]
Richard Laager <rlaager@wiktel.com>
parents:
13819
diff
changeset
|
1676 } |
d1fdde7cfc0a
[gaim-migrate @ 16281]
Richard Laager <rlaager@wiktel.com>
parents:
13819
diff
changeset
|
1677 |
5228 | 1678 if (sd->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE) && sd->data) { |
1679 GaimBlistNode *n = NULL; | |
1680 GtkTreePath *path = NULL; | |
1681 GtkTreeViewDropPosition position; | |
1682 memcpy(&n, sd->data, sizeof(n)); | |
1683 if(gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), x, y, &path, &position)) { | |
8470
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
1684 /* if we're here, I think it means the drop is ok */ |
7642 | 1685 GtkTreeIter iter; |
5228 | 1686 GaimBlistNode *node; |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1687 GValue val; |
7620 | 1688 struct _gaim_gtk_blist_node *gtknode; |
1689 | |
1690 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), | |
1691 &iter, path); | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1692 val.g_type = 0; |
7620 | 1693 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), |
1694 &iter, NODE_COLUMN, &val); | |
5228 | 1695 node = g_value_get_pointer(&val); |
7620 | 1696 gtknode = node->ui_data; |
1697 | |
1698 if (GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
1699 GaimContact *c = (GaimContact*)n; | |
1700 if (GAIM_BLIST_NODE_IS_CONTACT(node) && gtknode->contact_expanded) { | |
1701 gaim_blist_merge_contact(c, node); | |
1702 } else if (GAIM_BLIST_NODE_IS_CONTACT(node) || | |
5234 | 1703 GAIM_BLIST_NODE_IS_CHAT(node)) { |
5228 | 1704 switch(position) { |
1705 case GTK_TREE_VIEW_DROP_AFTER: | |
1706 case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
7620 | 1707 gaim_blist_add_contact(c, (GaimGroup*)node->parent, |
1708 node); | |
1709 break; | |
1710 case GTK_TREE_VIEW_DROP_BEFORE: | |
1711 case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
1712 gaim_blist_add_contact(c, (GaimGroup*)node->parent, | |
1713 node->prev); | |
1714 break; | |
1715 } | |
1716 } else if(GAIM_BLIST_NODE_IS_GROUP(node)) { | |
1717 gaim_blist_add_contact(c, (GaimGroup*)node, NULL); | |
1718 } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
1719 gaim_blist_merge_contact(c, node); | |
1720 } | |
1721 } else if (GAIM_BLIST_NODE_IS_BUDDY(n)) { | |
1722 GaimBuddy *b = (GaimBuddy*)n; | |
1723 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
1724 switch(position) { | |
1725 case GTK_TREE_VIEW_DROP_AFTER: | |
1726 case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
1727 gaim_blist_add_buddy(b, (GaimContact*)node->parent, | |
1728 (GaimGroup*)node->parent->parent, node); | |
5228 | 1729 break; |
1730 case GTK_TREE_VIEW_DROP_BEFORE: | |
1731 case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
7620 | 1732 gaim_blist_add_buddy(b, (GaimContact*)node->parent, |
1733 (GaimGroup*)node->parent->parent, | |
1734 node->prev); | |
5228 | 1735 break; |
1736 } | |
7620 | 1737 } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { |
1738 gaim_blist_add_buddy(b, NULL, (GaimGroup*)node->parent, | |
1739 NULL); | |
5228 | 1740 } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
7620 | 1741 gaim_blist_add_buddy(b, NULL, (GaimGroup*)node, NULL); |
1742 } else if (GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
1743 if(gtknode->contact_expanded) { | |
1744 switch(position) { | |
1745 case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
1746 case GTK_TREE_VIEW_DROP_AFTER: | |
1747 case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
1748 gaim_blist_add_buddy(b, (GaimContact*)node, | |
1749 (GaimGroup*)node->parent, NULL); | |
1750 break; | |
1751 case GTK_TREE_VIEW_DROP_BEFORE: | |
1752 gaim_blist_add_buddy(b, NULL, | |
1753 (GaimGroup*)node->parent, node->prev); | |
1754 break; | |
1755 } | |
1756 } else { | |
1757 switch(position) { | |
1758 case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
1759 case GTK_TREE_VIEW_DROP_AFTER: | |
1760 gaim_blist_add_buddy(b, NULL, | |
1761 (GaimGroup*)node->parent, NULL); | |
1762 break; | |
1763 case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
1764 case GTK_TREE_VIEW_DROP_BEFORE: | |
1765 gaim_blist_add_buddy(b, NULL, | |
1766 (GaimGroup*)node->parent, node->prev); | |
1767 break; | |
1768 } | |
1769 } | |
5228 | 1770 } |
5234 | 1771 } else if (GAIM_BLIST_NODE_IS_CHAT(n)) { |
7620 | 1772 GaimChat *chat = (GaimChat *)n; |
1773 if (GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
1774 switch(position) { | |
1775 case GTK_TREE_VIEW_DROP_AFTER: | |
1776 case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
1777 case GTK_TREE_VIEW_DROP_BEFORE: | |
1778 case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
1779 gaim_blist_add_chat(chat, | |
1780 (GaimGroup*)node->parent->parent, | |
13542
2235ada6c746
[gaim-migrate @ 15919]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13540
diff
changeset
|
1781 node->parent); |
7620 | 1782 break; |
1783 } | |
1784 } else if(GAIM_BLIST_NODE_IS_CONTACT(node) || | |
5234 | 1785 GAIM_BLIST_NODE_IS_CHAT(node)) { |
1786 switch(position) { | |
1787 case GTK_TREE_VIEW_DROP_AFTER: | |
1788 case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
7620 | 1789 gaim_blist_add_chat(chat, (GaimGroup*)node->parent, node); |
5234 | 1790 break; |
1791 case GTK_TREE_VIEW_DROP_BEFORE: | |
1792 case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
7620 | 1793 gaim_blist_add_chat(chat, (GaimGroup*)node->parent, node->prev); |
5234 | 1794 break; |
1795 } | |
1796 } else if (GAIM_BLIST_NODE_IS_GROUP(node)) { | |
7620 | 1797 gaim_blist_add_chat(chat, (GaimGroup*)node, NULL); |
5234 | 1798 } |
5228 | 1799 } else if (GAIM_BLIST_NODE_IS_GROUP(n)) { |
7620 | 1800 GaimGroup *g = (GaimGroup*)n; |
5228 | 1801 if (GAIM_BLIST_NODE_IS_GROUP(node)) { |
1802 switch (position) { | |
1803 case GTK_TREE_VIEW_DROP_INTO_OR_AFTER: | |
1804 case GTK_TREE_VIEW_DROP_AFTER: | |
1805 gaim_blist_add_group(g, node); | |
1806 break; | |
1807 case GTK_TREE_VIEW_DROP_INTO_OR_BEFORE: | |
1808 case GTK_TREE_VIEW_DROP_BEFORE: | |
1809 gaim_blist_add_group(g, node->prev); | |
1810 break; | |
1811 } | |
7620 | 1812 } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { |
1813 gaim_blist_add_group(g, node->parent->parent); | |
1814 } else if(GAIM_BLIST_NODE_IS_CONTACT(node) || | |
5234 | 1815 GAIM_BLIST_NODE_IS_CHAT(node)) { |
5228 | 1816 gaim_blist_add_group(g, node->parent); |
1817 } | |
1818 } | |
1819 | |
1820 gtk_tree_path_free(path); | |
7620 | 1821 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
5228 | 1822 } |
1823 } | |
7706 | 1824 else if (sd->target == gdk_atom_intern("application/x-im-contact", |
1825 FALSE) && sd->data) | |
1826 { | |
1827 GaimGroup *group = NULL; | |
1828 GtkTreePath *path = NULL; | |
1829 GtkTreeViewDropPosition position; | |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7706
diff
changeset
|
1830 GaimAccount *account; |
7706 | 1831 char *protocol = NULL; |
1832 char *username = NULL; | |
1833 char *alias = NULL; | |
1834 | |
1835 if (gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), | |
1836 x, y, &path, &position)) | |
1837 { | |
1838 GtkTreeIter iter; | |
1839 GaimBlistNode *node; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1840 GValue val; |
7706 | 1841 |
1842 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), | |
1843 &iter, path); | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1844 val.g_type = 0; |
7706 | 1845 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), |
1846 &iter, NODE_COLUMN, &val); | |
1847 node = g_value_get_pointer(&val); | |
1848 | |
1849 if (GAIM_BLIST_NODE_IS_BUDDY(node)) | |
1850 { | |
1851 group = (GaimGroup *)node->parent->parent; | |
1852 } | |
1853 else if (GAIM_BLIST_NODE_IS_CHAT(node) || | |
1854 GAIM_BLIST_NODE_IS_CONTACT(node)) | |
1855 { | |
1856 group = (GaimGroup *)node->parent; | |
1857 } | |
1858 else if (GAIM_BLIST_NODE_IS_GROUP(node)) | |
1859 { | |
1860 group = (GaimGroup *)node; | |
1861 } | |
1862 } | |
1863 | |
11137 | 1864 if (gaim_gtk_parse_x_im_contact((const char *)sd->data, FALSE, &account, |
7712
2823111061ba
[gaim-migrate @ 8357]
Christian Hammond <chipx86@chipx86.com>
parents:
7706
diff
changeset
|
1865 &protocol, &username, &alias)) |
7706 | 1866 { |
1867 if (account == NULL) | |
1868 { | |
1869 gaim_notify_error(NULL, NULL, | |
1870 _("You are not currently signed on with an account that " | |
1871 "can add that buddy."), NULL); | |
1872 } | |
1873 else | |
1874 { | |
1875 gaim_blist_request_add_buddy(account, username, | |
1876 (group ? group->name : NULL), | |
1877 alias); | |
1878 } | |
1879 } | |
1880 | |
1881 if (username != NULL) g_free(username); | |
1882 if (protocol != NULL) g_free(protocol); | |
1883 if (alias != NULL) g_free(alias); | |
1884 | |
1885 if (path != NULL) | |
1886 gtk_tree_path_free(path); | |
1887 | |
1888 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); | |
1889 } | |
8089 | 1890 else if (sd->target == gdk_atom_intern("text/x-vcard", FALSE) && sd->data) |
1891 { | |
1892 gboolean result; | |
1893 GaimGroup *group = NULL; | |
1894 GtkTreePath *path = NULL; | |
1895 GtkTreeViewDropPosition position; | |
1896 | |
1897 if (gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), | |
1898 x, y, &path, &position)) | |
1899 { | |
1900 GtkTreeIter iter; | |
1901 GaimBlistNode *node; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1902 GValue val; |
8089 | 1903 |
1904 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), | |
1905 &iter, path); | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1906 val.g_type = 0; |
8089 | 1907 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), |
1908 &iter, NODE_COLUMN, &val); | |
1909 node = g_value_get_pointer(&val); | |
1910 | |
1911 if (GAIM_BLIST_NODE_IS_BUDDY(node)) | |
1912 { | |
1913 group = (GaimGroup *)node->parent->parent; | |
1914 } | |
1915 else if (GAIM_BLIST_NODE_IS_CHAT(node) || | |
1916 GAIM_BLIST_NODE_IS_CONTACT(node)) | |
1917 { | |
1918 group = (GaimGroup *)node->parent; | |
1919 } | |
1920 else if (GAIM_BLIST_NODE_IS_GROUP(node)) | |
1921 { | |
1922 group = (GaimGroup *)node; | |
1923 } | |
1924 } | |
1925 | |
11137 | 1926 result = parse_vcard((const gchar *)sd->data, group); |
8089 | 1927 |
1928 gtk_drag_finish(dc, result, (dc->action == GDK_ACTION_MOVE), t); | |
9525 | 1929 } else if (sd->target == gdk_atom_intern("text/uri-list", FALSE) && sd->data) { |
9495 | 1930 GtkTreePath *path = NULL; |
1931 GtkTreeViewDropPosition position; | |
1932 | |
1933 if (gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), | |
9811 | 1934 x, y, &path, &position)) |
9495 | 1935 { |
1936 GtkTreeIter iter; | |
1937 GaimBlistNode *node; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1938 GValue val; |
10382
9f28196ed769
[gaim-migrate @ 11608]
Luke Schierer <lschiere@pidgin.im>
parents:
10357
diff
changeset
|
1939 |
9495 | 1940 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), |
1941 &iter, path); | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
1942 val.g_type = 0; |
9495 | 1943 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), |
1944 &iter, NODE_COLUMN, &val); | |
1945 node = g_value_get_pointer(&val); | |
10382
9f28196ed769
[gaim-migrate @ 11608]
Luke Schierer <lschiere@pidgin.im>
parents:
10357
diff
changeset
|
1946 |
9495 | 1947 if (GAIM_BLIST_NODE_IS_BUDDY(node) || GAIM_BLIST_NODE_IS_CONTACT(node)) { |
1948 GaimBuddy *b = GAIM_BLIST_NODE_IS_BUDDY(node) ? (GaimBuddy*)node : gaim_contact_get_priority_buddy((GaimContact*)node); | |
10229 | 1949 gaim_dnd_file_manage(sd, b->account, b->name); |
1950 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); | |
1951 } else { | |
1952 gtk_drag_finish(dc, FALSE, FALSE, t); | |
9495 | 1953 } |
10382
9f28196ed769
[gaim-migrate @ 11608]
Luke Schierer <lschiere@pidgin.im>
parents:
10357
diff
changeset
|
1954 } |
8089 | 1955 } |
5228 | 1956 } |
1957 | |
10482 | 1958 static GdkPixbuf *gaim_gtk_blist_get_buddy_icon(GaimBlistNode *node, |
1959 gboolean scaled, gboolean greyed) | |
1960 { | |
10483 | 1961 GdkPixbuf *buf, *ret = NULL; |
10482 | 1962 GdkPixbufLoader *loader; |
1963 GaimBuddyIcon *icon; | |
11137 | 1964 const guchar *data; |
1965 gsize len; | |
10482 | 1966 GaimBuddy *buddy = (GaimBuddy *)node; |
1967 | |
1968 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
1969 buddy = gaim_contact_get_priority_buddy((GaimContact*)node); | |
1970 } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
1971 buddy = (GaimBuddy*)node; | |
1972 } else { | |
1973 return NULL; | |
1974 } | |
1975 | |
1976 #if 0 | |
1977 if (!gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) | |
1978 return NULL; | |
1979 #endif | |
1980 | |
1981 if (!(icon = gaim_buddy_get_icon(buddy))) | |
1982 if (!(icon = gaim_buddy_icons_find(buddy->account, buddy->name))) /* Not sure I like this...*/ | |
1983 return NULL; | |
1984 | |
1985 loader = gdk_pixbuf_loader_new(); | |
1986 data = gaim_buddy_icon_get_data(icon, &len); | |
1987 gdk_pixbuf_loader_write(loader, data, len, NULL); | |
12601
e63fb8e9f4ac
[gaim-migrate @ 14935]
Richard Laager <rlaager@wiktel.com>
parents:
12600
diff
changeset
|
1988 gdk_pixbuf_loader_close(loader, NULL); |
10482 | 1989 buf = gdk_pixbuf_loader_get_pixbuf(loader); |
1990 if (buf) | |
1991 g_object_ref(G_OBJECT(buf)); | |
1992 g_object_unref(G_OBJECT(loader)); | |
1993 | |
1994 if (buf) { | |
10544 | 1995 GaimAccount *account = gaim_buddy_get_account(buddy); |
1996 GaimPluginProtocolInfo *prpl_info = NULL; | |
1997 int orig_width, orig_height; | |
1998 int scale_width, scale_height; | |
1999 | |
2000 if(account && account->gc) | |
2001 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl); | |
2002 | |
10482 | 2003 if (greyed) { |
2004 GaimPresence *presence = gaim_buddy_get_presence(buddy); | |
2005 if (!GAIM_BUDDY_IS_ONLINE(buddy)) | |
2006 gdk_pixbuf_saturate_and_pixelate(buf, buf, 0.0, FALSE); | |
2007 if (gaim_presence_is_idle(presence)) | |
2008 gdk_pixbuf_saturate_and_pixelate(buf, buf, 0.25, FALSE); | |
2009 } | |
2010 | |
10544 | 2011 /* i'd use the gaim_gtk_buddy_icon_get_scale_size() thing, |
2012 * but it won't tell me the original size, which I need for scaling | |
2013 * purposes */ | |
2014 scale_width = orig_width = gdk_pixbuf_get_width(buf); | |
2015 scale_height = orig_height = gdk_pixbuf_get_height(buf); | |
2016 | |
2017 gaim_buddy_icon_get_scale_size(prpl_info ? &prpl_info->icon_spec : NULL, &scale_width, &scale_height); | |
2018 | |
10482 | 2019 if (scaled) { |
10544 | 2020 if(scale_height > scale_width) { |
2021 scale_width = 30.0 * (double)scale_width / (double)scale_height; | |
2022 scale_height = 30; | |
2023 } else { | |
2024 scale_height = 30.0 * (double)scale_height / (double)scale_width; | |
2025 scale_width = 30; | |
2026 } | |
2027 | |
2028 ret = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 30, 30); | |
2029 gdk_pixbuf_fill(ret, 0x00000000); | |
2030 gdk_pixbuf_scale(buf, ret, (30-scale_width)/2, (30-scale_height)/2, scale_width, scale_height, (30-scale_width)/2, (30-scale_height)/2, (double)scale_width/(double)orig_width, (double)scale_height/(double)orig_height, GDK_INTERP_BILINEAR); | |
10483 | 2031 } else { |
2032 ret = gdk_pixbuf_scale_simple(buf,scale_width,scale_height, GDK_INTERP_BILINEAR); | |
2033 } | |
10544 | 2034 g_object_unref(G_OBJECT(buf)); |
10482 | 2035 } |
2036 | |
10483 | 2037 return ret; |
10482 | 2038 } |
2039 | |
11890 | 2040 struct tooltip_data { |
2041 PangoLayout *layout; | |
2042 GdkPixbuf *status_icon; | |
2043 GdkPixbuf *avatar; | |
11892 | 2044 int avatar_width; |
2045 int width; | |
2046 int height; | |
11890 | 2047 }; |
2048 | |
12530 | 2049 static struct tooltip_data * create_tip_for_node(GaimBlistNode *node, gboolean full) |
11890 | 2050 { |
12519 | 2051 char *tooltip_text = NULL; |
11890 | 2052 struct tooltip_data *td = g_new0(struct tooltip_data, 1); |
12519 | 2053 |
12530 | 2054 td->status_icon = gaim_gtk_blist_get_status_icon(node, GAIM_STATUS_ICON_LARGE); |
12971
7bd4dbf26c00
[gaim-migrate @ 15324]
Richard Laager <rlaager@wiktel.com>
parents:
12970
diff
changeset
|
2055 td->avatar = gaim_gtk_blist_get_buddy_icon(node, !full, FALSE); |
12530 | 2056 tooltip_text = gaim_get_tooltip_text(node, full); |
11890 | 2057 td->layout = gtk_widget_create_pango_layout(gtkblist->tipwindow, NULL); |
12940
b25f48c9f6d7
[gaim-migrate @ 15293]
Richard Laager <rlaager@wiktel.com>
parents:
12919
diff
changeset
|
2058 pango_layout_set_markup(td->layout, tooltip_text, -1); |
11890 | 2059 pango_layout_set_wrap(td->layout, PANGO_WRAP_WORD); |
2060 pango_layout_set_width(td->layout, 300000); | |
11983 | 2061 |
11892 | 2062 pango_layout_get_size (td->layout, &td->width, &td->height); |
2063 td->width = PANGO_PIXELS(td->width) + 38 + 8; | |
12530 | 2064 td->height = MAX(PANGO_PIXELS(td->height + 4) + 8, 38); |
11892 | 2065 |
2066 if(td->avatar) { | |
2067 td->avatar_width = gdk_pixbuf_get_width(td->avatar); | |
2068 td->width += td->avatar_width + 8; | |
2069 td->height = MAX(td->height, gdk_pixbuf_get_height(td->avatar) + 8); | |
2070 } | |
11890 | 2071 |
12649
773f694e83bf
[gaim-migrate @ 14987]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12601
diff
changeset
|
2072 g_free(tooltip_text); |
11890 | 2073 return td; |
2074 } | |
2075 | |
5234 | 2076 static void gaim_gtk_blist_paint_tip(GtkWidget *widget, GdkEventExpose *event, GaimBlistNode *node) |
5228 | 2077 { |
2078 GtkStyle *style; | |
11892 | 2079 int current_height, max_width; |
11890 | 2080 GList *l; |
2081 | |
2082 if(gtkblist->tooltipdata == NULL) | |
7620 | 2083 return; |
2084 | |
11890 | 2085 style = gtkblist->tipwindow->style; |
2086 gtk_paint_flat_box(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, | |
2087 NULL, gtkblist->tipwindow, "tooltip", 0, 0, -1, -1); | |
2088 | |
11892 | 2089 max_width = 0; |
2090 for(l = gtkblist->tooltipdata; l; l = l->next) | |
2091 { | |
2092 struct tooltip_data *td = l->data; | |
2093 max_width = MAX(max_width, td->width); | |
2094 } | |
2095 | |
12519 | 2096 current_height = 4; |
11890 | 2097 for(l = gtkblist->tooltipdata; l; l = l->next) |
10482 | 2098 { |
11890 | 2099 struct tooltip_data *td = l->data; |
5228 | 2100 |
2101 #if GTK_CHECK_VERSION(2,2,0) | |
11890 | 2102 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon, |
12530 | 2103 0, 0, 4, current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0); |
11890 | 2104 if(td->avatar) |
2105 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, | |
12519 | 2106 td->avatar, 0, 0, max_width - (td->avatar_width + 4), current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0); |
5228 | 2107 #else |
12519 | 2108 gdk_pixbuf_render_to_drawable(td->status_icon, GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0, 4, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); |
11890 | 2109 if(td->avatar) |
2110 gdk_pixbuf_render_to_drawable(td->avatar, | |
11983 | 2111 GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0, |
12530 | 2112 max_width - (td->avatar_width + 4), |
12519 | 2113 current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); |
5228 | 2114 #endif |
2115 | |
11890 | 2116 gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE, |
12519 | 2117 NULL, gtkblist->tipwindow, "tooltip", 38 + 4, current_height, td->layout); |
11890 | 2118 |
11895 | 2119 current_height += td->height; |
2120 | |
12530 | 2121 if(l->next) |
2122 gtk_paint_hline(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, NULL, NULL, NULL, 4, max_width - 4, current_height-6); | |
2123 | |
11890 | 2124 } |
5228 | 2125 } |
2126 | |
8254 | 2127 static void gaim_gtk_blist_tooltip_destroy() |
2128 { | |
11890 | 2129 while(gtkblist->tooltipdata) { |
2130 struct tooltip_data *td = gtkblist->tooltipdata->data; | |
2131 | |
2132 if(td->avatar) | |
2133 g_object_unref(td->avatar); | |
2134 if(td->status_icon) | |
2135 g_object_unref(td->status_icon); | |
2136 g_object_unref(td->layout); | |
2137 g_free(td); | |
2138 gtkblist->tooltipdata = g_list_delete_link(gtkblist->tooltipdata, gtkblist->tooltipdata); | |
2139 } | |
11636 | 2140 |
8254 | 2141 if (gtkblist->tipwindow == NULL) |
2142 return; | |
2143 | |
2144 gtk_widget_destroy(gtkblist->tipwindow); | |
2145 gtkblist->tipwindow = NULL; | |
2146 } | |
2147 | |
10354 | 2148 static gboolean gaim_gtk_blist_expand_timeout(GtkWidget *tv) |
2149 { | |
2150 GtkTreePath *path; | |
2151 GtkTreeIter iter; | |
2152 GaimBlistNode *node; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2153 GValue val; |
10354 | 2154 struct _gaim_gtk_blist_node *gtknode; |
2155 | |
2156 if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), gtkblist->tip_rect.x, gtkblist->tip_rect.y, &path, NULL, NULL, NULL)) | |
2157 return FALSE; | |
2158 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2159 val.g_type = 0; |
10354 | 2160 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
2161 node = g_value_get_pointer(&val); | |
2162 | |
10504 | 2163 if(!GAIM_BLIST_NODE_IS_CONTACT(node)) { |
2164 gtk_tree_path_free(path); | |
10354 | 2165 return FALSE; |
10504 | 2166 } |
10354 | 2167 |
2168 gtknode = node->ui_data; | |
2169 | |
2170 if (!gtknode->contact_expanded) { | |
2171 GtkTreeIter i; | |
10382
9f28196ed769
[gaim-migrate @ 11608]
Luke Schierer <lschiere@pidgin.im>
parents:
10357
diff
changeset
|
2172 |
10354 | 2173 gaim_gtk_blist_expand_contact_cb(NULL, node); |
10382
9f28196ed769
[gaim-migrate @ 11608]
Luke Schierer <lschiere@pidgin.im>
parents:
10357
diff
changeset
|
2174 |
10354 | 2175 gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, >kblist->contact_rect); |
2176 gdk_drawable_get_size(GDK_DRAWABLE(tv->window), &(gtkblist->contact_rect.width), NULL); | |
2177 gtkblist->mouseover_contact = node; | |
2178 gtk_tree_path_down (path); | |
2179 while (gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &i, path)) { | |
2180 GdkRectangle rect; | |
2181 gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, &rect); | |
2182 gtkblist->contact_rect.height += rect.height; | |
2183 gtk_tree_path_next(path); | |
2184 } | |
2185 } | |
2186 gtk_tree_path_free(path); | |
2187 return FALSE; | |
2188 } | |
2189 | |
11890 | 2190 static gboolean buddy_is_displayable(GaimBuddy *buddy) |
2191 { | |
11910 | 2192 struct _gaim_gtk_blist_node *gtknode; |
2193 | |
2194 if(!buddy) | |
2195 return FALSE; | |
2196 | |
2197 gtknode = ((GaimBlistNode*)buddy)->ui_data; | |
2198 | |
2199 return (gaim_account_is_connected(buddy->account) && | |
11890 | 2200 (gaim_presence_is_online(buddy->presence) || |
11910 | 2201 (gtknode && gtknode->recent_signonoff) || |
2202 gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies") || | |
2203 gaim_blist_node_get_bool((GaimBlistNode*)buddy, "show_offline"))); | |
11890 | 2204 } |
2205 | |
5228 | 2206 static gboolean gaim_gtk_blist_tooltip_timeout(GtkWidget *tv) |
2207 { | |
2208 GtkTreePath *path; | |
2209 GtkTreeIter iter; | |
2210 GaimBlistNode *node; | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2211 GValue val; |
9869 | 2212 int scr_w, scr_h, w, h, x, y; |
2213 #if GTK_CHECK_VERSION(2,2,0) | |
2214 int mon_num; | |
2215 GdkScreen *screen = NULL; | |
2216 #endif | |
7636 | 2217 gboolean tooltip_top = FALSE; |
2218 struct _gaim_gtk_blist_node *gtknode; | |
9773 | 2219 GdkRectangle mon_size; |
5228 | 2220 |
11636 | 2221 /* |
2222 * Attempt to free the previous tooltip. I have a feeling | |
2223 * this is never needed... but just in case. | |
2224 */ | |
2225 gaim_gtk_blist_tooltip_destroy(); | |
2226 | |
7636 | 2227 if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), gtkblist->tip_rect.x, gtkblist->tip_rect.y, &path, NULL, NULL, NULL)) |
5228 | 2228 return FALSE; |
2229 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2230 val.g_type = 0; |
5228 | 2231 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); |
2232 node = g_value_get_pointer(&val); | |
7620 | 2233 |
10504 | 2234 gtk_tree_path_free(path); |
2235 | |
11890 | 2236 gtkblist->tipwindow = gtk_window_new(GTK_WINDOW_POPUP); |
2237 | |
2238 if(GAIM_BLIST_NODE_IS_CHAT(node) || GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
12530 | 2239 struct tooltip_data *td = create_tip_for_node(node, TRUE); |
11890 | 2240 gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td); |
11892 | 2241 w = td->width; |
12941
586f2b04e0c5
[gaim-migrate @ 15294]
Richard Laager <rlaager@wiktel.com>
parents:
12940
diff
changeset
|
2242 h = td->height; |
11890 | 2243 } else if(GAIM_BLIST_NODE_IS_CONTACT(node)) { |
2244 GaimBlistNode *child; | |
11988 | 2245 GaimBuddy *b = gaim_contact_get_priority_buddy((GaimContact *)node); |
11890 | 2246 w = h = 0; |
12530 | 2247 for(child = node->child; child; child = child->next) |
11890 | 2248 { |
2249 if(GAIM_BLIST_NODE_IS_BUDDY(child) && buddy_is_displayable((GaimBuddy*)child)) { | |
12530 | 2250 struct tooltip_data *td = create_tip_for_node(child, (b == (GaimBuddy*)child)); |
11988 | 2251 if (b == (GaimBuddy *)child) { |
2252 gtkblist->tooltipdata = g_list_prepend(gtkblist->tooltipdata, td); | |
2253 } else { | |
2254 gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td); | |
2255 } | |
11892 | 2256 w = MAX(w, td->width); |
2257 h += td->height; | |
11890 | 2258 } |
2259 } | |
2260 } else { | |
2261 gtk_widget_destroy(gtkblist->tipwindow); | |
11892 | 2262 gtkblist->tipwindow = NULL; |
5234 | 2263 return FALSE; |
11890 | 2264 } |
2265 | |
2266 if (gtkblist->tooltipdata == NULL) { | |
2267 gtk_widget_destroy(gtkblist->tipwindow); | |
11892 | 2268 gtkblist->tipwindow = NULL; |
11890 | 2269 return FALSE; |
2270 } | |
5228 | 2271 |
7636 | 2272 gtknode = node->ui_data; |
2273 | |
5234 | 2274 gtk_widget_set_app_paintable(gtkblist->tipwindow, TRUE); |
2275 gtk_window_set_resizable(GTK_WINDOW(gtkblist->tipwindow), FALSE); | |
2276 gtk_widget_set_name(gtkblist->tipwindow, "gtk-tooltips"); | |
2277 g_signal_connect(G_OBJECT(gtkblist->tipwindow), "expose_event", | |
11890 | 2278 G_CALLBACK(gaim_gtk_blist_paint_tip), NULL); |
5234 | 2279 gtk_widget_ensure_style (gtkblist->tipwindow); |
7837 | 2280 |
9773 | 2281 |
9869 | 2282 #if GTK_CHECK_VERSION(2,2,0) |
9773 | 2283 gdk_display_get_pointer(gdk_display_get_default(), &screen, &x, &y, NULL); |
2284 mon_num = gdk_screen_get_monitor_at_point(screen, x, y); | |
2285 gdk_screen_get_monitor_geometry(screen, mon_num, &mon_size); | |
2286 | |
2287 scr_w = mon_size.width + mon_size.x; | |
2288 scr_h = mon_size.height + mon_size.y; | |
9869 | 2289 #else |
2290 scr_w = gdk_screen_width(); | |
2291 scr_h = gdk_screen_height(); | |
2292 gdk_window_get_pointer(NULL, &x, &y, NULL); | |
2293 mon_size.x = 0; | |
2294 mon_size.y = 0; | |
2295 #endif | |
9773 | 2296 |
9869 | 2297 #if GTK_CHECK_VERSION(2,2,0) |
10046 | 2298 if (w > mon_size.width) |
9773 | 2299 w = mon_size.width - 10; |
2300 | |
10046 | 2301 if (h > mon_size.height) |
9773 | 2302 h = mon_size.height - 10; |
9869 | 2303 #endif |
9773 | 2304 |
5234 | 2305 if (GTK_WIDGET_NO_WINDOW(gtkblist->window)) |
2306 y+=gtkblist->window->allocation.y; | |
2307 | |
2308 x -= ((w >> 1) + 4); | |
5228 | 2309 |
7636 | 2310 if ((y + h + 4) > scr_h || tooltip_top) |
7620 | 2311 y = y - h - 5; |
5234 | 2312 else |
2313 y = y + 6; | |
7620 | 2314 |
9773 | 2315 if (y < mon_size.y) |
2316 y = mon_size.y; | |
2317 | |
2318 if (y != mon_size.y) { | |
7719 | 2319 if ((x + w) > scr_w) |
2320 x -= (x + w + 5) - scr_w; | |
9773 | 2321 else if (x < mon_size.x) |
2322 x = mon_size.x; | |
7719 | 2323 } else { |
2324 x -= (w / 2 + 10); | |
9773 | 2325 if (x < mon_size.x) |
2326 x = mon_size.x; | |
7719 | 2327 } |
2328 | |
5234 | 2329 gtk_widget_set_size_request(gtkblist->tipwindow, w, h); |
2330 gtk_window_move(GTK_WINDOW(gtkblist->tipwindow), x, y); | |
2331 gtk_widget_show(gtkblist->tipwindow); | |
5228 | 2332 |
2333 return FALSE; | |
2334 } | |
2335 | |
10354 | 2336 static gboolean gaim_gtk_blist_drag_motion_cb(GtkWidget *tv, GdkDragContext *drag_context, |
2337 gint x, gint y, guint time, gpointer user_data) | |
2338 { | |
2339 GtkTreePath *path; | |
2340 int delay; | |
2341 | |
12679 | 2342 /* |
2343 * When dragging a buddy into a contact, this is the delay before | |
2344 * the contact auto-expands. | |
2345 */ | |
2346 delay = 900; | |
10354 | 2347 |
2348 if (gtkblist->drag_timeout) { | |
2349 if ((y > gtkblist->tip_rect.y) && ((y - gtkblist->tip_rect.height) < gtkblist->tip_rect.y)) | |
2350 return FALSE; | |
2351 /* We've left the cell. Remove the timeout and create a new one below */ | |
2352 g_source_remove(gtkblist->drag_timeout); | |
2353 } | |
2354 | |
2355 gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), x, y, &path, NULL, NULL, NULL); | |
2356 gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, >kblist->tip_rect); | |
2357 | |
2358 if (path) | |
2359 gtk_tree_path_free(path); | |
2360 gtkblist->drag_timeout = g_timeout_add(delay, (GSourceFunc)gaim_gtk_blist_expand_timeout, tv); | |
2361 | |
2362 if (gtkblist->mouseover_contact) { | |
2363 if ((y < gtkblist->contact_rect.y) || ((y - gtkblist->contact_rect.height) > gtkblist->contact_rect.y)) { | |
2364 gaim_gtk_blist_collapse_contact_cb(NULL, gtkblist->mouseover_contact); | |
2365 gtkblist->mouseover_contact = NULL; | |
2366 } | |
2367 } | |
2368 | |
2369 return FALSE; | |
2370 } | |
2371 | |
5228 | 2372 static gboolean gaim_gtk_blist_motion_cb (GtkWidget *tv, GdkEventMotion *event, gpointer null) |
2373 { | |
2374 GtkTreePath *path; | |
8470
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2375 int delay; |
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2376 |
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2377 delay = gaim_prefs_get_int("/gaim/gtk/blist/tooltip_delay"); |
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2378 |
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2379 if (delay == 0) |
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2380 return FALSE; |
8083 | 2381 |
5228 | 2382 if (gtkblist->timeout) { |
7636 | 2383 if ((event->y > gtkblist->tip_rect.y) && ((event->y - gtkblist->tip_rect.height) < gtkblist->tip_rect.y)) |
5228 | 2384 return FALSE; |
2385 /* We've left the cell. Remove the timeout and create a new one below */ | |
8254 | 2386 gaim_gtk_blist_tooltip_destroy(); |
5228 | 2387 g_source_remove(gtkblist->timeout); |
2388 } | |
8470
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2389 |
5228 | 2390 gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL); |
7636 | 2391 gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, >kblist->tip_rect); |
8470
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2392 |
5228 | 2393 if (path) |
2394 gtk_tree_path_free(path); | |
8470
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2395 gtkblist->timeout = g_timeout_add(delay, (GSourceFunc)gaim_gtk_blist_tooltip_timeout, tv); |
7636 | 2396 |
2397 if (gtkblist->mouseover_contact) { | |
2398 if ((event->y < gtkblist->contact_rect.y) || ((event->y - gtkblist->contact_rect.height) > gtkblist->contact_rect.y)) { | |
2399 gaim_gtk_blist_collapse_contact_cb(NULL, gtkblist->mouseover_contact); | |
2400 gtkblist->mouseover_contact = NULL; | |
2401 } | |
2402 } | |
8470
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2403 |
5228 | 2404 return FALSE; |
2405 } | |
2406 | |
2407 static void gaim_gtk_blist_leave_cb (GtkWidget *w, GdkEventCrossing *e, gpointer n) | |
2408 { | |
8083 | 2409 |
5228 | 2410 if (gtkblist->timeout) { |
2411 g_source_remove(gtkblist->timeout); | |
2412 gtkblist->timeout = 0; | |
2413 } | |
10382
9f28196ed769
[gaim-migrate @ 11608]
Luke Schierer <lschiere@pidgin.im>
parents:
10357
diff
changeset
|
2414 |
10354 | 2415 if (gtkblist->drag_timeout) { |
2416 g_source_remove(gtkblist->drag_timeout); | |
2417 gtkblist->drag_timeout = 0; | |
2418 } | |
2419 | |
8254 | 2420 gaim_gtk_blist_tooltip_destroy(); |
7720 | 2421 |
8470
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2422 if (gtkblist->mouseover_contact && |
9811 | 2423 !((e->x > gtkblist->contact_rect.x) && (e->x < (gtkblist->contact_rect.x + gtkblist->contact_rect.width)) && |
2424 (e->y > gtkblist->contact_rect.y) && (e->y < (gtkblist->contact_rect.y + gtkblist->contact_rect.height)))) { | |
2425 gaim_gtk_blist_collapse_contact_cb(NULL, gtkblist->mouseover_contact); | |
7636 | 2426 gtkblist->mouseover_contact = NULL; |
2427 } | |
5228 | 2428 } |
2429 | |
2430 static void | |
2431 toggle_debug(void) | |
2432 { | |
7620 | 2433 gaim_prefs_set_bool("/gaim/gtk/debug/enabled", |
2434 !gaim_prefs_get_bool("/gaim/gtk/debug/enabled")); | |
5228 | 2435 } |
2436 | |
2437 | |
2438 /*************************************************** | |
2439 * Crap * | |
2440 ***************************************************/ | |
2441 static GtkItemFactoryEntry blist_menu[] = | |
2442 { | |
2443 /* Buddies menu */ | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2444 { N_("/_Buddies"), NULL, NULL, 0, "<Branch>", NULL }, |
9714 | 2445 { N_("/Buddies/New Instant _Message..."), "<CTL>M", gaim_gtkdialogs_im, 0, "<StockItem>", GAIM_STOCK_IM }, |
8940 | 2446 { N_("/Buddies/Join a _Chat..."), "<CTL>C", gaim_gtk_blist_joinchat_show, 0, "<StockItem>", GAIM_STOCK_CHAT }, |
9714 | 2447 { N_("/Buddies/Get User _Info..."), "<CTL>I", gaim_gtkdialogs_info, 0, "<StockItem>", GAIM_STOCK_INFO }, |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12179
diff
changeset
|
2448 { N_("/Buddies/View User _Log..."), "<CTL>L", gaim_gtkdialogs_log, 0, "<StockItem>", GAIM_STOCK_LOG }, |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2449 { "/Buddies/sep1", NULL, NULL, 0, "<Separator>", NULL }, |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2450 { N_("/Buddies/Show _Offline Buddies"), NULL, gaim_gtk_blist_edit_mode_cb, 1, "<CheckItem>", NULL }, |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2451 { N_("/Buddies/Show _Empty Groups"), NULL, gaim_gtk_blist_show_empty_groups_cb, 1, "<CheckItem>", NULL }, |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2452 { N_("/Buddies/Show Buddy _Details"), NULL, gaim_gtk_blist_buddy_details_cb, 1, "<CheckItem>", NULL }, |
12656 | 2453 { N_("/Buddies/Show Idle _Times"), NULL, gaim_gtk_blist_show_idle_time_cb, 1, "<CheckItem>", NULL }, |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2454 { N_("/Buddies/_Sort Buddies"), NULL, NULL, 0, "<Branch>", NULL }, |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2455 { "/Buddies/sep2", NULL, NULL, 0, "<Separator>", NULL }, |
7853 | 2456 { N_("/Buddies/_Add Buddy..."), "<CTL>B", gaim_gtk_blist_add_buddy_cb, 0, "<StockItem>", GTK_STOCK_ADD }, |
2457 { N_("/Buddies/Add C_hat..."), NULL, gaim_gtk_blist_add_chat_cb, 0, "<StockItem>", GTK_STOCK_ADD }, | |
2458 { N_("/Buddies/Add _Group..."), NULL, gaim_blist_request_add_group, 0, "<StockItem>", GTK_STOCK_ADD }, | |
12799 | 2459 { "/Buddies/sep3", NULL, NULL, 0, "<Separator>", NULL }, |
12300
6487e68dcef9
[gaim-migrate @ 14604]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12298
diff
changeset
|
2460 { N_("/Buddies/_Quit"), "<CTL>Q", gaim_core_quit, 0, "<StockItem>", GTK_STOCK_QUIT }, |
6487e68dcef9
[gaim-migrate @ 14604]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12298
diff
changeset
|
2461 |
6487e68dcef9
[gaim-migrate @ 14604]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12298
diff
changeset
|
2462 /* Accounts menu */ |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2463 { N_("/_Accounts"), NULL, NULL, 0, "<Branch>", NULL }, |
12348
4f7797a3024b
[gaim-migrate @ 14652]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12341
diff
changeset
|
2464 { N_("/Accounts/Add\\/Edit"), "<CTL>A", gaim_gtk_accounts_window_show, 0, "<StockItem>", GAIM_STOCK_ACCOUNTS }, |
5228 | 2465 |
8470
9949b752d1ab
[gaim-migrate @ 9203]
Christian Hammond <chipx86@chipx86.com>
parents:
8444
diff
changeset
|
2466 /* Tools */ |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2467 { N_("/_Tools"), NULL, NULL, 0, "<Branch>", NULL }, |
12191
bc2b9f925979
[gaim-migrate @ 14493]
Richard Laager <rlaager@wiktel.com>
parents:
12179
diff
changeset
|
2468 { N_("/Tools/Buddy _Pounces"), NULL, gaim_gtk_pounces_manager_show, 0, "<StockItem>", GAIM_STOCK_POUNCE }, |
12163
f6f08fd1841a
[gaim-migrate @ 14464]
Richard Laager <rlaager@wiktel.com>
parents:
12136
diff
changeset
|
2469 { N_("/Tools/Plu_gins"), "<CTL>U", gaim_gtk_plugin_dialog_show, 0, "<StockItem>", GAIM_STOCK_PLUGIN }, |
12136
370f9d7868f9
[gaim-migrate @ 14436]
Richard Laager <rlaager@wiktel.com>
parents:
12133
diff
changeset
|
2470 { N_("/Tools/Pr_eferences"), "<CTL>P", gaim_gtk_prefs_show, 0, "<StockItem>", GTK_STOCK_PREFERENCES }, |
10694 | 2471 { N_("/Tools/Pr_ivacy"), NULL, gaim_gtk_privacy_dialog_show, 0, "<StockItem>", GTK_STOCK_DIALOG_ERROR }, |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2472 { "/Tools/sep2", NULL, NULL, 0, "<Separator>", NULL }, |
10019
8cc6f0bfa215
[gaim-migrate @ 10943]
Luke Schierer <lschiere@pidgin.im>
parents:
10018
diff
changeset
|
2473 { N_("/Tools/_File Transfers"), "<CTL>T", gaim_show_xfer_dialog, 0, "<StockItem>", GAIM_STOCK_FILE_TRANSFER }, |
10694 | 2474 { N_("/Tools/R_oom List"), NULL, gaim_gtk_roomlist_dialog_show, 0, "<StockItem>", GTK_STOCK_INDEX }, |
12334 | 2475 { N_("/Tools/System _Log"), NULL, gtk_blist_show_systemlog_cb, 0, "<StockItem>", GAIM_STOCK_LOG }, |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2476 { "/Tools/sep3", NULL, NULL, 0, "<Separator>", NULL }, |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2477 { N_("/Tools/Mute _Sounds"), "<CTL>S", gaim_gtk_blist_mute_sounds_cb, 0, "<CheckItem>", NULL }, |
5228 | 2478 |
2479 /* Help */ | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
2480 { N_("/_Help"), NULL, NULL, 0, "<Branch>", NULL }, |
5228 | 2481 { N_("/Help/Online _Help"), "F1", gtk_blist_show_onlinehelp_cb, 0, "<StockItem>", GTK_STOCK_HELP }, |
12333 | 2482 { N_("/Help/_Debug Window"), NULL, toggle_debug, 0, "<StockItem>", GAIM_STOCK_DEBUG }, |
9753 | 2483 { N_("/Help/_About"), NULL, gaim_gtkdialogs_about, 0, "<StockItem>", GAIM_STOCK_ABOUT }, |
5228 | 2484 }; |
2485 | |
2486 /********************************************************* | |
2487 * Private Utility functions * | |
2488 *********************************************************/ | |
2489 | |
12530 | 2490 static char *gaim_get_tooltip_text(GaimBlistNode *node, gboolean full) |
5228 | 2491 { |
10475 | 2492 GString *str = g_string_new(""); |
5237 | 2493 GaimPlugin *prpl; |
2494 GaimPluginProtocolInfo *prpl_info = NULL; | |
10475 | 2495 char *tmp; |
2496 | |
2497 if (GAIM_BLIST_NODE_IS_CHAT(node)) | |
2498 { | |
2499 GaimChat *chat; | |
2500 GList *cur; | |
5274 | 2501 struct proto_chat_entry *pce; |
10475 | 2502 char *name, *value; |
2503 | |
2504 chat = (GaimChat *)node; | |
7956 | 2505 prpl = gaim_find_prpl(gaim_account_get_protocol_id(chat->account)); |
5274 | 2506 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
2507 | |
10475 | 2508 tmp = g_markup_escape_text(gaim_chat_get_name(chat), -1); |
2509 g_string_append_printf(str, "<span size='larger' weight='bold'>%s</span>", tmp); | |
2510 g_free(tmp); | |
2511 | |
2512 if (g_list_length(gaim_connections_get_all()) > 1) | |
2513 { | |
2514 tmp = g_markup_escape_text(chat->account->username, -1); | |
2515 g_string_append_printf(str, _("\n<b>Account:</b> %s"), tmp); | |
2516 g_free(tmp); | |
2517 } | |
2518 | |
9959 | 2519 if (prpl_info->chat_info != NULL) |
10475 | 2520 cur = prpl_info->chat_info(chat->account->gc); |
2521 else | |
2522 cur = NULL; | |
2523 | |
2524 while (cur != NULL) | |
2525 { | |
2526 pce = cur->data; | |
2527 | |
2528 if (!pce->secret && (!pce->required && | |
2529 g_hash_table_lookup(chat->components, pce->identifier) == NULL)) | |
2530 { | |
2531 tmp = gaim_text_strip_mnemonic(pce->label); | |
2532 name = g_markup_escape_text(tmp, -1); | |
2533 g_free(tmp); | |
2534 value = g_markup_escape_text(g_hash_table_lookup( | |
2535 chat->components, pce->identifier), -1); | |
10924
7a82d86ab44a
[gaim-migrate @ 12695]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10918
diff
changeset
|
2536 g_string_append_printf(str, "\n<b>%s</b> %s", |
7a82d86ab44a
[gaim-migrate @ 12695]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10918
diff
changeset
|
2537 name ? name : "", |
7a82d86ab44a
[gaim-migrate @ 12695]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10918
diff
changeset
|
2538 value ? value : ""); |
10475 | 2539 g_free(name); |
8020 | 2540 g_free(value); |
2541 } | |
10475 | 2542 |
5274 | 2543 g_free(pce); |
10475 | 2544 cur = g_list_remove(cur, pce); |
5274 | 2545 } |
10475 | 2546 } |
2547 else if (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_BUDDY(node)) | |
2548 { | |
12942
432894b3bdad
[gaim-migrate @ 15295]
Richard Laager <rlaager@wiktel.com>
parents:
12941
diff
changeset
|
2549 /* NOTE: THIS FUNCTION IS NO LONGER CALLED FOR CONTACTS |
432894b3bdad
[gaim-migrate @ 15295]
Richard Laager <rlaager@wiktel.com>
parents:
12941
diff
changeset
|
2550 * See create_tip_for_node(). */ |
432894b3bdad
[gaim-migrate @ 15295]
Richard Laager <rlaager@wiktel.com>
parents:
12941
diff
changeset
|
2551 |
10475 | 2552 GaimContact *c; |
7620 | 2553 GaimBuddy *b; |
9944 | 2554 GaimPresence *presence; |
10475 | 2555 char *tmp; |
10567 | 2556 time_t idle_secs, signon; |
10475 | 2557 |
2558 if (GAIM_BLIST_NODE_IS_CONTACT(node)) | |
2559 { | |
2560 c = (GaimContact *)node; | |
2561 b = gaim_contact_get_priority_buddy(c); | |
2562 } | |
2563 else | |
2564 { | |
7620 | 2565 b = (GaimBuddy *)node; |
10475 | 2566 c = gaim_buddy_get_contact(b); |
7620 | 2567 } |
2568 | |
7956 | 2569 prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account)); |
5234 | 2570 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
2571 | |
10475 | 2572 presence = gaim_buddy_get_presence(b); |
2573 | |
2574 /* Buddy Name */ | |
2575 tmp = g_markup_escape_text(gaim_buddy_get_name(b), -1); | |
2576 g_string_append_printf(str, "<span size='larger' weight='bold'>%s</span>", tmp); | |
2577 g_free(tmp); | |
2578 | |
2579 /* Account */ | |
12530 | 2580 if (full && g_list_length(gaim_connections_get_all()) > 1) |
10475 | 2581 { |
2582 tmp = g_markup_escape_text(gaim_account_get_username( | |
2583 gaim_buddy_get_account(b)), -1); | |
2584 g_string_append_printf(str, _("\n<b>Account:</b> %s"), tmp); | |
2585 g_free(tmp); | |
2586 } | |
2587 | |
2588 /* Alias */ | |
12942
432894b3bdad
[gaim-migrate @ 15295]
Richard Laager <rlaager@wiktel.com>
parents:
12941
diff
changeset
|
2589 /* If there's not a contact alias, the node is being displayed with |
432894b3bdad
[gaim-migrate @ 15295]
Richard Laager <rlaager@wiktel.com>
parents:
12941
diff
changeset
|
2590 * this alias, so there's no point in showing it in the tooltip. */ |
432894b3bdad
[gaim-migrate @ 15295]
Richard Laager <rlaager@wiktel.com>
parents:
12941
diff
changeset
|
2591 if (full && b->alias != NULL && b->alias[0] != '\0' && |
13217
502a4de3365c
[gaim-migrate @ 15581]
Richard Laager <rlaager@wiktel.com>
parents:
13201
diff
changeset
|
2592 (c->alias != NULL && c->alias[0] != '\0') && |
502a4de3365c
[gaim-migrate @ 15581]
Richard Laager <rlaager@wiktel.com>
parents:
13201
diff
changeset
|
2593 strcmp(c->alias, b->alias) != 0) |
10475 | 2594 { |
2595 tmp = g_markup_escape_text(b->alias, -1); | |
12942
432894b3bdad
[gaim-migrate @ 15295]
Richard Laager <rlaager@wiktel.com>
parents:
12941
diff
changeset
|
2596 g_string_append_printf(str, _("\n<b>Buddy Alias:</b> %s"), tmp); |
10475 | 2597 g_free(tmp); |
2598 } | |
2599 | |
2600 /* Nickname/Server Alias */ | |
12966
03679a4db953
[gaim-migrate @ 15319]
Richard Laager <rlaager@wiktel.com>
parents:
12943
diff
changeset
|
2601 /* I'd like to only show this if there's a contact or buddy |
03679a4db953
[gaim-migrate @ 15319]
Richard Laager <rlaager@wiktel.com>
parents:
12943
diff
changeset
|
2602 * alias, but many people on MSN set long nicknames, which |
03679a4db953
[gaim-migrate @ 15319]
Richard Laager <rlaager@wiktel.com>
parents:
12943
diff
changeset
|
2603 * get ellipsized, so the only way to see the whole thing is |
03679a4db953
[gaim-migrate @ 15319]
Richard Laager <rlaager@wiktel.com>
parents:
12943
diff
changeset
|
2604 * to look at the tooltip. */ |
03679a4db953
[gaim-migrate @ 15319]
Richard Laager <rlaager@wiktel.com>
parents:
12943
diff
changeset
|
2605 if (full && b->server_alias != NULL && b->server_alias[0] != '\0') |
10475 | 2606 { |
2607 tmp = g_markup_escape_text(b->server_alias, -1); | |
2608 g_string_append_printf(str, _("\n<b>Nickname:</b> %s"), tmp); | |
2609 g_free(tmp); | |
2610 } | |
2611 | |
2612 /* Logged In */ | |
10567 | 2613 signon = gaim_presence_get_login_time(presence); |
12530 | 2614 if (full && GAIM_BUDDY_IS_ONLINE(b) && signon > 0) |
10475 | 2615 { |
10567 | 2616 tmp = gaim_str_seconds_to_string(time(NULL) - signon); |
10475 | 2617 g_string_append_printf(str, _("\n<b>Logged In:</b> %s"), tmp); |
2618 g_free(tmp); | |
2619 } | |
2620 | |
2621 /* Idle */ | |
12979
78f8ef7f0f6d
[gaim-migrate @ 15332]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12971
diff
changeset
|
2622 if (gaim_presence_is_idle(presence)) |
10475 | 2623 { |
2624 idle_secs = gaim_presence_get_idle_time(presence); | |
2625 if (idle_secs > 0) | |
2626 { | |
2627 tmp = gaim_str_seconds_to_string(time(NULL) - idle_secs); | |
2628 g_string_append_printf(str, _("\n<b>Idle:</b> %s"), tmp); | |
2629 g_free(tmp); | |
2630 } | |
2631 } | |
2632 | |
2633 /* Last Seen */ | |
12883
d486bb706e82
[gaim-migrate @ 15235]
Richard Laager <rlaager@wiktel.com>
parents:
12849
diff
changeset
|
2634 if (full && !GAIM_BUDDY_IS_ONLINE(b)) |
10475 | 2635 { |
11023 | 2636 struct _gaim_gtk_blist_node *gtknode = ((GaimBlistNode *)c)->ui_data; |
2637 GaimBlistNode *bnode; | |
2638 int lastseen = 0; | |
2639 | |
2640 if (!gtknode->contact_expanded || GAIM_BLIST_NODE_IS_CONTACT(node)) | |
2641 { | |
11437
1c20849fc716
[gaim-migrate @ 13674]
Richard Laager <rlaager@wiktel.com>
parents:
11436
diff
changeset
|
2642 /* We're either looking at a buddy for a collapsed contact or |
11438
5451fe2d89c0
[gaim-migrate @ 13675]
Richard Laager <rlaager@wiktel.com>
parents:
11437
diff
changeset
|
2643 * an expanded contact itself so we show the most recent |
11023 | 2644 * (largest) last_seen time for any of the buddies under |
2645 * the contact. */ | |
2646 for (bnode = ((GaimBlistNode *)c)->child ; bnode != NULL ; bnode = bnode->next) | |
2647 { | |
2648 int value = gaim_blist_node_get_int(bnode, "last_seen"); | |
2649 if (value > lastseen) | |
2650 lastseen = value; | |
2651 } | |
2652 } | |
2653 else | |
2654 { | |
2655 /* We're dealing with a buddy under an expanded contact, | |
2656 * so we show the last_seen time for the buddy. */ | |
2657 lastseen = gaim_blist_node_get_int(&b->node, "last_seen"); | |
2658 } | |
2659 | |
10475 | 2660 if (lastseen > 0) |
2661 { | |
2662 tmp = gaim_str_seconds_to_string(time(NULL) - lastseen); | |
2663 g_string_append_printf(str, _("\n<b>Last Seen:</b> %s ago"), tmp); | |
2664 g_free(tmp); | |
5234 | 2665 } |
2666 } | |
2667 | |
10475 | 2668 |
2669 /* Offline? */ | |
12970
ec9b92104904
[gaim-migrate @ 15323]
Richard Laager <rlaager@wiktel.com>
parents:
12966
diff
changeset
|
2670 /* FIXME: Why is this status special-cased by the core? -- rlaager */ |
10475 | 2671 if (!GAIM_BUDDY_IS_ONLINE(b)) { |
2672 g_string_append_printf(str, _("\n<b>Status:</b> Offline")); | |
2673 } | |
10992
2bda44d66641
[gaim-migrate @ 12830]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10968
diff
changeset
|
2674 |
2bda44d66641
[gaim-migrate @ 12830]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10968
diff
changeset
|
2675 if (prpl_info && prpl_info->tooltip_text) |
10475 | 2676 { |
2677 /* Additional text from the PRPL */ | |
12970
ec9b92104904
[gaim-migrate @ 15323]
Richard Laager <rlaager@wiktel.com>
parents:
12966
diff
changeset
|
2678 prpl_info->tooltip_text(b, str, full); |
10475 | 2679 } |
2680 | |
2681 /* These are Easter Eggs. Patches to remove them will be rejected. */ | |
2682 if (!g_ascii_strcasecmp(b->name, "robflynn")) | |
2683 g_string_append(str, _("\n<b>Description:</b> Spooky")); | |
2684 if (!g_ascii_strcasecmp(b->name, "seanegn")) | |
2685 g_string_append(str, _("\n<b>Status:</b> Awesome")); | |
2686 if (!g_ascii_strcasecmp(b->name, "chipx86")) | |
2687 g_string_append(str, _("\n<b>Status:</b> Rockin'")); | |
5234 | 2688 } |
10475 | 2689 |
8824 | 2690 gaim_signal_emit(gaim_gtk_blist_get_handle(), |
12713
d7043c3c793d
[gaim-migrate @ 15057]
Richard Laager <rlaager@wiktel.com>
parents:
12679
diff
changeset
|
2691 "drawing-tooltip", node, str, full); |
10475 | 2692 |
2693 return g_string_free(str, FALSE); | |
5228 | 2694 } |
2695 | |
7620 | 2696 struct _emblem_data { |
9954 | 2697 const char *filename; |
7620 | 2698 int x; |
2699 int y; | |
2700 }; | |
2701 | |
9944 | 2702 GdkPixbuf * |
2703 gaim_gtk_blist_get_status_icon(GaimBlistNode *node, GaimStatusIconSize size) | |
5228 | 2704 { |
7620 | 2705 GdkPixbuf *scale, *status = NULL; |
2706 int i, scalesize = 30; | |
2707 char *filename; | |
5228 | 2708 const char *protoname = NULL; |
7620 | 2709 struct _gaim_gtk_blist_node *gtknode = node->ui_data; |
11910 | 2710 struct _gaim_gtk_blist_node *gtkbuddynode = NULL; |
7620 | 2711 struct _emblem_data emblems[4] = {{NULL, 15, 15}, {NULL, 0, 15}, |
2712 {NULL, 0, 0}, {NULL, 15, 0}}; | |
9944 | 2713 GaimPresence *presence = NULL; |
7620 | 2714 GaimBuddy *buddy = NULL; |
2715 GaimChat *chat = NULL; | |
2716 | |
2717 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
11910 | 2718 if(!gtknode->contact_expanded) { |
7620 | 2719 buddy = gaim_contact_get_priority_buddy((GaimContact*)node); |
11910 | 2720 gtkbuddynode = ((GaimBlistNode*)buddy)->ui_data; |
2721 } | |
7620 | 2722 } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { |
2723 buddy = (GaimBuddy*)node; | |
11910 | 2724 gtkbuddynode = node->ui_data; |
7620 | 2725 } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { |
2726 chat = (GaimChat*)node; | |
2727 } else { | |
5228 | 2728 return NULL; |
5234 | 2729 } |
2730 | |
7620 | 2731 if(buddy || chat) { |
2732 GaimAccount *account; | |
2733 GaimPlugin *prpl; | |
2734 GaimPluginProtocolInfo *prpl_info; | |
2735 | |
2736 if(buddy) | |
2737 account = buddy->account; | |
2738 else | |
2739 account = chat->account; | |
2740 | |
7956 | 2741 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
7620 | 2742 if(!prpl) |
2743 return NULL; | |
2744 | |
2745 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
2746 | |
2747 if(prpl_info && prpl_info->list_icon) { | |
2748 protoname = prpl_info->list_icon(account, buddy); | |
2749 } | |
2750 if(prpl_info && prpl_info->list_emblems && buddy) { | |
11924 | 2751 if(gtknode && !gtknode->recent_signonoff) |
7620 | 2752 prpl_info->list_emblems(buddy, &emblems[0].filename, |
2753 &emblems[1].filename, &emblems[2].filename, | |
2754 &emblems[3].filename); | |
2755 } | |
5234 | 2756 } |
5228 | 2757 |
12744
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2758 if(buddy) { |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2759 GaimConversation *conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2760 gaim_buddy_get_name(buddy), |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2761 gaim_buddy_get_account(buddy)); |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2762 if(conv != NULL) { |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2763 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2764 if(gtkconv != NULL && gaim_gtkconv_is_hidden(gtkconv)) { |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2765 /* add pending emblem */ |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2766 if(size == GAIM_STATUS_ICON_SMALL) { |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2767 emblems[0].filename="pending"; |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2768 } |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2769 else { |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2770 emblems[3].filename=emblems[2].filename; |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2771 emblems[2].filename="pending"; |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2772 } |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2773 } |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2774 } |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2775 } |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
2776 |
7620 | 2777 if(size == GAIM_STATUS_ICON_SMALL) { |
5228 | 2778 scalesize = 15; |
7620 | 2779 /* So that only the se icon will composite */ |
2780 emblems[1].filename = emblems[2].filename = emblems[3].filename = NULL; | |
5228 | 2781 } |
2782 | |
11917 | 2783 if(buddy && GAIM_BUDDY_IS_ONLINE(buddy) && gtkbuddynode && gtkbuddynode->recent_signonoff) { |
7620 | 2784 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "login.png", NULL); |
11917 | 2785 } else if(buddy && !GAIM_BUDDY_IS_ONLINE(buddy) && gtkbuddynode && gtkbuddynode->recent_signonoff) { |
7620 | 2786 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "logout.png", NULL); |
2787 } else if(buddy || chat) { | |
5228 | 2788 char *image = g_strdup_printf("%s.png", protoname); |
2789 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
2790 g_free(image); | |
7620 | 2791 } else { |
2792 /* gaim dude */ | |
2793 filename = g_build_filename(DATADIR, "pixmaps", "gaim.png", NULL); | |
5228 | 2794 } |
7620 | 2795 |
2796 status = gdk_pixbuf_new_from_file(filename, NULL); | |
2797 g_free(filename); | |
2798 | |
2799 if(!status) | |
2800 return NULL; | |
2801 | |
2802 scale = gdk_pixbuf_scale_simple(status, scalesize, scalesize, | |
2803 GDK_INTERP_BILINEAR); | |
2804 g_object_unref(status); | |
2805 | |
2806 for(i=0; i<4; i++) { | |
2807 if(emblems[i].filename) { | |
2808 GdkPixbuf *emblem; | |
2809 char *image = g_strdup_printf("%s.png", emblems[i].filename); | |
2810 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", image, NULL); | |
2811 g_free(image); | |
2812 emblem = gdk_pixbuf_new_from_file(filename, NULL); | |
2813 g_free(filename); | |
2814 if(emblem) { | |
2815 if(i == 0 && size == GAIM_STATUS_ICON_SMALL) { | |
2816 gdk_pixbuf_composite(emblem, | |
2817 scale, 5, 5, | |
2818 10, 10, | |
2819 5, 5, | |
2820 .6, .6, | |
2821 GDK_INTERP_BILINEAR, | |
2822 255); | |
2823 } else { | |
2824 gdk_pixbuf_composite(emblem, | |
2825 scale, emblems[i].x, emblems[i].y, | |
2826 15, 15, | |
2827 emblems[i].x, emblems[i].y, | |
2828 1, 1, | |
2829 GDK_INTERP_BILINEAR, | |
2830 255); | |
2831 } | |
2832 g_object_unref(emblem); | |
2833 } | |
5228 | 2834 } |
2835 } | |
7620 | 2836 |
2837 if(buddy) { | |
9944 | 2838 presence = gaim_buddy_get_presence(buddy); |
2839 | |
2840 if (!GAIM_BUDDY_IS_ONLINE(buddy)) | |
7620 | 2841 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.0, FALSE); |
10118 | 2842 else if (gaim_presence_is_idle(presence)) |
9944 | 2843 { |
7620 | 2844 gdk_pixbuf_saturate_and_pixelate(scale, scale, 0.25, FALSE); |
9944 | 2845 } |
11111
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2846 |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2847 if (!gaim_privacy_check(buddy->account, gaim_buddy_get_name(buddy))) |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2848 { |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2849 GdkPixbuf *emblem; |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2850 char *filename = g_build_filename(DATADIR, "pixmaps", "gaim", "status", "default", "blocked.png", NULL); |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2851 |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2852 emblem = gdk_pixbuf_new_from_file(filename, NULL); |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2853 g_free(filename); |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2854 |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2855 if (emblem) |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2856 { |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2857 gdk_pixbuf_composite(emblem, scale, |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2858 0, 0, scalesize, scalesize, |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2859 0, 0, |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2860 (double)scalesize / gdk_pixbuf_get_width(emblem), |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2861 (double)scalesize / gdk_pixbuf_get_height(emblem), |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2862 GDK_INTERP_BILINEAR, |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2863 224); |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2864 g_object_unref(emblem); |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2865 } |
f03dce7ea408
[gaim-migrate @ 13163]
Richard Laager <rlaager@wiktel.com>
parents:
11059
diff
changeset
|
2866 } |
5228 | 2867 } |
7620 | 2868 |
5228 | 2869 return scale; |
2870 } | |
2871 | |
7620 | 2872 static gchar *gaim_gtk_blist_get_name_markup(GaimBuddy *b, gboolean selected) |
5228 | 2873 { |
7620 | 2874 const char *name; |
2875 char *esc, *text = NULL; | |
5228 | 2876 GaimPlugin *prpl; |
2877 GaimPluginProtocolInfo *prpl_info = NULL; | |
7620 | 2878 GaimContact *contact; |
9944 | 2879 GaimPresence *presence; |
7620 | 2880 struct _gaim_gtk_blist_node *gtkcontactnode = NULL; |
11257 | 2881 char *idletime = NULL, *statustext = NULL; |
5228 | 2882 time_t t; |
13889 | 2883 /* XXX Good luck cleaning up this crap */ |
7620 | 2884 |
2885 contact = (GaimContact*)((GaimBlistNode*)b)->parent; | |
2886 if(contact) | |
2887 gtkcontactnode = ((GaimBlistNode*)contact)->ui_data; | |
2888 | |
2889 if(gtkcontactnode && !gtkcontactnode->contact_expanded && contact->alias) | |
2890 name = contact->alias; | |
2891 else | |
9620 | 2892 name = gaim_buddy_get_alias(b); |
7620 | 2893 esc = g_markup_escape_text(name, strlen(name)); |
2894 | |
9944 | 2895 presence = gaim_buddy_get_presence(b); |
2896 | |
13034
615c84e94745
[gaim-migrate @ 15392]
Richard Laager <rlaager@wiktel.com>
parents:
13030
diff
changeset
|
2897 if (!gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) |
615c84e94745
[gaim-migrate @ 15392]
Richard Laager <rlaager@wiktel.com>
parents:
13030
diff
changeset
|
2898 { |
13038
4005ad2b3ca9
[gaim-migrate @ 15397]
Richard Laager <rlaager@wiktel.com>
parents:
13034
diff
changeset
|
2899 if (!selected && gaim_presence_is_idle(presence)) |
9944 | 2900 { |
10118 | 2901 text = g_strdup_printf("<span color='%s'>%s</span>", |
2902 dim_grey(), esc); | |
5228 | 2903 g_free(esc); |
2904 return text; | |
7620 | 2905 } |
9944 | 2906 else |
5228 | 2907 return esc; |
2908 } | |
2909 | |
13889 | 2910 prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account)); |
2911 | |
2912 if (prpl != NULL) | |
2913 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
2914 | |
8122
36674144c510
[gaim-migrate @ 8826]
Christian Hammond <chipx86@chipx86.com>
parents:
8113
diff
changeset
|
2915 if (prpl_info && prpl_info->status_text && b->account->gc) { |
5228 | 2916 char *tmp = prpl_info->status_text(b); |
2917 const char *end; | |
2918 | |
2919 if(tmp && !g_utf8_validate(tmp, -1, &end)) { | |
2920 char *new = g_strndup(tmp, | |
2921 g_utf8_pointer_to_offset(tmp, end)); | |
2922 g_free(tmp); | |
2923 tmp = new; | |
2924 } | |
2925 | |
10288 | 2926 #if !GTK_CHECK_VERSION(2,6,0) |
5228 | 2927 if(tmp) { |
2928 char buf[32]; | |
2929 char *c = tmp; | |
2930 int length = 0, vis=0; | |
2931 gboolean inside = FALSE; | |
2932 g_strdelimit(tmp, "\n", ' '); | |
11920 | 2933 gaim_str_strip_char(tmp, '\r'); |
5228 | 2934 |
2935 while(*c && vis < 20) { | |
2936 if(*c == '&') | |
2937 inside = TRUE; | |
2938 else if(*c == ';') | |
2939 inside = FALSE; | |
2940 if(!inside) | |
2941 vis++; | |
7620 | 2942 c = g_utf8_next_char(c); /* this is fun */ |
5228 | 2943 } |
2944 | |
7620 | 2945 length = c - tmp; |
2946 | |
5228 | 2947 if(vis == 20) |
2948 g_snprintf(buf, sizeof(buf), "%%.%ds...", length); | |
2949 else | |
2950 g_snprintf(buf, sizeof(buf), "%%s "); | |
2951 | |
2952 statustext = g_strdup_printf(buf, tmp); | |
2953 | |
2954 g_free(tmp); | |
2955 } | |
10288 | 2956 #else |
13790
e744943e749c
[gaim-migrate @ 16202]
Richard Laager <rlaager@wiktel.com>
parents:
13766
diff
changeset
|
2957 if(tmp) { |
12437 | 2958 g_strdelimit(tmp, "\n", ' '); |
13790
e744943e749c
[gaim-migrate @ 16202]
Richard Laager <rlaager@wiktel.com>
parents:
13766
diff
changeset
|
2959 gaim_str_strip_char(tmp, '\r'); |
e744943e749c
[gaim-migrate @ 16202]
Richard Laager <rlaager@wiktel.com>
parents:
13766
diff
changeset
|
2960 } |
10288 | 2961 statustext = tmp; |
2962 #endif | |
5228 | 2963 } |
2964 | |
13034
615c84e94745
[gaim-migrate @ 15392]
Richard Laager <rlaager@wiktel.com>
parents:
13030
diff
changeset
|
2965 if(!gaim_presence_is_online(presence) && !statustext) |
615c84e94745
[gaim-migrate @ 15392]
Richard Laager <rlaager@wiktel.com>
parents:
13030
diff
changeset
|
2966 statustext = g_strdup(_("Offline")); |
13889 | 2967 else if (!statustext) |
2968 text = g_strdup(esc); | |
2969 | |
2970 if (gaim_presence_is_idle(presence)) { | |
2971 if (gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time")) { | |
2972 time_t idle_secs = gaim_presence_get_idle_time(presence); | |
2973 | |
2974 if (idle_secs > 0) { | |
2975 int ihrs, imin; | |
2976 | |
2977 time(&t); | |
2978 ihrs = (t - idle_secs) / 3600; | |
2979 imin = ((t - idle_secs) / 60) % 60; | |
2980 | |
2981 if (ihrs) | |
2982 idletime = g_strdup_printf(_("Idle %dh %02dm"), ihrs, imin); | |
2983 else | |
2984 idletime = g_strdup_printf(_("Idle %dm"), imin); | |
2985 } | |
2986 else | |
2987 idletime = g_strdup(_("Idle")); | |
2988 | |
2989 if (!selected) | |
2990 text = g_strdup_printf("<span color='%s'>%s</span>\n" | |
2991 "<span color='%s' size='smaller'>%s%s%s</span>", | |
2992 dim_grey(), esc, dim_grey(), | |
2993 idletime != NULL ? idletime : "", | |
2994 (idletime != NULL && statustext != NULL) ? " - " : "", | |
2995 statustext != NULL ? statustext : ""); | |
13034
615c84e94745
[gaim-migrate @ 15392]
Richard Laager <rlaager@wiktel.com>
parents:
13030
diff
changeset
|
2996 } |
13889 | 2997 else if (!selected && !statustext) /* We handle selected text later */ |
2998 text = g_strdup_printf("<span color='%s'>%s</span>", dim_grey(), esc); | |
2999 else if (!selected && !text) | |
3000 text = g_strdup_printf("<span color='%s'>%s</span>\n" | |
3001 "<span color='%s' size='smaller'>%s%s%s</span>", | |
3002 dim_grey(), esc, dim_grey(), | |
3003 idletime != NULL ? idletime : "", | |
3004 (idletime != NULL && statustext != NULL) ? " - " : "", | |
3005 statustext != NULL ? statustext : ""); | |
5228 | 3006 } |
13889 | 3007 |
3008 /* Not idle and not selected */ | |
3009 else if (!selected && !text) | |
3010 { | |
13201
6ff5271afedc
[gaim-migrate @ 15564]
Richard Laager <rlaager@wiktel.com>
parents:
13196
diff
changeset
|
3011 text = g_strdup_printf("%s\n" |
13889 | 3012 "<span color='%s' size='smaller'>%s%s%s</span>", |
3013 esc, dim_grey(), | |
3014 idletime != NULL ? idletime : "", | |
3015 (idletime != NULL && statustext != NULL) ? " - " : "", | |
3016 statustext != NULL ? statustext : ""); | |
3017 } | |
3018 | |
3019 /* It is selected. */ | |
3020 if ((selected && !text) || (selected && idletime)) | |
3021 text = g_strdup_printf("%s\n" | |
3022 "<span size='smaller'>%s%s%s</span>", | |
3023 esc, | |
3024 idletime != NULL ? idletime : "", | |
3025 (idletime != NULL && statustext != NULL) ? " - " : "", | |
3026 statustext != NULL ? statustext : ""); | |
12656 | 3027 |
3028 g_free(idletime); | |
3029 g_free(statustext); | |
3030 g_free(esc); | |
5228 | 3031 |
3032 return text; | |
3033 } | |
3034 | |
3035 static void gaim_gtk_blist_restore_position() | |
3036 { | |
7620 | 3037 int blist_x, blist_y, blist_width, blist_height; |
3038 | |
3039 blist_width = gaim_prefs_get_int("/gaim/gtk/blist/width"); | |
3040 | |
3041 /* if the window exists, is hidden, we're saving positions, and the | |
3042 * position is sane... */ | |
3043 if (gtkblist && gtkblist->window && | |
3044 !GTK_WIDGET_VISIBLE(gtkblist->window) && blist_width != 0) { | |
3045 | |
3046 blist_x = gaim_prefs_get_int("/gaim/gtk/blist/x"); | |
3047 blist_y = gaim_prefs_get_int("/gaim/gtk/blist/y"); | |
3048 blist_height = gaim_prefs_get_int("/gaim/gtk/blist/height"); | |
3049 | |
5228 | 3050 /* ...check position is on screen... */ |
7620 | 3051 if (blist_x >= gdk_screen_width()) |
3052 blist_x = gdk_screen_width() - 100; | |
3053 else if (blist_x + blist_width < 0) | |
3054 blist_x = 100; | |
3055 | |
3056 if (blist_y >= gdk_screen_height()) | |
3057 blist_y = gdk_screen_height() - 100; | |
3058 else if (blist_y + blist_height < 0) | |
3059 blist_y = 100; | |
3060 | |
5228 | 3061 /* ...and move it back. */ |
7620 | 3062 gtk_window_move(GTK_WINDOW(gtkblist->window), blist_x, blist_y); |
3063 gtk_window_resize(GTK_WINDOW(gtkblist->window), blist_width, blist_height); | |
12279 | 3064 if (gaim_prefs_get_bool("/gaim/gtk/blist/list_maximized")) |
3065 gtk_window_maximize(GTK_WINDOW(gtkblist->window)); | |
5228 | 3066 } |
3067 } | |
3068 | |
7620 | 3069 static gboolean gaim_gtk_blist_refresh_timer(GaimBuddyList *list) |
5228 | 3070 { |
7620 | 3071 GaimBlistNode *gnode, *cnode; |
3072 | |
13889 | 3073 if (gtk_blist_obscured || !GTK_WIDGET_VISIBLE(gtkblist->window)) |
3074 return TRUE; | |
3075 | |
7620 | 3076 for(gnode = list->root; gnode; gnode = gnode->next) { |
3077 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5234 | 3078 continue; |
7620 | 3079 for(cnode = gnode->child; cnode; cnode = cnode->next) { |
3080 if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
9944 | 3081 GaimBuddy *buddy; |
3082 | |
3083 buddy = gaim_contact_get_priority_buddy((GaimContact*)cnode); | |
10012 | 3084 |
3085 if (buddy && | |
3086 gaim_presence_is_idle(gaim_buddy_get_presence(buddy))) | |
13889 | 3087 gaim_gtk_blist_update_contact(list, (GaimBlistNode*)buddy); |
7620 | 3088 } |
5228 | 3089 } |
3090 } | |
3091 | |
3092 /* keep on going */ | |
3093 return TRUE; | |
3094 } | |
3095 | |
7620 | 3096 static void gaim_gtk_blist_hide_node(GaimBuddyList *list, GaimBlistNode *node) |
5260 | 3097 { |
3098 struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
3099 GtkTreeIter iter; | |
3100 | |
3101 if (!gtknode || !gtknode->row || !gtkblist) | |
3102 return; | |
3103 | |
3104 if(gtkblist->selected_node == node) | |
3105 gtkblist->selected_node = NULL; | |
3106 | |
3107 if (get_iter_from_node(node, &iter)) { | |
3108 gtk_tree_store_remove(gtkblist->treemodel, &iter); | |
7620 | 3109 if(GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_BUDDY(node) |
3110 || GAIM_BLIST_NODE_IS_CHAT(node)) { | |
5260 | 3111 gaim_gtk_blist_update(list, node->parent); |
3112 } | |
3113 } | |
3114 gtk_tree_row_reference_free(gtknode->row); | |
3115 gtknode->row = NULL; | |
3116 } | |
3117 | |
10352 | 3118 static const char *require_connection[] = |
7620 | 3119 { |
10352 | 3120 N_("/Buddies/New Instant Message..."), |
3121 N_("/Buddies/Join a Chat..."), | |
3122 N_("/Buddies/Get User Info..."), | |
3123 N_("/Buddies/Add Buddy..."), | |
3124 N_("/Buddies/Add Chat..."), | |
3125 N_("/Buddies/Add Group..."), | |
3126 }; | |
3127 | |
10357 | 3128 static const int require_connection_size = sizeof(require_connection) |
3129 / sizeof(*require_connection); | |
10352 | 3130 |
3131 /** | |
3132 * Rebuild dynamic menus and make menu items sensitive/insensitive | |
3133 * where appropriate. | |
3134 */ | |
3135 static void | |
3136 update_menu_bar(GaimGtkBuddyList *gtkblist) | |
3137 { | |
8937 | 3138 GtkWidget *widget; |
10352 | 3139 gboolean sensitive; |
3140 int i; | |
3141 | |
3142 g_return_if_fail(gtkblist != NULL); | |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3143 |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
3144 gaim_gtk_blist_update_accounts_menu(); |
8937 | 3145 |
10352 | 3146 sensitive = (gaim_connections_get_all() != NULL); |
3147 | |
10357 | 3148 for (i = 0; i < require_connection_size; i++) |
10352 | 3149 { |
3150 widget = gtk_item_factory_get_widget(gtkblist->ift, require_connection[i]); | |
3151 gtk_widget_set_sensitive(widget, sensitive); | |
3152 } | |
3153 | |
8940 | 3154 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Buddies/Join a Chat...")); |
3155 gtk_widget_set_sensitive(widget, gaim_gtk_blist_joinchat_is_showable()); | |
3156 | |
11988 | 3157 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Buddies/Add Chat...")); |
3158 gtk_widget_set_sensitive(widget, gaim_gtk_blist_joinchat_is_showable()); | |
3159 | |
12136
370f9d7868f9
[gaim-migrate @ 14436]
Richard Laager <rlaager@wiktel.com>
parents:
12133
diff
changeset
|
3160 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Buddy Pounces")); |
370f9d7868f9
[gaim-migrate @ 14436]
Richard Laager <rlaager@wiktel.com>
parents:
12133
diff
changeset
|
3161 gtk_widget_set_sensitive(widget, (gaim_connections_get_all() != NULL)); |
8938 | 3162 |
3163 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Privacy")); | |
13001
4bbd39576c52
[gaim-migrate @ 15354]
Richard Laager <rlaager@wiktel.com>
parents:
12979
diff
changeset
|
3164 gtk_widget_set_sensitive(widget, (gaim_connections_get_all() != NULL)); |
12136
370f9d7868f9
[gaim-migrate @ 14436]
Richard Laager <rlaager@wiktel.com>
parents:
12133
diff
changeset
|
3165 |
370f9d7868f9
[gaim-migrate @ 14436]
Richard Laager <rlaager@wiktel.com>
parents:
12133
diff
changeset
|
3166 widget = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Room List")); |
370f9d7868f9
[gaim-migrate @ 14436]
Richard Laager <rlaager@wiktel.com>
parents:
12133
diff
changeset
|
3167 gtk_widget_set_sensitive(widget, gaim_gtk_roomlist_is_showable()); |
7620 | 3168 } |
3169 | |
10352 | 3170 static void |
3171 sign_on_off_cb(GaimConnection *gc, GaimBuddyList *blist) | |
3172 { | |
3173 GaimGtkBuddyList *gtkblist = GAIM_GTK_BLIST(blist); | |
3174 | |
3175 update_menu_bar(gtkblist); | |
3176 } | |
8986 | 3177 |
3178 static void | |
3179 plugin_changed_cb(GaimPlugin *p, gpointer *data) | |
3180 { | |
3181 gaim_gtk_blist_update_plugin_actions(); | |
3182 } | |
3183 | |
12133
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3184 static void |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3185 unseen_conv_menu() |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3186 { |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3187 static GtkWidget *menu = NULL; |
12468
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3188 GList *convs = NULL; |
12133
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3189 |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3190 if (menu) |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3191 gtk_widget_destroy(menu); |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3192 |
12175
a655bdeb561d
[gaim-migrate @ 14477]
Richard Laager <rlaager@wiktel.com>
parents:
12163
diff
changeset
|
3193 menu = gtk_menu_new(); |
12468
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3194 |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3195 convs = gaim_gtk_conversations_find_unseen_list(GAIM_CONV_TYPE_IM, GAIM_UNSEEN_TEXT, TRUE, 0); |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3196 if (!convs) { |
12175
a655bdeb561d
[gaim-migrate @ 14477]
Richard Laager <rlaager@wiktel.com>
parents:
12163
diff
changeset
|
3197 /* no conversations added, don't show the menu */ |
a655bdeb561d
[gaim-migrate @ 14477]
Richard Laager <rlaager@wiktel.com>
parents:
12163
diff
changeset
|
3198 gtk_widget_destroy(menu); |
12133
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3199 return; |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3200 } |
12468
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3201 gaim_gtk_conversations_fill_menu(menu, convs); |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3202 g_list_free(convs); |
12133
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3203 gtk_widget_show_all(menu); |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3204 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3205 gtk_get_current_event_time()); |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3206 } |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3207 |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3208 static gboolean |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3209 menutray_press_cb(GtkWidget *widget, GdkEventButton *event) |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3210 { |
12468
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3211 GList *convs; |
12208 | 3212 |
12133
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3213 switch (event->button) { |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3214 case 1: |
12468
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3215 convs = gaim_gtk_conversations_find_unseen_list(GAIM_CONV_TYPE_IM, |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3216 GAIM_UNSEEN_TEXT, TRUE, 1); |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3217 if (convs) { |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3218 gaim_gtkconv_present_conversation((GaimConversation*)convs->data); |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3219 g_list_free(convs); |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3220 } |
12133
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3221 break; |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3222 case 3: |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3223 unseen_conv_menu(); |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3224 break; |
8254bb99f929
[gaim-migrate @ 14433]
Richard Laager <rlaager@wiktel.com>
parents:
12124
diff
changeset
|
3225 } |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3226 return TRUE; |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3227 } |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3228 |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3229 static void |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3230 conversation_updated_cb(GaimConversation *conv, GaimConvUpdateType type, |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3231 GaimGtkBuddyList *gtkblist) |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3232 { |
12468
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3233 GList *convs = NULL; |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3234 GList *l = NULL; |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3235 |
12175
a655bdeb561d
[gaim-migrate @ 14477]
Richard Laager <rlaager@wiktel.com>
parents:
12163
diff
changeset
|
3236 if (type != GAIM_CONV_UPDATE_UNSEEN) |
a655bdeb561d
[gaim-migrate @ 14477]
Richard Laager <rlaager@wiktel.com>
parents:
12163
diff
changeset
|
3237 return; |
a655bdeb561d
[gaim-migrate @ 14477]
Richard Laager <rlaager@wiktel.com>
parents:
12163
diff
changeset
|
3238 |
12744
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
3239 if(conv->account != NULL && conv->name != NULL) { |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
3240 GaimBuddy *buddy = gaim_find_buddy(conv->account, conv->name); |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
3241 if(buddy != NULL) |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
3242 gaim_gtk_blist_update_buddy(NULL, (GaimBlistNode *)buddy); |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
3243 } |
fcd9477e4476
[gaim-migrate @ 15091]
Luke Schierer <lschiere@pidgin.im>
parents:
12713
diff
changeset
|
3244 |
12175
a655bdeb561d
[gaim-migrate @ 14477]
Richard Laager <rlaager@wiktel.com>
parents:
12163
diff
changeset
|
3245 if (gtkblist->menutrayicon) { |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3246 gtk_widget_destroy(gtkblist->menutrayicon); |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3247 gtkblist->menutrayicon = NULL; |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3248 } |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3249 |
12468
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3250 convs = gaim_gtk_conversations_find_unseen_list(GAIM_CONV_TYPE_IM, GAIM_UNSEEN_TEXT, TRUE, 0); |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3251 if (convs) { |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3252 GtkWidget *img = NULL; |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3253 GString *tooltip_text = NULL; |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3254 |
12117 | 3255 tooltip_text = g_string_new(""); |
12468
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3256 l = convs; |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3257 while (l != NULL) { |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3258 if (GAIM_IS_GTK_CONVERSATION(l->data)) { |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3259 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION((GaimConversation *)l->data); |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3260 |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3261 g_string_append_printf(tooltip_text, |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3262 ngettext("%d unread message from %s\n", "%d unread messages from %s\n", gtkconv->unseen_count), |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3263 gtkconv->unseen_count, |
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3264 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label))); |
12117 | 3265 } |
12468
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3266 l = l->next; |
12117 | 3267 } |
12239 | 3268 if(tooltip_text->len > 0) { |
12302 | 3269 /* get rid of the last newline */ |
3270 tooltip_text = g_string_truncate(tooltip_text, tooltip_text->len -1); | |
3271 img = gtk_image_new_from_stock(GAIM_STOCK_PENDING, GTK_ICON_SIZE_MENU); | |
3272 | |
3273 gtkblist->menutrayicon = gtk_event_box_new(); | |
3274 gtk_container_add(GTK_CONTAINER(gtkblist->menutrayicon), img); | |
3275 gtk_widget_show(img); | |
3276 gtk_widget_show(gtkblist->menutrayicon); | |
3277 g_signal_connect(G_OBJECT(gtkblist->menutrayicon), "button-press-event", G_CALLBACK(menutray_press_cb), NULL); | |
3278 | |
3279 gaim_gtk_menu_tray_append(GAIM_GTK_MENU_TRAY(gtkblist->menutray), gtkblist->menutrayicon, tooltip_text->str); | |
12239 | 3280 } |
12302 | 3281 g_string_free(tooltip_text, TRUE); |
12468
6faefbebcd24
[gaim-migrate @ 14778]
Richard Laager <rlaager@wiktel.com>
parents:
12466
diff
changeset
|
3282 g_list_free(convs); |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3283 } |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3284 } |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3285 |
12208 | 3286 static void |
3287 conversation_deleting_cb(GaimConversation *conv, GaimGtkBuddyList *gtkblist) | |
3288 { | |
3289 conversation_updated_cb(conv, GAIM_CONV_UPDATE_UNSEEN, gtkblist); | |
3290 } | |
3291 | |
5228 | 3292 /********************************************************************************** |
3293 * Public API Functions * | |
3294 **********************************************************************************/ | |
9774 | 3295 |
7620 | 3296 static void gaim_gtk_blist_new_list(GaimBuddyList *blist) |
5228 | 3297 { |
7620 | 3298 GaimGtkBuddyList *gtkblist; |
3299 | |
3300 gtkblist = g_new0(GaimGtkBuddyList, 1); | |
13015 | 3301 gtkblist->connection_errors = g_hash_table_new_full(g_direct_hash, |
3302 g_direct_equal, NULL, g_free); | |
7620 | 3303 blist->ui_data = gtkblist; |
5228 | 3304 } |
3305 | |
5256 | 3306 static void gaim_gtk_blist_new_node(GaimBlistNode *node) |
3307 { | |
3308 node->ui_data = g_new0(struct _gaim_gtk_blist_node, 1); | |
3309 } | |
3310 | |
11018 | 3311 gboolean gaim_gtk_blist_node_is_contact_expanded(GaimBlistNode *node) |
3312 { | |
3313 if GAIM_BLIST_NODE_IS_BUDDY(node) | |
3314 node = node->parent; | |
3315 | |
3316 g_return_val_if_fail(GAIM_BLIST_NODE_IS_CONTACT(node), FALSE); | |
3317 | |
3318 return ((struct _gaim_gtk_blist_node *)node->ui_data)->contact_expanded; | |
3319 } | |
3320 | |
5228 | 3321 void gaim_gtk_blist_update_columns() |
3322 { | |
3323 if(!gtkblist) | |
3324 return; | |
3325 | |
7620 | 3326 if (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) { |
5228 | 3327 gtk_tree_view_column_set_visible(gtkblist->buddy_icon_column, TRUE); |
3328 gtk_tree_view_column_set_visible(gtkblist->idle_column, FALSE); | |
3329 } else { | |
12656 | 3330 gtk_tree_view_column_set_visible(gtkblist->idle_column, |
3331 gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time")); | |
5228 | 3332 gtk_tree_view_column_set_visible(gtkblist->buddy_icon_column, FALSE); |
3333 } | |
3334 } | |
3335 | |
12326 | 3336 static void |
3337 show_buddy_icons_pref_cb(const char *name, GaimPrefType type, | |
12816 | 3338 gconstpointer val, gpointer data) |
12326 | 3339 { |
3340 gaim_gtk_blist_update_columns(); | |
3341 } | |
3342 | |
10433 | 3343 enum { |
3344 DRAG_BUDDY, | |
3345 DRAG_ROW, | |
3346 DRAG_VCARD, | |
3347 DRAG_TEXT, | |
3348 DRAG_URI, | |
3349 NUM_TARGETS | |
3350 }; | |
5228 | 3351 |
13106
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
3352 static const char * |
5228 | 3353 item_factory_translate_func (const char *path, gpointer func_data) |
3354 { | |
7620 | 3355 return _((char *)path); |
5228 | 3356 } |
3357 | |
5422 | 3358 void gaim_gtk_blist_setup_sort_methods() |
3359 { | |
11798
01c3eec6ea3c
[gaim-migrate @ 14089]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11797
diff
changeset
|
3360 gaim_gtk_blist_sort_method_reg("none", _("Manually"), sort_method_none); |
7620 | 3361 #if GTK_CHECK_VERSION(2,2,1) |
11798
01c3eec6ea3c
[gaim-migrate @ 14089]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11797
diff
changeset
|
3362 gaim_gtk_blist_sort_method_reg("alphabetical", _("Alphabetically"), sort_method_alphabetical); |
7620 | 3363 gaim_gtk_blist_sort_method_reg("status", _("By status"), sort_method_status); |
3364 gaim_gtk_blist_sort_method_reg("log_size", _("By log size"), sort_method_log); | |
3365 #endif | |
3366 gaim_gtk_blist_sort_method_set(gaim_prefs_get_string("/gaim/gtk/blist/sort_type")); | |
3367 } | |
3368 | |
10433 | 3369 static void _prefs_change_redo_list() |
3370 { | |
13510
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3371 GtkTreeSelection *sel; |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3372 GtkTreeIter iter; |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3373 GaimBlistNode *node = NULL; |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3374 |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3375 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3376 if (gtk_tree_selection_get_selected(sel, NULL, &iter)) |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3377 { |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3378 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1); |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3379 } |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3380 |
7620 | 3381 redo_buddy_list(gaim_get_blist(), TRUE); |
13161
02268b52ced3
[gaim-migrate @ 15524]
Richard Laager <rlaager@wiktel.com>
parents:
13146
diff
changeset
|
3382 #if GTK_CHECK_VERSION(2,6,0) |
02268b52ced3
[gaim-migrate @ 15524]
Richard Laager <rlaager@wiktel.com>
parents:
13146
diff
changeset
|
3383 gtk_tree_view_columns_autosize(GTK_TREE_VIEW(gtkblist->treeview)); |
02268b52ced3
[gaim-migrate @ 15524]
Richard Laager <rlaager@wiktel.com>
parents:
13146
diff
changeset
|
3384 #endif |
13510
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3385 |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3386 if (node) |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3387 { |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3388 struct _gaim_gtk_blist_node *gtknode; |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3389 GtkTreePath *path; |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3390 |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3391 gtknode = node->ui_data; |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3392 if (gtknode && gtknode->row) |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3393 { |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3394 path = gtk_tree_row_reference_get_path(gtknode->row); |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3395 gtk_tree_selection_select_path(sel, path); |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3396 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(gtkblist->treeview), path, NULL, FALSE, 0, 0); |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3397 gtk_tree_path_free(path); |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3398 } |
65486b7e8e45
[gaim-migrate @ 15886]
Richard Laager <rlaager@wiktel.com>
parents:
13509
diff
changeset
|
3399 } |
7620 | 3400 } |
3401 | |
3402 static void _prefs_change_sort_method(const char *pref_name, GaimPrefType type, | |
12816 | 3403 gconstpointer val, gpointer data) |
10433 | 3404 { |
7620 | 3405 if(!strcmp(pref_name, "/gaim/gtk/blist/sort_type")) |
3406 gaim_gtk_blist_sort_method_set(val); | |
3407 } | |
3408 | |
10433 | 3409 /* |
3410 * "This is so dead sexy." | |
3411 * "Two thumbs up." | |
3412 * "Best movie of the year." | |
3413 * | |
3414 * This is the function that handles CTRL+F searching in the buddy list. | |
3415 * It finds the top-most buddy/group/chat/whatever containing the | |
3416 * entered string. | |
3417 * | |
3418 * It's somewhat ineffecient, because we strip all the HTML from the | |
3419 * "name" column of the buddy list (because the GtkTreeModel does not | |
3420 * contain the screen name in a non-markedup format). But the alternative | |
3421 * is to add an extra column to the GtkTreeModel. And this function is | |
3422 * used rarely, so it shouldn't matter TOO much. | |
3423 */ | |
3424 static gboolean | |
3425 _search_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer search_data) | |
3426 { | |
3427 gchar *enteredstring; | |
13612
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3428 gchar *tmp; |
10439 | 3429 gchar *withmarkup; |
10433 | 3430 gchar *nomarkup; |
11490 | 3431 gchar *normalized; |
13478
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3432 gboolean result; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3433 size_t i; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3434 size_t len; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3435 PangoLogAttr *log_attrs; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3436 gchar *word; |
10435 | 3437 |
13968 | 3438 if (strcasecmp(key, "Global Thermonuclear War") == 0) |
3439 { | |
3440 gaim_notify_info(NULL, "WOPR", | |
3441 "Wouldn't you prefer a nice game of chess?", NULL); | |
3442 return FALSE; | |
3443 } | |
3444 | |
10435 | 3445 gtk_tree_model_get(model, iter, column, &withmarkup, -1); |
10433 | 3446 |
13612
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3447 tmp = g_utf8_normalize(key, -1, G_NORMALIZE_DEFAULT); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3448 enteredstring = g_utf8_casefold(tmp, -1); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3449 g_free(tmp); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3450 |
10433 | 3451 nomarkup = gaim_markup_strip_html(withmarkup); |
13612
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3452 tmp = g_utf8_normalize(nomarkup, -1, G_NORMALIZE_DEFAULT); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3453 g_free(nomarkup); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3454 normalized = g_utf8_casefold(tmp, -1); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3455 g_free(tmp); |
10433 | 3456 |
13478
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3457 if (gaim_str_has_prefix(normalized, enteredstring)) |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3458 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3459 g_free(withmarkup); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3460 g_free(enteredstring); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3461 g_free(normalized); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3462 return FALSE; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3463 } |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3464 |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3465 |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3466 /* Use Pango to separate by words. */ |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3467 len = g_utf8_strlen(normalized, -1); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3468 log_attrs = g_new(PangoLogAttr, len + 1); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3469 |
13684
a104ce6e2cca
[gaim-migrate @ 16087]
Richard Laager <rlaager@wiktel.com>
parents:
13674
diff
changeset
|
3470 pango_get_log_attrs(normalized, strlen(normalized), -1, NULL, log_attrs, len + 1); |
13478
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3471 |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3472 word = normalized; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3473 result = TRUE; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3474 for (i = 0; i < (len - 1) ; i++) |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3475 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3476 if (log_attrs[i].is_word_start && |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3477 gaim_str_has_prefix(word, enteredstring)) |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3478 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3479 result = FALSE; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3480 break; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3481 } |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3482 word = g_utf8_next_char(word); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3483 } |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3484 g_free(log_attrs); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3485 |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3486 /* The non-Pango version. */ |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3487 #if 0 |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3488 word = normalized; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3489 result = TRUE; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3490 while (word[0] != '\0') |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3491 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3492 gunichar c = g_utf8_get_char(word); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3493 if (!g_unichar_isalnum(c)) |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3494 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3495 word = g_utf8_find_next_char(word, NULL); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3496 if (gaim_str_has_prefix(word, enteredstring)) |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3497 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3498 result = FALSE; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3499 break; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3500 } |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3501 } |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3502 else |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3503 word = g_utf8_find_next_char(word, NULL); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3504 } |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3505 #endif |
10433 | 3506 |
10439 | 3507 g_free(withmarkup); |
10433 | 3508 g_free(enteredstring); |
11490 | 3509 g_free(normalized); |
10433 | 3510 |
3511 return result; | |
3512 } | |
3513 | |
12522
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3514 static void account_modified(GaimAccount *account, GaimGtkBuddyList *gtkblist) |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3515 { |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3516 if (!gtkblist) |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3517 return; |
12589 | 3518 |
12522
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3519 update_menu_bar(gtkblist); |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3520 } |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3521 |
12766 | 3522 static void |
3523 account_status_changed(GaimAccount *account, GaimStatus *old, | |
3524 GaimStatus *new, GaimGtkBuddyList *gtkblist) | |
3525 { | |
3526 if (!gtkblist) | |
3527 return; | |
3528 | |
3529 update_menu_bar(gtkblist); | |
3530 } | |
3531 | |
12124
9c123e27e2f6
[gaim-migrate @ 14424]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12119
diff
changeset
|
3532 static gboolean |
12461
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3533 gtk_blist_window_key_press_cb(GtkWidget *w, GdkEventKey *event, GaimGtkBuddyList *gtkblist) |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3534 { |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3535 GtkWidget *imhtml; |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3536 |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3537 if (!gtkblist) |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3538 return FALSE; |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3539 |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3540 imhtml = gtk_window_get_focus(GTK_WINDOW(gtkblist->window)); |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3541 |
12474
24beec3e42ad
[gaim-migrate @ 14785]
Luke Schierer <lschiere@pidgin.im>
parents:
12473
diff
changeset
|
3542 if (GTK_IS_IMHTML(imhtml) && gtk_bindings_activate(GTK_OBJECT(imhtml), event->keyval, event->state)) |
12461
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3543 return TRUE; |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3544 return FALSE; |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3545 } |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3546 |
13015 | 3547 /***********************************/ |
3548 /* Connection error handling stuff */ | |
3549 /***********************************/ | |
3550 | |
3551 static void | |
13315
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3552 ce_modify_account_cb(GaimAccount *account) |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3553 { |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3554 gaim_gtk_account_dialog_show(GAIM_GTK_MODIFY_ACCOUNT_DIALOG, account); |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3555 } |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3556 |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3557 static void |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3558 ce_enable_account_cb(GaimAccount *account) |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3559 { |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3560 gaim_account_set_enabled(account, gaim_core_get_ui(), TRUE); |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3561 } |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3562 |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3563 static void |
13015 | 3564 connection_error_button_clicked_cb(GtkButton *widget, gpointer user_data) |
3565 { | |
3566 GaimAccount *account; | |
13023 | 3567 char *primary; |
3568 const char *text; | |
13730 | 3569 gboolean enabled; |
13015 | 3570 |
3571 account = user_data; | |
13023 | 3572 primary = g_strdup_printf(_("%s disconnected"), |
3573 gaim_account_get_username(account)); | |
13015 | 3574 text = g_hash_table_lookup(gtkblist->connection_errors, account); |
13375 | 3575 |
13730 | 3576 enabled = gaim_account_get_enabled(account, gaim_core_get_ui()); |
3577 gaim_request_action(account, _("Connection Error"), primary, text, 2, | |
3578 account, 3, | |
3579 _("OK"), NULL, | |
3580 _("Modify Account"), GAIM_CALLBACK(ce_modify_account_cb), | |
3581 enabled ? _("Connect") : _("Re-enable Account"), | |
3582 enabled ? GAIM_CALLBACK(gaim_account_connect) : | |
3583 GAIM_CALLBACK(ce_enable_account_cb)); | |
13629
3275a0f675e2
[gaim-migrate @ 16016]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13612
diff
changeset
|
3584 g_free(primary); |
13015 | 3585 gtk_widget_destroy(GTK_WIDGET(widget)); |
3586 g_hash_table_remove(gtkblist->connection_errors, account); | |
3587 } | |
3588 | |
3589 /* Add some buttons that show connection errors */ | |
3590 static void | |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3591 create_connection_error_buttons(gpointer key, gpointer value, |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3592 gpointer user_data) |
13015 | 3593 { |
3594 GaimAccount *account; | |
13090 | 3595 GaimStatusType *status_type; |
3596 gchar *escaped, *text; | |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3597 GtkWidget *button, *label, *image, *hbox; |
13090 | 3598 GdkPixbuf *pixbuf; |
13015 | 3599 |
3600 account = key; | |
13049 | 3601 escaped = g_markup_escape_text((const gchar *)value, -1); |
13023 | 3602 text = g_strdup_printf(_("<span color=\"red\">%s disconnected: %s</span>"), |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3603 gaim_account_get_username(account), |
13049 | 3604 escaped); |
3605 g_free(escaped); | |
3606 | |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3607 hbox = gtk_hbox_new(FALSE, 0); |
13049 | 3608 |
3609 /* Create the icon */ | |
13090 | 3610 status_type = gaim_account_get_status_type_with_primitive(account, |
3611 GAIM_STATUS_OFFLINE); | |
3612 pixbuf = gaim_gtk_create_prpl_icon_with_status(account, status_type, 0.5); | |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3613 if (pixbuf != NULL) { |
13090 | 3614 image = gtk_image_new_from_pixbuf(pixbuf); |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3615 g_object_unref(pixbuf); |
13030 | 3616 |
3617 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, | |
3618 GAIM_HIG_BOX_SPACE); | |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3619 } |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3620 |
13049 | 3621 /* Create the text */ |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3622 label = gtk_label_new(""); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3623 gtk_label_set_markup(GTK_LABEL(label), text); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3624 g_free(text); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3625 #if GTK_CHECK_VERSION(2,6,0) |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3626 g_object_set(label, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3627 #endif |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3628 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3629 GAIM_HIG_BOX_SPACE); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3630 |
13049 | 3631 /* Create the actual button and put the icon and text on it */ |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3632 button = gtk_button_new(); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3633 gtk_container_add(GTK_CONTAINER(button), hbox); |
13015 | 3634 g_signal_connect(G_OBJECT(button), "clicked", |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3635 G_CALLBACK(connection_error_button_clicked_cb), |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3636 account); |
13049 | 3637 gtk_widget_show_all(button); |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3638 gtk_box_pack_end(GTK_BOX(gtkblist->error_buttons), button, |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3639 FALSE, FALSE, 0); |
13015 | 3640 } |
3641 | |
3642 void | |
3643 gaim_gtk_blist_update_account_error_state(GaimAccount *account, const char *text) | |
3644 { | |
3645 GList *l; | |
3646 | |
13016 | 3647 if (text == NULL) |
13015 | 3648 g_hash_table_remove(gtkblist->connection_errors, account); |
3649 else | |
3650 g_hash_table_insert(gtkblist->connection_errors, account, g_strdup(text)); | |
3651 | |
3652 /* Remove the old error buttons */ | |
3653 for (l = gtk_container_get_children(GTK_CONTAINER(gtkblist->error_buttons)); | |
3654 l != NULL; | |
3655 l = l->next) | |
3656 { | |
3657 gtk_widget_destroy(GTK_WIDGET(l->data)); | |
3658 } | |
3659 | |
3660 /* Add new error buttons */ | |
3661 g_hash_table_foreach(gtkblist->connection_errors, | |
3662 create_connection_error_buttons, NULL); | |
3663 } | |
3664 | |
3665 /******************************************/ | |
3666 /* End of connection error handling stuff */ | |
3667 /******************************************/ | |
3668 | |
7620 | 3669 static void gaim_gtk_blist_show(GaimBuddyList *list) |
5228 | 3670 { |
10087 | 3671 void *handle; |
5228 | 3672 GtkCellRenderer *rend; |
3673 GtkTreeViewColumn *column; | |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3674 GtkWidget *menu; |
5228 | 3675 GtkWidget *sw; |
3676 GtkAccelGroup *accel_group; | |
3677 GtkTreeSelection *selection; | |
9556 | 3678 GtkTargetEntry dte[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, |
8089 | 3679 {"application/x-im-contact", 0, DRAG_BUDDY}, |
9495 | 3680 {"text/x-vcard", 0, DRAG_VCARD }, |
9525 | 3681 {"text/uri-list", 0, DRAG_URI}, |
3682 {"text/plain", 0, DRAG_TEXT}}; | |
9556 | 3683 GtkTargetEntry ste[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, |
3684 {"application/x-im-contact", 0, DRAG_BUDDY}, | |
3685 {"text/x-vcard", 0, DRAG_VCARD }}; | |
5228 | 3686 if (gtkblist && gtkblist->window) { |
12119
312efb43c49a
[gaim-migrate @ 14419]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12117
diff
changeset
|
3687 gaim_blist_set_visible(gaim_prefs_get_bool("/gaim/gtk/blist/list_visible")); |
5228 | 3688 return; |
3689 } | |
3690 | |
3691 gtkblist = GAIM_GTK_BLIST(list); | |
3692 | |
3693 gtkblist->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
3694 gtk_window_set_role(GTK_WINDOW(gtkblist->window), "buddy_list"); | |
9746 | 3695 gtk_window_set_title(GTK_WINDOW(gtkblist->window), _("Buddy List")); |
12328 | 3696 GTK_WINDOW(gtkblist->window)->allow_shrink = TRUE; |
5228 | 3697 |
3698 gtkblist->vbox = gtk_vbox_new(FALSE, 0); | |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3699 gtk_widget_show(gtkblist->vbox); |
5228 | 3700 gtk_container_add(GTK_CONTAINER(gtkblist->window), gtkblist->vbox); |
3701 | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
3702 g_signal_connect(G_OBJECT(gtkblist->window), "delete_event", G_CALLBACK(gtk_blist_delete_cb), NULL); |
5228 | 3703 g_signal_connect(G_OBJECT(gtkblist->window), "configure_event", G_CALLBACK(gtk_blist_configure_cb), NULL); |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
3704 g_signal_connect(G_OBJECT(gtkblist->window), "visibility_notify_event", G_CALLBACK(gtk_blist_visibility_cb), NULL); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
3705 g_signal_connect(G_OBJECT(gtkblist->window), "window_state_event", G_CALLBACK(gtk_blist_window_state_cb), NULL); |
12461
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3706 g_signal_connect(G_OBJECT(gtkblist->window), "key_press_event", G_CALLBACK(gtk_blist_window_key_press_cb), gtkblist); |
5228 | 3707 gtk_widget_add_events(gtkblist->window, GDK_VISIBILITY_NOTIFY_MASK); |
3708 | |
3709 /******************************* Menu bar *************************************/ | |
3710 accel_group = gtk_accel_group_new(); | |
3711 gtk_window_add_accel_group(GTK_WINDOW (gtkblist->window), accel_group); | |
3712 g_object_unref(accel_group); | |
5427 | 3713 gtkblist->ift = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<GaimMain>", accel_group); |
9811 | 3714 gtk_item_factory_set_translate_func(gtkblist->ift, |
13106
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
3715 (GtkTranslateFunc)item_factory_translate_func, |
9811 | 3716 NULL, NULL); |
5427 | 3717 gtk_item_factory_create_items(gtkblist->ift, sizeof(blist_menu) / sizeof(*blist_menu), |
9811 | 3718 blist_menu, NULL); |
7620 | 3719 gaim_gtk_load_accels(); |
3720 g_signal_connect(G_OBJECT(accel_group), "accel-changed", | |
3721 G_CALLBACK(gaim_gtk_save_accels_cb), NULL); | |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3722 menu = gtk_item_factory_get_widget(gtkblist->ift, "<GaimMain>"); |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3723 gtkblist->menutray = gaim_gtk_menu_tray_new(); |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3724 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtkblist->menutray); |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3725 gtk_widget_show(gtkblist->menutray); |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3726 gtk_widget_show(menu); |
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3727 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), menu, FALSE, FALSE, 0); |
5228 | 3728 |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
3729 accountmenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Accounts")); |
10352 | 3730 |
5228 | 3731 /****************************** GtkTreeView **********************************/ |
3732 sw = gtk_scrolled_window_new(NULL,NULL); | |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3733 gtk_widget_show(sw); |
5228 | 3734 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); |
3735 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
3736 | |
7620 | 3737 gtkblist->treemodel = gtk_tree_store_new(BLIST_COLUMNS, |
11494 | 3738 GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN, |
11257 | 3739 G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER); |
5228 | 3740 |
3741 gtkblist->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtkblist->treemodel)); | |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3742 gtk_widget_show(gtkblist->treeview); |
9176 | 3743 gtk_widget_set_name(gtkblist->treeview, "gaim_gtkblist_treeview"); |
5228 | 3744 |
3745 /* Set up selection stuff */ | |
3746 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); | |
3747 g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(gaim_gtk_blist_selection_changed), NULL); | |
3748 | |
3749 /* Set up dnd */ | |
7650 | 3750 gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(gtkblist->treeview), |
9811 | 3751 GDK_BUTTON1_MASK, ste, 3, |
3752 GDK_ACTION_COPY); | |
7650 | 3753 gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(gtkblist->treeview), |
9811 | 3754 dte, 5, |
3755 GDK_ACTION_COPY | GDK_ACTION_MOVE); | |
7636 | 3756 |
10544 | 3757 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-received", G_CALLBACK(gaim_gtk_blist_drag_data_rcv_cb), NULL); |
5228 | 3758 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-get", G_CALLBACK(gaim_gtk_blist_drag_data_get_cb), NULL); |
11059
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
3759 #ifdef _WIN32 |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
3760 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-begin", G_CALLBACK(gaim_gtk_blist_drag_begin), NULL); |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
3761 #endif |
10433 | 3762 |
10354 | 3763 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-motion", G_CALLBACK(gaim_gtk_blist_drag_motion_cb), NULL); |
5228 | 3764 |
3765 /* Tooltips */ | |
3766 g_signal_connect(G_OBJECT(gtkblist->treeview), "motion-notify-event", G_CALLBACK(gaim_gtk_blist_motion_cb), NULL); | |
3767 g_signal_connect(G_OBJECT(gtkblist->treeview), "leave-notify-event", G_CALLBACK(gaim_gtk_blist_leave_cb), NULL); | |
3768 | |
3769 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE); | |
3770 | |
11016 | 3771 gtkblist->text_column = column = gtk_tree_view_column_new (); |
5228 | 3772 |
3773 rend = gtk_cell_renderer_pixbuf_new(); | |
9811 | 3774 gtk_tree_view_column_pack_start(column, rend, FALSE); |
3775 gtk_tree_view_column_set_attributes(column, rend, | |
3776 "pixbuf", STATUS_ICON_COLUMN, | |
3777 "visible", STATUS_ICON_VISIBLE_COLUMN, | |
3778 NULL); | |
5228 | 3779 g_object_set(rend, "xalign", 0.0, "ypad", 0, NULL); |
3780 | |
11016 | 3781 gtkblist->text_rend = rend = gtk_cell_renderer_text_new(); |
5228 | 3782 gtk_tree_view_column_pack_start (column, rend, TRUE); |
9811 | 3783 gtk_tree_view_column_set_attributes(column, rend, |
3784 "markup", NAME_COLUMN, | |
3785 NULL); | |
11016 | 3786 g_signal_connect(G_OBJECT(rend), "edited", G_CALLBACK(gtk_blist_renderer_edited_cb), NULL); |
5228 | 3787 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); |
10285 | 3788 #if GTK_CHECK_VERSION(2,6,0) |
3789 gtk_tree_view_column_set_expand (column, TRUE); | |
10501 | 3790 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
10285 | 3791 #endif |
5228 | 3792 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), column); |
3793 | |
3794 rend = gtk_cell_renderer_text_new(); | |
10351 | 3795 gtkblist->idle_column = gtk_tree_view_column_new_with_attributes("Idle", rend, "markup", IDLE_COLUMN, NULL); |
3796 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->idle_column); | |
5228 | 3797 g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL); |
3798 | |
3799 rend = gtk_cell_renderer_pixbuf_new(); | |
3800 gtkblist->buddy_icon_column = gtk_tree_view_column_new_with_attributes("Buddy Icon", rend, "pixbuf", BUDDY_ICON_COLUMN, NULL); | |
3801 g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL); | |
3802 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->buddy_icon_column); | |
3803 | |
3804 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-activated", G_CALLBACK(gtk_blist_row_activated_cb), NULL); | |
3805 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-expanded", G_CALLBACK(gtk_blist_row_expanded_cb), NULL); | |
3806 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-collapsed", G_CALLBACK(gtk_blist_row_collapsed_cb), NULL); | |
3807 g_signal_connect(G_OBJECT(gtkblist->treeview), "button-press-event", G_CALLBACK(gtk_blist_button_press_cb), NULL); | |
7620 | 3808 g_signal_connect(G_OBJECT(gtkblist->treeview), "key-press-event", G_CALLBACK(gtk_blist_key_press_cb), NULL); |
8143 | 3809 g_signal_connect(G_OBJECT(gtkblist->treeview), "popup-menu", G_CALLBACK(gaim_gtk_blist_popup_menu_cb), NULL); |
5228 | 3810 |
5419 | 3811 /* Enable CTRL+F searching */ |
3812 gtk_tree_view_set_search_column(GTK_TREE_VIEW(gtkblist->treeview), NAME_COLUMN); | |
10433 | 3813 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(gtkblist->treeview), _search_func, NULL, NULL); |
5419 | 3814 |
12583 | 3815 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), sw, TRUE, TRUE, 0); |
5228 | 3816 gtk_container_add(GTK_CONTAINER(sw), gtkblist->treeview); |
3817 gaim_gtk_blist_update_columns(); | |
3818 | |
13015 | 3819 /* Create an empty vbox used for showing connection errors */ |
3820 gtkblist->error_buttons = gtk_vbox_new(FALSE, 0); | |
3821 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->error_buttons, FALSE, FALSE, 0); | |
3822 | |
3823 /* Add the statusbox */ | |
12583 | 3824 gtkblist->statusbox = gtk_gaim_status_box_new(); |
12592
37160dd563fa
[gaim-migrate @ 14922]
Richard Laager <rlaager@wiktel.com>
parents:
12589
diff
changeset
|
3825 gtk_widget_set_name(gtkblist->statusbox, "gaim_gtkblist_statusbox"); |
12656 | 3826 |
12583 | 3827 gtk_widget_show(gtkblist->statusbox); |
3828 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->statusbox, FALSE, TRUE, 0); | |
12656 | 3829 |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3830 |
5228 | 3831 /* set the Show Offline Buddies option. must be done |
3832 * after the treeview or faceprint gets mad. -Robot101 | |
3833 */ | |
5427 | 3834 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show Offline Buddies"))), |
7620 | 3835 gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")); |
12656 | 3836 |
5427 | 3837 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show Empty Groups"))), |
7620 | 3838 gaim_prefs_get_bool("/gaim/gtk/blist/show_empty_groups")); |
12656 | 3839 |
10074 | 3840 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Tools/Mute Sounds"))), |
3841 gaim_prefs_get_bool("/gaim/gtk/sound/mute")); | |
12656 | 3842 |
11796 | 3843 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show Buddy Details"))), |
11920 | 3844 gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")); |
12656 | 3845 |
3846 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show Idle Times"))), | |
3847 gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time")); | |
3848 | |
10074 | 3849 if(!strcmp(gaim_prefs_get_string("/gaim/gtk/sound/method"), "none")) |
11494 | 3850 gtk_widget_set_sensitive(gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Mute Sounds")), FALSE); |
5228 | 3851 |
10353 | 3852 /* Update some dynamic things */ |
3853 update_menu_bar(gtkblist); | |
3854 gaim_gtk_blist_update_plugin_actions(); | |
11796 | 3855 gaim_gtk_blist_update_sort_methods(); |
10353 | 3856 |
5228 | 3857 /* OK... let's show this bad boy. */ |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
3858 gaim_gtk_blist_refresh(list); |
12119
312efb43c49a
[gaim-migrate @ 14419]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12117
diff
changeset
|
3859 gaim_gtk_blist_restore_position(); |
312efb43c49a
[gaim-migrate @ 14419]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12117
diff
changeset
|
3860 gtk_widget_show_all(GTK_WIDGET(gtkblist->window)); |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
3861 gaim_blist_set_visible(gaim_prefs_get_bool("/gaim/gtk/blist/list_visible")); |
5228 | 3862 |
3863 /* start the refresh timer */ | |
10351 | 3864 gtkblist->refresh_timer = g_timeout_add(30000, (GSourceFunc)gaim_gtk_blist_refresh_timer, list); |
10353 | 3865 |
10087 | 3866 handle = gaim_gtk_blist_get_handle(); |
3867 | |
7620 | 3868 /* things that affect how buddies are displayed */ |
10087 | 3869 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_buddy_icons", |
3870 _prefs_change_redo_list, NULL); | |
12656 | 3871 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_idle_time", |
3872 _prefs_change_redo_list, NULL); | |
10087 | 3873 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_empty_groups", |
3874 _prefs_change_redo_list, NULL); | |
3875 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_offline_buddies", | |
3876 _prefs_change_redo_list, NULL); | |
7620 | 3877 |
3878 /* sorting */ | |
10087 | 3879 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/sort_type", |
3880 _prefs_change_sort_method, NULL); | |
7620 | 3881 |
3882 /* things that affect what columns are displayed */ | |
10087 | 3883 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_buddy_icons", |
12326 | 3884 show_buddy_icons_pref_cb, NULL); |
12656 | 3885 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_idle_time", |
3886 show_buddy_icons_pref_cb, NULL); | |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3887 |
10074 | 3888 /* menus */ |
10087 | 3889 gaim_prefs_connect_callback(handle, "/gaim/gtk/sound/mute", |
3890 gaim_gtk_blist_mute_pref_cb, NULL); | |
3891 gaim_prefs_connect_callback(handle, "/gaim/gtk/sound/method", | |
3892 gaim_gtk_blist_sound_method_pref_cb, NULL); | |
10074 | 3893 |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3894 /* Setup some gaim signal handlers. */ |
12522
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3895 gaim_signal_connect(gaim_accounts_get_handle(), "account-enabled", |
12583 | 3896 gtkblist, GAIM_CALLBACK(account_modified), gtkblist); |
12070 | 3897 gaim_signal_connect(gaim_accounts_get_handle(), "account-disabled", |
12583 | 3898 gtkblist, GAIM_CALLBACK(account_modified), gtkblist); |
12226 | 3899 gaim_signal_connect(gaim_accounts_get_handle(), "account-removed", |
12583 | 3900 gtkblist, GAIM_CALLBACK(account_modified), gtkblist); |
12766 | 3901 gaim_signal_connect(gaim_accounts_get_handle(), "account-status-changed", |
3902 gtkblist, GAIM_CALLBACK(account_status_changed), gtkblist); | |
12522
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3903 |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3904 gaim_signal_connect(gaim_gtk_account_get_handle(), "account-modified", |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3905 gtkblist, GAIM_CALLBACK(account_modified), gtkblist); |
12070 | 3906 |
8937 | 3907 gaim_signal_connect(gaim_connections_get_handle(), "signed-on", |
3908 gtkblist, GAIM_CALLBACK(sign_on_off_cb), list); | |
3909 gaim_signal_connect(gaim_connections_get_handle(), "signed-off", | |
3910 gtkblist, GAIM_CALLBACK(sign_on_off_cb), list); | |
8815 | 3911 |
8986 | 3912 gaim_signal_connect(gaim_plugins_get_handle(), "plugin-load", |
3913 gtkblist, GAIM_CALLBACK(plugin_changed_cb), NULL); | |
3914 gaim_signal_connect(gaim_plugins_get_handle(), "plugin-unload", | |
3915 gtkblist, GAIM_CALLBACK(plugin_changed_cb), NULL); | |
3916 | |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3917 gaim_signal_connect(gaim_conversations_get_handle(), "conversation-updated", |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3918 gtkblist, GAIM_CALLBACK(conversation_updated_cb), |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3919 gtkblist); |
12208 | 3920 gaim_signal_connect(gaim_conversations_get_handle(), "deleting-conversation", |
3921 gtkblist, GAIM_CALLBACK(conversation_deleting_cb), | |
3922 gtkblist); | |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3923 |
8815 | 3924 /* emit our created signal */ |
10087 | 3925 gaim_signal_emit(handle, "gtkblist-created", list); |
5228 | 3926 } |
3927 | |
7620 | 3928 static void redo_buddy_list(GaimBuddyList *list, gboolean remove) |
5228 | 3929 { |
12112 | 3930 GaimBlistNode *node = list->root; |
3931 | |
3932 while (node) | |
3933 { | |
13889 | 3934 if (remove && !GAIM_BLIST_NODE_IS_GROUP(node)) |
12112 | 3935 gaim_gtk_blist_hide_node(list, node); |
3936 | |
3937 gaim_gtk_blist_update(list, node); | |
3938 node = gaim_blist_node_next(node, FALSE); | |
5228 | 3939 } |
3940 } | |
3941 | |
7620 | 3942 void gaim_gtk_blist_refresh(GaimBuddyList *list) |
5422 | 3943 { |
3944 redo_buddy_list(list, FALSE); | |
3945 } | |
3946 | |
5297 | 3947 void |
3948 gaim_gtk_blist_update_refresh_timeout() | |
3949 { | |
7620 | 3950 GaimBuddyList *blist; |
3951 GaimGtkBuddyList *gtkblist; | |
5297 | 3952 |
3953 blist = gaim_get_blist(); | |
3954 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
3955 | |
10351 | 3956 gtkblist->refresh_timer = g_timeout_add(30000,(GSourceFunc)gaim_gtk_blist_refresh_timer, blist); |
5297 | 3957 } |
3958 | |
5256 | 3959 static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter) { |
3960 struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
3961 GtkTreePath *path; | |
5228 | 3962 |
5263 | 3963 if (!gtknode) { |
3964 return FALSE; | |
3965 } | |
3966 | |
3967 if (!gtkblist) { | |
10006 | 3968 gaim_debug_error("gtkblist", "get_iter_from_node was called, but we don't seem to have a blist\n"); |
5263 | 3969 return FALSE; |
3970 } | |
3971 | |
3972 if (!gtknode->row) | |
5228 | 3973 return FALSE; |
11494 | 3974 |
5228 | 3975 |
5256 | 3976 if ((path = gtk_tree_row_reference_get_path(gtknode->row)) == NULL) |
5228 | 3977 return FALSE; |
11016 | 3978 |
5256 | 3979 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), iter, path)) { |
3980 gtk_tree_path_free(path); | |
3981 return FALSE; | |
3982 } | |
3983 gtk_tree_path_free(path); | |
3984 return TRUE; | |
5228 | 3985 } |
3986 | |
7620 | 3987 static void gaim_gtk_blist_remove(GaimBuddyList *list, GaimBlistNode *node) |
5228 | 3988 { |
11910 | 3989 struct _gaim_gtk_blist_node *gtknode = node->ui_data; |
3990 | |
10222 | 3991 gaim_request_close_with_handle(node); |
3992 | |
5260 | 3993 gaim_gtk_blist_hide_node(list, node); |
5228 | 3994 |
7620 | 3995 if(node->parent) |
3996 gaim_gtk_blist_update(list, node->parent); | |
3997 | |
10504 | 3998 /* There's something I don't understand here - Ethan */ |
3999 /* Ethan said that back in 2003, but this g_free has been left commented | |
4000 * out ever since. I can't find any reason at all why this is bad and | |
4001 * valgrind found several reasons why it's good. If this causes problems | |
4002 * comment it out again. Stu */ | |
10510 | 4003 /* Of course it still causes problems - this breaks dragging buddies into |
10515 | 4004 * contacts, the dragged buddy mysteriously 'disappears'. Stu. */ |
4005 /* I think it's fixed now. Stu. */ | |
11910 | 4006 |
11915 | 4007 if(gtknode) { |
4008 if(gtknode->recent_signonoff_timer > 0) | |
4009 gaim_timeout_remove(gtknode->recent_signonoff_timer); | |
4010 | |
4011 g_free(node->ui_data); | |
4012 node->ui_data = NULL; | |
4013 } | |
5228 | 4014 } |
4015 | |
4016 static gboolean do_selection_changed(GaimBlistNode *new_selection) | |
4017 { | |
5254 | 4018 GaimBlistNode *old_selection = NULL; |
5228 | 4019 |
5254 | 4020 /* test for gtkblist because crazy timeout means we can be called after the blist is gone */ |
4021 if (gtkblist && new_selection != gtkblist->selected_node) { | |
4022 old_selection = gtkblist->selected_node; | |
5228 | 4023 gtkblist->selected_node = new_selection; |
4024 if(new_selection) | |
4025 gaim_gtk_blist_update(NULL, new_selection); | |
4026 if(old_selection) | |
4027 gaim_gtk_blist_update(NULL, old_selection); | |
4028 } | |
4029 | |
4030 return FALSE; | |
4031 } | |
4032 | |
4033 static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data) | |
4034 { | |
4035 GaimBlistNode *new_selection = NULL; | |
4036 GtkTreeIter iter; | |
4037 | |
4038 if(gtk_tree_selection_get_selected(selection, NULL, &iter)){ | |
4039 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, | |
4040 NODE_COLUMN, &new_selection, -1); | |
4041 } | |
5254 | 4042 |
5228 | 4043 /* we set this up as a timeout, otherwise the blist flickers */ |
4044 g_timeout_add(0, (GSourceFunc)do_selection_changed, new_selection); | |
4045 } | |
4046 | |
8252 | 4047 static gboolean insert_node(GaimBuddyList *list, GaimBlistNode *node, GtkTreeIter *iter) |
7620 | 4048 { |
4049 GtkTreeIter parent_iter, cur, *curptr = NULL; | |
4050 struct _gaim_gtk_blist_node *gtknode = node->ui_data; | |
5256 | 4051 GtkTreePath *newpath; |
7620 | 4052 |
10515 | 4053 if(!iter) |
8252 | 4054 return FALSE; |
7620 | 4055 |
4056 if(node->parent && !get_iter_from_node(node->parent, &parent_iter)) | |
8252 | 4057 return FALSE; |
7620 | 4058 |
4059 if(get_iter_from_node(node, &cur)) | |
4060 curptr = &cur; | |
4061 | |
4062 if(GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_CHAT(node)) { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
4063 current_sort_method->func(node, list, parent_iter, curptr, iter); |
7620 | 4064 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
4065 sort_method_none(node, list, parent_iter, curptr, iter); |
5228 | 4066 } |
4067 | |
10515 | 4068 if(gtknode != NULL) { |
4069 gtk_tree_row_reference_free(gtknode->row); | |
4070 } else { | |
4071 gaim_gtk_blist_new_node(node); | |
4072 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
4073 } | |
4074 | |
7620 | 4075 newpath = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), |
4076 iter); | |
4077 gtknode->row = | |
4078 gtk_tree_row_reference_new(GTK_TREE_MODEL(gtkblist->treemodel), | |
4079 newpath); | |
11494 | 4080 |
5256 | 4081 gtk_tree_path_free(newpath); |
4082 | |
5228 | 4083 gtk_tree_store_set(gtkblist->treemodel, iter, |
4084 NODE_COLUMN, node, | |
4085 -1); | |
7620 | 4086 |
4087 if(node->parent) { | |
4088 GtkTreePath *expand = NULL; | |
4089 struct _gaim_gtk_blist_node *gtkparentnode = node->parent->ui_data; | |
4090 | |
4091 if(GAIM_BLIST_NODE_IS_GROUP(node->parent)) { | |
7693 | 4092 if(!gaim_blist_node_get_bool(node->parent, "collapsed")) |
7620 | 4093 expand = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &parent_iter); |
4094 } else if(GAIM_BLIST_NODE_IS_CONTACT(node->parent) && | |
4095 gtkparentnode->contact_expanded) { | |
4096 expand = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &parent_iter); | |
4097 } | |
4098 if(expand) { | |
7693 | 4099 gtk_tree_view_expand_row(GTK_TREE_VIEW(gtkblist->treeview), expand, FALSE); |
7620 | 4100 gtk_tree_path_free(expand); |
4101 } | |
4102 } | |
4103 | |
8252 | 4104 return TRUE; |
5228 | 4105 } |
4106 | |
13889 | 4107 /*This version of gaim_gtk_blist_update_group can take the original buddy |
4108 or a group, but has much better algorithmic performance with a pre-known buddy*/ | |
7620 | 4109 static void gaim_gtk_blist_update_group(GaimBuddyList *list, GaimBlistNode *node) |
4110 { | |
4111 GaimGroup *group; | |
8203 | 4112 int count; |
12341 | 4113 gboolean show = FALSE; |
13889 | 4114 GaimBlistNode* gnode; |
4115 | |
13920 | 4116 g_return_if_fail(node != NULL); |
13889 | 4117 |
4118 if (GAIM_BLIST_NODE_IS_GROUP(node)) | |
4119 gnode = node; | |
13921 | 4120 else if (GAIM_BLIST_NODE_IS_BUDDY(node)) |
13889 | 4121 gnode = node->parent->parent; |
13921 | 4122 else if (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_CHAT(node)) |
13889 | 4123 gnode = node->parent; |
13920 | 4124 else |
4125 return; | |
13889 | 4126 |
4127 group = (GaimGroup*)gnode; | |
7620 | 4128 |
8203 | 4129 if(gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")) |
4130 count = gaim_blist_get_group_size(group, FALSE); | |
4131 else | |
4132 count = gaim_blist_get_group_online_count(group); | |
13195 | 4133 |
12341 | 4134 if (count > 0 || gaim_prefs_get_bool("/gaim/gtk/blist/show_empty_groups")) |
4135 show = TRUE; | |
13889 | 4136 else if (GAIM_BLIST_NODE_IS_BUDDY(node)){ /* Or chat? */ |
4137 if (buddy_is_displayable((GaimBuddy*)node)) | |
4138 show = TRUE;} | |
12341 | 4139 |
4140 if (show) { | |
7620 | 4141 char *mark, *esc; |
4142 GtkTreeIter iter; | |
4143 | |
13889 | 4144 if(!insert_node(list, gnode, &iter)) |
8252 | 4145 return; |
7620 | 4146 |
4147 esc = g_markup_escape_text(group->name, -1); | |
8945 | 4148 mark = g_strdup_printf("<span weight='bold'>%s</span> (%d/%d)", |
4149 esc, gaim_blist_get_group_online_count(group), | |
4150 gaim_blist_get_group_size(group, FALSE)); | |
7620 | 4151 g_free(esc); |
4152 | |
4153 gtk_tree_store_set(gtkblist->treemodel, &iter, | |
4154 STATUS_ICON_COLUMN, NULL, | |
4155 STATUS_ICON_VISIBLE_COLUMN, FALSE, | |
4156 NAME_COLUMN, mark, | |
13889 | 4157 NODE_COLUMN, gnode, |
7620 | 4158 -1); |
4159 g_free(mark); | |
4160 } else { | |
13889 | 4161 gaim_gtk_blist_hide_node(list, gnode); |
7620 | 4162 } |
4163 } | |
4164 | |
4165 static void buddy_node(GaimBuddy *buddy, GtkTreeIter *iter, GaimBlistNode *node) | |
5228 | 4166 { |
9944 | 4167 GaimPresence *presence; |
7620 | 4168 GdkPixbuf *status, *avatar; |
4169 char *mark; | |
11257 | 4170 char *idle = NULL; |
7620 | 4171 gboolean selected = (gtkblist->selected_node == node); |
4172 | |
9944 | 4173 presence = gaim_buddy_get_presence(buddy); |
4174 | |
7620 | 4175 status = gaim_gtk_blist_get_status_icon((GaimBlistNode*)buddy, |
4176 (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") | |
4177 ? GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); | |
4178 | |
10482 | 4179 avatar = gaim_gtk_blist_get_buddy_icon((GaimBlistNode *)buddy, TRUE, TRUE); |
7620 | 4180 mark = gaim_gtk_blist_get_name_markup(buddy, selected); |
4181 | |
12656 | 4182 if (gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time") && |
13889 | 4183 gaim_presence_is_idle(presence) && |
4184 !gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) | |
9944 | 4185 { |
4186 time_t idle_secs = gaim_presence_get_idle_time(presence); | |
4187 | |
4188 if (idle_secs > 0) | |
4189 { | |
4190 time_t t; | |
4191 int ihrs, imin; | |
4192 time(&t); | |
4193 ihrs = (t - idle_secs) / 3600; | |
4194 imin = ((t - idle_secs) / 60) % 60; | |
13819
f41a515307a9
[gaim-migrate @ 16251]
Richard Laager <rlaager@wiktel.com>
parents:
13790
diff
changeset
|
4195 idle = g_strdup_printf("%d:%02d", ihrs, imin); |
9944 | 4196 } |
7620 | 4197 } |
4198 | |
10118 | 4199 if (gaim_presence_is_idle(presence)) |
9944 | 4200 { |
4201 if (idle && !selected) { | |
10118 | 4202 char *i2 = g_strdup_printf("<span color='%s'>%s</span>", |
4203 dim_grey(), idle); | |
7620 | 4204 g_free(idle); |
4205 idle = i2; | |
5228 | 4206 } |
7620 | 4207 } |
4208 | |
4209 gtk_tree_store_set(gtkblist->treemodel, iter, | |
4210 STATUS_ICON_COLUMN, status, | |
4211 STATUS_ICON_VISIBLE_COLUMN, TRUE, | |
4212 NAME_COLUMN, mark, | |
4213 IDLE_COLUMN, idle, | |
4214 BUDDY_ICON_COLUMN, avatar, | |
4215 -1); | |
4216 | |
4217 g_free(mark); | |
12656 | 4218 g_free(idle); |
7620 | 4219 if(status) |
4220 g_object_unref(status); | |
4221 if(avatar) | |
4222 g_object_unref(avatar); | |
4223 } | |
4224 | |
13889 | 4225 /* This is a variation on the original gtk_blist_update_contact. Here we |
4226 can know in advance which buddy has changed so we can just update that */ | |
7620 | 4227 static void gaim_gtk_blist_update_contact(GaimBuddyList *list, GaimBlistNode *node) |
4228 { | |
13889 | 4229 GaimBlistNode *cnode; |
7620 | 4230 GaimContact *contact; |
4231 GaimBuddy *buddy; | |
4232 struct _gaim_gtk_blist_node *gtknode; | |
4233 | |
13889 | 4234 if (GAIM_BLIST_NODE_IS_BUDDY(node)) |
4235 cnode = node->parent; | |
4236 else | |
4237 cnode = node; | |
4238 | |
4239 g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT(cnode)); | |
7620 | 4240 |
4241 /* First things first, update the group */ | |
13889 | 4242 if (GAIM_BLIST_NODE_IS_BUDDY(node)) |
4243 gaim_gtk_blist_update_group(list, node); | |
4244 else | |
4245 gaim_gtk_blist_update_group(list, cnode->parent); | |
4246 | |
4247 contact = (GaimContact*)cnode; | |
7620 | 4248 buddy = gaim_contact_get_priority_buddy(contact); |
13889 | 4249 |
11890 | 4250 if (buddy_is_displayable(buddy)) |
10006 | 4251 { |
7620 | 4252 GtkTreeIter iter; |
4253 | |
13889 | 4254 if(!insert_node(list, cnode, &iter)) |
8252 | 4255 return; |
7620 | 4256 |
13889 | 4257 gtknode = (struct _gaim_gtk_blist_node *)cnode->ui_data; |
10515 | 4258 |
7620 | 4259 if(gtknode->contact_expanded) { |
4260 GdkPixbuf *status; | |
5228 | 4261 char *mark; |
4262 | |
13889 | 4263 status = gaim_gtk_blist_get_status_icon(cnode, |
7620 | 4264 (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") ? |
4265 GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); | |
4266 | |
4267 mark = g_markup_escape_text(gaim_contact_get_alias(contact), -1); | |
4268 | |
5228 | 4269 gtk_tree_store_set(gtkblist->treemodel, &iter, |
7620 | 4270 STATUS_ICON_COLUMN, status, |
4271 STATUS_ICON_VISIBLE_COLUMN, TRUE, | |
5228 | 4272 NAME_COLUMN, mark, |
7620 | 4273 IDLE_COLUMN, NULL, |
4274 BUDDY_ICON_COLUMN, NULL, | |
5228 | 4275 -1); |
4276 g_free(mark); | |
7620 | 4277 if(status) |
4278 g_object_unref(status); | |
4279 } else { | |
13889 | 4280 buddy_node(buddy, &iter, cnode); |
5228 | 4281 } |
7620 | 4282 } else { |
13889 | 4283 gaim_gtk_blist_hide_node(list, cnode); |
5228 | 4284 } |
7620 | 4285 } |
4286 | |
13889 | 4287 |
4288 | |
7620 | 4289 static void gaim_gtk_blist_update_buddy(GaimBuddyList *list, GaimBlistNode *node) |
4290 { | |
4291 GaimBuddy *buddy; | |
4292 struct _gaim_gtk_blist_node *gtkparentnode; | |
4293 | |
4294 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
4295 | |
13889 | 4296 if (node->parent == NULL) |
4297 return; | |
4298 | |
7620 | 4299 buddy = (GaimBuddy*)node; |
13889 | 4300 |
7620 | 4301 /* First things first, update the contact */ |
13889 | 4302 gaim_gtk_blist_update_contact(list, node); |
7620 | 4303 |
10918 | 4304 gtkparentnode = (struct _gaim_gtk_blist_node *)node->parent->ui_data; |
4305 | |
12341 | 4306 if (gtkparentnode->contact_expanded && buddy_is_displayable(buddy)) |
10006 | 4307 { |
7620 | 4308 GtkTreeIter iter; |
4309 | |
10006 | 4310 if (!insert_node(list, node, &iter)) |
8252 | 4311 return; |
4312 | |
7620 | 4313 buddy_node(buddy, &iter, node); |
4314 | |
4315 } else { | |
4316 gaim_gtk_blist_hide_node(list, node); | |
4317 } | |
4318 | |
4319 } | |
4320 | |
4321 static void gaim_gtk_blist_update_chat(GaimBuddyList *list, GaimBlistNode *node) | |
4322 { | |
4323 GaimChat *chat; | |
4324 | |
4325 g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT(node)); | |
4326 | |
4327 /* First things first, update the group */ | |
4328 gaim_gtk_blist_update_group(list, node->parent); | |
4329 | |
4330 chat = (GaimChat*)node; | |
4331 | |
4332 if(gaim_account_is_connected(chat->account)) { | |
4333 GtkTreeIter iter; | |
5234 | 4334 GdkPixbuf *status; |
7620 | 4335 char *mark; |
4336 | |
8252 | 4337 if(!insert_node(list, node, &iter)) |
4338 return; | |
5234 | 4339 |
4340 status = gaim_gtk_blist_get_status_icon(node, | |
7620 | 4341 (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") ? |
4342 GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); | |
4343 | |
4344 mark = g_markup_escape_text(gaim_chat_get_name(chat), -1); | |
5234 | 4345 |
4346 gtk_tree_store_set(gtkblist->treemodel, &iter, | |
7620 | 4347 STATUS_ICON_COLUMN, status, |
4348 STATUS_ICON_VISIBLE_COLUMN, TRUE, | |
4349 NAME_COLUMN, mark, | |
4350 -1); | |
5228 | 4351 |
4352 g_free(mark); | |
7620 | 4353 if(status) |
5228 | 4354 g_object_unref(status); |
7620 | 4355 } else { |
5260 | 4356 gaim_gtk_blist_hide_node(list, node); |
5228 | 4357 } |
7620 | 4358 } |
4359 | |
4360 static void gaim_gtk_blist_update(GaimBuddyList *list, GaimBlistNode *node) | |
4361 { | |
12797
eda1572c788b
[gaim-migrate @ 15144]
Richard Laager <rlaager@wiktel.com>
parents:
12766
diff
changeset
|
4362 if(!gtkblist || !node) |
7620 | 4363 return; |
4364 | |
13195 | 4365 if (node->ui_data == NULL) |
4366 gaim_gtk_blist_new_node(node); | |
4367 | |
7620 | 4368 switch(node->type) { |
4369 case GAIM_BLIST_GROUP_NODE: | |
4370 gaim_gtk_blist_update_group(list, node); | |
4371 break; | |
4372 case GAIM_BLIST_CONTACT_NODE: | |
4373 gaim_gtk_blist_update_contact(list, node); | |
4374 break; | |
4375 case GAIM_BLIST_BUDDY_NODE: | |
4376 gaim_gtk_blist_update_buddy(list, node); | |
4377 break; | |
4378 case GAIM_BLIST_CHAT_NODE: | |
4379 gaim_gtk_blist_update_chat(list, node); | |
4380 break; | |
4381 case GAIM_BLIST_OTHER_NODE: | |
4382 return; | |
4383 } | |
5234 | 4384 |
13146
a3c1112bb190
[gaim-migrate @ 15509]
Richard Laager <rlaager@wiktel.com>
parents:
13140
diff
changeset
|
4385 #if !GTK_CHECK_VERSION(2,6,0) |
5228 | 4386 gtk_tree_view_columns_autosize(GTK_TREE_VIEW(gtkblist->treeview)); |
13146
a3c1112bb190
[gaim-migrate @ 15509]
Richard Laager <rlaager@wiktel.com>
parents:
13140
diff
changeset
|
4387 #endif |
5228 | 4388 } |
4389 | |
7620 | 4390 |
4391 static void gaim_gtk_blist_destroy(GaimBuddyList *list) | |
5228 | 4392 { |
4393 if (!gtkblist) | |
4394 return; | |
4395 | |
8937 | 4396 gaim_signal_disconnect(gaim_connections_get_handle(), "signed-on", |
4397 gtkblist, GAIM_CALLBACK(sign_on_off_cb)); | |
4398 gaim_signal_disconnect(gaim_connections_get_handle(), "signed-off", | |
4399 gtkblist, GAIM_CALLBACK(sign_on_off_cb)); | |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
4400 |
5228 | 4401 gtk_widget_destroy(gtkblist->window); |
7620 | 4402 |
8254 | 4403 gaim_gtk_blist_tooltip_destroy(); |
7620 | 4404 |
5228 | 4405 if (gtkblist->refresh_timer) |
4406 g_source_remove(gtkblist->refresh_timer); | |
4407 if (gtkblist->timeout) | |
4408 g_source_remove(gtkblist->timeout); | |
10354 | 4409 if (gtkblist->drag_timeout) |
4410 g_source_remove(gtkblist->drag_timeout); | |
5228 | 4411 |
13015 | 4412 g_hash_table_destroy(gtkblist->connection_errors); |
5228 | 4413 gtkblist->refresh_timer = 0; |
4414 gtkblist->timeout = 0; | |
10354 | 4415 gtkblist->drag_timeout = 0; |
5228 | 4416 gtkblist->window = gtkblist->vbox = gtkblist->treeview = NULL; |
4417 gtkblist->treemodel = NULL; | |
4418 gtkblist->idle_column = NULL; | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
4419 gtkblist->buddy_icon_column = NULL; |
5427 | 4420 g_object_unref(G_OBJECT(gtkblist->ift)); |
13015 | 4421 g_free(gtkblist); |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
4422 accountmenu = NULL; |
5228 | 4423 gtkblist = NULL; |
7620 | 4424 |
10087 | 4425 gaim_prefs_disconnect_by_handle(gaim_gtk_blist_get_handle()); |
5228 | 4426 } |
4427 | |
7620 | 4428 static void gaim_gtk_blist_set_visible(GaimBuddyList *list, gboolean show) |
5228 | 4429 { |
4430 if (!(gtkblist && gtkblist->window)) | |
4431 return; | |
10325 | 4432 |
5228 | 4433 if (show) { |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4434 if(!GAIM_WINDOW_ICONIFIED(gtkblist->window) && !GTK_WIDGET_VISIBLE(gtkblist->window)) |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4435 gaim_signal_emit(gaim_gtk_blist_get_handle(), "gtkblist-unhiding", gtkblist); |
5228 | 4436 gaim_gtk_blist_restore_position(); |
4437 gtk_window_present(GTK_WINDOW(gtkblist->window)); | |
4438 } else { | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4439 if(visibility_manager_count) { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4440 gaim_signal_emit(gaim_gtk_blist_get_handle(), "gtkblist-hiding", gtkblist); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4441 gtk_widget_hide(gtkblist->window); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4442 } else { |
12479
53e2dc07d9e2
[gaim-migrate @ 14790]
Richard Laager <rlaager@wiktel.com>
parents:
12478
diff
changeset
|
4443 if (!GTK_WIDGET_VISIBLE(gtkblist->window)) |
53e2dc07d9e2
[gaim-migrate @ 14790]
Richard Laager <rlaager@wiktel.com>
parents:
12478
diff
changeset
|
4444 gtk_widget_show(gtkblist->window); |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4445 gtk_window_iconify(GTK_WINDOW(gtkblist->window)); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4446 } |
5228 | 4447 } |
4448 } | |
4449 | |
7620 | 4450 static GList * |
4451 groups_tree(void) | |
4452 { | |
4453 GList *tmp = NULL; | |
4454 char *tmp2; | |
4455 GaimGroup *g; | |
4456 GaimBlistNode *gnode; | |
4457 | |
4458 if (gaim_get_blist()->root == NULL) | |
4459 { | |
4460 tmp2 = g_strdup(_("Buddies")); | |
4461 tmp = g_list_append(tmp, tmp2); | |
4462 } | |
4463 else | |
4464 { | |
4465 for (gnode = gaim_get_blist()->root; | |
4466 gnode != NULL; | |
4467 gnode = gnode->next) | |
4468 { | |
4469 if (GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
4470 { | |
4471 g = (GaimGroup *)gnode; | |
4472 tmp2 = g->name; | |
4473 tmp = g_list_append(tmp, tmp2); | |
4474 } | |
4475 } | |
4476 } | |
4477 | |
4478 return tmp; | |
4479 } | |
4480 | |
4481 static void | |
4482 add_buddy_select_account_cb(GObject *w, GaimAccount *account, | |
4483 GaimGtkAddBuddyData *data) | |
4484 { | |
4485 /* Save our account */ | |
4486 data->account = account; | |
4487 } | |
4488 | |
4489 static void | |
4490 destroy_add_buddy_dialog_cb(GtkWidget *win, GaimGtkAddBuddyData *data) | |
4491 { | |
4492 g_free(data); | |
4493 } | |
4494 | |
4495 static void | |
4496 add_buddy_cb(GtkWidget *w, int resp, GaimGtkAddBuddyData *data) | |
4497 { | |
4498 const char *grp, *who, *whoalias; | |
13880 | 4499 GaimGroup *g; |
7620 | 4500 GaimBuddy *b; |
13880 | 4501 GaimConversation *c; |
4502 GaimBuddyIcon *icon; | |
7620 | 4503 |
4504 if (resp == GTK_RESPONSE_OK) | |
4505 { | |
4506 who = gtk_entry_get_text(GTK_ENTRY(data->entry)); | |
4507 grp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(data->combo)->entry)); | |
4508 whoalias = gtk_entry_get_text(GTK_ENTRY(data->entry_for_alias)); | |
9658 | 4509 if (*whoalias == '\0') |
4510 whoalias = NULL; | |
7620 | 4511 |
4512 if ((g = gaim_find_group(grp)) == NULL) | |
4513 { | |
4514 g = gaim_group_new(grp); | |
4515 gaim_blist_add_group(g, NULL); | |
4516 } | |
4517 | |
4518 b = gaim_buddy_new(data->account, who, whoalias); | |
4519 gaim_blist_add_buddy(b, NULL, g, NULL); | |
11643 | 4520 gaim_account_add_buddy(data->account, b); |
7620 | 4521 |
7887 | 4522 /* |
9285 | 4523 * XXX |
11643 | 4524 * It really seems like it would be better if the call to |
4525 * gaim_account_add_buddy() and gaim_conversation_update() were done in | |
4526 * blist.c, possibly in the gaim_blist_add_buddy() function. Maybe | |
4527 * gaim_account_add_buddy() should be renamed to | |
4528 * gaim_blist_add_new_buddy() or something, and have it call | |
7887 | 4529 * gaim_blist_add_buddy() after it creates it. --Mark |
9285 | 4530 * |
4531 * No that's not good. blist.c should only deal with adding nodes to the | |
11643 | 4532 * local list. We need a new, non-gtk file that calls both |
4533 * gaim_account_add_buddy and gaim_blist_add_buddy(). | |
4534 * Or something. --Mark | |
7887 | 4535 */ |
4536 | |
11338 | 4537 c = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, who, data->account); |
7620 | 4538 if (c != NULL) { |
13880 | 4539 icon = gaim_conv_im_get_icon(GAIM_CONV_IM(c)); |
4540 if (icon != NULL) | |
4541 gaim_buddy_icon_update(icon); | |
7620 | 4542 } |
4543 } | |
4544 | |
4545 gtk_widget_destroy(data->window); | |
4546 } | |
4547 | |
4548 static void | |
4549 gaim_gtk_blist_request_add_buddy(GaimAccount *account, const char *username, | |
4550 const char *group, const char *alias) | |
4551 { | |
4552 GtkWidget *table; | |
4553 GtkWidget *label; | |
4554 GtkWidget *hbox; | |
4555 GtkWidget *vbox; | |
4556 GtkWidget *img; | |
4557 GaimGtkBuddyList *gtkblist; | |
4558 GaimGtkAddBuddyData *data = g_new0(GaimGtkAddBuddyData, 1); | |
4559 | |
4560 data->account = | |
4561 (account != NULL | |
4562 ? account | |
4563 : gaim_connection_get_account(gaim_connections_get_all()->data)); | |
4564 | |
4565 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, | |
4566 GTK_ICON_SIZE_DIALOG); | |
4567 | |
4568 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
4569 | |
4570 data->window = gtk_dialog_new_with_buttons(_("Add Buddy"), | |
8975 | 4571 NULL, GTK_DIALOG_NO_SEPARATOR, |
7620 | 4572 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
4573 GTK_STOCK_ADD, GTK_RESPONSE_OK, | |
4574 NULL); | |
4575 | |
4576 gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); | |
11243 | 4577 gtk_container_set_border_width(GTK_CONTAINER(data->window), GAIM_HIG_BOX_SPACE); |
7620 | 4578 gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); |
11243 | 4579 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), GAIM_HIG_BORDER); |
4580 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), GAIM_HIG_BOX_SPACE); | |
7620 | 4581 gtk_window_set_role(GTK_WINDOW(data->window), "add_buddy"); |
8975 | 4582 gtk_window_set_type_hint(GTK_WINDOW(data->window), |
9811 | 4583 GDK_WINDOW_TYPE_HINT_DIALOG); |
7620 | 4584 |
11243 | 4585 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); |
7620 | 4586 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); |
4587 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
4588 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
4589 | |
4590 vbox = gtk_vbox_new(FALSE, 0); | |
4591 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
4592 | |
4593 label = gtk_label_new( | |
4594 _("Please enter the screen name of the person you would like " | |
4595 "to add to your buddy list. You may optionally enter an alias, " | |
4596 "or nickname, for the buddy. The alias will be displayed in " | |
4597 "place of the screen name whenever possible.\n")); | |
4598 | |
4599 gtk_widget_set_size_request(GTK_WIDGET(label), 400, -1); | |
4600 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
4601 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
4602 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
4603 | |
11243 | 4604 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
7620 | 4605 gtk_container_add(GTK_CONTAINER(vbox), hbox); |
4606 | |
4607 g_signal_connect(G_OBJECT(data->window), "destroy", | |
4608 G_CALLBACK(destroy_add_buddy_dialog_cb), data); | |
4609 | |
4610 table = gtk_table_new(4, 2, FALSE); | |
4611 gtk_table_set_row_spacings(GTK_TABLE(table), 5); | |
4612 gtk_table_set_col_spacings(GTK_TABLE(table), 5); | |
4613 gtk_container_set_border_width(GTK_CONTAINER(table), 0); | |
4614 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); | |
4615 | |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13542
diff
changeset
|
4616 label = gtk_label_new(_("Screen name:")); |
7620 | 4617 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
4618 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); | |
4619 | |
4620 data->entry = gtk_entry_new(); | |
4621 gtk_table_attach_defaults(GTK_TABLE(table), data->entry, 1, 2, 0, 1); | |
4622 gtk_widget_grab_focus(data->entry); | |
4623 | |
4624 if (username != NULL) | |
4625 gtk_entry_set_text(GTK_ENTRY(data->entry), username); | |
12337 | 4626 else |
4627 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), | |
4628 GTK_RESPONSE_OK, FALSE); | |
7620 | 4629 |
4630 gtk_entry_set_activates_default (GTK_ENTRY(data->entry), TRUE); | |
8137 | 4631 gaim_set_accessible_label (data->entry, label); |
7620 | 4632 |
12337 | 4633 g_signal_connect(G_OBJECT(data->entry), "changed", |
4634 G_CALLBACK(gaim_gtk_set_sensitive_if_input), | |
4635 data->window); | |
4636 | |
7620 | 4637 label = gtk_label_new(_("Alias:")); |
4638 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
4639 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); | |
4640 | |
4641 data->entry_for_alias = gtk_entry_new(); | |
4642 gtk_table_attach_defaults(GTK_TABLE(table), | |
4643 data->entry_for_alias, 1, 2, 1, 2); | |
4644 | |
4645 if (alias != NULL) | |
4646 gtk_entry_set_text(GTK_ENTRY(data->entry_for_alias), alias); | |
4647 | |
10734
8b2c81d9b271
[gaim-migrate @ 12336]
Luke Schierer <lschiere@pidgin.im>
parents:
10694
diff
changeset
|
4648 if (username != NULL) |
8b2c81d9b271
[gaim-migrate @ 12336]
Luke Schierer <lschiere@pidgin.im>
parents:
10694
diff
changeset
|
4649 gtk_widget_grab_focus(GTK_WIDGET(data->entry_for_alias)); |
8b2c81d9b271
[gaim-migrate @ 12336]
Luke Schierer <lschiere@pidgin.im>
parents:
10694
diff
changeset
|
4650 |
7620 | 4651 gtk_entry_set_activates_default (GTK_ENTRY(data->entry_for_alias), TRUE); |
8137 | 4652 gaim_set_accessible_label (data->entry_for_alias, label); |
7620 | 4653 |
4654 label = gtk_label_new(_("Group:")); | |
4655 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
4656 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); | |
4657 | |
4658 data->combo = gtk_combo_new(); | |
4659 gtk_combo_set_popdown_strings(GTK_COMBO(data->combo), groups_tree()); | |
4660 gtk_table_attach_defaults(GTK_TABLE(table), data->combo, 1, 2, 2, 3); | |
8137 | 4661 gaim_set_accessible_label (data->combo, label); |
7620 | 4662 |
4663 /* Set up stuff for the account box */ | |
4664 label = gtk_label_new(_("Account:")); | |
4665 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
4666 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4); | |
4667 | |
4668 data->account_box = gaim_gtk_account_option_menu_new(account, FALSE, | |
4669 G_CALLBACK(add_buddy_select_account_cb), NULL, data); | |
4670 | |
4671 gtk_table_attach_defaults(GTK_TABLE(table), data->account_box, 1, 2, 3, 4); | |
8137 | 4672 gaim_set_accessible_label (data->account_box, label); |
7620 | 4673 /* End of account box */ |
4674 | |
4675 g_signal_connect(G_OBJECT(data->window), "response", | |
4676 G_CALLBACK(add_buddy_cb), data); | |
4677 | |
4678 gtk_widget_show_all(data->window); | |
4679 | |
4680 if (group != NULL) | |
4681 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(data->combo)->entry), group); | |
4682 } | |
4683 | |
4684 static void | |
4685 add_chat_cb(GtkWidget *w, GaimGtkAddChatData *data) | |
4686 { | |
4687 GHashTable *components; | |
4688 GList *tmp; | |
4689 GaimChat *chat; | |
4690 GaimGroup *group; | |
4691 const char *group_name; | |
10475 | 4692 const char *value; |
7620 | 4693 |
4694 components = g_hash_table_new_full(g_str_hash, g_str_equal, | |
4695 g_free, g_free); | |
4696 | |
4697 for (tmp = data->entries; tmp; tmp = tmp->next) | |
4698 { | |
4699 if (g_object_get_data(tmp->data, "is_spin")) | |
4700 { | |
4701 g_hash_table_replace(components, | |
4702 g_strdup(g_object_get_data(tmp->data, "identifier")), | |
4703 g_strdup_printf("%d", | |
4704 gtk_spin_button_get_value_as_int(tmp->data))); | |
4705 } | |
4706 else | |
4707 { | |
10475 | 4708 value = gtk_entry_get_text(tmp->data); |
4709 if (*value != '\0') | |
4710 g_hash_table_replace(components, | |
4711 g_strdup(g_object_get_data(tmp->data, "identifier")), | |
4712 g_strdup(value)); | |
7620 | 4713 } |
4714 } | |
4715 | |
4716 chat = gaim_chat_new(data->account, | |
4717 gtk_entry_get_text(GTK_ENTRY(data->alias_entry)), | |
4718 components); | |
4719 | |
4720 group_name = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(data->group_combo)->entry)); | |
4721 | |
4722 if ((group = gaim_find_group(group_name)) == NULL) | |
4723 { | |
4724 group = gaim_group_new(group_name); | |
4725 gaim_blist_add_group(group, NULL); | |
4726 } | |
4727 | |
4728 if (chat != NULL) | |
4729 { | |
4730 gaim_blist_add_chat(chat, group, NULL); | |
4731 } | |
4732 | |
4733 gtk_widget_destroy(data->window); | |
9812 | 4734 g_free(data->default_chat_name); |
7620 | 4735 g_list_free(data->entries); |
4736 g_free(data); | |
4737 } | |
4738 | |
4739 static void | |
4740 add_chat_resp_cb(GtkWidget *w, int resp, GaimGtkAddChatData *data) | |
4741 { | |
4742 if (resp == GTK_RESPONSE_OK) | |
4743 { | |
4744 add_chat_cb(NULL, data); | |
4745 } | |
4746 else | |
4747 { | |
4748 gtk_widget_destroy(data->window); | |
9812 | 4749 g_free(data->default_chat_name); |
7620 | 4750 g_list_free(data->entries); |
4751 g_free(data); | |
4752 } | |
4753 } | |
4754 | |
10475 | 4755 /* |
4756 * Check the values of all the text entry boxes. If any required input | |
4757 * strings are empty then don't allow the user to click on "OK." | |
4758 */ | |
4759 static void | |
4760 addchat_set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data) | |
4761 { | |
4762 GaimGtkAddChatData *data; | |
4763 GList *tmp; | |
4764 const char *text; | |
4765 gboolean required; | |
4766 gboolean sensitive = TRUE; | |
4767 | |
4768 data = user_data; | |
4769 | |
4770 for (tmp = data->entries; tmp != NULL; tmp = tmp->next) | |
4771 { | |
4772 if (!g_object_get_data(tmp->data, "is_spin")) | |
4773 { | |
4774 required = GPOINTER_TO_INT(g_object_get_data(tmp->data, "required")); | |
4775 text = gtk_entry_get_text(tmp->data); | |
4776 if (required && (*text == '\0')) | |
4777 sensitive = FALSE; | |
4778 } | |
4779 } | |
4780 | |
4781 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_OK, sensitive); | |
4782 } | |
4783 | |
7620 | 4784 static void |
4785 rebuild_addchat_entries(GaimGtkAddChatData *data) | |
4786 { | |
4787 GaimConnection *gc; | |
9959 | 4788 GList *list = NULL, *tmp = NULL; |
9754 | 4789 GHashTable *defaults = NULL; |
7620 | 4790 struct proto_chat_entry *pce; |
4791 gboolean focus = TRUE; | |
4792 | |
10127 | 4793 g_return_if_fail(data->account != NULL); |
4794 | |
7620 | 4795 gc = gaim_account_get_connection(data->account); |
4796 | |
4797 while (GTK_BOX(data->entries_box)->children) | |
4798 { | |
4799 gtk_container_remove(GTK_CONTAINER(data->entries_box), | |
10475 | 4800 ((GtkBoxChild *)GTK_BOX(data->entries_box)->children->data)->widget); |
7620 | 4801 } |
4802 | |
4803 if (data->entries != NULL) | |
4804 g_list_free(data->entries); | |
4805 | |
4806 data->entries = NULL; | |
4807 | |
9959 | 4808 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL) |
4809 list = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc); | |
7620 | 4810 |
9754 | 4811 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) |
10475 | 4812 defaults = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, data->default_chat_name); |
9754 | 4813 |
7620 | 4814 for (tmp = list; tmp; tmp = tmp->next) |
4815 { | |
4816 GtkWidget *label; | |
4817 GtkWidget *rowbox; | |
10475 | 4818 GtkWidget *input; |
7620 | 4819 |
4820 pce = tmp->data; | |
4821 | |
4822 rowbox = gtk_hbox_new(FALSE, 5); | |
4823 gtk_box_pack_start(GTK_BOX(data->entries_box), rowbox, FALSE, FALSE, 0); | |
4824 | |
7889 | 4825 label = gtk_label_new_with_mnemonic(pce->label); |
7620 | 4826 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
4827 gtk_size_group_add_widget(data->sg, label); | |
4828 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
4829 | |
4830 if (pce->is_int) | |
4831 { | |
4832 GtkObject *adjust; | |
4833 adjust = gtk_adjustment_new(pce->min, pce->min, pce->max, | |
4834 1, 10, 10); | |
10475 | 4835 input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); |
4836 gtk_widget_set_size_request(input, 50, -1); | |
4837 gtk_box_pack_end(GTK_BOX(rowbox), input, FALSE, FALSE, 0); | |
7620 | 4838 } |
4839 else | |
4840 { | |
9754 | 4841 char *value; |
10475 | 4842 input = gtk_entry_new(); |
4843 gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE); | |
9754 | 4844 value = g_hash_table_lookup(defaults, pce->identifier); |
4845 if (value != NULL) | |
10475 | 4846 gtk_entry_set_text(GTK_ENTRY(input), value); |
7620 | 4847 if (pce->secret) |
11986 | 4848 { |
10475 | 4849 gtk_entry_set_visibility(GTK_ENTRY(input), FALSE); |
11986 | 4850 gtk_entry_set_invisible_char(GTK_ENTRY(input), GAIM_INVISIBLE_CHAR); |
4851 } | |
10475 | 4852 gtk_box_pack_end(GTK_BOX(rowbox), input, TRUE, TRUE, 0); |
4853 g_signal_connect(G_OBJECT(input), "changed", | |
4854 G_CALLBACK(addchat_set_sensitive_if_input_cb), data); | |
7620 | 4855 } |
4856 | |
10475 | 4857 /* Do the following for any type of input widget */ |
4858 if (focus) | |
4859 { | |
4860 gtk_widget_grab_focus(input); | |
4861 focus = FALSE; | |
4862 } | |
4863 gtk_label_set_mnemonic_widget(GTK_LABEL(label), input); | |
4864 gaim_set_accessible_label(input, label); | |
13106
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
4865 g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier); |
10475 | 4866 g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int)); |
4867 g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required)); | |
4868 data->entries = g_list_append(data->entries, input); | |
4869 | |
7620 | 4870 g_free(pce); |
4871 } | |
4872 | |
4873 g_list_free(list); | |
9754 | 4874 g_hash_table_destroy(defaults); |
7620 | 4875 |
10475 | 4876 /* Set whether the "OK" button should be clickable initially */ |
4877 addchat_set_sensitive_if_input_cb(NULL, data); | |
4878 | |
7620 | 4879 gtk_widget_show_all(data->entries_box); |
4880 } | |
4881 | |
4882 static void | |
10475 | 4883 addchat_select_account_cb(GObject *w, GaimAccount *account, |
7620 | 4884 GaimGtkAddChatData *data) |
4885 { | |
9460 | 4886 if (strcmp(gaim_account_get_protocol_id(data->account), |
4887 gaim_account_get_protocol_id(account)) == 0) | |
7620 | 4888 { |
4889 data->account = account; | |
4890 } | |
4891 else | |
4892 { | |
4893 data->account = account; | |
4894 rebuild_addchat_entries(data); | |
4895 } | |
4896 } | |
4897 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
4898 static void |
7859 | 4899 gaim_gtk_blist_request_add_chat(GaimAccount *account, GaimGroup *group, |
9754 | 4900 const char *alias, const char *name) |
7620 | 4901 { |
4902 GaimGtkAddChatData *data; | |
8975 | 4903 GaimGtkBuddyList *gtkblist; |
4904 GList *l; | |
4905 GaimConnection *gc; | |
7620 | 4906 GtkWidget *label; |
4907 GtkWidget *rowbox; | |
4908 GtkWidget *hbox; | |
4909 GtkWidget *vbox; | |
4910 GtkWidget *img; | |
4911 | |
9812 | 4912 if (account != NULL) { |
4913 gc = gaim_account_get_connection(account); | |
4914 | |
4915 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat == NULL) { | |
4916 gaim_notify_error(gc, NULL, _("This protocol does not support chat rooms."), NULL); | |
4917 return; | |
4918 } | |
4919 } else { | |
4920 /* Find an account with chat capabilities */ | |
4921 for (l = gaim_connections_get_all(); l != NULL; l = l->next) { | |
4922 gc = (GaimConnection *)l->data; | |
4923 | |
4924 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat != NULL) { | |
4925 account = gaim_connection_get_account(gc); | |
4926 break; | |
4927 } | |
4928 } | |
4929 | |
4930 if (account == NULL) { | |
4931 gaim_notify_error(NULL, NULL, | |
4932 _("You are not currently signed on with any " | |
4933 "protocols that have the ability to chat."), NULL); | |
4934 return; | |
4935 } | |
4936 } | |
4937 | |
7620 | 4938 data = g_new0(GaimGtkAddChatData, 1); |
9812 | 4939 data->account = account; |
4940 data->default_chat_name = g_strdup(name); | |
7620 | 4941 |
4942 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, | |
4943 GTK_ICON_SIZE_DIALOG); | |
4944 | |
8975 | 4945 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); |
4946 | |
7620 | 4947 data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
4948 | |
8975 | 4949 data->window = gtk_dialog_new_with_buttons(_("Add Chat"), |
4950 NULL, GTK_DIALOG_NO_SEPARATOR, | |
4951 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
4952 GTK_STOCK_ADD, GTK_RESPONSE_OK, | |
4953 NULL); | |
4954 | |
4955 gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); | |
11243 | 4956 gtk_container_set_border_width(GTK_CONTAINER(data->window), GAIM_HIG_BOX_SPACE); |
8975 | 4957 gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); |
11243 | 4958 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), GAIM_HIG_BORDER); |
4959 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), GAIM_HIG_BOX_SPACE); | |
7620 | 4960 gtk_window_set_role(GTK_WINDOW(data->window), "add_chat"); |
8975 | 4961 gtk_window_set_type_hint(GTK_WINDOW(data->window), |
9811 | 4962 GDK_WINDOW_TYPE_HINT_DIALOG); |
7620 | 4963 |
11243 | 4964 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); |
7620 | 4965 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); |
4966 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
4967 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
4968 | |
4969 vbox = gtk_vbox_new(FALSE, 5); | |
4970 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
4971 | |
4972 label = gtk_label_new( | |
4973 _("Please enter an alias, and the appropriate information " | |
4974 "about the chat you would like to add to your buddy list.\n")); | |
4975 gtk_widget_set_size_request(label, 400, -1); | |
4976 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
4977 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
4978 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
4979 | |
4980 rowbox = gtk_hbox_new(FALSE, 5); | |
4981 gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); | |
4982 | |
4983 label = gtk_label_new(_("Account:")); | |
4984 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
4985 gtk_size_group_add_widget(data->sg, label); | |
4986 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
4987 | |
4988 data->account_menu = gaim_gtk_account_option_menu_new(account, FALSE, | |
10475 | 4989 G_CALLBACK(addchat_select_account_cb), |
9987 | 4990 chat_account_filter_func, data); |
7620 | 4991 gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); |
8137 | 4992 gaim_set_accessible_label (data->account_menu, label); |
7620 | 4993 |
4994 data->entries_box = gtk_vbox_new(FALSE, 5); | |
9811 | 4995 gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); |
7620 | 4996 gtk_box_pack_start(GTK_BOX(vbox), data->entries_box, TRUE, TRUE, 0); |
4997 | |
4998 rebuild_addchat_entries(data); | |
4999 | |
5000 rowbox = gtk_hbox_new(FALSE, 5); | |
5001 gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); | |
5002 | |
5003 label = gtk_label_new(_("Alias:")); | |
5004 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
5005 gtk_size_group_add_widget(data->sg, label); | |
5006 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
5007 | |
5008 data->alias_entry = gtk_entry_new(); | |
7859 | 5009 if (alias != NULL) |
5010 gtk_entry_set_text(GTK_ENTRY(data->alias_entry), alias); | |
7620 | 5011 gtk_box_pack_end(GTK_BOX(rowbox), data->alias_entry, TRUE, TRUE, 0); |
10311 | 5012 gtk_entry_set_activates_default(GTK_ENTRY(data->alias_entry), TRUE); |
8137 | 5013 gaim_set_accessible_label (data->alias_entry, label); |
7620 | 5014 |
5015 rowbox = gtk_hbox_new(FALSE, 5); | |
5016 gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); | |
5017 | |
9811 | 5018 label = gtk_label_new(_("Group:")); |
7620 | 5019 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
5020 gtk_size_group_add_widget(data->sg, label); | |
5021 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
5022 | |
9811 | 5023 data->group_combo = gtk_combo_new(); |
5024 gtk_combo_set_popdown_strings(GTK_COMBO(data->group_combo), groups_tree()); | |
7620 | 5025 gtk_box_pack_end(GTK_BOX(rowbox), data->group_combo, TRUE, TRUE, 0); |
5026 | |
5027 if (group) | |
5028 { | |
5029 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(data->group_combo)->entry), | |
5030 group->name); | |
5031 } | |
8137 | 5032 gaim_set_accessible_label (data->group_combo, label); |
7620 | 5033 |
5034 g_signal_connect(G_OBJECT(data->window), "response", | |
5035 G_CALLBACK(add_chat_resp_cb), data); | |
5036 | |
5037 gtk_widget_show_all(data->window); | |
5038 } | |
5039 | |
5040 static void | |
5041 add_group_cb(GaimConnection *gc, const char *group_name) | |
5042 { | |
9285 | 5043 GaimGroup *group; |
5044 | |
12458 | 5045 if ((group_name == NULL) || (*group_name == '\0')) |
5046 return; | |
5047 | |
9285 | 5048 group = gaim_group_new(group_name); |
5049 gaim_blist_add_group(group, NULL); | |
7620 | 5050 } |
5051 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5052 static void |
7620 | 5053 gaim_gtk_blist_request_add_group(void) |
5054 { | |
7853 | 5055 gaim_request_input(NULL, _("Add Group"), NULL, |
7620 | 5056 _("Please enter the name of the group to be added."), |
8697 | 5057 NULL, FALSE, FALSE, NULL, |
7620 | 5058 _("Add"), G_CALLBACK(add_group_cb), |
5059 _("Cancel"), NULL, NULL); | |
5060 } | |
5061 | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5062 void |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5063 gaim_gtk_blist_toggle_visibility() |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5064 { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5065 if (gtkblist && gtkblist->window) { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5066 if (GTK_WIDGET_VISIBLE(gtkblist->window)) { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5067 gaim_blist_set_visible(GAIM_WINDOW_ICONIFIED(gtkblist->window) || gtk_blist_obscured); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5068 } else { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5069 gaim_blist_set_visible(TRUE); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5070 } |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5071 } |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5072 } |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5073 |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5074 void |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5075 gaim_gtk_blist_visibility_manager_add() |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5076 { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5077 visibility_manager_count++; |
12479
53e2dc07d9e2
[gaim-migrate @ 14790]
Richard Laager <rlaager@wiktel.com>
parents:
12478
diff
changeset
|
5078 gaim_debug_info("gtkblist", "added visibility manager: %d\n", visibility_manager_count); |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5079 } |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5080 |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5081 void |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5082 gaim_gtk_blist_visibility_manager_remove() |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5083 { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5084 if (visibility_manager_count) |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5085 visibility_manager_count--; |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5086 if (!visibility_manager_count) |
13674 | 5087 gaim_blist_set_visible(TRUE); |
12479
53e2dc07d9e2
[gaim-migrate @ 14790]
Richard Laager <rlaager@wiktel.com>
parents:
12478
diff
changeset
|
5088 gaim_debug_info("gtkblist", "removed visibility manager: %d\n", visibility_manager_count); |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5089 } |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5090 |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5091 |
7620 | 5092 static GaimBlistUiOps blist_ui_ops = |
5228 | 5093 { |
5094 gaim_gtk_blist_new_list, | |
5256 | 5095 gaim_gtk_blist_new_node, |
5228 | 5096 gaim_gtk_blist_show, |
5097 gaim_gtk_blist_update, | |
5098 gaim_gtk_blist_remove, | |
5099 gaim_gtk_blist_destroy, | |
7620 | 5100 gaim_gtk_blist_set_visible, |
5101 gaim_gtk_blist_request_add_buddy, | |
5102 gaim_gtk_blist_request_add_chat, | |
10012 | 5103 gaim_gtk_blist_request_add_group |
5228 | 5104 }; |
5105 | |
5106 | |
7620 | 5107 GaimBlistUiOps * |
5108 gaim_gtk_blist_get_ui_ops(void) | |
5228 | 5109 { |
5110 return &blist_ui_ops; | |
5111 } | |
5112 | |
10643 | 5113 GaimGtkBuddyList *gaim_gtk_blist_get_default_gtk_blist() |
5114 { | |
5115 return gtkblist; | |
5116 } | |
5117 | |
7620 | 5118 static void account_signon_cb(GaimConnection *gc, gpointer z) |
5119 { | |
5120 GaimAccount *account = gaim_connection_get_account(gc); | |
5121 GaimBlistNode *gnode, *cnode; | |
5122 for(gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) | |
5123 { | |
5124 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5125 continue; | |
5126 for(cnode = gnode->child; cnode; cnode = cnode->next) | |
5127 { | |
5128 GaimChat *chat; | |
5129 | |
5130 if(!GAIM_BLIST_NODE_IS_CHAT(cnode)) | |
5131 continue; | |
5132 | |
5133 chat = (GaimChat *)cnode; | |
5134 | |
5135 if(chat->account != account) | |
5136 continue; | |
5137 | |
8197 | 5138 if(gaim_blist_node_get_bool((GaimBlistNode*)chat, "gtk-autojoin") || |
8198 | 5139 (gaim_blist_node_get_string((GaimBlistNode*)chat, |
5140 "gtk-autojoin") != NULL)) | |
7620 | 5141 serv_join_chat(gc, chat->components); |
5142 } | |
5143 } | |
5144 } | |
5145 | |
8815 | 5146 void * |
5147 gaim_gtk_blist_get_handle() { | |
5148 static int handle; | |
5149 | |
5150 return &handle; | |
5151 } | |
5152 | |
11910 | 5153 static gboolean buddy_signonoff_timeout_cb(GaimBuddy *buddy) |
5154 { | |
5155 struct _gaim_gtk_blist_node *gtknode = ((GaimBlistNode*)buddy)->ui_data; | |
5156 | |
5157 gtknode->recent_signonoff = FALSE; | |
5158 gtknode->recent_signonoff_timer = 0; | |
5159 | |
5160 gaim_gtk_blist_update(NULL, (GaimBlistNode*)buddy); | |
5161 | |
5162 return FALSE; | |
5163 } | |
5164 | |
5165 static void buddy_signonoff_cb(GaimBuddy *buddy) | |
5166 { | |
11915 | 5167 struct _gaim_gtk_blist_node *gtknode; |
5168 | |
5169 if(!((GaimBlistNode*)buddy)->ui_data) { | |
5170 gaim_gtk_blist_new_node((GaimBlistNode*)buddy); | |
5171 } | |
5172 | |
5173 gtknode = ((GaimBlistNode*)buddy)->ui_data; | |
11910 | 5174 |
5175 gtknode->recent_signonoff = TRUE; | |
5176 | |
5177 if(gtknode->recent_signonoff_timer > 0) | |
5178 gaim_timeout_remove(gtknode->recent_signonoff_timer); | |
5179 gtknode->recent_signonoff_timer = gaim_timeout_add(10000, | |
5180 (GSourceFunc)buddy_signonoff_timeout_cb, buddy); | |
5181 } | |
5182 | |
7620 | 5183 void gaim_gtk_blist_init(void) |
5184 { | |
8815 | 5185 void *gtk_blist_handle = gaim_gtk_blist_get_handle(); |
7620 | 5186 |
5187 gaim_signal_connect(gaim_connections_get_handle(), "signed-on", | |
8815 | 5188 gtk_blist_handle, GAIM_CALLBACK(account_signon_cb), |
7620 | 5189 NULL); |
7731 | 5190 |
5191 /* Initialize prefs */ | |
8819 | 5192 gaim_prefs_add_none("/gaim/gtk/blist"); |
5193 gaim_prefs_add_bool("/gaim/gtk/blist/show_buddy_icons", TRUE); | |
5194 gaim_prefs_add_bool("/gaim/gtk/blist/show_empty_groups", FALSE); | |
12656 | 5195 gaim_prefs_add_bool("/gaim/gtk/blist/show_idle_time", TRUE); |
8819 | 5196 gaim_prefs_add_bool("/gaim/gtk/blist/show_offline_buddies", FALSE); |
10282 | 5197 gaim_prefs_add_bool("/gaim/gtk/blist/list_visible", TRUE); |
12279 | 5198 gaim_prefs_add_bool("/gaim/gtk/blist/list_maximized", FALSE); |
9711 | 5199 gaim_prefs_add_string("/gaim/gtk/blist/sort_type", "alphabetical"); |
8819 | 5200 gaim_prefs_add_int("/gaim/gtk/blist/x", 0); |
5201 gaim_prefs_add_int("/gaim/gtk/blist/y", 0); | |
9778 | 5202 gaim_prefs_add_int("/gaim/gtk/blist/width", 309); /* Golden ratio, baby */ |
5203 gaim_prefs_add_int("/gaim/gtk/blist/height", 500); /* Golden ratio, baby */ | |
8819 | 5204 gaim_prefs_add_int("/gaim/gtk/blist/tooltip_delay", 500); |
7731 | 5205 |
8815 | 5206 /* Register our signals */ |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5207 gaim_signal_register(gtk_blist_handle, "gtkblist-hiding", |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5208 gaim_marshal_VOID__POINTER, NULL, 1, |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5209 gaim_value_new(GAIM_TYPE_POINTER)); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5210 |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5211 gaim_signal_register(gtk_blist_handle, "gtkblist-unhiding", |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5212 gaim_marshal_VOID__POINTER, NULL, 1, |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5213 gaim_value_new(GAIM_TYPE_SUBTYPE)); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5214 |
8815 | 5215 gaim_signal_register(gtk_blist_handle, "gtkblist-created", |
9811 | 5216 gaim_marshal_VOID__POINTER, NULL, 1, |
5217 gaim_value_new(GAIM_TYPE_SUBTYPE, | |
5218 GAIM_SUBTYPE_BLIST)); | |
8819 | 5219 |
5220 gaim_signal_register(gtk_blist_handle, "drawing-tooltip", | |
12713
d7043c3c793d
[gaim-migrate @ 15057]
Richard Laager <rlaager@wiktel.com>
parents:
12679
diff
changeset
|
5221 gaim_marshal_VOID__POINTER_POINTER_UINT, NULL, 3, |
9811 | 5222 gaim_value_new(GAIM_TYPE_SUBTYPE, GAIM_SUBTYPE_BLIST_NODE), |
12713
d7043c3c793d
[gaim-migrate @ 15057]
Richard Laager <rlaager@wiktel.com>
parents:
12679
diff
changeset
|
5223 gaim_value_new_outgoing(GAIM_TYPE_BOXED, "GString *"), |
d7043c3c793d
[gaim-migrate @ 15057]
Richard Laager <rlaager@wiktel.com>
parents:
12679
diff
changeset
|
5224 gaim_value_new(GAIM_TYPE_BOOLEAN)); |
11910 | 5225 |
5226 | |
5227 gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-on", gtk_blist_handle, GAIM_CALLBACK(buddy_signonoff_cb), NULL); | |
5228 gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-off", gtk_blist_handle, GAIM_CALLBACK(buddy_signonoff_cb), NULL); | |
7620 | 5229 } |
5230 | |
8815 | 5231 void |
5232 gaim_gtk_blist_uninit(void) { | |
5233 gaim_signals_unregister_by_instance(gaim_gtk_blist_get_handle()); | |
5234 } | |
5228 | 5235 |
5236 /********************************************************************* | |
9811 | 5237 * Buddy List sorting functions * |
5422 | 5238 *********************************************************************/ |
5239 | |
11796 | 5240 GList *gaim_gtk_blist_get_sort_methods() |
5241 { | |
5242 return gaim_gtk_blist_sort_methods; | |
5243 } | |
5244 | |
7620 | 5245 void gaim_gtk_blist_sort_method_reg(const char *id, const char *name, gaim_gtk_blist_sort_function func) |
5422 | 5246 { |
5247 struct gaim_gtk_blist_sort_method *method = g_new0(struct gaim_gtk_blist_sort_method, 1); | |
7620 | 5248 method->id = g_strdup(id); |
5422 | 5249 method->name = g_strdup(name); |
9775 | 5250 method->func = func; |
11796 | 5251 gaim_gtk_blist_sort_methods = g_list_append(gaim_gtk_blist_sort_methods, method); |
5252 gaim_gtk_blist_update_sort_methods(); | |
5422 | 5253 } |
5254 | |
7620 | 5255 void gaim_gtk_blist_sort_method_unreg(const char *id){ |
11796 | 5256 GList *l = gaim_gtk_blist_sort_methods; |
7620 | 5257 |
5258 while(l) { | |
5259 struct gaim_gtk_blist_sort_method *method = l->data; | |
5260 if(!strcmp(method->id, id)) { | |
11796 | 5261 gaim_gtk_blist_sort_methods = g_list_delete_link(gaim_gtk_blist_sort_methods, l); |
7620 | 5262 g_free(method->id); |
5263 g_free(method->name); | |
5264 g_free(method); | |
5265 break; | |
5266 } | |
5267 } | |
11796 | 5268 gaim_gtk_blist_update_sort_methods(); |
5422 | 5269 } |
5270 | |
7620 | 5271 void gaim_gtk_blist_sort_method_set(const char *id){ |
11796 | 5272 GList *l = gaim_gtk_blist_sort_methods; |
7620 | 5273 |
5274 if(!id) | |
5275 id = "none"; | |
5276 | |
5277 while (l && strcmp(((struct gaim_gtk_blist_sort_method*)l->data)->id, id)) | |
5422 | 5278 l = l->next; |
7620 | 5279 |
5422 | 5280 if (l) { |
5281 current_sort_method = l->data; | |
5282 } else if (!current_sort_method) { | |
7620 | 5283 gaim_gtk_blist_sort_method_set("none"); |
5422 | 5284 return; |
5285 } | |
5286 redo_buddy_list(gaim_get_blist(), TRUE); | |
5287 | |
5288 } | |
5289 | |
5290 /****************************************** | |
5291 ** Sort Methods | |
5292 ******************************************/ | |
5293 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5294 static void sort_method_none(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter parent_iter, GtkTreeIter *cur, GtkTreeIter *iter) |
5422 | 5295 { |
7620 | 5296 GaimBlistNode *sibling = node->prev; |
5297 GtkTreeIter sibling_iter; | |
5298 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5299 if (cur != NULL) { |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5300 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5301 return; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5302 } |
7620 | 5303 |
5304 while (sibling && !get_iter_from_node(sibling, &sibling_iter)) { | |
5305 sibling = sibling->prev; | |
5422 | 5306 } |
7620 | 5307 |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5308 gtk_tree_store_insert_after(gtkblist->treemodel, iter, |
7620 | 5309 node->parent ? &parent_iter : NULL, |
5310 sibling ? &sibling_iter : NULL); | |
5422 | 5311 } |
5312 | |
7620 | 5313 #if GTK_CHECK_VERSION(2,2,1) |
5314 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5315 static void sort_method_alphabetical(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter) |
5422 | 5316 { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5317 GtkTreeIter more_z; |
7620 | 5318 |
5319 const char *my_name; | |
5320 | |
5321 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
5322 my_name = gaim_contact_get_alias((GaimContact*)node); | |
5323 } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { | |
5324 my_name = gaim_chat_get_name((GaimChat*)node); | |
5325 } else { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5326 sort_method_none(node, blist, groupiter, cur, iter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5327 return; |
7620 | 5328 } |
5329 | |
5422 | 5330 |
5331 if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(gtkblist->treemodel), &more_z, &groupiter)) { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5332 gtk_tree_store_insert(gtkblist->treemodel, iter, &groupiter, 0); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5333 return; |
7620 | 5334 } |
5335 | |
5336 do { | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5337 GValue val; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5338 GaimBlistNode *n; |
7620 | 5339 const char *this_name; |
5340 int cmp; | |
5341 | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5342 val.g_type = 0; |
7620 | 5343 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val); |
5344 n = g_value_get_pointer(&val); | |
5345 | |
5346 if(GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
5347 this_name = gaim_contact_get_alias((GaimContact*)n); | |
5348 } else if(GAIM_BLIST_NODE_IS_CHAT(n)) { | |
5349 this_name = gaim_chat_get_name((GaimChat*)n); | |
5350 } else { | |
5351 this_name = NULL; | |
5352 } | |
5353 | |
5354 cmp = gaim_utf8_strcasecmp(my_name, this_name); | |
5355 | |
5356 if(this_name && (cmp < 0 || (cmp == 0 && node < n))) { | |
5357 if(cur) { | |
5358 gtk_tree_store_move_before(gtkblist->treemodel, cur, &more_z); | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5359 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5360 return; |
7620 | 5361 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5362 gtk_tree_store_insert_before(gtkblist->treemodel, iter, |
7620 | 5363 &groupiter, &more_z); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5364 return; |
7620 | 5365 } |
5366 } | |
5367 g_value_unset(&val); | |
5368 } while (gtk_tree_model_iter_next (GTK_TREE_MODEL(gtkblist->treemodel), &more_z)); | |
5369 | |
5370 if(cur) { | |
5371 gtk_tree_store_move_before(gtkblist->treemodel, cur, NULL); | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5372 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5373 return; |
7620 | 5374 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5375 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5376 return; |
7620 | 5377 } |
5378 } | |
5379 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5380 static void sort_method_status(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter) |
7620 | 5381 { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5382 GtkTreeIter more_z; |
7620 | 5383 |
5384 GaimBuddy *my_buddy, *this_buddy; | |
5385 | |
5386 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
5387 my_buddy = gaim_contact_get_priority_buddy((GaimContact*)node); | |
5388 } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5389 if (cur != NULL) { |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5390 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5391 return; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5392 } |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5393 |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5394 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5395 return; |
7620 | 5396 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5397 sort_method_none(node, blist, groupiter, cur, iter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5398 return; |
7620 | 5399 } |
5400 | |
5401 | |
5402 if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(gtkblist->treemodel), &more_z, &groupiter)) { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5403 gtk_tree_store_insert(gtkblist->treemodel, iter, &groupiter, 0); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5404 return; |
5422 | 5405 } |
5406 | |
5407 do { | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5408 GValue val; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5409 GaimBlistNode *n; |
9944 | 5410 gint name_cmp; |
5411 gint presence_cmp; | |
7620 | 5412 |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5413 val.g_type = 0; |
5422 | 5414 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val); |
5415 n = g_value_get_pointer(&val); | |
7620 | 5416 |
5417 if(GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
5418 this_buddy = gaim_contact_get_priority_buddy((GaimContact*)n); | |
5419 } else { | |
5420 this_buddy = NULL; | |
5421 } | |
5422 | |
9944 | 5423 name_cmp = gaim_utf8_strcasecmp( |
13670
a373da801dc1
[gaim-migrate @ 16072]
Richard Laager <rlaager@wiktel.com>
parents:
13629
diff
changeset
|
5424 gaim_contact_get_alias(gaim_buddy_get_contact(my_buddy)), |
9944 | 5425 (this_buddy |
5426 ? gaim_contact_get_alias(gaim_buddy_get_contact(this_buddy)) | |
5427 : NULL)); | |
5428 | |
5429 presence_cmp = gaim_presence_compare( | |
5430 gaim_buddy_get_presence(my_buddy), | |
13689
5fb687f9965c
[gaim-migrate @ 16092]
Richard Laager <rlaager@wiktel.com>
parents:
13684
diff
changeset
|
5431 this_buddy ? gaim_buddy_get_presence(this_buddy) : NULL); |
9944 | 5432 |
5433 if (this_buddy == NULL || | |
10860 | 5434 (presence_cmp < 0 || |
9944 | 5435 (presence_cmp == 0 && |
5436 (name_cmp < 0 || (name_cmp == 0 && node < n))))) | |
5437 { | |
5438 if (cur != NULL) | |
5439 { | |
7620 | 5440 gtk_tree_store_move_before(gtkblist->treemodel, cur, &more_z); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5441 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5442 return; |
9944 | 5443 } |
5444 else | |
5445 { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5446 gtk_tree_store_insert_before(gtkblist->treemodel, iter, |
9944 | 5447 &groupiter, &more_z); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5448 return; |
7620 | 5449 } |
5422 | 5450 } |
9944 | 5451 |
5422 | 5452 g_value_unset(&val); |
9944 | 5453 } |
5454 while (gtk_tree_model_iter_next(GTK_TREE_MODEL(gtkblist->treemodel), | |
5455 &more_z)); | |
7620 | 5456 |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5457 if (cur) { |
7620 | 5458 gtk_tree_store_move_before(gtkblist->treemodel, cur, NULL); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5459 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5460 return; |
7620 | 5461 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5462 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5463 return; |
7620 | 5464 } |
5422 | 5465 } |
5466 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5467 static void sort_method_log(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter) |
5422 | 5468 { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5469 GtkTreeIter more_z; |
7620 | 5470 |
5471 int log_size = 0, this_log_size = 0; | |
5472 const char *buddy_name, *this_buddy_name; | |
5473 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5474 if(cur && (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(gtkblist->treemodel), &groupiter) == 1)) { |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5475 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5476 return; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5477 } |
7620 | 5478 |
5479 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5480 GaimBlistNode *n; |
7620 | 5481 for (n = node->child; n; n = n->next) |
8898 | 5482 log_size += gaim_log_get_total_size(GAIM_LOG_IM, ((GaimBuddy*)(n))->name, ((GaimBuddy*)(n))->account); |
7620 | 5483 buddy_name = gaim_contact_get_alias((GaimContact*)node); |
5484 } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { | |
5485 /* we don't have a reliable way of getting the log filename | |
5486 * from the chat info in the blist, yet */ | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5487 if (cur != NULL) { |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5488 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5489 return; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5490 } |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5491 |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5492 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5493 return; |
7620 | 5494 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5495 sort_method_none(node, blist, groupiter, cur, iter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5496 return; |
7620 | 5497 } |
5498 | |
5499 | |
5422 | 5500 if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(gtkblist->treemodel), &more_z, &groupiter)) { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5501 gtk_tree_store_insert(gtkblist->treemodel, iter, &groupiter, 0); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5502 return; |
5422 | 5503 } |
5504 | |
5505 do { | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5506 GValue val; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5507 GaimBlistNode *n; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5508 GaimBlistNode *n2; |
7620 | 5509 int cmp; |
5510 | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5511 val.g_type = 0; |
5422 | 5512 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val); |
5513 n = g_value_get_pointer(&val); | |
7620 | 5514 this_log_size = 0; |
5515 | |
5516 if(GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
5517 for (n2 = n->child; n2; n2 = n2->next) | |
8898 | 5518 this_log_size += gaim_log_get_total_size(GAIM_LOG_IM, ((GaimBuddy*)(n2))->name, ((GaimBuddy*)(n2))->account); |
7620 | 5519 this_buddy_name = gaim_contact_get_alias((GaimContact*)n); |
5520 } else { | |
5521 this_buddy_name = NULL; | |
5422 | 5522 } |
7620 | 5523 |
5524 cmp = gaim_utf8_strcasecmp(buddy_name, this_buddy_name); | |
5525 | |
5526 if (!GAIM_BLIST_NODE_IS_CONTACT(n) || log_size > this_log_size || | |
5527 ((log_size == this_log_size) && | |
5528 (cmp < 0 || (cmp == 0 && node < n)))) { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5529 if (cur != NULL) { |
7620 | 5530 gtk_tree_store_move_before(gtkblist->treemodel, cur, &more_z); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5531 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5532 return; |
7620 | 5533 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5534 gtk_tree_store_insert_before(gtkblist->treemodel, iter, |
7620 | 5535 &groupiter, &more_z); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5536 return; |
7620 | 5537 } |
5422 | 5538 } |
5539 g_value_unset(&val); | |
5540 } while (gtk_tree_model_iter_next (GTK_TREE_MODEL(gtkblist->treemodel), &more_z)); | |
7620 | 5541 |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5542 if (cur != NULL) { |
7620 | 5543 gtk_tree_store_move_before(gtkblist->treemodel, cur, NULL); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5544 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5545 return; |
7620 | 5546 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5547 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5548 return; |
7620 | 5549 } |
5550 } | |
5551 | |
5552 #endif | |
5553 | |
5554 static void | |
13196
f04dffe22957
[gaim-migrate @ 15559]
Gary Kramlich <grim@reaperworld.com>
parents:
13195
diff
changeset
|
5555 plugin_act(GtkObject *obj, GaimPluginAction *pam) |
7620 | 5556 { |
13196
f04dffe22957
[gaim-migrate @ 15559]
Gary Kramlich <grim@reaperworld.com>
parents:
13195
diff
changeset
|
5557 if (pam && pam->callback) |
10352 | 5558 pam->callback(pam); |
5422 | 5559 } |
7620 | 5560 |
8986 | 5561 static void |
12333 | 5562 build_plugin_actions(GtkWidget *menu, GaimPlugin *plugin) |
8986 | 5563 { |
12333 | 5564 GtkWidget *menuitem; |
9015 | 5565 GaimPluginAction *action = NULL; |
12333 | 5566 GList *actions, *l; |
5567 | |
5568 actions = GAIM_PLUGIN_ACTIONS(plugin, NULL); | |
5569 | |
5570 for (l = actions; l != NULL; l = l->next) | |
5571 { | |
5572 if (l->data) | |
5573 { | |
9015 | 5574 action = (GaimPluginAction *) l->data; |
5575 action->plugin = plugin; | |
12333 | 5576 action->context = NULL; |
9015 | 5577 |
5578 menuitem = gtk_menu_item_new_with_label(action->label); | |
12333 | 5579 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
5580 | |
9015 | 5581 g_signal_connect(G_OBJECT(menuitem), "activate", |
5582 G_CALLBACK(plugin_act), action); | |
13196
f04dffe22957
[gaim-migrate @ 15559]
Gary Kramlich <grim@reaperworld.com>
parents:
13195
diff
changeset
|
5583 g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", |
f04dffe22957
[gaim-migrate @ 15559]
Gary Kramlich <grim@reaperworld.com>
parents:
13195
diff
changeset
|
5584 action, |
f04dffe22957
[gaim-migrate @ 15559]
Gary Kramlich <grim@reaperworld.com>
parents:
13195
diff
changeset
|
5585 (GDestroyNotify)gaim_plugin_action_free); |
9015 | 5586 gtk_widget_show(menuitem); |
5587 } | |
5588 else | |
5589 gaim_separator(menu); | |
5590 } | |
5591 | |
12333 | 5592 g_list_free(actions); |
8986 | 5593 } |
5594 | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5595 static void |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5596 modify_account_cb(GtkWidget *widget, gpointer data) |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5597 { |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5598 gaim_gtk_account_dialog_show(GAIM_GTK_MODIFY_ACCOUNT_DIALOG, data); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5599 } |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5600 |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5601 static void |
12330 | 5602 enable_account_cb(GtkCheckMenuItem *widget, gpointer data) |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5603 { |
12330 | 5604 GaimAccount *account = data; |
5605 const GaimSavedStatus *saved_status; | |
5606 | |
5607 saved_status = gaim_savedstatus_get_current(); | |
5608 gaim_savedstatus_activate_for_account(saved_status, account); | |
5609 | |
5610 gaim_account_set_enabled(account, GAIM_GTK_UI, TRUE); | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5611 } |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5612 |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5613 static void |
12330 | 5614 disable_account_cb(GtkCheckMenuItem *widget, gpointer data) |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5615 { |
12330 | 5616 GaimAccount *account = data; |
5617 | |
5618 gaim_account_set_enabled(account, GAIM_GTK_UI, FALSE); | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5619 } |
8986 | 5620 |
7620 | 5621 void |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5622 gaim_gtk_blist_update_accounts_menu(void) |
7620 | 5623 { |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5624 GtkWidget *menuitem = NULL, *submenu = NULL; |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5625 GList *l = NULL, *accounts = NULL; |
12330 | 5626 gboolean disabled_accounts = FALSE; |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5627 |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5628 if (accountmenu == NULL) |
7620 | 5629 return; |
5630 | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5631 /* Clear the old Accounts menu */ |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5632 for (l = gtk_container_get_children(GTK_CONTAINER(accountmenu)); l; l = l->next) { |
12348
4f7797a3024b
[gaim-migrate @ 14652]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12341
diff
changeset
|
5633 menuitem = l->data; |
4f7797a3024b
[gaim-migrate @ 14652]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12341
diff
changeset
|
5634 |
4f7797a3024b
[gaim-migrate @ 14652]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12341
diff
changeset
|
5635 if (menuitem != gtk_item_factory_get_widget(gtkblist->ift, N_("/Accounts/Add\\/Edit"))) |
4f7797a3024b
[gaim-migrate @ 14652]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12341
diff
changeset
|
5636 gtk_container_remove(GTK_CONTAINER(accountmenu), |
13132
ba82cc4d1abd
[gaim-migrate @ 15494]
Richard Laager <rlaager@wiktel.com>
parents:
13106
diff
changeset
|
5637 menuitem); |
7620 | 5638 } |
5639 | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5640 for (accounts = gaim_accounts_get_all(); accounts; accounts = accounts->next) { |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5641 char *buf = NULL; |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5642 GtkWidget *image = NULL; |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5643 GaimConnection *gc = NULL; |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5644 GaimAccount *account = NULL; |
12300
6487e68dcef9
[gaim-migrate @ 14604]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12298
diff
changeset
|
5645 GaimStatus *status = NULL; |
13090 | 5646 GdkPixbuf *pixbuf = NULL; |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5647 |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5648 account = accounts->data; |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5649 |
12330 | 5650 if(gaim_account_get_enabled(account, GAIM_GTK_UI)) { |
5651 buf = g_strconcat(gaim_account_get_username(account), " (", | |
5652 gaim_account_get_protocol_name(account), ")", NULL); | |
5653 menuitem = gtk_image_menu_item_new_with_label(buf); | |
5654 g_free(buf); | |
5655 status = gaim_account_get_active_status(account); | |
13090 | 5656 pixbuf = gaim_gtk_create_prpl_icon_with_status(account, gaim_status_get_type(status), 0.5); |
5657 if (pixbuf != NULL) | |
5658 { | |
12330 | 5659 if (!gaim_account_is_connected(account)) |
13090 | 5660 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, |
12330 | 5661 0.0, FALSE); |
13090 | 5662 image = gtk_image_new_from_pixbuf(pixbuf); |
12330 | 5663 g_object_unref(G_OBJECT(pixbuf)); |
5664 gtk_widget_show(image); | |
5665 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); | |
5666 } | |
5667 gtk_menu_shell_append(GTK_MENU_SHELL(accountmenu), menuitem); | |
5668 gtk_widget_show(menuitem); | |
5669 | |
5670 submenu = gtk_menu_new(); | |
5671 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); | |
5672 gtk_widget_show(submenu); | |
5673 | |
5674 | |
12334 | 5675 menuitem = gtk_menu_item_new_with_mnemonic(_("_Edit Account")); |
12330 | 5676 g_signal_connect(G_OBJECT(menuitem), "activate", |
5677 G_CALLBACK(modify_account_cb), account); | |
5678 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); | |
5679 gtk_widget_show(menuitem); | |
5680 | |
5681 gaim_separator(submenu); | |
5682 | |
5683 gc = gaim_account_get_connection(account); | |
5684 if (gc && GAIM_CONNECTION_IS_CONNECTED(gc)) { | |
5685 GaimPlugin *plugin = NULL; | |
5686 | |
5687 plugin = gc->prpl; | |
5688 if (GAIM_PLUGIN_HAS_ACTIONS(plugin)) { | |
5689 GList *l, *ll = NULL; | |
5690 GaimPluginAction *action = NULL; | |
5691 | |
5692 for (l = ll = GAIM_PLUGIN_ACTIONS(plugin, gc); l; l = l->next) { | |
5693 if (l->data) { | |
5694 action = (GaimPluginAction *)l->data; | |
5695 action->plugin = plugin; | |
5696 action->context = gc; | |
5697 | |
5698 menuitem = gtk_menu_item_new_with_label(action->label); | |
5699 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); | |
5700 g_signal_connect(G_OBJECT(menuitem), "activate", | |
5701 G_CALLBACK(plugin_act), action); | |
13755 | 5702 g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", action, (GDestroyNotify)gaim_plugin_action_free); |
12330 | 5703 gtk_widget_show(menuitem); |
5704 } else | |
5705 gaim_separator(submenu); | |
5706 } | |
5707 } else { | |
5708 menuitem = gtk_menu_item_new_with_label(_("No actions available")); | |
5709 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); | |
5710 gtk_widget_set_sensitive(menuitem, FALSE); | |
5711 gtk_widget_show(menuitem); | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5712 } |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5713 } else { |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5714 menuitem = gtk_menu_item_new_with_label(_("No actions available")); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5715 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5716 gtk_widget_set_sensitive(menuitem, FALSE); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5717 gtk_widget_show(menuitem); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5718 } |
12330 | 5719 |
5720 gaim_separator(submenu); | |
5721 | |
5722 menuitem = gtk_menu_item_new_with_mnemonic(_("_Disable")); | |
5723 g_signal_connect(G_OBJECT(menuitem), "activate", | |
5724 G_CALLBACK(disable_account_cb), account); | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5725 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5726 gtk_widget_show(menuitem); |
12330 | 5727 } else { |
5728 disabled_accounts = TRUE; | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5729 } |
7620 | 5730 } |
9019 | 5731 |
12330 | 5732 if(disabled_accounts) { |
5733 gaim_separator(accountmenu); | |
12338 | 5734 menuitem = gtk_menu_item_new_with_label(_("Enable Account")); |
12330 | 5735 gtk_menu_shell_append(GTK_MENU_SHELL(accountmenu), menuitem); |
5736 gtk_widget_show(menuitem); | |
5737 | |
5738 submenu = gtk_menu_new(); | |
5739 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); | |
5740 gtk_widget_show(submenu); | |
5741 | |
5742 for (accounts = gaim_accounts_get_all(); accounts; accounts = accounts->next) { | |
5743 char *buf = NULL; | |
5744 GtkWidget *image = NULL; | |
5745 GaimAccount *account = NULL; | |
13090 | 5746 GdkPixbuf *pixbuf = NULL; |
12330 | 5747 |
5748 account = accounts->data; | |
5749 | |
5750 if(!gaim_account_get_enabled(account, GAIM_GTK_UI)) { | |
5751 | |
5752 disabled_accounts = TRUE; | |
5753 | |
5754 buf = g_strconcat(gaim_account_get_username(account), " (", | |
5755 gaim_account_get_protocol_name(account), ")", NULL); | |
5756 menuitem = gtk_image_menu_item_new_with_label(buf); | |
5757 g_free(buf); | |
13090 | 5758 pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); |
5759 if (pixbuf != NULL) | |
5760 { | |
5761 if (!gaim_account_is_connected(account)) | |
5762 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); | |
5763 image = gtk_image_new_from_pixbuf(pixbuf); | |
12330 | 5764 g_object_unref(G_OBJECT(pixbuf)); |
5765 gtk_widget_show(image); | |
5766 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); | |
5767 } | |
5768 g_signal_connect(G_OBJECT(menuitem), "activate", | |
5769 G_CALLBACK(enable_account_cb), account); | |
5770 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); | |
5771 gtk_widget_show(menuitem); | |
5772 } | |
9019 | 5773 } |
7620 | 5774 } |
5775 } | |
8986 | 5776 |
12333 | 5777 static GList *plugin_submenus = NULL; |
5778 | |
8986 | 5779 void |
5780 gaim_gtk_blist_update_plugin_actions(void) | |
5781 { | |
12333 | 5782 GtkWidget *menuitem, *submenu; |
9015 | 5783 GaimPlugin *plugin = NULL; |
8986 | 5784 GList *l; |
12464
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5785 GtkAccelGroup *accel_group; |
8986 | 5786 |
11742 | 5787 GtkWidget *pluginmenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools")); |
5788 | |
12333 | 5789 g_return_if_fail(pluginmenu != NULL); |
5790 | |
5791 /* Remove old plugin action submenus from the Tools menu */ | |
5792 for (l = plugin_submenus; l; l = l->next) | |
5793 { | |
5794 GList *menuitems; | |
5795 | |
5796 submenu = l->data; | |
5797 | |
5798 menuitems = gtk_container_get_children(GTK_CONTAINER(submenu)); | |
5799 while (menuitems != NULL) | |
5800 { | |
5801 GaimPluginAction *action; | |
5802 menuitem = menuitems->data; | |
5803 action = g_object_get_data(G_OBJECT(menuitem), "plugin_action"); | |
5804 g_free(action); | |
5805 menuitems = g_list_delete_link(menuitems, menuitems); | |
5806 } | |
5807 | |
5808 gtk_container_remove(GTK_CONTAINER(pluginmenu), GTK_WIDGET(submenu)); | |
8986 | 5809 } |
12333 | 5810 g_list_free(plugin_submenus); |
5811 plugin_submenus = NULL; | |
5812 | |
12464
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5813 accel_group = gtk_menu_get_accel_group(GTK_MENU(pluginmenu)); |
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5814 |
12333 | 5815 /* Add a submenu for each plugin with custom actions */ |
11742 | 5816 for (l = gaim_plugins_get_loaded(); l; l = l->next) { |
12464
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5817 char *path; |
11923 | 5818 |
11742 | 5819 plugin = (GaimPlugin *) l->data; |
11923 | 5820 |
11742 | 5821 if (GAIM_IS_PROTOCOL_PLUGIN(plugin)) |
5822 continue; | |
5823 | |
5824 if (!GAIM_PLUGIN_HAS_ACTIONS(plugin)) | |
5825 continue; | |
9019 | 5826 |
13336
999571d910ed
[gaim-migrate @ 15706]
Richard Laager <rlaager@wiktel.com>
parents:
13315
diff
changeset
|
5827 menuitem = gtk_image_menu_item_new_with_label(_(plugin->info->name)); |
12333 | 5828 gtk_menu_shell_append(GTK_MENU_SHELL(pluginmenu), menuitem); |
5829 gtk_widget_show(menuitem); | |
5830 | |
5831 plugin_submenus = g_list_append(plugin_submenus, menuitem); | |
5832 | |
5833 submenu = gtk_menu_new(); | |
5834 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); | |
5835 gtk_widget_show(submenu); | |
12464
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5836 |
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5837 gtk_menu_set_accel_group(GTK_MENU(submenu), accel_group); |
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5838 path = g_strdup_printf("%s/Tools/%s", gtkblist->ift->path, plugin->info->name); |
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5839 gtk_menu_set_accel_path(GTK_MENU(submenu), path); |
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5840 g_free(path); |
12333 | 5841 |
5842 build_plugin_actions(submenu, plugin); | |
8986 | 5843 } |
5844 } | |
11796 | 5845 |
12246 | 5846 static void |
5847 sortmethod_act(GtkCheckMenuItem *checkmenuitem, char *id) | |
11796 | 5848 { |
5849 if (gtk_check_menu_item_get_active(checkmenuitem)) | |
11923 | 5850 { |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
5851 gaim_gtk_set_cursor(gtkblist->window, GDK_WATCH); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5852 |
11796 | 5853 gaim_gtk_blist_sort_method_set(id); |
11923 | 5854 gaim_prefs_set_string("/gaim/gtk/blist/sort_type", id); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5855 |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
5856 gaim_gtk_clear_cursor(gtkblist->window); |
11923 | 5857 } |
11796 | 5858 } |
5859 | |
5860 void | |
5861 gaim_gtk_blist_update_sort_methods(void) | |
5862 { | |
5863 GtkWidget *menuitem = NULL, *activeitem = NULL; | |
5864 GaimGtkBlistSortMethod *method = NULL; | |
5865 GList *l; | |
5866 GSList *sl = NULL; | |
5867 GtkWidget *sortmenu; | |
11797 | 5868 const char *m = gaim_prefs_get_string("/gaim/gtk/blist/sort_type"); |
11796 | 5869 |
5870 if (gtkblist == NULL) | |
5871 return; | |
5872 | |
11798
01c3eec6ea3c
[gaim-migrate @ 14089]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11797
diff
changeset
|
5873 sortmenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Buddies/Sort Buddies")); |
11796 | 5874 |
5875 if (sortmenu == NULL) | |
5876 return; | |
5877 | |
5878 /* Clear the old menu */ | |
5879 for (l = gtk_container_get_children(GTK_CONTAINER(sortmenu)); l; l = l->next) { | |
5880 menuitem = l->data; | |
5881 gtk_widget_destroy(GTK_WIDGET(menuitem)); | |
5882 } | |
11923 | 5883 |
11796 | 5884 for (l = gaim_gtk_blist_sort_methods; l; l = l->next) { |
5885 method = (GaimGtkBlistSortMethod *) l->data; | |
5886 menuitem = gtk_radio_menu_item_new_with_label(sl, _(method->name)); | |
5887 if (!strcmp(m, method->id)) | |
5888 activeitem = menuitem; | |
5889 sl = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); | |
5890 gtk_menu_shell_append(GTK_MENU_SHELL(sortmenu), menuitem); | |
5891 g_signal_connect(G_OBJECT(menuitem), "toggled", | |
5892 G_CALLBACK(sortmethod_act), method->id); | |
11923 | 5893 gtk_widget_show(menuitem); |
11796 | 5894 } |
5895 if (activeitem) | |
5896 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(activeitem), TRUE); | |
5897 } |