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