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