Mercurial > pidgin
annotate src/gtkblist.c @ 13967:99b9b58b19dd
[gaim-migrate @ 16523]
Fix a crazy MSN crash. Basically it's possible to have more than one
slplink associated with a given switchboard, but our code did not
allow for that. I think it happens when you're in a multi-user
chat and you do stuff with multiple users that involves slplinks.
Like maybe file transfer and buddy icon related stuff.
Tracking this down took an ungodly amount of time, but thanks to
Meebo for letting me do it :-)
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 20 Jul 2006 07:31:15 +0000 |
parents | dc4db4925249 |
children | 6fc412e59214 |
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 |
3438 gtk_tree_model_get(model, iter, column, &withmarkup, -1); | |
10433 | 3439 |
13612
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3440 tmp = g_utf8_normalize(key, -1, G_NORMALIZE_DEFAULT); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3441 enteredstring = g_utf8_casefold(tmp, -1); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3442 g_free(tmp); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3443 |
10433 | 3444 nomarkup = gaim_markup_strip_html(withmarkup); |
13612
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3445 tmp = g_utf8_normalize(nomarkup, -1, G_NORMALIZE_DEFAULT); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3446 g_free(nomarkup); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3447 normalized = g_utf8_casefold(tmp, -1); |
dd03aa8a28ad
[gaim-migrate @ 15998]
Richard Laager <rlaager@wiktel.com>
parents:
13559
diff
changeset
|
3448 g_free(tmp); |
10433 | 3449 |
13478
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3450 if (gaim_str_has_prefix(normalized, enteredstring)) |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3451 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3452 g_free(withmarkup); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3453 g_free(enteredstring); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3454 g_free(normalized); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3455 return FALSE; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3456 } |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3457 |
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 /* Use Pango to separate by words. */ |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3460 len = g_utf8_strlen(normalized, -1); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3461 log_attrs = g_new(PangoLogAttr, len + 1); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3462 |
13684
a104ce6e2cca
[gaim-migrate @ 16087]
Richard Laager <rlaager@wiktel.com>
parents:
13674
diff
changeset
|
3463 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
|
3464 |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3465 word = normalized; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3466 result = TRUE; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3467 for (i = 0; i < (len - 1) ; i++) |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3468 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3469 if (log_attrs[i].is_word_start && |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3470 gaim_str_has_prefix(word, enteredstring)) |
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 result = FALSE; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3473 break; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3474 } |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3475 word = g_utf8_next_char(word); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3476 } |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3477 g_free(log_attrs); |
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 /* The non-Pango version. */ |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3480 #if 0 |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3481 word = normalized; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3482 result = TRUE; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3483 while (word[0] != '\0') |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3484 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3485 gunichar c = g_utf8_get_char(word); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3486 if (!g_unichar_isalnum(c)) |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3487 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3488 word = g_utf8_find_next_char(word, NULL); |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3489 if (gaim_str_has_prefix(word, enteredstring)) |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3490 { |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3491 result = FALSE; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3492 break; |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3493 } |
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 else |
38dcde2c8c4b
[gaim-migrate @ 15854]
Richard Laager <rlaager@wiktel.com>
parents:
13450
diff
changeset
|
3496 word = g_utf8_find_next_char(word, NULL); |
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 #endif |
10433 | 3499 |
10439 | 3500 g_free(withmarkup); |
10433 | 3501 g_free(enteredstring); |
11490 | 3502 g_free(normalized); |
10433 | 3503 |
3504 return result; | |
3505 } | |
3506 | |
12522
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3507 static void account_modified(GaimAccount *account, GaimGtkBuddyList *gtkblist) |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3508 { |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3509 if (!gtkblist) |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3510 return; |
12589 | 3511 |
12522
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3512 update_menu_bar(gtkblist); |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3513 } |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3514 |
12766 | 3515 static void |
3516 account_status_changed(GaimAccount *account, GaimStatus *old, | |
3517 GaimStatus *new, GaimGtkBuddyList *gtkblist) | |
3518 { | |
3519 if (!gtkblist) | |
3520 return; | |
3521 | |
3522 update_menu_bar(gtkblist); | |
3523 } | |
3524 | |
12124
9c123e27e2f6
[gaim-migrate @ 14424]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12119
diff
changeset
|
3525 static gboolean |
12461
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3526 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
|
3527 { |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3528 GtkWidget *imhtml; |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3529 |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3530 if (!gtkblist) |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3531 return FALSE; |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3532 |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3533 imhtml = gtk_window_get_focus(GTK_WINDOW(gtkblist->window)); |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3534 |
12474
24beec3e42ad
[gaim-migrate @ 14785]
Luke Schierer <lschiere@pidgin.im>
parents:
12473
diff
changeset
|
3535 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
|
3536 return TRUE; |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3537 return FALSE; |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3538 } |
27671f780081
[gaim-migrate @ 14771]
Richard Laager <rlaager@wiktel.com>
parents:
12458
diff
changeset
|
3539 |
13015 | 3540 /***********************************/ |
3541 /* Connection error handling stuff */ | |
3542 /***********************************/ | |
3543 | |
3544 static void | |
13315
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3545 ce_modify_account_cb(GaimAccount *account) |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3546 { |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3547 gaim_gtk_account_dialog_show(GAIM_GTK_MODIFY_ACCOUNT_DIALOG, account); |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3548 } |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3549 |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3550 static void |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3551 ce_enable_account_cb(GaimAccount *account) |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3552 { |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3553 gaim_account_set_enabled(account, gaim_core_get_ui(), TRUE); |
d65250edebe0
[gaim-migrate @ 15681]
Richard Laager <rlaager@wiktel.com>
parents:
13293
diff
changeset
|
3554 } |
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 static void |
13015 | 3557 connection_error_button_clicked_cb(GtkButton *widget, gpointer user_data) |
3558 { | |
3559 GaimAccount *account; | |
13023 | 3560 char *primary; |
3561 const char *text; | |
13730 | 3562 gboolean enabled; |
13015 | 3563 |
3564 account = user_data; | |
13023 | 3565 primary = g_strdup_printf(_("%s disconnected"), |
3566 gaim_account_get_username(account)); | |
13015 | 3567 text = g_hash_table_lookup(gtkblist->connection_errors, account); |
13375 | 3568 |
13730 | 3569 enabled = gaim_account_get_enabled(account, gaim_core_get_ui()); |
3570 gaim_request_action(account, _("Connection Error"), primary, text, 2, | |
3571 account, 3, | |
3572 _("OK"), NULL, | |
3573 _("Modify Account"), GAIM_CALLBACK(ce_modify_account_cb), | |
3574 enabled ? _("Connect") : _("Re-enable Account"), | |
3575 enabled ? GAIM_CALLBACK(gaim_account_connect) : | |
3576 GAIM_CALLBACK(ce_enable_account_cb)); | |
13629
3275a0f675e2
[gaim-migrate @ 16016]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13612
diff
changeset
|
3577 g_free(primary); |
13015 | 3578 gtk_widget_destroy(GTK_WIDGET(widget)); |
3579 g_hash_table_remove(gtkblist->connection_errors, account); | |
3580 } | |
3581 | |
3582 /* Add some buttons that show connection errors */ | |
3583 static void | |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3584 create_connection_error_buttons(gpointer key, gpointer value, |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3585 gpointer user_data) |
13015 | 3586 { |
3587 GaimAccount *account; | |
13090 | 3588 GaimStatusType *status_type; |
3589 gchar *escaped, *text; | |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3590 GtkWidget *button, *label, *image, *hbox; |
13090 | 3591 GdkPixbuf *pixbuf; |
13015 | 3592 |
3593 account = key; | |
13049 | 3594 escaped = g_markup_escape_text((const gchar *)value, -1); |
13023 | 3595 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
|
3596 gaim_account_get_username(account), |
13049 | 3597 escaped); |
3598 g_free(escaped); | |
3599 | |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3600 hbox = gtk_hbox_new(FALSE, 0); |
13049 | 3601 |
3602 /* Create the icon */ | |
13090 | 3603 status_type = gaim_account_get_status_type_with_primitive(account, |
3604 GAIM_STATUS_OFFLINE); | |
3605 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
|
3606 if (pixbuf != NULL) { |
13090 | 3607 image = gtk_image_new_from_pixbuf(pixbuf); |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3608 g_object_unref(pixbuf); |
13030 | 3609 |
3610 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, | |
3611 GAIM_HIG_BOX_SPACE); | |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3612 } |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3613 |
13049 | 3614 /* Create the text */ |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3615 label = gtk_label_new(""); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3616 gtk_label_set_markup(GTK_LABEL(label), text); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3617 g_free(text); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3618 #if GTK_CHECK_VERSION(2,6,0) |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3619 g_object_set(label, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3620 #endif |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3621 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3622 GAIM_HIG_BOX_SPACE); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3623 |
13049 | 3624 /* 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
|
3625 button = gtk_button_new(); |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3626 gtk_container_add(GTK_CONTAINER(button), hbox); |
13015 | 3627 g_signal_connect(G_OBJECT(button), "clicked", |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3628 G_CALLBACK(connection_error_button_clicked_cb), |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3629 account); |
13049 | 3630 gtk_widget_show_all(button); |
13022
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3631 gtk_box_pack_end(GTK_BOX(gtkblist->error_buttons), button, |
228b1f95e5b4
[gaim-migrate @ 15375]
Etan Reisner <pidgin@unreliablesource.net>
parents:
13016
diff
changeset
|
3632 FALSE, FALSE, 0); |
13015 | 3633 } |
3634 | |
3635 void | |
3636 gaim_gtk_blist_update_account_error_state(GaimAccount *account, const char *text) | |
3637 { | |
3638 GList *l; | |
3639 | |
13016 | 3640 if (text == NULL) |
13015 | 3641 g_hash_table_remove(gtkblist->connection_errors, account); |
3642 else | |
3643 g_hash_table_insert(gtkblist->connection_errors, account, g_strdup(text)); | |
3644 | |
3645 /* Remove the old error buttons */ | |
3646 for (l = gtk_container_get_children(GTK_CONTAINER(gtkblist->error_buttons)); | |
3647 l != NULL; | |
3648 l = l->next) | |
3649 { | |
3650 gtk_widget_destroy(GTK_WIDGET(l->data)); | |
3651 } | |
3652 | |
3653 /* Add new error buttons */ | |
3654 g_hash_table_foreach(gtkblist->connection_errors, | |
3655 create_connection_error_buttons, NULL); | |
3656 } | |
3657 | |
3658 /******************************************/ | |
3659 /* End of connection error handling stuff */ | |
3660 /******************************************/ | |
3661 | |
7620 | 3662 static void gaim_gtk_blist_show(GaimBuddyList *list) |
5228 | 3663 { |
10087 | 3664 void *handle; |
5228 | 3665 GtkCellRenderer *rend; |
3666 GtkTreeViewColumn *column; | |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3667 GtkWidget *menu; |
5228 | 3668 GtkWidget *sw; |
3669 GtkAccelGroup *accel_group; | |
3670 GtkTreeSelection *selection; | |
9556 | 3671 GtkTargetEntry dte[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, |
8089 | 3672 {"application/x-im-contact", 0, DRAG_BUDDY}, |
9495 | 3673 {"text/x-vcard", 0, DRAG_VCARD }, |
9525 | 3674 {"text/uri-list", 0, DRAG_URI}, |
3675 {"text/plain", 0, DRAG_TEXT}}; | |
9556 | 3676 GtkTargetEntry ste[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, |
3677 {"application/x-im-contact", 0, DRAG_BUDDY}, | |
3678 {"text/x-vcard", 0, DRAG_VCARD }}; | |
5228 | 3679 if (gtkblist && gtkblist->window) { |
12119
312efb43c49a
[gaim-migrate @ 14419]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12117
diff
changeset
|
3680 gaim_blist_set_visible(gaim_prefs_get_bool("/gaim/gtk/blist/list_visible")); |
5228 | 3681 return; |
3682 } | |
3683 | |
3684 gtkblist = GAIM_GTK_BLIST(list); | |
3685 | |
3686 gtkblist->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
3687 gtk_window_set_role(GTK_WINDOW(gtkblist->window), "buddy_list"); | |
9746 | 3688 gtk_window_set_title(GTK_WINDOW(gtkblist->window), _("Buddy List")); |
12328 | 3689 GTK_WINDOW(gtkblist->window)->allow_shrink = TRUE; |
5228 | 3690 |
3691 gtkblist->vbox = gtk_vbox_new(FALSE, 0); | |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3692 gtk_widget_show(gtkblist->vbox); |
5228 | 3693 gtk_container_add(GTK_CONTAINER(gtkblist->window), gtkblist->vbox); |
3694 | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
3695 g_signal_connect(G_OBJECT(gtkblist->window), "delete_event", G_CALLBACK(gtk_blist_delete_cb), NULL); |
5228 | 3696 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
|
3697 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
|
3698 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
|
3699 g_signal_connect(G_OBJECT(gtkblist->window), "key_press_event", G_CALLBACK(gtk_blist_window_key_press_cb), gtkblist); |
5228 | 3700 gtk_widget_add_events(gtkblist->window, GDK_VISIBILITY_NOTIFY_MASK); |
3701 | |
3702 /******************************* Menu bar *************************************/ | |
3703 accel_group = gtk_accel_group_new(); | |
3704 gtk_window_add_accel_group(GTK_WINDOW (gtkblist->window), accel_group); | |
3705 g_object_unref(accel_group); | |
5427 | 3706 gtkblist->ift = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<GaimMain>", accel_group); |
9811 | 3707 gtk_item_factory_set_translate_func(gtkblist->ift, |
13106
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
3708 (GtkTranslateFunc)item_factory_translate_func, |
9811 | 3709 NULL, NULL); |
5427 | 3710 gtk_item_factory_create_items(gtkblist->ift, sizeof(blist_menu) / sizeof(*blist_menu), |
9811 | 3711 blist_menu, NULL); |
7620 | 3712 gaim_gtk_load_accels(); |
3713 g_signal_connect(G_OBJECT(accel_group), "accel-changed", | |
3714 G_CALLBACK(gaim_gtk_save_accels_cb), NULL); | |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3715 menu = gtk_item_factory_get_widget(gtkblist->ift, "<GaimMain>"); |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3716 gtkblist->menutray = gaim_gtk_menu_tray_new(); |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3717 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtkblist->menutray); |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3718 gtk_widget_show(gtkblist->menutray); |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3719 gtk_widget_show(menu); |
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3720 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), menu, FALSE, FALSE, 0); |
5228 | 3721 |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
3722 accountmenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Accounts")); |
10352 | 3723 |
5228 | 3724 /****************************** GtkTreeView **********************************/ |
3725 sw = gtk_scrolled_window_new(NULL,NULL); | |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3726 gtk_widget_show(sw); |
5228 | 3727 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); |
3728 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | |
3729 | |
7620 | 3730 gtkblist->treemodel = gtk_tree_store_new(BLIST_COLUMNS, |
11494 | 3731 GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN, |
11257 | 3732 G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER); |
5228 | 3733 |
3734 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
|
3735 gtk_widget_show(gtkblist->treeview); |
9176 | 3736 gtk_widget_set_name(gtkblist->treeview, "gaim_gtkblist_treeview"); |
5228 | 3737 |
3738 /* Set up selection stuff */ | |
3739 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview)); | |
3740 g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(gaim_gtk_blist_selection_changed), NULL); | |
3741 | |
3742 /* Set up dnd */ | |
7650 | 3743 gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(gtkblist->treeview), |
9811 | 3744 GDK_BUTTON1_MASK, ste, 3, |
3745 GDK_ACTION_COPY); | |
7650 | 3746 gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(gtkblist->treeview), |
9811 | 3747 dte, 5, |
3748 GDK_ACTION_COPY | GDK_ACTION_MOVE); | |
7636 | 3749 |
10544 | 3750 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-received", G_CALLBACK(gaim_gtk_blist_drag_data_rcv_cb), NULL); |
5228 | 3751 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
|
3752 #ifdef _WIN32 |
c86d423df757
[gaim-migrate @ 13012]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11038
diff
changeset
|
3753 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
|
3754 #endif |
10433 | 3755 |
10354 | 3756 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-motion", G_CALLBACK(gaim_gtk_blist_drag_motion_cb), NULL); |
5228 | 3757 |
3758 /* Tooltips */ | |
3759 g_signal_connect(G_OBJECT(gtkblist->treeview), "motion-notify-event", G_CALLBACK(gaim_gtk_blist_motion_cb), NULL); | |
3760 g_signal_connect(G_OBJECT(gtkblist->treeview), "leave-notify-event", G_CALLBACK(gaim_gtk_blist_leave_cb), NULL); | |
3761 | |
3762 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkblist->treeview), FALSE); | |
3763 | |
11016 | 3764 gtkblist->text_column = column = gtk_tree_view_column_new (); |
5228 | 3765 |
3766 rend = gtk_cell_renderer_pixbuf_new(); | |
9811 | 3767 gtk_tree_view_column_pack_start(column, rend, FALSE); |
3768 gtk_tree_view_column_set_attributes(column, rend, | |
3769 "pixbuf", STATUS_ICON_COLUMN, | |
3770 "visible", STATUS_ICON_VISIBLE_COLUMN, | |
3771 NULL); | |
5228 | 3772 g_object_set(rend, "xalign", 0.0, "ypad", 0, NULL); |
3773 | |
11016 | 3774 gtkblist->text_rend = rend = gtk_cell_renderer_text_new(); |
5228 | 3775 gtk_tree_view_column_pack_start (column, rend, TRUE); |
9811 | 3776 gtk_tree_view_column_set_attributes(column, rend, |
3777 "markup", NAME_COLUMN, | |
3778 NULL); | |
11016 | 3779 g_signal_connect(G_OBJECT(rend), "edited", G_CALLBACK(gtk_blist_renderer_edited_cb), NULL); |
5228 | 3780 g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); |
10285 | 3781 #if GTK_CHECK_VERSION(2,6,0) |
3782 gtk_tree_view_column_set_expand (column, TRUE); | |
10501 | 3783 g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
10285 | 3784 #endif |
5228 | 3785 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), column); |
3786 | |
3787 rend = gtk_cell_renderer_text_new(); | |
10351 | 3788 gtkblist->idle_column = gtk_tree_view_column_new_with_attributes("Idle", rend, "markup", IDLE_COLUMN, NULL); |
3789 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->idle_column); | |
5228 | 3790 g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL); |
3791 | |
3792 rend = gtk_cell_renderer_pixbuf_new(); | |
3793 gtkblist->buddy_icon_column = gtk_tree_view_column_new_with_attributes("Buddy Icon", rend, "pixbuf", BUDDY_ICON_COLUMN, NULL); | |
3794 g_object_set(rend, "xalign", 1.0, "ypad", 0, NULL); | |
3795 gtk_tree_view_append_column(GTK_TREE_VIEW(gtkblist->treeview), gtkblist->buddy_icon_column); | |
3796 | |
3797 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-activated", G_CALLBACK(gtk_blist_row_activated_cb), NULL); | |
3798 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-expanded", G_CALLBACK(gtk_blist_row_expanded_cb), NULL); | |
3799 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-collapsed", G_CALLBACK(gtk_blist_row_collapsed_cb), NULL); | |
3800 g_signal_connect(G_OBJECT(gtkblist->treeview), "button-press-event", G_CALLBACK(gtk_blist_button_press_cb), NULL); | |
7620 | 3801 g_signal_connect(G_OBJECT(gtkblist->treeview), "key-press-event", G_CALLBACK(gtk_blist_key_press_cb), NULL); |
8143 | 3802 g_signal_connect(G_OBJECT(gtkblist->treeview), "popup-menu", G_CALLBACK(gaim_gtk_blist_popup_menu_cb), NULL); |
5228 | 3803 |
5419 | 3804 /* Enable CTRL+F searching */ |
3805 gtk_tree_view_set_search_column(GTK_TREE_VIEW(gtkblist->treeview), NAME_COLUMN); | |
10433 | 3806 gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(gtkblist->treeview), _search_func, NULL, NULL); |
5419 | 3807 |
12583 | 3808 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), sw, TRUE, TRUE, 0); |
5228 | 3809 gtk_container_add(GTK_CONTAINER(sw), gtkblist->treeview); |
3810 gaim_gtk_blist_update_columns(); | |
3811 | |
13015 | 3812 /* Create an empty vbox used for showing connection errors */ |
3813 gtkblist->error_buttons = gtk_vbox_new(FALSE, 0); | |
3814 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->error_buttons, FALSE, FALSE, 0); | |
3815 | |
3816 /* Add the statusbox */ | |
12583 | 3817 gtkblist->statusbox = gtk_gaim_status_box_new(); |
12592
37160dd563fa
[gaim-migrate @ 14922]
Richard Laager <rlaager@wiktel.com>
parents:
12589
diff
changeset
|
3818 gtk_widget_set_name(gtkblist->statusbox, "gaim_gtkblist_statusbox"); |
12656 | 3819 |
12583 | 3820 gtk_widget_show(gtkblist->statusbox); |
3821 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->statusbox, FALSE, TRUE, 0); | |
12656 | 3822 |
10178
96a850ab30c8
[gaim-migrate @ 11293]
Christian Hammond <chipx86@chipx86.com>
parents:
10144
diff
changeset
|
3823 |
5228 | 3824 /* set the Show Offline Buddies option. must be done |
3825 * after the treeview or faceprint gets mad. -Robot101 | |
3826 */ | |
5427 | 3827 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show Offline Buddies"))), |
7620 | 3828 gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")); |
12656 | 3829 |
5427 | 3830 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show Empty Groups"))), |
7620 | 3831 gaim_prefs_get_bool("/gaim/gtk/blist/show_empty_groups")); |
12656 | 3832 |
10074 | 3833 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Tools/Mute Sounds"))), |
3834 gaim_prefs_get_bool("/gaim/gtk/sound/mute")); | |
12656 | 3835 |
11796 | 3836 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show Buddy Details"))), |
11920 | 3837 gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")); |
12656 | 3838 |
3839 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item (gtkblist->ift, N_("/Buddies/Show Idle Times"))), | |
3840 gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time")); | |
3841 | |
10074 | 3842 if(!strcmp(gaim_prefs_get_string("/gaim/gtk/sound/method"), "none")) |
11494 | 3843 gtk_widget_set_sensitive(gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools/Mute Sounds")), FALSE); |
5228 | 3844 |
10353 | 3845 /* Update some dynamic things */ |
3846 update_menu_bar(gtkblist); | |
3847 gaim_gtk_blist_update_plugin_actions(); | |
11796 | 3848 gaim_gtk_blist_update_sort_methods(); |
10353 | 3849 |
5228 | 3850 /* OK... let's show this bad boy. */ |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
3851 gaim_gtk_blist_refresh(list); |
12119
312efb43c49a
[gaim-migrate @ 14419]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12117
diff
changeset
|
3852 gaim_gtk_blist_restore_position(); |
312efb43c49a
[gaim-migrate @ 14419]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12117
diff
changeset
|
3853 gtk_widget_show_all(GTK_WIDGET(gtkblist->window)); |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
3854 gaim_blist_set_visible(gaim_prefs_get_bool("/gaim/gtk/blist/list_visible")); |
5228 | 3855 |
3856 /* start the refresh timer */ | |
10351 | 3857 gtkblist->refresh_timer = g_timeout_add(30000, (GSourceFunc)gaim_gtk_blist_refresh_timer, list); |
10353 | 3858 |
10087 | 3859 handle = gaim_gtk_blist_get_handle(); |
3860 | |
7620 | 3861 /* things that affect how buddies are displayed */ |
10087 | 3862 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_buddy_icons", |
3863 _prefs_change_redo_list, NULL); | |
12656 | 3864 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_idle_time", |
3865 _prefs_change_redo_list, NULL); | |
10087 | 3866 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_empty_groups", |
3867 _prefs_change_redo_list, NULL); | |
3868 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_offline_buddies", | |
3869 _prefs_change_redo_list, NULL); | |
7620 | 3870 |
3871 /* sorting */ | |
10087 | 3872 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/sort_type", |
3873 _prefs_change_sort_method, NULL); | |
7620 | 3874 |
3875 /* things that affect what columns are displayed */ | |
10087 | 3876 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_buddy_icons", |
12326 | 3877 show_buddy_icons_pref_cb, NULL); |
12656 | 3878 gaim_prefs_connect_callback(handle, "/gaim/gtk/blist/show_idle_time", |
3879 show_buddy_icons_pref_cb, NULL); | |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3880 |
10074 | 3881 /* menus */ |
10087 | 3882 gaim_prefs_connect_callback(handle, "/gaim/gtk/sound/mute", |
3883 gaim_gtk_blist_mute_pref_cb, NULL); | |
3884 gaim_prefs_connect_callback(handle, "/gaim/gtk/sound/method", | |
3885 gaim_gtk_blist_sound_method_pref_cb, NULL); | |
10074 | 3886 |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
3887 /* Setup some gaim signal handlers. */ |
12522
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3888 gaim_signal_connect(gaim_accounts_get_handle(), "account-enabled", |
12583 | 3889 gtkblist, GAIM_CALLBACK(account_modified), gtkblist); |
12070 | 3890 gaim_signal_connect(gaim_accounts_get_handle(), "account-disabled", |
12583 | 3891 gtkblist, GAIM_CALLBACK(account_modified), gtkblist); |
12226 | 3892 gaim_signal_connect(gaim_accounts_get_handle(), "account-removed", |
12583 | 3893 gtkblist, GAIM_CALLBACK(account_modified), gtkblist); |
12766 | 3894 gaim_signal_connect(gaim_accounts_get_handle(), "account-status-changed", |
3895 gtkblist, GAIM_CALLBACK(account_status_changed), gtkblist); | |
12522
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3896 |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3897 gaim_signal_connect(gaim_gtk_account_get_handle(), "account-modified", |
560ddc8d26f3
[gaim-migrate @ 14834]
Richard Laager <rlaager@wiktel.com>
parents:
12519
diff
changeset
|
3898 gtkblist, GAIM_CALLBACK(account_modified), gtkblist); |
12070 | 3899 |
8937 | 3900 gaim_signal_connect(gaim_connections_get_handle(), "signed-on", |
3901 gtkblist, GAIM_CALLBACK(sign_on_off_cb), list); | |
3902 gaim_signal_connect(gaim_connections_get_handle(), "signed-off", | |
3903 gtkblist, GAIM_CALLBACK(sign_on_off_cb), list); | |
8815 | 3904 |
8986 | 3905 gaim_signal_connect(gaim_plugins_get_handle(), "plugin-load", |
3906 gtkblist, GAIM_CALLBACK(plugin_changed_cb), NULL); | |
3907 gaim_signal_connect(gaim_plugins_get_handle(), "plugin-unload", | |
3908 gtkblist, GAIM_CALLBACK(plugin_changed_cb), NULL); | |
3909 | |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3910 gaim_signal_connect(gaim_conversations_get_handle(), "conversation-updated", |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3911 gtkblist, GAIM_CALLBACK(conversation_updated_cb), |
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3912 gtkblist); |
12208 | 3913 gaim_signal_connect(gaim_conversations_get_handle(), "deleting-conversation", |
3914 gtkblist, GAIM_CALLBACK(conversation_deleting_cb), | |
3915 gtkblist); | |
12116
e75ef7aa913e
[gaim-migrate @ 14416]
Luke Schierer <lschiere@pidgin.im>
parents:
12115
diff
changeset
|
3916 |
8815 | 3917 /* emit our created signal */ |
10087 | 3918 gaim_signal_emit(handle, "gtkblist-created", list); |
5228 | 3919 } |
3920 | |
7620 | 3921 static void redo_buddy_list(GaimBuddyList *list, gboolean remove) |
5228 | 3922 { |
12112 | 3923 GaimBlistNode *node = list->root; |
3924 | |
3925 while (node) | |
3926 { | |
13889 | 3927 if (remove && !GAIM_BLIST_NODE_IS_GROUP(node)) |
12112 | 3928 gaim_gtk_blist_hide_node(list, node); |
3929 | |
3930 gaim_gtk_blist_update(list, node); | |
3931 node = gaim_blist_node_next(node, FALSE); | |
5228 | 3932 } |
3933 } | |
3934 | |
7620 | 3935 void gaim_gtk_blist_refresh(GaimBuddyList *list) |
5422 | 3936 { |
3937 redo_buddy_list(list, FALSE); | |
3938 } | |
3939 | |
5297 | 3940 void |
3941 gaim_gtk_blist_update_refresh_timeout() | |
3942 { | |
7620 | 3943 GaimBuddyList *blist; |
3944 GaimGtkBuddyList *gtkblist; | |
5297 | 3945 |
3946 blist = gaim_get_blist(); | |
3947 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
3948 | |
10351 | 3949 gtkblist->refresh_timer = g_timeout_add(30000,(GSourceFunc)gaim_gtk_blist_refresh_timer, blist); |
5297 | 3950 } |
3951 | |
5256 | 3952 static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter) { |
3953 struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
3954 GtkTreePath *path; | |
5228 | 3955 |
5263 | 3956 if (!gtknode) { |
3957 return FALSE; | |
3958 } | |
3959 | |
3960 if (!gtkblist) { | |
10006 | 3961 gaim_debug_error("gtkblist", "get_iter_from_node was called, but we don't seem to have a blist\n"); |
5263 | 3962 return FALSE; |
3963 } | |
3964 | |
3965 if (!gtknode->row) | |
5228 | 3966 return FALSE; |
11494 | 3967 |
5228 | 3968 |
5256 | 3969 if ((path = gtk_tree_row_reference_get_path(gtknode->row)) == NULL) |
5228 | 3970 return FALSE; |
11016 | 3971 |
5256 | 3972 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), iter, path)) { |
3973 gtk_tree_path_free(path); | |
3974 return FALSE; | |
3975 } | |
3976 gtk_tree_path_free(path); | |
3977 return TRUE; | |
5228 | 3978 } |
3979 | |
7620 | 3980 static void gaim_gtk_blist_remove(GaimBuddyList *list, GaimBlistNode *node) |
5228 | 3981 { |
11910 | 3982 struct _gaim_gtk_blist_node *gtknode = node->ui_data; |
3983 | |
10222 | 3984 gaim_request_close_with_handle(node); |
3985 | |
5260 | 3986 gaim_gtk_blist_hide_node(list, node); |
5228 | 3987 |
7620 | 3988 if(node->parent) |
3989 gaim_gtk_blist_update(list, node->parent); | |
3990 | |
10504 | 3991 /* There's something I don't understand here - Ethan */ |
3992 /* Ethan said that back in 2003, but this g_free has been left commented | |
3993 * out ever since. I can't find any reason at all why this is bad and | |
3994 * valgrind found several reasons why it's good. If this causes problems | |
3995 * comment it out again. Stu */ | |
10510 | 3996 /* Of course it still causes problems - this breaks dragging buddies into |
10515 | 3997 * contacts, the dragged buddy mysteriously 'disappears'. Stu. */ |
3998 /* I think it's fixed now. Stu. */ | |
11910 | 3999 |
11915 | 4000 if(gtknode) { |
4001 if(gtknode->recent_signonoff_timer > 0) | |
4002 gaim_timeout_remove(gtknode->recent_signonoff_timer); | |
4003 | |
4004 g_free(node->ui_data); | |
4005 node->ui_data = NULL; | |
4006 } | |
5228 | 4007 } |
4008 | |
4009 static gboolean do_selection_changed(GaimBlistNode *new_selection) | |
4010 { | |
5254 | 4011 GaimBlistNode *old_selection = NULL; |
5228 | 4012 |
5254 | 4013 /* test for gtkblist because crazy timeout means we can be called after the blist is gone */ |
4014 if (gtkblist && new_selection != gtkblist->selected_node) { | |
4015 old_selection = gtkblist->selected_node; | |
5228 | 4016 gtkblist->selected_node = new_selection; |
4017 if(new_selection) | |
4018 gaim_gtk_blist_update(NULL, new_selection); | |
4019 if(old_selection) | |
4020 gaim_gtk_blist_update(NULL, old_selection); | |
4021 } | |
4022 | |
4023 return FALSE; | |
4024 } | |
4025 | |
4026 static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data) | |
4027 { | |
4028 GaimBlistNode *new_selection = NULL; | |
4029 GtkTreeIter iter; | |
4030 | |
4031 if(gtk_tree_selection_get_selected(selection, NULL, &iter)){ | |
4032 gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, | |
4033 NODE_COLUMN, &new_selection, -1); | |
4034 } | |
5254 | 4035 |
5228 | 4036 /* we set this up as a timeout, otherwise the blist flickers */ |
4037 g_timeout_add(0, (GSourceFunc)do_selection_changed, new_selection); | |
4038 } | |
4039 | |
8252 | 4040 static gboolean insert_node(GaimBuddyList *list, GaimBlistNode *node, GtkTreeIter *iter) |
7620 | 4041 { |
4042 GtkTreeIter parent_iter, cur, *curptr = NULL; | |
4043 struct _gaim_gtk_blist_node *gtknode = node->ui_data; | |
5256 | 4044 GtkTreePath *newpath; |
7620 | 4045 |
10515 | 4046 if(!iter) |
8252 | 4047 return FALSE; |
7620 | 4048 |
4049 if(node->parent && !get_iter_from_node(node->parent, &parent_iter)) | |
8252 | 4050 return FALSE; |
7620 | 4051 |
4052 if(get_iter_from_node(node, &cur)) | |
4053 curptr = &cur; | |
4054 | |
4055 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
|
4056 current_sort_method->func(node, list, parent_iter, curptr, iter); |
7620 | 4057 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
4058 sort_method_none(node, list, parent_iter, curptr, iter); |
5228 | 4059 } |
4060 | |
10515 | 4061 if(gtknode != NULL) { |
4062 gtk_tree_row_reference_free(gtknode->row); | |
4063 } else { | |
4064 gaim_gtk_blist_new_node(node); | |
4065 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; | |
4066 } | |
4067 | |
7620 | 4068 newpath = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), |
4069 iter); | |
4070 gtknode->row = | |
4071 gtk_tree_row_reference_new(GTK_TREE_MODEL(gtkblist->treemodel), | |
4072 newpath); | |
11494 | 4073 |
5256 | 4074 gtk_tree_path_free(newpath); |
4075 | |
5228 | 4076 gtk_tree_store_set(gtkblist->treemodel, iter, |
4077 NODE_COLUMN, node, | |
4078 -1); | |
7620 | 4079 |
4080 if(node->parent) { | |
4081 GtkTreePath *expand = NULL; | |
4082 struct _gaim_gtk_blist_node *gtkparentnode = node->parent->ui_data; | |
4083 | |
4084 if(GAIM_BLIST_NODE_IS_GROUP(node->parent)) { | |
7693 | 4085 if(!gaim_blist_node_get_bool(node->parent, "collapsed")) |
7620 | 4086 expand = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &parent_iter); |
4087 } else if(GAIM_BLIST_NODE_IS_CONTACT(node->parent) && | |
4088 gtkparentnode->contact_expanded) { | |
4089 expand = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &parent_iter); | |
4090 } | |
4091 if(expand) { | |
7693 | 4092 gtk_tree_view_expand_row(GTK_TREE_VIEW(gtkblist->treeview), expand, FALSE); |
7620 | 4093 gtk_tree_path_free(expand); |
4094 } | |
4095 } | |
4096 | |
8252 | 4097 return TRUE; |
5228 | 4098 } |
4099 | |
13889 | 4100 /*This version of gaim_gtk_blist_update_group can take the original buddy |
4101 or a group, but has much better algorithmic performance with a pre-known buddy*/ | |
7620 | 4102 static void gaim_gtk_blist_update_group(GaimBuddyList *list, GaimBlistNode *node) |
4103 { | |
4104 GaimGroup *group; | |
8203 | 4105 int count; |
12341 | 4106 gboolean show = FALSE; |
13889 | 4107 GaimBlistNode* gnode; |
4108 | |
13920 | 4109 g_return_if_fail(node != NULL); |
13889 | 4110 |
4111 if (GAIM_BLIST_NODE_IS_GROUP(node)) | |
4112 gnode = node; | |
13921 | 4113 else if (GAIM_BLIST_NODE_IS_BUDDY(node)) |
13889 | 4114 gnode = node->parent->parent; |
13921 | 4115 else if (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_CHAT(node)) |
13889 | 4116 gnode = node->parent; |
13920 | 4117 else |
4118 return; | |
13889 | 4119 |
4120 group = (GaimGroup*)gnode; | |
7620 | 4121 |
8203 | 4122 if(gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")) |
4123 count = gaim_blist_get_group_size(group, FALSE); | |
4124 else | |
4125 count = gaim_blist_get_group_online_count(group); | |
13195 | 4126 |
12341 | 4127 if (count > 0 || gaim_prefs_get_bool("/gaim/gtk/blist/show_empty_groups")) |
4128 show = TRUE; | |
13889 | 4129 else if (GAIM_BLIST_NODE_IS_BUDDY(node)){ /* Or chat? */ |
4130 if (buddy_is_displayable((GaimBuddy*)node)) | |
4131 show = TRUE;} | |
12341 | 4132 |
4133 if (show) { | |
7620 | 4134 char *mark, *esc; |
4135 GtkTreeIter iter; | |
4136 | |
13889 | 4137 if(!insert_node(list, gnode, &iter)) |
8252 | 4138 return; |
7620 | 4139 |
4140 esc = g_markup_escape_text(group->name, -1); | |
8945 | 4141 mark = g_strdup_printf("<span weight='bold'>%s</span> (%d/%d)", |
4142 esc, gaim_blist_get_group_online_count(group), | |
4143 gaim_blist_get_group_size(group, FALSE)); | |
7620 | 4144 g_free(esc); |
4145 | |
4146 gtk_tree_store_set(gtkblist->treemodel, &iter, | |
4147 STATUS_ICON_COLUMN, NULL, | |
4148 STATUS_ICON_VISIBLE_COLUMN, FALSE, | |
4149 NAME_COLUMN, mark, | |
13889 | 4150 NODE_COLUMN, gnode, |
7620 | 4151 -1); |
4152 g_free(mark); | |
4153 } else { | |
13889 | 4154 gaim_gtk_blist_hide_node(list, gnode); |
7620 | 4155 } |
4156 } | |
4157 | |
4158 static void buddy_node(GaimBuddy *buddy, GtkTreeIter *iter, GaimBlistNode *node) | |
5228 | 4159 { |
9944 | 4160 GaimPresence *presence; |
7620 | 4161 GdkPixbuf *status, *avatar; |
4162 char *mark; | |
11257 | 4163 char *idle = NULL; |
7620 | 4164 gboolean selected = (gtkblist->selected_node == node); |
4165 | |
9944 | 4166 presence = gaim_buddy_get_presence(buddy); |
4167 | |
7620 | 4168 status = gaim_gtk_blist_get_status_icon((GaimBlistNode*)buddy, |
4169 (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") | |
4170 ? GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); | |
4171 | |
10482 | 4172 avatar = gaim_gtk_blist_get_buddy_icon((GaimBlistNode *)buddy, TRUE, TRUE); |
7620 | 4173 mark = gaim_gtk_blist_get_name_markup(buddy, selected); |
4174 | |
12656 | 4175 if (gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time") && |
13889 | 4176 gaim_presence_is_idle(presence) && |
4177 !gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) | |
9944 | 4178 { |
4179 time_t idle_secs = gaim_presence_get_idle_time(presence); | |
4180 | |
4181 if (idle_secs > 0) | |
4182 { | |
4183 time_t t; | |
4184 int ihrs, imin; | |
4185 time(&t); | |
4186 ihrs = (t - idle_secs) / 3600; | |
4187 imin = ((t - idle_secs) / 60) % 60; | |
13819
f41a515307a9
[gaim-migrate @ 16251]
Richard Laager <rlaager@wiktel.com>
parents:
13790
diff
changeset
|
4188 idle = g_strdup_printf("%d:%02d", ihrs, imin); |
9944 | 4189 } |
7620 | 4190 } |
4191 | |
10118 | 4192 if (gaim_presence_is_idle(presence)) |
9944 | 4193 { |
4194 if (idle && !selected) { | |
10118 | 4195 char *i2 = g_strdup_printf("<span color='%s'>%s</span>", |
4196 dim_grey(), idle); | |
7620 | 4197 g_free(idle); |
4198 idle = i2; | |
5228 | 4199 } |
7620 | 4200 } |
4201 | |
4202 gtk_tree_store_set(gtkblist->treemodel, iter, | |
4203 STATUS_ICON_COLUMN, status, | |
4204 STATUS_ICON_VISIBLE_COLUMN, TRUE, | |
4205 NAME_COLUMN, mark, | |
4206 IDLE_COLUMN, idle, | |
4207 BUDDY_ICON_COLUMN, avatar, | |
4208 -1); | |
4209 | |
4210 g_free(mark); | |
12656 | 4211 g_free(idle); |
7620 | 4212 if(status) |
4213 g_object_unref(status); | |
4214 if(avatar) | |
4215 g_object_unref(avatar); | |
4216 } | |
4217 | |
13889 | 4218 /* This is a variation on the original gtk_blist_update_contact. Here we |
4219 can know in advance which buddy has changed so we can just update that */ | |
7620 | 4220 static void gaim_gtk_blist_update_contact(GaimBuddyList *list, GaimBlistNode *node) |
4221 { | |
13889 | 4222 GaimBlistNode *cnode; |
7620 | 4223 GaimContact *contact; |
4224 GaimBuddy *buddy; | |
4225 struct _gaim_gtk_blist_node *gtknode; | |
4226 | |
13889 | 4227 if (GAIM_BLIST_NODE_IS_BUDDY(node)) |
4228 cnode = node->parent; | |
4229 else | |
4230 cnode = node; | |
4231 | |
4232 g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT(cnode)); | |
7620 | 4233 |
4234 /* First things first, update the group */ | |
13889 | 4235 if (GAIM_BLIST_NODE_IS_BUDDY(node)) |
4236 gaim_gtk_blist_update_group(list, node); | |
4237 else | |
4238 gaim_gtk_blist_update_group(list, cnode->parent); | |
4239 | |
4240 contact = (GaimContact*)cnode; | |
7620 | 4241 buddy = gaim_contact_get_priority_buddy(contact); |
13889 | 4242 |
11890 | 4243 if (buddy_is_displayable(buddy)) |
10006 | 4244 { |
7620 | 4245 GtkTreeIter iter; |
4246 | |
13889 | 4247 if(!insert_node(list, cnode, &iter)) |
8252 | 4248 return; |
7620 | 4249 |
13889 | 4250 gtknode = (struct _gaim_gtk_blist_node *)cnode->ui_data; |
10515 | 4251 |
7620 | 4252 if(gtknode->contact_expanded) { |
4253 GdkPixbuf *status; | |
5228 | 4254 char *mark; |
4255 | |
13889 | 4256 status = gaim_gtk_blist_get_status_icon(cnode, |
7620 | 4257 (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") ? |
4258 GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); | |
4259 | |
4260 mark = g_markup_escape_text(gaim_contact_get_alias(contact), -1); | |
4261 | |
5228 | 4262 gtk_tree_store_set(gtkblist->treemodel, &iter, |
7620 | 4263 STATUS_ICON_COLUMN, status, |
4264 STATUS_ICON_VISIBLE_COLUMN, TRUE, | |
5228 | 4265 NAME_COLUMN, mark, |
7620 | 4266 IDLE_COLUMN, NULL, |
4267 BUDDY_ICON_COLUMN, NULL, | |
5228 | 4268 -1); |
4269 g_free(mark); | |
7620 | 4270 if(status) |
4271 g_object_unref(status); | |
4272 } else { | |
13889 | 4273 buddy_node(buddy, &iter, cnode); |
5228 | 4274 } |
7620 | 4275 } else { |
13889 | 4276 gaim_gtk_blist_hide_node(list, cnode); |
5228 | 4277 } |
7620 | 4278 } |
4279 | |
13889 | 4280 |
4281 | |
7620 | 4282 static void gaim_gtk_blist_update_buddy(GaimBuddyList *list, GaimBlistNode *node) |
4283 { | |
4284 GaimBuddy *buddy; | |
4285 struct _gaim_gtk_blist_node *gtkparentnode; | |
4286 | |
4287 g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); | |
4288 | |
13889 | 4289 if (node->parent == NULL) |
4290 return; | |
4291 | |
7620 | 4292 buddy = (GaimBuddy*)node; |
13889 | 4293 |
7620 | 4294 /* First things first, update the contact */ |
13889 | 4295 gaim_gtk_blist_update_contact(list, node); |
7620 | 4296 |
10918 | 4297 gtkparentnode = (struct _gaim_gtk_blist_node *)node->parent->ui_data; |
4298 | |
12341 | 4299 if (gtkparentnode->contact_expanded && buddy_is_displayable(buddy)) |
10006 | 4300 { |
7620 | 4301 GtkTreeIter iter; |
4302 | |
10006 | 4303 if (!insert_node(list, node, &iter)) |
8252 | 4304 return; |
4305 | |
7620 | 4306 buddy_node(buddy, &iter, node); |
4307 | |
4308 } else { | |
4309 gaim_gtk_blist_hide_node(list, node); | |
4310 } | |
4311 | |
4312 } | |
4313 | |
4314 static void gaim_gtk_blist_update_chat(GaimBuddyList *list, GaimBlistNode *node) | |
4315 { | |
4316 GaimChat *chat; | |
4317 | |
4318 g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT(node)); | |
4319 | |
4320 /* First things first, update the group */ | |
4321 gaim_gtk_blist_update_group(list, node->parent); | |
4322 | |
4323 chat = (GaimChat*)node; | |
4324 | |
4325 if(gaim_account_is_connected(chat->account)) { | |
4326 GtkTreeIter iter; | |
5234 | 4327 GdkPixbuf *status; |
7620 | 4328 char *mark; |
4329 | |
8252 | 4330 if(!insert_node(list, node, &iter)) |
4331 return; | |
5234 | 4332 |
4333 status = gaim_gtk_blist_get_status_icon(node, | |
7620 | 4334 (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") ? |
4335 GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); | |
4336 | |
4337 mark = g_markup_escape_text(gaim_chat_get_name(chat), -1); | |
5234 | 4338 |
4339 gtk_tree_store_set(gtkblist->treemodel, &iter, | |
7620 | 4340 STATUS_ICON_COLUMN, status, |
4341 STATUS_ICON_VISIBLE_COLUMN, TRUE, | |
4342 NAME_COLUMN, mark, | |
4343 -1); | |
5228 | 4344 |
4345 g_free(mark); | |
7620 | 4346 if(status) |
5228 | 4347 g_object_unref(status); |
7620 | 4348 } else { |
5260 | 4349 gaim_gtk_blist_hide_node(list, node); |
5228 | 4350 } |
7620 | 4351 } |
4352 | |
4353 static void gaim_gtk_blist_update(GaimBuddyList *list, GaimBlistNode *node) | |
4354 { | |
12797
eda1572c788b
[gaim-migrate @ 15144]
Richard Laager <rlaager@wiktel.com>
parents:
12766
diff
changeset
|
4355 if(!gtkblist || !node) |
7620 | 4356 return; |
4357 | |
13195 | 4358 if (node->ui_data == NULL) |
4359 gaim_gtk_blist_new_node(node); | |
4360 | |
7620 | 4361 switch(node->type) { |
4362 case GAIM_BLIST_GROUP_NODE: | |
4363 gaim_gtk_blist_update_group(list, node); | |
4364 break; | |
4365 case GAIM_BLIST_CONTACT_NODE: | |
4366 gaim_gtk_blist_update_contact(list, node); | |
4367 break; | |
4368 case GAIM_BLIST_BUDDY_NODE: | |
4369 gaim_gtk_blist_update_buddy(list, node); | |
4370 break; | |
4371 case GAIM_BLIST_CHAT_NODE: | |
4372 gaim_gtk_blist_update_chat(list, node); | |
4373 break; | |
4374 case GAIM_BLIST_OTHER_NODE: | |
4375 return; | |
4376 } | |
5234 | 4377 |
13146
a3c1112bb190
[gaim-migrate @ 15509]
Richard Laager <rlaager@wiktel.com>
parents:
13140
diff
changeset
|
4378 #if !GTK_CHECK_VERSION(2,6,0) |
5228 | 4379 gtk_tree_view_columns_autosize(GTK_TREE_VIEW(gtkblist->treeview)); |
13146
a3c1112bb190
[gaim-migrate @ 15509]
Richard Laager <rlaager@wiktel.com>
parents:
13140
diff
changeset
|
4380 #endif |
5228 | 4381 } |
4382 | |
7620 | 4383 |
4384 static void gaim_gtk_blist_destroy(GaimBuddyList *list) | |
5228 | 4385 { |
4386 if (!gtkblist) | |
4387 return; | |
4388 | |
8937 | 4389 gaim_signal_disconnect(gaim_connections_get_handle(), "signed-on", |
4390 gtkblist, GAIM_CALLBACK(sign_on_off_cb)); | |
4391 gaim_signal_disconnect(gaim_connections_get_handle(), "signed-off", | |
4392 gtkblist, GAIM_CALLBACK(sign_on_off_cb)); | |
8259
4f9f68ab8770
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8254
diff
changeset
|
4393 |
5228 | 4394 gtk_widget_destroy(gtkblist->window); |
7620 | 4395 |
8254 | 4396 gaim_gtk_blist_tooltip_destroy(); |
7620 | 4397 |
5228 | 4398 if (gtkblist->refresh_timer) |
4399 g_source_remove(gtkblist->refresh_timer); | |
4400 if (gtkblist->timeout) | |
4401 g_source_remove(gtkblist->timeout); | |
10354 | 4402 if (gtkblist->drag_timeout) |
4403 g_source_remove(gtkblist->drag_timeout); | |
5228 | 4404 |
13015 | 4405 g_hash_table_destroy(gtkblist->connection_errors); |
5228 | 4406 gtkblist->refresh_timer = 0; |
4407 gtkblist->timeout = 0; | |
10354 | 4408 gtkblist->drag_timeout = 0; |
5228 | 4409 gtkblist->window = gtkblist->vbox = gtkblist->treeview = NULL; |
4410 gtkblist->treemodel = NULL; | |
4411 gtkblist->idle_column = NULL; | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
4412 gtkblist->buddy_icon_column = NULL; |
5427 | 4413 g_object_unref(G_OBJECT(gtkblist->ift)); |
13015 | 4414 g_free(gtkblist); |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
4415 accountmenu = NULL; |
5228 | 4416 gtkblist = NULL; |
7620 | 4417 |
10087 | 4418 gaim_prefs_disconnect_by_handle(gaim_gtk_blist_get_handle()); |
5228 | 4419 } |
4420 | |
7620 | 4421 static void gaim_gtk_blist_set_visible(GaimBuddyList *list, gboolean show) |
5228 | 4422 { |
4423 if (!(gtkblist && gtkblist->window)) | |
4424 return; | |
10325 | 4425 |
5228 | 4426 if (show) { |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4427 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
|
4428 gaim_signal_emit(gaim_gtk_blist_get_handle(), "gtkblist-unhiding", gtkblist); |
5228 | 4429 gaim_gtk_blist_restore_position(); |
4430 gtk_window_present(GTK_WINDOW(gtkblist->window)); | |
4431 } else { | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4432 if(visibility_manager_count) { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4433 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
|
4434 gtk_widget_hide(gtkblist->window); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4435 } else { |
12479
53e2dc07d9e2
[gaim-migrate @ 14790]
Richard Laager <rlaager@wiktel.com>
parents:
12478
diff
changeset
|
4436 if (!GTK_WIDGET_VISIBLE(gtkblist->window)) |
53e2dc07d9e2
[gaim-migrate @ 14790]
Richard Laager <rlaager@wiktel.com>
parents:
12478
diff
changeset
|
4437 gtk_widget_show(gtkblist->window); |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4438 gtk_window_iconify(GTK_WINDOW(gtkblist->window)); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
4439 } |
5228 | 4440 } |
4441 } | |
4442 | |
7620 | 4443 static GList * |
4444 groups_tree(void) | |
4445 { | |
4446 GList *tmp = NULL; | |
4447 char *tmp2; | |
4448 GaimGroup *g; | |
4449 GaimBlistNode *gnode; | |
4450 | |
4451 if (gaim_get_blist()->root == NULL) | |
4452 { | |
4453 tmp2 = g_strdup(_("Buddies")); | |
4454 tmp = g_list_append(tmp, tmp2); | |
4455 } | |
4456 else | |
4457 { | |
4458 for (gnode = gaim_get_blist()->root; | |
4459 gnode != NULL; | |
4460 gnode = gnode->next) | |
4461 { | |
4462 if (GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
4463 { | |
4464 g = (GaimGroup *)gnode; | |
4465 tmp2 = g->name; | |
4466 tmp = g_list_append(tmp, tmp2); | |
4467 } | |
4468 } | |
4469 } | |
4470 | |
4471 return tmp; | |
4472 } | |
4473 | |
4474 static void | |
4475 add_buddy_select_account_cb(GObject *w, GaimAccount *account, | |
4476 GaimGtkAddBuddyData *data) | |
4477 { | |
4478 /* Save our account */ | |
4479 data->account = account; | |
4480 } | |
4481 | |
4482 static void | |
4483 destroy_add_buddy_dialog_cb(GtkWidget *win, GaimGtkAddBuddyData *data) | |
4484 { | |
4485 g_free(data); | |
4486 } | |
4487 | |
4488 static void | |
4489 add_buddy_cb(GtkWidget *w, int resp, GaimGtkAddBuddyData *data) | |
4490 { | |
4491 const char *grp, *who, *whoalias; | |
13880 | 4492 GaimGroup *g; |
7620 | 4493 GaimBuddy *b; |
13880 | 4494 GaimConversation *c; |
4495 GaimBuddyIcon *icon; | |
7620 | 4496 |
4497 if (resp == GTK_RESPONSE_OK) | |
4498 { | |
4499 who = gtk_entry_get_text(GTK_ENTRY(data->entry)); | |
4500 grp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(data->combo)->entry)); | |
4501 whoalias = gtk_entry_get_text(GTK_ENTRY(data->entry_for_alias)); | |
9658 | 4502 if (*whoalias == '\0') |
4503 whoalias = NULL; | |
7620 | 4504 |
4505 if ((g = gaim_find_group(grp)) == NULL) | |
4506 { | |
4507 g = gaim_group_new(grp); | |
4508 gaim_blist_add_group(g, NULL); | |
4509 } | |
4510 | |
4511 b = gaim_buddy_new(data->account, who, whoalias); | |
4512 gaim_blist_add_buddy(b, NULL, g, NULL); | |
11643 | 4513 gaim_account_add_buddy(data->account, b); |
7620 | 4514 |
7887 | 4515 /* |
9285 | 4516 * XXX |
11643 | 4517 * It really seems like it would be better if the call to |
4518 * gaim_account_add_buddy() and gaim_conversation_update() were done in | |
4519 * blist.c, possibly in the gaim_blist_add_buddy() function. Maybe | |
4520 * gaim_account_add_buddy() should be renamed to | |
4521 * gaim_blist_add_new_buddy() or something, and have it call | |
7887 | 4522 * gaim_blist_add_buddy() after it creates it. --Mark |
9285 | 4523 * |
4524 * No that's not good. blist.c should only deal with adding nodes to the | |
11643 | 4525 * local list. We need a new, non-gtk file that calls both |
4526 * gaim_account_add_buddy and gaim_blist_add_buddy(). | |
4527 * Or something. --Mark | |
7887 | 4528 */ |
4529 | |
11338 | 4530 c = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, who, data->account); |
7620 | 4531 if (c != NULL) { |
13880 | 4532 icon = gaim_conv_im_get_icon(GAIM_CONV_IM(c)); |
4533 if (icon != NULL) | |
4534 gaim_buddy_icon_update(icon); | |
7620 | 4535 } |
4536 } | |
4537 | |
4538 gtk_widget_destroy(data->window); | |
4539 } | |
4540 | |
4541 static void | |
4542 gaim_gtk_blist_request_add_buddy(GaimAccount *account, const char *username, | |
4543 const char *group, const char *alias) | |
4544 { | |
4545 GtkWidget *table; | |
4546 GtkWidget *label; | |
4547 GtkWidget *hbox; | |
4548 GtkWidget *vbox; | |
4549 GtkWidget *img; | |
4550 GaimGtkBuddyList *gtkblist; | |
4551 GaimGtkAddBuddyData *data = g_new0(GaimGtkAddBuddyData, 1); | |
4552 | |
4553 data->account = | |
4554 (account != NULL | |
4555 ? account | |
4556 : gaim_connection_get_account(gaim_connections_get_all()->data)); | |
4557 | |
4558 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, | |
4559 GTK_ICON_SIZE_DIALOG); | |
4560 | |
4561 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); | |
4562 | |
4563 data->window = gtk_dialog_new_with_buttons(_("Add Buddy"), | |
8975 | 4564 NULL, GTK_DIALOG_NO_SEPARATOR, |
7620 | 4565 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
4566 GTK_STOCK_ADD, GTK_RESPONSE_OK, | |
4567 NULL); | |
4568 | |
4569 gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); | |
11243 | 4570 gtk_container_set_border_width(GTK_CONTAINER(data->window), GAIM_HIG_BOX_SPACE); |
7620 | 4571 gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); |
11243 | 4572 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), GAIM_HIG_BORDER); |
4573 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), GAIM_HIG_BOX_SPACE); | |
7620 | 4574 gtk_window_set_role(GTK_WINDOW(data->window), "add_buddy"); |
8975 | 4575 gtk_window_set_type_hint(GTK_WINDOW(data->window), |
9811 | 4576 GDK_WINDOW_TYPE_HINT_DIALOG); |
7620 | 4577 |
11243 | 4578 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); |
7620 | 4579 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); |
4580 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
4581 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
4582 | |
4583 vbox = gtk_vbox_new(FALSE, 0); | |
4584 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
4585 | |
4586 label = gtk_label_new( | |
4587 _("Please enter the screen name of the person you would like " | |
4588 "to add to your buddy list. You may optionally enter an alias, " | |
4589 "or nickname, for the buddy. The alias will be displayed in " | |
4590 "place of the screen name whenever possible.\n")); | |
4591 | |
4592 gtk_widget_set_size_request(GTK_WIDGET(label), 400, -1); | |
4593 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
4594 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
4595 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
4596 | |
11243 | 4597 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); |
7620 | 4598 gtk_container_add(GTK_CONTAINER(vbox), hbox); |
4599 | |
4600 g_signal_connect(G_OBJECT(data->window), "destroy", | |
4601 G_CALLBACK(destroy_add_buddy_dialog_cb), data); | |
4602 | |
4603 table = gtk_table_new(4, 2, FALSE); | |
4604 gtk_table_set_row_spacings(GTK_TABLE(table), 5); | |
4605 gtk_table_set_col_spacings(GTK_TABLE(table), 5); | |
4606 gtk_container_set_border_width(GTK_CONTAINER(table), 0); | |
4607 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); | |
4608 | |
13545
cfc2f7fcb3dd
[gaim-migrate @ 15922]
Richard Laager <rlaager@wiktel.com>
parents:
13542
diff
changeset
|
4609 label = gtk_label_new(_("Screen name:")); |
7620 | 4610 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
4611 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1); | |
4612 | |
4613 data->entry = gtk_entry_new(); | |
4614 gtk_table_attach_defaults(GTK_TABLE(table), data->entry, 1, 2, 0, 1); | |
4615 gtk_widget_grab_focus(data->entry); | |
4616 | |
4617 if (username != NULL) | |
4618 gtk_entry_set_text(GTK_ENTRY(data->entry), username); | |
12337 | 4619 else |
4620 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), | |
4621 GTK_RESPONSE_OK, FALSE); | |
7620 | 4622 |
4623 gtk_entry_set_activates_default (GTK_ENTRY(data->entry), TRUE); | |
8137 | 4624 gaim_set_accessible_label (data->entry, label); |
7620 | 4625 |
12337 | 4626 g_signal_connect(G_OBJECT(data->entry), "changed", |
4627 G_CALLBACK(gaim_gtk_set_sensitive_if_input), | |
4628 data->window); | |
4629 | |
7620 | 4630 label = gtk_label_new(_("Alias:")); |
4631 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
4632 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); | |
4633 | |
4634 data->entry_for_alias = gtk_entry_new(); | |
4635 gtk_table_attach_defaults(GTK_TABLE(table), | |
4636 data->entry_for_alias, 1, 2, 1, 2); | |
4637 | |
4638 if (alias != NULL) | |
4639 gtk_entry_set_text(GTK_ENTRY(data->entry_for_alias), alias); | |
4640 | |
10734
8b2c81d9b271
[gaim-migrate @ 12336]
Luke Schierer <lschiere@pidgin.im>
parents:
10694
diff
changeset
|
4641 if (username != NULL) |
8b2c81d9b271
[gaim-migrate @ 12336]
Luke Schierer <lschiere@pidgin.im>
parents:
10694
diff
changeset
|
4642 gtk_widget_grab_focus(GTK_WIDGET(data->entry_for_alias)); |
8b2c81d9b271
[gaim-migrate @ 12336]
Luke Schierer <lschiere@pidgin.im>
parents:
10694
diff
changeset
|
4643 |
7620 | 4644 gtk_entry_set_activates_default (GTK_ENTRY(data->entry_for_alias), TRUE); |
8137 | 4645 gaim_set_accessible_label (data->entry_for_alias, label); |
7620 | 4646 |
4647 label = gtk_label_new(_("Group:")); | |
4648 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
4649 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); | |
4650 | |
4651 data->combo = gtk_combo_new(); | |
4652 gtk_combo_set_popdown_strings(GTK_COMBO(data->combo), groups_tree()); | |
4653 gtk_table_attach_defaults(GTK_TABLE(table), data->combo, 1, 2, 2, 3); | |
8137 | 4654 gaim_set_accessible_label (data->combo, label); |
7620 | 4655 |
4656 /* Set up stuff for the account box */ | |
4657 label = gtk_label_new(_("Account:")); | |
4658 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
4659 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4); | |
4660 | |
4661 data->account_box = gaim_gtk_account_option_menu_new(account, FALSE, | |
4662 G_CALLBACK(add_buddy_select_account_cb), NULL, data); | |
4663 | |
4664 gtk_table_attach_defaults(GTK_TABLE(table), data->account_box, 1, 2, 3, 4); | |
8137 | 4665 gaim_set_accessible_label (data->account_box, label); |
7620 | 4666 /* End of account box */ |
4667 | |
4668 g_signal_connect(G_OBJECT(data->window), "response", | |
4669 G_CALLBACK(add_buddy_cb), data); | |
4670 | |
4671 gtk_widget_show_all(data->window); | |
4672 | |
4673 if (group != NULL) | |
4674 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(data->combo)->entry), group); | |
4675 } | |
4676 | |
4677 static void | |
4678 add_chat_cb(GtkWidget *w, GaimGtkAddChatData *data) | |
4679 { | |
4680 GHashTable *components; | |
4681 GList *tmp; | |
4682 GaimChat *chat; | |
4683 GaimGroup *group; | |
4684 const char *group_name; | |
10475 | 4685 const char *value; |
7620 | 4686 |
4687 components = g_hash_table_new_full(g_str_hash, g_str_equal, | |
4688 g_free, g_free); | |
4689 | |
4690 for (tmp = data->entries; tmp; tmp = tmp->next) | |
4691 { | |
4692 if (g_object_get_data(tmp->data, "is_spin")) | |
4693 { | |
4694 g_hash_table_replace(components, | |
4695 g_strdup(g_object_get_data(tmp->data, "identifier")), | |
4696 g_strdup_printf("%d", | |
4697 gtk_spin_button_get_value_as_int(tmp->data))); | |
4698 } | |
4699 else | |
4700 { | |
10475 | 4701 value = gtk_entry_get_text(tmp->data); |
4702 if (*value != '\0') | |
4703 g_hash_table_replace(components, | |
4704 g_strdup(g_object_get_data(tmp->data, "identifier")), | |
4705 g_strdup(value)); | |
7620 | 4706 } |
4707 } | |
4708 | |
4709 chat = gaim_chat_new(data->account, | |
4710 gtk_entry_get_text(GTK_ENTRY(data->alias_entry)), | |
4711 components); | |
4712 | |
4713 group_name = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(data->group_combo)->entry)); | |
4714 | |
4715 if ((group = gaim_find_group(group_name)) == NULL) | |
4716 { | |
4717 group = gaim_group_new(group_name); | |
4718 gaim_blist_add_group(group, NULL); | |
4719 } | |
4720 | |
4721 if (chat != NULL) | |
4722 { | |
4723 gaim_blist_add_chat(chat, group, NULL); | |
4724 } | |
4725 | |
4726 gtk_widget_destroy(data->window); | |
9812 | 4727 g_free(data->default_chat_name); |
7620 | 4728 g_list_free(data->entries); |
4729 g_free(data); | |
4730 } | |
4731 | |
4732 static void | |
4733 add_chat_resp_cb(GtkWidget *w, int resp, GaimGtkAddChatData *data) | |
4734 { | |
4735 if (resp == GTK_RESPONSE_OK) | |
4736 { | |
4737 add_chat_cb(NULL, data); | |
4738 } | |
4739 else | |
4740 { | |
4741 gtk_widget_destroy(data->window); | |
9812 | 4742 g_free(data->default_chat_name); |
7620 | 4743 g_list_free(data->entries); |
4744 g_free(data); | |
4745 } | |
4746 } | |
4747 | |
10475 | 4748 /* |
4749 * Check the values of all the text entry boxes. If any required input | |
4750 * strings are empty then don't allow the user to click on "OK." | |
4751 */ | |
4752 static void | |
4753 addchat_set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data) | |
4754 { | |
4755 GaimGtkAddChatData *data; | |
4756 GList *tmp; | |
4757 const char *text; | |
4758 gboolean required; | |
4759 gboolean sensitive = TRUE; | |
4760 | |
4761 data = user_data; | |
4762 | |
4763 for (tmp = data->entries; tmp != NULL; tmp = tmp->next) | |
4764 { | |
4765 if (!g_object_get_data(tmp->data, "is_spin")) | |
4766 { | |
4767 required = GPOINTER_TO_INT(g_object_get_data(tmp->data, "required")); | |
4768 text = gtk_entry_get_text(tmp->data); | |
4769 if (required && (*text == '\0')) | |
4770 sensitive = FALSE; | |
4771 } | |
4772 } | |
4773 | |
4774 gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_OK, sensitive); | |
4775 } | |
4776 | |
7620 | 4777 static void |
4778 rebuild_addchat_entries(GaimGtkAddChatData *data) | |
4779 { | |
4780 GaimConnection *gc; | |
9959 | 4781 GList *list = NULL, *tmp = NULL; |
9754 | 4782 GHashTable *defaults = NULL; |
7620 | 4783 struct proto_chat_entry *pce; |
4784 gboolean focus = TRUE; | |
4785 | |
10127 | 4786 g_return_if_fail(data->account != NULL); |
4787 | |
7620 | 4788 gc = gaim_account_get_connection(data->account); |
4789 | |
4790 while (GTK_BOX(data->entries_box)->children) | |
4791 { | |
4792 gtk_container_remove(GTK_CONTAINER(data->entries_box), | |
10475 | 4793 ((GtkBoxChild *)GTK_BOX(data->entries_box)->children->data)->widget); |
7620 | 4794 } |
4795 | |
4796 if (data->entries != NULL) | |
4797 g_list_free(data->entries); | |
4798 | |
4799 data->entries = NULL; | |
4800 | |
9959 | 4801 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL) |
4802 list = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc); | |
7620 | 4803 |
9754 | 4804 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) |
10475 | 4805 defaults = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, data->default_chat_name); |
9754 | 4806 |
7620 | 4807 for (tmp = list; tmp; tmp = tmp->next) |
4808 { | |
4809 GtkWidget *label; | |
4810 GtkWidget *rowbox; | |
10475 | 4811 GtkWidget *input; |
7620 | 4812 |
4813 pce = tmp->data; | |
4814 | |
4815 rowbox = gtk_hbox_new(FALSE, 5); | |
4816 gtk_box_pack_start(GTK_BOX(data->entries_box), rowbox, FALSE, FALSE, 0); | |
4817 | |
7889 | 4818 label = gtk_label_new_with_mnemonic(pce->label); |
7620 | 4819 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
4820 gtk_size_group_add_widget(data->sg, label); | |
4821 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
4822 | |
4823 if (pce->is_int) | |
4824 { | |
4825 GtkObject *adjust; | |
4826 adjust = gtk_adjustment_new(pce->min, pce->min, pce->max, | |
4827 1, 10, 10); | |
10475 | 4828 input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0); |
4829 gtk_widget_set_size_request(input, 50, -1); | |
4830 gtk_box_pack_end(GTK_BOX(rowbox), input, FALSE, FALSE, 0); | |
7620 | 4831 } |
4832 else | |
4833 { | |
9754 | 4834 char *value; |
10475 | 4835 input = gtk_entry_new(); |
4836 gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE); | |
9754 | 4837 value = g_hash_table_lookup(defaults, pce->identifier); |
4838 if (value != NULL) | |
10475 | 4839 gtk_entry_set_text(GTK_ENTRY(input), value); |
7620 | 4840 if (pce->secret) |
11986 | 4841 { |
10475 | 4842 gtk_entry_set_visibility(GTK_ENTRY(input), FALSE); |
11986 | 4843 gtk_entry_set_invisible_char(GTK_ENTRY(input), GAIM_INVISIBLE_CHAR); |
4844 } | |
10475 | 4845 gtk_box_pack_end(GTK_BOX(rowbox), input, TRUE, TRUE, 0); |
4846 g_signal_connect(G_OBJECT(input), "changed", | |
4847 G_CALLBACK(addchat_set_sensitive_if_input_cb), data); | |
7620 | 4848 } |
4849 | |
10475 | 4850 /* Do the following for any type of input widget */ |
4851 if (focus) | |
4852 { | |
4853 gtk_widget_grab_focus(input); | |
4854 focus = FALSE; | |
4855 } | |
4856 gtk_label_set_mnemonic_widget(GTK_LABEL(label), input); | |
4857 gaim_set_accessible_label(input, label); | |
13106
a0a4b44239e8
[gaim-migrate @ 15468]
Richard Laager <rlaager@wiktel.com>
parents:
13090
diff
changeset
|
4858 g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier); |
10475 | 4859 g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int)); |
4860 g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required)); | |
4861 data->entries = g_list_append(data->entries, input); | |
4862 | |
7620 | 4863 g_free(pce); |
4864 } | |
4865 | |
4866 g_list_free(list); | |
9754 | 4867 g_hash_table_destroy(defaults); |
7620 | 4868 |
10475 | 4869 /* Set whether the "OK" button should be clickable initially */ |
4870 addchat_set_sensitive_if_input_cb(NULL, data); | |
4871 | |
7620 | 4872 gtk_widget_show_all(data->entries_box); |
4873 } | |
4874 | |
4875 static void | |
10475 | 4876 addchat_select_account_cb(GObject *w, GaimAccount *account, |
7620 | 4877 GaimGtkAddChatData *data) |
4878 { | |
9460 | 4879 if (strcmp(gaim_account_get_protocol_id(data->account), |
4880 gaim_account_get_protocol_id(account)) == 0) | |
7620 | 4881 { |
4882 data->account = account; | |
4883 } | |
4884 else | |
4885 { | |
4886 data->account = account; | |
4887 rebuild_addchat_entries(data); | |
4888 } | |
4889 } | |
4890 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
4891 static void |
7859 | 4892 gaim_gtk_blist_request_add_chat(GaimAccount *account, GaimGroup *group, |
9754 | 4893 const char *alias, const char *name) |
7620 | 4894 { |
4895 GaimGtkAddChatData *data; | |
8975 | 4896 GaimGtkBuddyList *gtkblist; |
4897 GList *l; | |
4898 GaimConnection *gc; | |
7620 | 4899 GtkWidget *label; |
4900 GtkWidget *rowbox; | |
4901 GtkWidget *hbox; | |
4902 GtkWidget *vbox; | |
4903 GtkWidget *img; | |
4904 | |
9812 | 4905 if (account != NULL) { |
4906 gc = gaim_account_get_connection(account); | |
4907 | |
4908 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat == NULL) { | |
4909 gaim_notify_error(gc, NULL, _("This protocol does not support chat rooms."), NULL); | |
4910 return; | |
4911 } | |
4912 } else { | |
4913 /* Find an account with chat capabilities */ | |
4914 for (l = gaim_connections_get_all(); l != NULL; l = l->next) { | |
4915 gc = (GaimConnection *)l->data; | |
4916 | |
4917 if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->join_chat != NULL) { | |
4918 account = gaim_connection_get_account(gc); | |
4919 break; | |
4920 } | |
4921 } | |
4922 | |
4923 if (account == NULL) { | |
4924 gaim_notify_error(NULL, NULL, | |
4925 _("You are not currently signed on with any " | |
4926 "protocols that have the ability to chat."), NULL); | |
4927 return; | |
4928 } | |
4929 } | |
4930 | |
7620 | 4931 data = g_new0(GaimGtkAddChatData, 1); |
9812 | 4932 data->account = account; |
4933 data->default_chat_name = g_strdup(name); | |
7620 | 4934 |
4935 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_QUESTION, | |
4936 GTK_ICON_SIZE_DIALOG); | |
4937 | |
8975 | 4938 gtkblist = GAIM_GTK_BLIST(gaim_get_blist()); |
4939 | |
7620 | 4940 data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
4941 | |
8975 | 4942 data->window = gtk_dialog_new_with_buttons(_("Add Chat"), |
4943 NULL, GTK_DIALOG_NO_SEPARATOR, | |
4944 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | |
4945 GTK_STOCK_ADD, GTK_RESPONSE_OK, | |
4946 NULL); | |
4947 | |
4948 gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK); | |
11243 | 4949 gtk_container_set_border_width(GTK_CONTAINER(data->window), GAIM_HIG_BOX_SPACE); |
8975 | 4950 gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE); |
11243 | 4951 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), GAIM_HIG_BORDER); |
4952 gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), GAIM_HIG_BOX_SPACE); | |
7620 | 4953 gtk_window_set_role(GTK_WINDOW(data->window), "add_chat"); |
8975 | 4954 gtk_window_set_type_hint(GTK_WINDOW(data->window), |
9811 | 4955 GDK_WINDOW_TYPE_HINT_DIALOG); |
7620 | 4956 |
11243 | 4957 hbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); |
7620 | 4958 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox); |
4959 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
4960 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
4961 | |
4962 vbox = gtk_vbox_new(FALSE, 5); | |
4963 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
4964 | |
4965 label = gtk_label_new( | |
4966 _("Please enter an alias, and the appropriate information " | |
4967 "about the chat you would like to add to your buddy list.\n")); | |
4968 gtk_widget_set_size_request(label, 400, -1); | |
4969 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
4970 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
4971 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
4972 | |
4973 rowbox = gtk_hbox_new(FALSE, 5); | |
4974 gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); | |
4975 | |
4976 label = gtk_label_new(_("Account:")); | |
4977 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
4978 gtk_size_group_add_widget(data->sg, label); | |
4979 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
4980 | |
4981 data->account_menu = gaim_gtk_account_option_menu_new(account, FALSE, | |
10475 | 4982 G_CALLBACK(addchat_select_account_cb), |
9987 | 4983 chat_account_filter_func, data); |
7620 | 4984 gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); |
8137 | 4985 gaim_set_accessible_label (data->account_menu, label); |
7620 | 4986 |
4987 data->entries_box = gtk_vbox_new(FALSE, 5); | |
9811 | 4988 gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); |
7620 | 4989 gtk_box_pack_start(GTK_BOX(vbox), data->entries_box, TRUE, TRUE, 0); |
4990 | |
4991 rebuild_addchat_entries(data); | |
4992 | |
4993 rowbox = gtk_hbox_new(FALSE, 5); | |
4994 gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); | |
4995 | |
4996 label = gtk_label_new(_("Alias:")); | |
4997 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
4998 gtk_size_group_add_widget(data->sg, label); | |
4999 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
5000 | |
5001 data->alias_entry = gtk_entry_new(); | |
7859 | 5002 if (alias != NULL) |
5003 gtk_entry_set_text(GTK_ENTRY(data->alias_entry), alias); | |
7620 | 5004 gtk_box_pack_end(GTK_BOX(rowbox), data->alias_entry, TRUE, TRUE, 0); |
10311 | 5005 gtk_entry_set_activates_default(GTK_ENTRY(data->alias_entry), TRUE); |
8137 | 5006 gaim_set_accessible_label (data->alias_entry, label); |
7620 | 5007 |
5008 rowbox = gtk_hbox_new(FALSE, 5); | |
5009 gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); | |
5010 | |
9811 | 5011 label = gtk_label_new(_("Group:")); |
7620 | 5012 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
5013 gtk_size_group_add_widget(data->sg, label); | |
5014 gtk_box_pack_start(GTK_BOX(rowbox), label, FALSE, FALSE, 0); | |
5015 | |
9811 | 5016 data->group_combo = gtk_combo_new(); |
5017 gtk_combo_set_popdown_strings(GTK_COMBO(data->group_combo), groups_tree()); | |
7620 | 5018 gtk_box_pack_end(GTK_BOX(rowbox), data->group_combo, TRUE, TRUE, 0); |
5019 | |
5020 if (group) | |
5021 { | |
5022 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(data->group_combo)->entry), | |
5023 group->name); | |
5024 } | |
8137 | 5025 gaim_set_accessible_label (data->group_combo, label); |
7620 | 5026 |
5027 g_signal_connect(G_OBJECT(data->window), "response", | |
5028 G_CALLBACK(add_chat_resp_cb), data); | |
5029 | |
5030 gtk_widget_show_all(data->window); | |
5031 } | |
5032 | |
5033 static void | |
5034 add_group_cb(GaimConnection *gc, const char *group_name) | |
5035 { | |
9285 | 5036 GaimGroup *group; |
5037 | |
12458 | 5038 if ((group_name == NULL) || (*group_name == '\0')) |
5039 return; | |
5040 | |
9285 | 5041 group = gaim_group_new(group_name); |
5042 gaim_blist_add_group(group, NULL); | |
7620 | 5043 } |
5044 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5045 static void |
7620 | 5046 gaim_gtk_blist_request_add_group(void) |
5047 { | |
7853 | 5048 gaim_request_input(NULL, _("Add Group"), NULL, |
7620 | 5049 _("Please enter the name of the group to be added."), |
8697 | 5050 NULL, FALSE, FALSE, NULL, |
7620 | 5051 _("Add"), G_CALLBACK(add_group_cb), |
5052 _("Cancel"), NULL, NULL); | |
5053 } | |
5054 | |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5055 void |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5056 gaim_gtk_blist_toggle_visibility() |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5057 { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5058 if (gtkblist && gtkblist->window) { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5059 if (GTK_WIDGET_VISIBLE(gtkblist->window)) { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5060 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
|
5061 } else { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5062 gaim_blist_set_visible(TRUE); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5063 } |
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 } |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5066 |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5067 void |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5068 gaim_gtk_blist_visibility_manager_add() |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5069 { |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5070 visibility_manager_count++; |
12479
53e2dc07d9e2
[gaim-migrate @ 14790]
Richard Laager <rlaager@wiktel.com>
parents:
12478
diff
changeset
|
5071 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
|
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_remove() |
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 if (visibility_manager_count) |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5078 visibility_manager_count--; |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5079 if (!visibility_manager_count) |
13674 | 5080 gaim_blist_set_visible(TRUE); |
12479
53e2dc07d9e2
[gaim-migrate @ 14790]
Richard Laager <rlaager@wiktel.com>
parents:
12478
diff
changeset
|
5081 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
|
5082 } |
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 |
7620 | 5085 static GaimBlistUiOps blist_ui_ops = |
5228 | 5086 { |
5087 gaim_gtk_blist_new_list, | |
5256 | 5088 gaim_gtk_blist_new_node, |
5228 | 5089 gaim_gtk_blist_show, |
5090 gaim_gtk_blist_update, | |
5091 gaim_gtk_blist_remove, | |
5092 gaim_gtk_blist_destroy, | |
7620 | 5093 gaim_gtk_blist_set_visible, |
5094 gaim_gtk_blist_request_add_buddy, | |
5095 gaim_gtk_blist_request_add_chat, | |
10012 | 5096 gaim_gtk_blist_request_add_group |
5228 | 5097 }; |
5098 | |
5099 | |
7620 | 5100 GaimBlistUiOps * |
5101 gaim_gtk_blist_get_ui_ops(void) | |
5228 | 5102 { |
5103 return &blist_ui_ops; | |
5104 } | |
5105 | |
10643 | 5106 GaimGtkBuddyList *gaim_gtk_blist_get_default_gtk_blist() |
5107 { | |
5108 return gtkblist; | |
5109 } | |
5110 | |
7620 | 5111 static void account_signon_cb(GaimConnection *gc, gpointer z) |
5112 { | |
5113 GaimAccount *account = gaim_connection_get_account(gc); | |
5114 GaimBlistNode *gnode, *cnode; | |
5115 for(gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) | |
5116 { | |
5117 if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
5118 continue; | |
5119 for(cnode = gnode->child; cnode; cnode = cnode->next) | |
5120 { | |
5121 GaimChat *chat; | |
5122 | |
5123 if(!GAIM_BLIST_NODE_IS_CHAT(cnode)) | |
5124 continue; | |
5125 | |
5126 chat = (GaimChat *)cnode; | |
5127 | |
5128 if(chat->account != account) | |
5129 continue; | |
5130 | |
8197 | 5131 if(gaim_blist_node_get_bool((GaimBlistNode*)chat, "gtk-autojoin") || |
8198 | 5132 (gaim_blist_node_get_string((GaimBlistNode*)chat, |
5133 "gtk-autojoin") != NULL)) | |
7620 | 5134 serv_join_chat(gc, chat->components); |
5135 } | |
5136 } | |
5137 } | |
5138 | |
8815 | 5139 void * |
5140 gaim_gtk_blist_get_handle() { | |
5141 static int handle; | |
5142 | |
5143 return &handle; | |
5144 } | |
5145 | |
11910 | 5146 static gboolean buddy_signonoff_timeout_cb(GaimBuddy *buddy) |
5147 { | |
5148 struct _gaim_gtk_blist_node *gtknode = ((GaimBlistNode*)buddy)->ui_data; | |
5149 | |
5150 gtknode->recent_signonoff = FALSE; | |
5151 gtknode->recent_signonoff_timer = 0; | |
5152 | |
5153 gaim_gtk_blist_update(NULL, (GaimBlistNode*)buddy); | |
5154 | |
5155 return FALSE; | |
5156 } | |
5157 | |
5158 static void buddy_signonoff_cb(GaimBuddy *buddy) | |
5159 { | |
11915 | 5160 struct _gaim_gtk_blist_node *gtknode; |
5161 | |
5162 if(!((GaimBlistNode*)buddy)->ui_data) { | |
5163 gaim_gtk_blist_new_node((GaimBlistNode*)buddy); | |
5164 } | |
5165 | |
5166 gtknode = ((GaimBlistNode*)buddy)->ui_data; | |
11910 | 5167 |
5168 gtknode->recent_signonoff = TRUE; | |
5169 | |
5170 if(gtknode->recent_signonoff_timer > 0) | |
5171 gaim_timeout_remove(gtknode->recent_signonoff_timer); | |
5172 gtknode->recent_signonoff_timer = gaim_timeout_add(10000, | |
5173 (GSourceFunc)buddy_signonoff_timeout_cb, buddy); | |
5174 } | |
5175 | |
7620 | 5176 void gaim_gtk_blist_init(void) |
5177 { | |
8815 | 5178 void *gtk_blist_handle = gaim_gtk_blist_get_handle(); |
7620 | 5179 |
5180 gaim_signal_connect(gaim_connections_get_handle(), "signed-on", | |
8815 | 5181 gtk_blist_handle, GAIM_CALLBACK(account_signon_cb), |
7620 | 5182 NULL); |
7731 | 5183 |
5184 /* Initialize prefs */ | |
8819 | 5185 gaim_prefs_add_none("/gaim/gtk/blist"); |
5186 gaim_prefs_add_bool("/gaim/gtk/blist/show_buddy_icons", TRUE); | |
5187 gaim_prefs_add_bool("/gaim/gtk/blist/show_empty_groups", FALSE); | |
12656 | 5188 gaim_prefs_add_bool("/gaim/gtk/blist/show_idle_time", TRUE); |
8819 | 5189 gaim_prefs_add_bool("/gaim/gtk/blist/show_offline_buddies", FALSE); |
10282 | 5190 gaim_prefs_add_bool("/gaim/gtk/blist/list_visible", TRUE); |
12279 | 5191 gaim_prefs_add_bool("/gaim/gtk/blist/list_maximized", FALSE); |
9711 | 5192 gaim_prefs_add_string("/gaim/gtk/blist/sort_type", "alphabetical"); |
8819 | 5193 gaim_prefs_add_int("/gaim/gtk/blist/x", 0); |
5194 gaim_prefs_add_int("/gaim/gtk/blist/y", 0); | |
9778 | 5195 gaim_prefs_add_int("/gaim/gtk/blist/width", 309); /* Golden ratio, baby */ |
5196 gaim_prefs_add_int("/gaim/gtk/blist/height", 500); /* Golden ratio, baby */ | |
8819 | 5197 gaim_prefs_add_int("/gaim/gtk/blist/tooltip_delay", 500); |
7731 | 5198 |
8815 | 5199 /* Register our signals */ |
12016
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5200 gaim_signal_register(gtk_blist_handle, "gtkblist-hiding", |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5201 gaim_marshal_VOID__POINTER, NULL, 1, |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5202 gaim_value_new(GAIM_TYPE_POINTER)); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5203 |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5204 gaim_signal_register(gtk_blist_handle, "gtkblist-unhiding", |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5205 gaim_marshal_VOID__POINTER, NULL, 1, |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5206 gaim_value_new(GAIM_TYPE_SUBTYPE)); |
24c7fb94d3a3
[gaim-migrate @ 14309]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11988
diff
changeset
|
5207 |
8815 | 5208 gaim_signal_register(gtk_blist_handle, "gtkblist-created", |
9811 | 5209 gaim_marshal_VOID__POINTER, NULL, 1, |
5210 gaim_value_new(GAIM_TYPE_SUBTYPE, | |
5211 GAIM_SUBTYPE_BLIST)); | |
8819 | 5212 |
5213 gaim_signal_register(gtk_blist_handle, "drawing-tooltip", | |
12713
d7043c3c793d
[gaim-migrate @ 15057]
Richard Laager <rlaager@wiktel.com>
parents:
12679
diff
changeset
|
5214 gaim_marshal_VOID__POINTER_POINTER_UINT, NULL, 3, |
9811 | 5215 gaim_value_new(GAIM_TYPE_SUBTYPE, GAIM_SUBTYPE_BLIST_NODE), |
12713
d7043c3c793d
[gaim-migrate @ 15057]
Richard Laager <rlaager@wiktel.com>
parents:
12679
diff
changeset
|
5216 gaim_value_new_outgoing(GAIM_TYPE_BOXED, "GString *"), |
d7043c3c793d
[gaim-migrate @ 15057]
Richard Laager <rlaager@wiktel.com>
parents:
12679
diff
changeset
|
5217 gaim_value_new(GAIM_TYPE_BOOLEAN)); |
11910 | 5218 |
5219 | |
5220 gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-on", gtk_blist_handle, GAIM_CALLBACK(buddy_signonoff_cb), NULL); | |
5221 gaim_signal_connect(gaim_blist_get_handle(), "buddy-signed-off", gtk_blist_handle, GAIM_CALLBACK(buddy_signonoff_cb), NULL); | |
7620 | 5222 } |
5223 | |
8815 | 5224 void |
5225 gaim_gtk_blist_uninit(void) { | |
5226 gaim_signals_unregister_by_instance(gaim_gtk_blist_get_handle()); | |
5227 } | |
5228 | 5228 |
5229 /********************************************************************* | |
9811 | 5230 * Buddy List sorting functions * |
5422 | 5231 *********************************************************************/ |
5232 | |
11796 | 5233 GList *gaim_gtk_blist_get_sort_methods() |
5234 { | |
5235 return gaim_gtk_blist_sort_methods; | |
5236 } | |
5237 | |
7620 | 5238 void gaim_gtk_blist_sort_method_reg(const char *id, const char *name, gaim_gtk_blist_sort_function func) |
5422 | 5239 { |
5240 struct gaim_gtk_blist_sort_method *method = g_new0(struct gaim_gtk_blist_sort_method, 1); | |
7620 | 5241 method->id = g_strdup(id); |
5422 | 5242 method->name = g_strdup(name); |
9775 | 5243 method->func = func; |
11796 | 5244 gaim_gtk_blist_sort_methods = g_list_append(gaim_gtk_blist_sort_methods, method); |
5245 gaim_gtk_blist_update_sort_methods(); | |
5422 | 5246 } |
5247 | |
7620 | 5248 void gaim_gtk_blist_sort_method_unreg(const char *id){ |
11796 | 5249 GList *l = gaim_gtk_blist_sort_methods; |
7620 | 5250 |
5251 while(l) { | |
5252 struct gaim_gtk_blist_sort_method *method = l->data; | |
5253 if(!strcmp(method->id, id)) { | |
11796 | 5254 gaim_gtk_blist_sort_methods = g_list_delete_link(gaim_gtk_blist_sort_methods, l); |
7620 | 5255 g_free(method->id); |
5256 g_free(method->name); | |
5257 g_free(method); | |
5258 break; | |
5259 } | |
5260 } | |
11796 | 5261 gaim_gtk_blist_update_sort_methods(); |
5422 | 5262 } |
5263 | |
7620 | 5264 void gaim_gtk_blist_sort_method_set(const char *id){ |
11796 | 5265 GList *l = gaim_gtk_blist_sort_methods; |
7620 | 5266 |
5267 if(!id) | |
5268 id = "none"; | |
5269 | |
5270 while (l && strcmp(((struct gaim_gtk_blist_sort_method*)l->data)->id, id)) | |
5422 | 5271 l = l->next; |
7620 | 5272 |
5422 | 5273 if (l) { |
5274 current_sort_method = l->data; | |
5275 } else if (!current_sort_method) { | |
7620 | 5276 gaim_gtk_blist_sort_method_set("none"); |
5422 | 5277 return; |
5278 } | |
5279 redo_buddy_list(gaim_get_blist(), TRUE); | |
5280 | |
5281 } | |
5282 | |
5283 /****************************************** | |
5284 ** Sort Methods | |
5285 ******************************************/ | |
5286 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5287 static void sort_method_none(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter parent_iter, GtkTreeIter *cur, GtkTreeIter *iter) |
5422 | 5288 { |
7620 | 5289 GaimBlistNode *sibling = node->prev; |
5290 GtkTreeIter sibling_iter; | |
5291 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5292 if (cur != NULL) { |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5293 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5294 return; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5295 } |
7620 | 5296 |
5297 while (sibling && !get_iter_from_node(sibling, &sibling_iter)) { | |
5298 sibling = sibling->prev; | |
5422 | 5299 } |
7620 | 5300 |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5301 gtk_tree_store_insert_after(gtkblist->treemodel, iter, |
7620 | 5302 node->parent ? &parent_iter : NULL, |
5303 sibling ? &sibling_iter : NULL); | |
5422 | 5304 } |
5305 | |
7620 | 5306 #if GTK_CHECK_VERSION(2,2,1) |
5307 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5308 static void sort_method_alphabetical(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter) |
5422 | 5309 { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5310 GtkTreeIter more_z; |
7620 | 5311 |
5312 const char *my_name; | |
5313 | |
5314 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
5315 my_name = gaim_contact_get_alias((GaimContact*)node); | |
5316 } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { | |
5317 my_name = gaim_chat_get_name((GaimChat*)node); | |
5318 } else { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5319 sort_method_none(node, blist, groupiter, cur, iter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5320 return; |
7620 | 5321 } |
5322 | |
5422 | 5323 |
5324 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
|
5325 gtk_tree_store_insert(gtkblist->treemodel, iter, &groupiter, 0); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5326 return; |
7620 | 5327 } |
5328 | |
5329 do { | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5330 GValue val; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5331 GaimBlistNode *n; |
7620 | 5332 const char *this_name; |
5333 int cmp; | |
5334 | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5335 val.g_type = 0; |
7620 | 5336 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val); |
5337 n = g_value_get_pointer(&val); | |
5338 | |
5339 if(GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
5340 this_name = gaim_contact_get_alias((GaimContact*)n); | |
5341 } else if(GAIM_BLIST_NODE_IS_CHAT(n)) { | |
5342 this_name = gaim_chat_get_name((GaimChat*)n); | |
5343 } else { | |
5344 this_name = NULL; | |
5345 } | |
5346 | |
5347 cmp = gaim_utf8_strcasecmp(my_name, this_name); | |
5348 | |
5349 if(this_name && (cmp < 0 || (cmp == 0 && node < n))) { | |
5350 if(cur) { | |
5351 gtk_tree_store_move_before(gtkblist->treemodel, cur, &more_z); | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5352 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5353 return; |
7620 | 5354 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5355 gtk_tree_store_insert_before(gtkblist->treemodel, iter, |
7620 | 5356 &groupiter, &more_z); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5357 return; |
7620 | 5358 } |
5359 } | |
5360 g_value_unset(&val); | |
5361 } while (gtk_tree_model_iter_next (GTK_TREE_MODEL(gtkblist->treemodel), &more_z)); | |
5362 | |
5363 if(cur) { | |
5364 gtk_tree_store_move_before(gtkblist->treemodel, cur, NULL); | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5365 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5366 return; |
7620 | 5367 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5368 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5369 return; |
7620 | 5370 } |
5371 } | |
5372 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5373 static void sort_method_status(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter) |
7620 | 5374 { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5375 GtkTreeIter more_z; |
7620 | 5376 |
5377 GaimBuddy *my_buddy, *this_buddy; | |
5378 | |
5379 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
5380 my_buddy = gaim_contact_get_priority_buddy((GaimContact*)node); | |
5381 } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5382 if (cur != NULL) { |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5383 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5384 return; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5385 } |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5386 |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5387 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5388 return; |
7620 | 5389 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5390 sort_method_none(node, blist, groupiter, cur, iter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5391 return; |
7620 | 5392 } |
5393 | |
5394 | |
5395 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
|
5396 gtk_tree_store_insert(gtkblist->treemodel, iter, &groupiter, 0); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5397 return; |
5422 | 5398 } |
5399 | |
5400 do { | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5401 GValue val; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5402 GaimBlistNode *n; |
9944 | 5403 gint name_cmp; |
5404 gint presence_cmp; | |
7620 | 5405 |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5406 val.g_type = 0; |
5422 | 5407 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val); |
5408 n = g_value_get_pointer(&val); | |
7620 | 5409 |
5410 if(GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
5411 this_buddy = gaim_contact_get_priority_buddy((GaimContact*)n); | |
5412 } else { | |
5413 this_buddy = NULL; | |
5414 } | |
5415 | |
9944 | 5416 name_cmp = gaim_utf8_strcasecmp( |
13670
a373da801dc1
[gaim-migrate @ 16072]
Richard Laager <rlaager@wiktel.com>
parents:
13629
diff
changeset
|
5417 gaim_contact_get_alias(gaim_buddy_get_contact(my_buddy)), |
9944 | 5418 (this_buddy |
5419 ? gaim_contact_get_alias(gaim_buddy_get_contact(this_buddy)) | |
5420 : NULL)); | |
5421 | |
5422 presence_cmp = gaim_presence_compare( | |
5423 gaim_buddy_get_presence(my_buddy), | |
13689
5fb687f9965c
[gaim-migrate @ 16092]
Richard Laager <rlaager@wiktel.com>
parents:
13684
diff
changeset
|
5424 this_buddy ? gaim_buddy_get_presence(this_buddy) : NULL); |
9944 | 5425 |
5426 if (this_buddy == NULL || | |
10860 | 5427 (presence_cmp < 0 || |
9944 | 5428 (presence_cmp == 0 && |
5429 (name_cmp < 0 || (name_cmp == 0 && node < n))))) | |
5430 { | |
5431 if (cur != NULL) | |
5432 { | |
7620 | 5433 gtk_tree_store_move_before(gtkblist->treemodel, cur, &more_z); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5434 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5435 return; |
9944 | 5436 } |
5437 else | |
5438 { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5439 gtk_tree_store_insert_before(gtkblist->treemodel, iter, |
9944 | 5440 &groupiter, &more_z); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5441 return; |
7620 | 5442 } |
5422 | 5443 } |
9944 | 5444 |
5422 | 5445 g_value_unset(&val); |
9944 | 5446 } |
5447 while (gtk_tree_model_iter_next(GTK_TREE_MODEL(gtkblist->treemodel), | |
5448 &more_z)); | |
7620 | 5449 |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5450 if (cur) { |
7620 | 5451 gtk_tree_store_move_before(gtkblist->treemodel, cur, NULL); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5452 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5453 return; |
7620 | 5454 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5455 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5456 return; |
7620 | 5457 } |
5422 | 5458 } |
5459 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5460 static void sort_method_log(GaimBlistNode *node, GaimBuddyList *blist, GtkTreeIter groupiter, GtkTreeIter *cur, GtkTreeIter *iter) |
5422 | 5461 { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5462 GtkTreeIter more_z; |
7620 | 5463 |
5464 int log_size = 0, this_log_size = 0; | |
5465 const char *buddy_name, *this_buddy_name; | |
5466 | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5467 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
|
5468 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5469 return; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5470 } |
7620 | 5471 |
5472 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5473 GaimBlistNode *n; |
7620 | 5474 for (n = node->child; n; n = n->next) |
8898 | 5475 log_size += gaim_log_get_total_size(GAIM_LOG_IM, ((GaimBuddy*)(n))->name, ((GaimBuddy*)(n))->account); |
7620 | 5476 buddy_name = gaim_contact_get_alias((GaimContact*)node); |
5477 } else if(GAIM_BLIST_NODE_IS_CHAT(node)) { | |
5478 /* we don't have a reliable way of getting the log filename | |
5479 * from the chat info in the blist, yet */ | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5480 if (cur != NULL) { |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5481 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5482 return; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5483 } |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5484 |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5485 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5486 return; |
7620 | 5487 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5488 sort_method_none(node, blist, groupiter, cur, iter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5489 return; |
7620 | 5490 } |
5491 | |
5492 | |
5422 | 5493 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
|
5494 gtk_tree_store_insert(gtkblist->treemodel, iter, &groupiter, 0); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5495 return; |
5422 | 5496 } |
5497 | |
5498 do { | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5499 GValue val; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5500 GaimBlistNode *n; |
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5501 GaimBlistNode *n2; |
7620 | 5502 int cmp; |
5503 | |
12600
e856f985a0b9
[gaim-migrate @ 14934]
Richard Laager <rlaager@wiktel.com>
parents:
12592
diff
changeset
|
5504 val.g_type = 0; |
5422 | 5505 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val); |
5506 n = g_value_get_pointer(&val); | |
7620 | 5507 this_log_size = 0; |
5508 | |
5509 if(GAIM_BLIST_NODE_IS_CONTACT(n)) { | |
5510 for (n2 = n->child; n2; n2 = n2->next) | |
8898 | 5511 this_log_size += gaim_log_get_total_size(GAIM_LOG_IM, ((GaimBuddy*)(n2))->name, ((GaimBuddy*)(n2))->account); |
7620 | 5512 this_buddy_name = gaim_contact_get_alias((GaimContact*)n); |
5513 } else { | |
5514 this_buddy_name = NULL; | |
5422 | 5515 } |
7620 | 5516 |
5517 cmp = gaim_utf8_strcasecmp(buddy_name, this_buddy_name); | |
5518 | |
5519 if (!GAIM_BLIST_NODE_IS_CONTACT(n) || log_size > this_log_size || | |
5520 ((log_size == this_log_size) && | |
5521 (cmp < 0 || (cmp == 0 && node < n)))) { | |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5522 if (cur != NULL) { |
7620 | 5523 gtk_tree_store_move_before(gtkblist->treemodel, cur, &more_z); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5524 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5525 return; |
7620 | 5526 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5527 gtk_tree_store_insert_before(gtkblist->treemodel, iter, |
7620 | 5528 &groupiter, &more_z); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5529 return; |
7620 | 5530 } |
5422 | 5531 } |
5532 g_value_unset(&val); | |
5533 } while (gtk_tree_model_iter_next (GTK_TREE_MODEL(gtkblist->treemodel), &more_z)); | |
7620 | 5534 |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5535 if (cur != NULL) { |
7620 | 5536 gtk_tree_store_move_before(gtkblist->treemodel, cur, NULL); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5537 *iter = *cur; |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5538 return; |
7620 | 5539 } else { |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5540 gtk_tree_store_append(gtkblist->treemodel, iter, &groupiter); |
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5541 return; |
7620 | 5542 } |
5543 } | |
5544 | |
5545 #endif | |
5546 | |
5547 static void | |
13196
f04dffe22957
[gaim-migrate @ 15559]
Gary Kramlich <grim@reaperworld.com>
parents:
13195
diff
changeset
|
5548 plugin_act(GtkObject *obj, GaimPluginAction *pam) |
7620 | 5549 { |
13196
f04dffe22957
[gaim-migrate @ 15559]
Gary Kramlich <grim@reaperworld.com>
parents:
13195
diff
changeset
|
5550 if (pam && pam->callback) |
10352 | 5551 pam->callback(pam); |
5422 | 5552 } |
7620 | 5553 |
8986 | 5554 static void |
12333 | 5555 build_plugin_actions(GtkWidget *menu, GaimPlugin *plugin) |
8986 | 5556 { |
12333 | 5557 GtkWidget *menuitem; |
9015 | 5558 GaimPluginAction *action = NULL; |
12333 | 5559 GList *actions, *l; |
5560 | |
5561 actions = GAIM_PLUGIN_ACTIONS(plugin, NULL); | |
5562 | |
5563 for (l = actions; l != NULL; l = l->next) | |
5564 { | |
5565 if (l->data) | |
5566 { | |
9015 | 5567 action = (GaimPluginAction *) l->data; |
5568 action->plugin = plugin; | |
12333 | 5569 action->context = NULL; |
9015 | 5570 |
5571 menuitem = gtk_menu_item_new_with_label(action->label); | |
12333 | 5572 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
5573 | |
9015 | 5574 g_signal_connect(G_OBJECT(menuitem), "activate", |
5575 G_CALLBACK(plugin_act), action); | |
13196
f04dffe22957
[gaim-migrate @ 15559]
Gary Kramlich <grim@reaperworld.com>
parents:
13195
diff
changeset
|
5576 g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", |
f04dffe22957
[gaim-migrate @ 15559]
Gary Kramlich <grim@reaperworld.com>
parents:
13195
diff
changeset
|
5577 action, |
f04dffe22957
[gaim-migrate @ 15559]
Gary Kramlich <grim@reaperworld.com>
parents:
13195
diff
changeset
|
5578 (GDestroyNotify)gaim_plugin_action_free); |
9015 | 5579 gtk_widget_show(menuitem); |
5580 } | |
5581 else | |
5582 gaim_separator(menu); | |
5583 } | |
5584 | |
12333 | 5585 g_list_free(actions); |
8986 | 5586 } |
5587 | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5588 static void |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5589 modify_account_cb(GtkWidget *widget, gpointer data) |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5590 { |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5591 gaim_gtk_account_dialog_show(GAIM_GTK_MODIFY_ACCOUNT_DIALOG, data); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5592 } |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5593 |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5594 static void |
12330 | 5595 enable_account_cb(GtkCheckMenuItem *widget, gpointer data) |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5596 { |
12330 | 5597 GaimAccount *account = data; |
5598 const GaimSavedStatus *saved_status; | |
5599 | |
5600 saved_status = gaim_savedstatus_get_current(); | |
5601 gaim_savedstatus_activate_for_account(saved_status, account); | |
5602 | |
5603 gaim_account_set_enabled(account, GAIM_GTK_UI, TRUE); | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5604 } |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5605 |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5606 static void |
12330 | 5607 disable_account_cb(GtkCheckMenuItem *widget, gpointer data) |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5608 { |
12330 | 5609 GaimAccount *account = data; |
5610 | |
5611 gaim_account_set_enabled(account, GAIM_GTK_UI, FALSE); | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5612 } |
8986 | 5613 |
7620 | 5614 void |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5615 gaim_gtk_blist_update_accounts_menu(void) |
7620 | 5616 { |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5617 GtkWidget *menuitem = NULL, *submenu = NULL; |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5618 GList *l = NULL, *accounts = NULL; |
12330 | 5619 gboolean disabled_accounts = FALSE; |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5620 |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5621 if (accountmenu == NULL) |
7620 | 5622 return; |
5623 | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5624 /* Clear the old Accounts menu */ |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5625 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
|
5626 menuitem = l->data; |
4f7797a3024b
[gaim-migrate @ 14652]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12341
diff
changeset
|
5627 |
4f7797a3024b
[gaim-migrate @ 14652]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12341
diff
changeset
|
5628 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
|
5629 gtk_container_remove(GTK_CONTAINER(accountmenu), |
13132
ba82cc4d1abd
[gaim-migrate @ 15494]
Richard Laager <rlaager@wiktel.com>
parents:
13106
diff
changeset
|
5630 menuitem); |
7620 | 5631 } |
5632 | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5633 for (accounts = gaim_accounts_get_all(); accounts; accounts = accounts->next) { |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5634 char *buf = NULL; |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5635 GtkWidget *image = NULL; |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5636 GaimConnection *gc = NULL; |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5637 GaimAccount *account = NULL; |
12300
6487e68dcef9
[gaim-migrate @ 14604]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12298
diff
changeset
|
5638 GaimStatus *status = NULL; |
13090 | 5639 GdkPixbuf *pixbuf = NULL; |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5640 |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5641 account = accounts->data; |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5642 |
12330 | 5643 if(gaim_account_get_enabled(account, GAIM_GTK_UI)) { |
5644 buf = g_strconcat(gaim_account_get_username(account), " (", | |
5645 gaim_account_get_protocol_name(account), ")", NULL); | |
5646 menuitem = gtk_image_menu_item_new_with_label(buf); | |
5647 g_free(buf); | |
5648 status = gaim_account_get_active_status(account); | |
13090 | 5649 pixbuf = gaim_gtk_create_prpl_icon_with_status(account, gaim_status_get_type(status), 0.5); |
5650 if (pixbuf != NULL) | |
5651 { | |
12330 | 5652 if (!gaim_account_is_connected(account)) |
13090 | 5653 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, |
12330 | 5654 0.0, FALSE); |
13090 | 5655 image = gtk_image_new_from_pixbuf(pixbuf); |
12330 | 5656 g_object_unref(G_OBJECT(pixbuf)); |
5657 gtk_widget_show(image); | |
5658 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); | |
5659 } | |
5660 gtk_menu_shell_append(GTK_MENU_SHELL(accountmenu), menuitem); | |
5661 gtk_widget_show(menuitem); | |
5662 | |
5663 submenu = gtk_menu_new(); | |
5664 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); | |
5665 gtk_widget_show(submenu); | |
5666 | |
5667 | |
12334 | 5668 menuitem = gtk_menu_item_new_with_mnemonic(_("_Edit Account")); |
12330 | 5669 g_signal_connect(G_OBJECT(menuitem), "activate", |
5670 G_CALLBACK(modify_account_cb), account); | |
5671 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); | |
5672 gtk_widget_show(menuitem); | |
5673 | |
5674 gaim_separator(submenu); | |
5675 | |
5676 gc = gaim_account_get_connection(account); | |
5677 if (gc && GAIM_CONNECTION_IS_CONNECTED(gc)) { | |
5678 GaimPlugin *plugin = NULL; | |
5679 | |
5680 plugin = gc->prpl; | |
5681 if (GAIM_PLUGIN_HAS_ACTIONS(plugin)) { | |
5682 GList *l, *ll = NULL; | |
5683 GaimPluginAction *action = NULL; | |
5684 | |
5685 for (l = ll = GAIM_PLUGIN_ACTIONS(plugin, gc); l; l = l->next) { | |
5686 if (l->data) { | |
5687 action = (GaimPluginAction *)l->data; | |
5688 action->plugin = plugin; | |
5689 action->context = gc; | |
5690 | |
5691 menuitem = gtk_menu_item_new_with_label(action->label); | |
5692 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); | |
5693 g_signal_connect(G_OBJECT(menuitem), "activate", | |
5694 G_CALLBACK(plugin_act), action); | |
13755 | 5695 g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", action, (GDestroyNotify)gaim_plugin_action_free); |
12330 | 5696 gtk_widget_show(menuitem); |
5697 } else | |
5698 gaim_separator(submenu); | |
5699 } | |
5700 } else { | |
5701 menuitem = gtk_menu_item_new_with_label(_("No actions available")); | |
5702 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); | |
5703 gtk_widget_set_sensitive(menuitem, FALSE); | |
5704 gtk_widget_show(menuitem); | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5705 } |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5706 } else { |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5707 menuitem = gtk_menu_item_new_with_label(_("No actions available")); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5708 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5709 gtk_widget_set_sensitive(menuitem, FALSE); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5710 gtk_widget_show(menuitem); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5711 } |
12330 | 5712 |
5713 gaim_separator(submenu); | |
5714 | |
5715 menuitem = gtk_menu_item_new_with_mnemonic(_("_Disable")); | |
5716 g_signal_connect(G_OBJECT(menuitem), "activate", | |
5717 G_CALLBACK(disable_account_cb), account); | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5718 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); |
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5719 gtk_widget_show(menuitem); |
12330 | 5720 } else { |
5721 disabled_accounts = TRUE; | |
12296
2f4577ae3810
[gaim-migrate @ 14600]
Etan Reisner <pidgin@unreliablesource.net>
parents:
12279
diff
changeset
|
5722 } |
7620 | 5723 } |
9019 | 5724 |
12330 | 5725 if(disabled_accounts) { |
5726 gaim_separator(accountmenu); | |
12338 | 5727 menuitem = gtk_menu_item_new_with_label(_("Enable Account")); |
12330 | 5728 gtk_menu_shell_append(GTK_MENU_SHELL(accountmenu), menuitem); |
5729 gtk_widget_show(menuitem); | |
5730 | |
5731 submenu = gtk_menu_new(); | |
5732 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); | |
5733 gtk_widget_show(submenu); | |
5734 | |
5735 for (accounts = gaim_accounts_get_all(); accounts; accounts = accounts->next) { | |
5736 char *buf = NULL; | |
5737 GtkWidget *image = NULL; | |
5738 GaimAccount *account = NULL; | |
13090 | 5739 GdkPixbuf *pixbuf = NULL; |
12330 | 5740 |
5741 account = accounts->data; | |
5742 | |
5743 if(!gaim_account_get_enabled(account, GAIM_GTK_UI)) { | |
5744 | |
5745 disabled_accounts = TRUE; | |
5746 | |
5747 buf = g_strconcat(gaim_account_get_username(account), " (", | |
5748 gaim_account_get_protocol_name(account), ")", NULL); | |
5749 menuitem = gtk_image_menu_item_new_with_label(buf); | |
5750 g_free(buf); | |
13090 | 5751 pixbuf = gaim_gtk_create_prpl_icon(account, 0.5); |
5752 if (pixbuf != NULL) | |
5753 { | |
5754 if (!gaim_account_is_connected(account)) | |
5755 gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf, 0.0, FALSE); | |
5756 image = gtk_image_new_from_pixbuf(pixbuf); | |
12330 | 5757 g_object_unref(G_OBJECT(pixbuf)); |
5758 gtk_widget_show(image); | |
5759 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); | |
5760 } | |
5761 g_signal_connect(G_OBJECT(menuitem), "activate", | |
5762 G_CALLBACK(enable_account_cb), account); | |
5763 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); | |
5764 gtk_widget_show(menuitem); | |
5765 } | |
9019 | 5766 } |
7620 | 5767 } |
5768 } | |
8986 | 5769 |
12333 | 5770 static GList *plugin_submenus = NULL; |
5771 | |
8986 | 5772 void |
5773 gaim_gtk_blist_update_plugin_actions(void) | |
5774 { | |
12333 | 5775 GtkWidget *menuitem, *submenu; |
9015 | 5776 GaimPlugin *plugin = NULL; |
8986 | 5777 GList *l; |
12464
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5778 GtkAccelGroup *accel_group; |
8986 | 5779 |
11742 | 5780 GtkWidget *pluginmenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Tools")); |
5781 | |
12333 | 5782 g_return_if_fail(pluginmenu != NULL); |
5783 | |
5784 /* Remove old plugin action submenus from the Tools menu */ | |
5785 for (l = plugin_submenus; l; l = l->next) | |
5786 { | |
5787 GList *menuitems; | |
5788 | |
5789 submenu = l->data; | |
5790 | |
5791 menuitems = gtk_container_get_children(GTK_CONTAINER(submenu)); | |
5792 while (menuitems != NULL) | |
5793 { | |
5794 GaimPluginAction *action; | |
5795 menuitem = menuitems->data; | |
5796 action = g_object_get_data(G_OBJECT(menuitem), "plugin_action"); | |
5797 g_free(action); | |
5798 menuitems = g_list_delete_link(menuitems, menuitems); | |
5799 } | |
5800 | |
5801 gtk_container_remove(GTK_CONTAINER(pluginmenu), GTK_WIDGET(submenu)); | |
8986 | 5802 } |
12333 | 5803 g_list_free(plugin_submenus); |
5804 plugin_submenus = NULL; | |
5805 | |
12464
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5806 accel_group = gtk_menu_get_accel_group(GTK_MENU(pluginmenu)); |
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5807 |
12333 | 5808 /* Add a submenu for each plugin with custom actions */ |
11742 | 5809 for (l = gaim_plugins_get_loaded(); l; l = l->next) { |
12464
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5810 char *path; |
11923 | 5811 |
11742 | 5812 plugin = (GaimPlugin *) l->data; |
11923 | 5813 |
11742 | 5814 if (GAIM_IS_PROTOCOL_PLUGIN(plugin)) |
5815 continue; | |
5816 | |
5817 if (!GAIM_PLUGIN_HAS_ACTIONS(plugin)) | |
5818 continue; | |
9019 | 5819 |
13336
999571d910ed
[gaim-migrate @ 15706]
Richard Laager <rlaager@wiktel.com>
parents:
13315
diff
changeset
|
5820 menuitem = gtk_image_menu_item_new_with_label(_(plugin->info->name)); |
12333 | 5821 gtk_menu_shell_append(GTK_MENU_SHELL(pluginmenu), menuitem); |
5822 gtk_widget_show(menuitem); | |
5823 | |
5824 plugin_submenus = g_list_append(plugin_submenus, menuitem); | |
5825 | |
5826 submenu = gtk_menu_new(); | |
5827 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); | |
5828 gtk_widget_show(submenu); | |
12464
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5829 |
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5830 gtk_menu_set_accel_group(GTK_MENU(submenu), accel_group); |
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5831 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
|
5832 gtk_menu_set_accel_path(GTK_MENU(submenu), path); |
2b08a27c2342
[gaim-migrate @ 14774]
Richard Laager <rlaager@wiktel.com>
parents:
12461
diff
changeset
|
5833 g_free(path); |
12333 | 5834 |
5835 build_plugin_actions(submenu, plugin); | |
8986 | 5836 } |
5837 } | |
11796 | 5838 |
12246 | 5839 static void |
5840 sortmethod_act(GtkCheckMenuItem *checkmenuitem, char *id) | |
11796 | 5841 { |
5842 if (gtk_check_menu_item_get_active(checkmenuitem)) | |
11923 | 5843 { |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
5844 gaim_gtk_set_cursor(gtkblist->window, GDK_WATCH); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5845 |
11796 | 5846 gaim_gtk_blist_sort_method_set(id); |
11923 | 5847 gaim_prefs_set_string("/gaim/gtk/blist/sort_type", id); |
12413
0332daad85ae
[gaim-migrate @ 14720]
Richard Laager <rlaager@wiktel.com>
parents:
12368
diff
changeset
|
5848 |
13434
ffd724befbf8
[gaim-migrate @ 15809]
Richard Laager <rlaager@wiktel.com>
parents:
13375
diff
changeset
|
5849 gaim_gtk_clear_cursor(gtkblist->window); |
11923 | 5850 } |
11796 | 5851 } |
5852 | |
5853 void | |
5854 gaim_gtk_blist_update_sort_methods(void) | |
5855 { | |
5856 GtkWidget *menuitem = NULL, *activeitem = NULL; | |
5857 GaimGtkBlistSortMethod *method = NULL; | |
5858 GList *l; | |
5859 GSList *sl = NULL; | |
5860 GtkWidget *sortmenu; | |
11797 | 5861 const char *m = gaim_prefs_get_string("/gaim/gtk/blist/sort_type"); |
11796 | 5862 |
5863 if (gtkblist == NULL) | |
5864 return; | |
5865 | |
11798
01c3eec6ea3c
[gaim-migrate @ 14089]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11797
diff
changeset
|
5866 sortmenu = gtk_item_factory_get_widget(gtkblist->ift, N_("/Buddies/Sort Buddies")); |
11796 | 5867 |
5868 if (sortmenu == NULL) | |
5869 return; | |
5870 | |
5871 /* Clear the old menu */ | |
5872 for (l = gtk_container_get_children(GTK_CONTAINER(sortmenu)); l; l = l->next) { | |
5873 menuitem = l->data; | |
5874 gtk_widget_destroy(GTK_WIDGET(menuitem)); | |
5875 } | |
11923 | 5876 |
11796 | 5877 for (l = gaim_gtk_blist_sort_methods; l; l = l->next) { |
5878 method = (GaimGtkBlistSortMethod *) l->data; | |
5879 menuitem = gtk_radio_menu_item_new_with_label(sl, _(method->name)); | |
5880 if (!strcmp(m, method->id)) | |
5881 activeitem = menuitem; | |
5882 sl = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); | |
5883 gtk_menu_shell_append(GTK_MENU_SHELL(sortmenu), menuitem); | |
5884 g_signal_connect(G_OBJECT(menuitem), "toggled", | |
5885 G_CALLBACK(sortmethod_act), method->id); | |
11923 | 5886 gtk_widget_show(menuitem); |
11796 | 5887 } |
5888 if (activeitem) | |
5889 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(activeitem), TRUE); | |
5890 } |