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