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