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