Mercurial > pidgin.yaz
annotate finch/gntblist.c @ 20329:24ce4fcce5b0
applied changes from e56db1b8a7bb8729e30fb3bf99a94ff7887fe4ec
through 3efb5d625e5a73423be8be77a6baeed0b65f7e55
applied changes from 74f0e6698f9f17bc8335cf2454c06e6b13748039
through 017296ee954fb91349806c809983c916842603da
applied changes from c8ff393c43d8a5f4136c653853a95284cc5710dc
through f53dbbff44537aa86b1cb8788fd306c90e6ccca9
applied changes from f53dbbff44537aa86b1cb8788fd306c90e6ccca9
through 5798594431164383deacd7d4aad5a9a0d5b867ae
applied changes from 5798594431164383deacd7d4aad5a9a0d5b867ae
through 0822c640f22b63d7bc8992e62b80bccd1eea12a2
applied changes from 703c3f9437d5e71255819c747f9690d19c6ba6e3
through b7a2c4d81867c3bbd262c2a4b1d924ea7fd3afb6
applied changes from b7a2c4d81867c3bbd262c2a4b1d924ea7fd3afb6
through 5ea15b000ee727088be88bb335c2ded6b2ab96e3
applied changes from 5ea15b000ee727088be88bb335c2ded6b2ab96e3
through c5051010dd50f9fdb7f85d779d882ce8bbc149f2
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Fri, 19 Oct 2007 18:14:53 +0000 |
parents | 6b8bc3309ab7 |
children | c7b2c6ae3bea |
rev | line source |
---|---|
15818 | 1 /** |
2 * @file gntblist.c GNT BuddyList API | |
16194
0f0832c13fcb
Rename the Doxygen group from gntui to finch and define the finch group
Richard Laager <rlaager@wiktel.com>
parents:
16106
diff
changeset
|
3 * @ingroup finch |
20251
6b8bc3309ab7
applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@wiktel.com>
parents:
19680
diff
changeset
|
4 */ |
6b8bc3309ab7
applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@wiktel.com>
parents:
19680
diff
changeset
|
5 |
6b8bc3309ab7
applied changes from 8a731bbd0197fbcc91a705c2d8f528154216defa
Richard Laager <rlaager@wiktel.com>
parents:
19680
diff
changeset
|
6 /* finch |
15818 | 7 * |
15871
66dff3dfdea6
Re-sed the copyright notices so they don't all talk about Purple.
Richard Laager <rlaager@wiktel.com>
parents:
15844
diff
changeset
|
8 * Finch is the legal property of its developers, whose names are too numerous |
15818 | 9 * to list here. Please refer to the COPYRIGHT file distributed with this |
10 * source distribution. | |
11 * | |
12 * This program is free software; you can redistribute it and/or modify | |
13 * it under the terms of the GNU General Public License as published by | |
14 * the Free Software Foundation; either version 2 of the License, or | |
15 * (at your option) any later version. | |
16 * | |
17 * This program is distributed in the hope that it will be useful, | |
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 * GNU General Public License for more details. | |
21 * | |
22 * You should have received a copy of the GNU General Public License | |
23 * along with this program; if not, write to the Free Software | |
19680
44b4e8bd759b
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
19375
diff
changeset
|
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
15818 | 25 */ |
18210
b8572b937c09
#include reorganizations to allow compiling with glib < 2.8 using the
Stu Tomlinson <stu@nosnilmot.com>
parents:
18071
diff
changeset
|
26 #include "finch.h" |
b8572b937c09
#include reorganizations to allow compiling with glib < 2.8 using the
Stu Tomlinson <stu@nosnilmot.com>
parents:
18071
diff
changeset
|
27 |
15818 | 28 #include <account.h> |
29 #include <blist.h> | |
30 #include <notify.h> | |
31 #include <request.h> | |
32 #include <savedstatuses.h> | |
33 #include <server.h> | |
34 #include <signal.h> | |
35 #include <status.h> | |
36 #include <util.h> | |
37 #include "debug.h" | |
38 | |
39 #include "gntbox.h" | |
40 #include "gntcombobox.h" | |
41 #include "gntentry.h" | |
42 #include "gntft.h" | |
43 #include "gntlabel.h" | |
44 #include "gntline.h" | |
45 #include "gntmenu.h" | |
46 #include "gntmenuitem.h" | |
47 #include "gntmenuitemcheck.h" | |
48 #include "gntpounce.h" | |
49 #include "gnttree.h" | |
50 #include "gntutils.h" | |
51 #include "gntwindow.h" | |
52 | |
53 #include "gntblist.h" | |
54 #include "gntconv.h" | |
55 #include "gntstatus.h" | |
56 #include <string.h> | |
57 | |
16427
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16276
diff
changeset
|
58 #define PREF_ROOT "/finch/blist" |
15818 | 59 #define TYPING_TIMEOUT 4000 |
60 | |
61 typedef struct | |
62 { | |
63 GntWidget *window; | |
64 GntWidget *tree; | |
65 | |
66 GntWidget *tooltip; | |
15823 | 67 PurpleBlistNode *tnode; /* Who is the tooltip being displayed for? */ |
15818 | 68 GList *tagged; /* A list of tagged blistnodes */ |
69 | |
70 GntWidget *context; | |
15823 | 71 PurpleBlistNode *cnode; |
15818 | 72 |
73 /* XXX: I am KISSing */ | |
74 GntWidget *status; /* Dropdown with the statuses */ | |
75 GntWidget *statustext; /* Status message */ | |
76 int typing; | |
77 | |
78 GntWidget *menu; | |
79 /* These are the menuitems that get regenerated */ | |
80 GntMenuItem *accounts; | |
81 GntMenuItem *plugins; | |
82 } FinchBlist; | |
83 | |
84 typedef enum | |
85 { | |
86 STATUS_PRIMITIVE = 0, | |
87 STATUS_SAVED_POPULAR, | |
88 STATUS_SAVED_ALL, | |
89 STATUS_SAVED_NEW | |
90 } StatusType; | |
91 | |
92 typedef struct | |
93 { | |
94 StatusType type; | |
95 union | |
96 { | |
15823 | 97 PurpleStatusPrimitive prim; |
98 PurpleSavedStatus *saved; | |
15818 | 99 } u; |
100 } StatusBoxItem; | |
101 | |
18584
91fdd3e4892f
We don't need dynamic things here.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18565
diff
changeset
|
102 static FinchBlist *ggblist; |
15818 | 103 |
15823 | 104 static void add_buddy(PurpleBuddy *buddy, FinchBlist *ggblist); |
105 static void add_contact(PurpleContact *contact, FinchBlist *ggblist); | |
106 static void add_group(PurpleGroup *group, FinchBlist *ggblist); | |
107 static void add_chat(PurpleChat *chat, FinchBlist *ggblist); | |
108 static void add_node(PurpleBlistNode *node, FinchBlist *ggblist); | |
18001
55a90b3fb1a1
Fix for the bug Alver reported:
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17987
diff
changeset
|
109 static void node_update(PurpleBuddyList *list, PurpleBlistNode *node); |
15818 | 110 static void draw_tooltip(FinchBlist *ggblist); |
111 static gboolean remove_typing_cb(gpointer null); | |
112 static void remove_peripherals(FinchBlist *ggblist); | |
15823 | 113 static const char * get_display_name(PurpleBlistNode *node); |
114 static void savedstatus_changed(PurpleSavedStatus *now, PurpleSavedStatus *old); | |
115 static void blist_show(PurpleBuddyList *list); | |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
116 static void update_node_display(PurpleBlistNode *buddy, FinchBlist *ggblist); |
15823 | 117 static void update_buddy_display(PurpleBuddy *buddy, FinchBlist *ggblist); |
16782
d7ad8013b914
Fix this spectacularly braindead code. I must've been on the good stuff when I wrote this. Fixes #364.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16663
diff
changeset
|
118 static void account_signed_on_cb(PurpleConnection *pc, gpointer null); |
17254
0d9fba04fc85
Re-show the add buddy request dialog if something went wrong. It's easy to lose the buddy who just added you otherwise.
Richard Nelson <wabz@pidgin.im>
parents:
17104
diff
changeset
|
119 static void finch_request_add_buddy(PurpleAccount *account, const char *username, const char *grp, const char *alias); |
15818 | 120 |
121 /* Sort functions */ | |
16491
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
122 static int blist_node_compare_position(PurpleBlistNode *n1, PurpleBlistNode *n2); |
15823 | 123 static int blist_node_compare_text(PurpleBlistNode *n1, PurpleBlistNode *n2); |
124 static int blist_node_compare_status(PurpleBlistNode *n1, PurpleBlistNode *n2); | |
125 static int blist_node_compare_log(PurpleBlistNode *n1, PurpleBlistNode *n2); | |
15818 | 126 |
127 static gboolean | |
15823 | 128 is_contact_online(PurpleContact *contact) |
15818 | 129 { |
15823 | 130 PurpleBlistNode *node; |
131 for (node = ((PurpleBlistNode*)contact)->child; node; node = node->next) { | |
132 if (PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node)) | |
15818 | 133 return TRUE; |
134 } | |
135 return FALSE; | |
136 } | |
137 | |
138 static gboolean | |
15823 | 139 is_group_online(PurpleGroup *group) |
15818 | 140 { |
15823 | 141 PurpleBlistNode *node; |
142 for (node = ((PurpleBlistNode*)group)->child; node; node = node->next) { | |
18490
095718d51209
Chats aren't shown if their account is offline, so a group of offline chats shouldn't be either
Richard Nelson <wabz@pidgin.im>
parents:
18442
diff
changeset
|
143 if (PURPLE_BLIST_NODE_IS_CHAT(node) && |
095718d51209
Chats aren't shown if their account is offline, so a group of offline chats shouldn't be either
Richard Nelson <wabz@pidgin.im>
parents:
18442
diff
changeset
|
144 purple_account_is_connected(((PurpleChat *)node)->account)) |
15818 | 145 return TRUE; |
15823 | 146 else if (is_contact_online((PurpleContact*)node)) |
15818 | 147 return TRUE; |
148 } | |
149 return FALSE; | |
150 } | |
151 | |
152 static void | |
15823 | 153 new_node(PurpleBlistNode *node) |
15818 | 154 { |
155 } | |
156 | |
15823 | 157 static void add_node(PurpleBlistNode *node, FinchBlist *ggblist) |
15818 | 158 { |
15823 | 159 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
160 add_buddy((PurpleBuddy*)node, ggblist); | |
161 else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) | |
162 add_contact((PurpleContact*)node, ggblist); | |
163 else if (PURPLE_BLIST_NODE_IS_GROUP(node)) | |
164 add_group((PurpleGroup*)node, ggblist); | |
165 else if (PURPLE_BLIST_NODE_IS_CHAT(node)) | |
166 add_chat((PurpleChat *)node, ggblist); | |
15818 | 167 draw_tooltip(ggblist); |
168 } | |
169 | |
170 static void | |
171 remove_tooltip(FinchBlist *ggblist) | |
172 { | |
173 gnt_widget_destroy(ggblist->tooltip); | |
174 ggblist->tooltip = NULL; | |
175 ggblist->tnode = NULL; | |
176 } | |
177 | |
178 static void | |
15823 | 179 node_remove(PurpleBuddyList *list, PurpleBlistNode *node) |
15818 | 180 { |
181 FinchBlist *ggblist = list->ui_data; | |
182 | |
183 if (ggblist == NULL || node->ui_data == NULL) | |
184 return; | |
185 | |
186 gnt_tree_remove(GNT_TREE(ggblist->tree), node); | |
187 node->ui_data = NULL; | |
188 if (ggblist->tagged) | |
189 ggblist->tagged = g_list_remove(ggblist->tagged, node); | |
190 | |
15823 | 191 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { |
192 PurpleContact *contact = (PurpleContact*)node->parent; | |
193 if ((!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_contact_online(contact)) || | |
15818 | 194 contact->currentsize < 1) |
15823 | 195 node_remove(list, (PurpleBlistNode*)contact); |
18001
55a90b3fb1a1
Fix for the bug Alver reported:
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17987
diff
changeset
|
196 else |
55a90b3fb1a1
Fix for the bug Alver reported:
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17987
diff
changeset
|
197 node_update(list, (PurpleBlistNode*)contact); |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
198 } else if (!PURPLE_BLIST_NODE_IS_GROUP(node)) { |
15823 | 199 PurpleGroup *group = (PurpleGroup*)node->parent; |
18441
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
200 if ((group->currentsize < 1 && !purple_prefs_get_bool(PREF_ROOT "/emptygroups")) || |
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
201 (!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_group_online(group))) |
15818 | 202 node_remove(list, node->parent); |
203 for (node = node->child; node; node = node->next) | |
204 node->ui_data = NULL; | |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
205 } else { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
206 for (node = node->child; node; node = node->next) |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
207 node_remove(list, node); |
15818 | 208 } |
209 | |
210 draw_tooltip(ggblist); | |
211 } | |
212 | |
213 static void | |
15823 | 214 node_update(PurpleBuddyList *list, PurpleBlistNode *node) |
15818 | 215 { |
216 /* It really looks like this should never happen ... but it does. | |
217 This will at least emit a warning to the log when it | |
218 happens, so maybe someone will figure it out. */ | |
219 g_return_if_fail(node != NULL); | |
220 | |
221 if (list->ui_data == NULL) | |
222 return; /* XXX: this is probably the place to auto-join chats */ | |
223 | |
17987
1b6db70bdab2
Fix a crash exposed by nullprpl.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17520
diff
changeset
|
224 if (ggblist->window == NULL) |
1b6db70bdab2
Fix a crash exposed by nullprpl.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17520
diff
changeset
|
225 return; |
1b6db70bdab2
Fix a crash exposed by nullprpl.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17520
diff
changeset
|
226 |
15818 | 227 if (node->ui_data != NULL) { |
228 gnt_tree_change_text(GNT_TREE(ggblist->tree), node, | |
229 0, get_display_name(node)); | |
230 gnt_tree_sort_row(GNT_TREE(ggblist->tree), node); | |
231 } | |
232 | |
15823 | 233 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { |
234 PurpleBuddy *buddy = (PurpleBuddy*)node; | |
235 if (purple_account_is_connected(buddy->account) && | |
236 (PURPLE_BUDDY_IS_ONLINE(buddy) || purple_prefs_get_bool(PREF_ROOT "/showoffline"))) | |
237 add_node((PurpleBlistNode*)buddy, list->ui_data); | |
15818 | 238 else |
15823 | 239 node_remove(purple_get_blist(), node); |
15818 | 240 |
241 node_update(list, node->parent); | |
15823 | 242 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { |
243 add_chat((PurpleChat *)node, list->ui_data); | |
244 } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { | |
245 PurpleContact *contact = (PurpleContact*)node; | |
246 if ((!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_contact_online(contact)) || | |
15818 | 247 contact->currentsize < 1) |
15823 | 248 node_remove(purple_get_blist(), node); |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
249 else { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
250 if (node->ui_data == NULL) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
251 /* The core seems to expect the UI to add the buddies. */ |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
252 for (node = node->child; node; node = node->next) |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
253 add_node(node, list->ui_data); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
254 } |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
255 } |
15823 | 256 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { |
257 PurpleGroup *group = (PurpleGroup*)node; | |
18441
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
258 if (!purple_prefs_get_bool(PREF_ROOT "/emptygroups") && |
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
259 ((!purple_prefs_get_bool(PREF_ROOT "/showoffline") && !is_group_online(group)) || |
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
260 group->currentsize < 1)) |
15818 | 261 node_remove(list, node); |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
262 else |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
263 add_node(node, list->ui_data); |
15818 | 264 } |
265 } | |
266 | |
267 static void | |
15823 | 268 new_list(PurpleBuddyList *list) |
15818 | 269 { |
270 if (ggblist) | |
271 return; | |
272 | |
273 ggblist = g_new0(FinchBlist, 1); | |
274 list->ui_data = ggblist; | |
275 } | |
276 | |
277 static void | |
15823 | 278 add_buddy_cb(void *data, PurpleRequestFields *allfields) |
15818 | 279 { |
15823 | 280 const char *username = purple_request_fields_get_string(allfields, "screenname"); |
281 const char *alias = purple_request_fields_get_string(allfields, "alias"); | |
282 const char *group = purple_request_fields_get_string(allfields, "group"); | |
283 PurpleAccount *account = purple_request_fields_get_account(allfields, "account"); | |
15818 | 284 const char *error = NULL; |
15823 | 285 PurpleGroup *grp; |
286 PurpleBuddy *buddy; | |
15818 | 287 |
288 if (!username) | |
289 error = _("You must provide a screename for the buddy."); | |
290 else if (!group) | |
291 error = _("You must provide a group."); | |
292 else if (!account) | |
293 error = _("You must select an account."); | |
16937
7e4a22162bb6
Show an error message when trying to add a buddy from an offline account.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16936
diff
changeset
|
294 else if (!purple_account_is_connected(account)) |
7e4a22162bb6
Show an error message when trying to add a buddy from an offline account.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16936
diff
changeset
|
295 error = _("The selected account is not online."); |
15818 | 296 |
297 if (error) | |
298 { | |
17254
0d9fba04fc85
Re-show the add buddy request dialog if something went wrong. It's easy to lose the buddy who just added you otherwise.
Richard Nelson <wabz@pidgin.im>
parents:
17104
diff
changeset
|
299 finch_request_add_buddy(account, username, group, alias); |
15823 | 300 purple_notify_error(NULL, _("Error"), _("Error adding buddy"), error); |
15818 | 301 return; |
302 } | |
303 | |
15823 | 304 grp = purple_find_group(group); |
15818 | 305 if (!grp) |
306 { | |
15823 | 307 grp = purple_group_new(group); |
308 purple_blist_add_group(grp, NULL); | |
15818 | 309 } |
310 | |
15823 | 311 buddy = purple_buddy_new(account, username, alias); |
312 purple_blist_add_buddy(buddy, NULL, grp, NULL); | |
313 purple_account_add_buddy(account, buddy); | |
15818 | 314 } |
315 | |
316 static void | |
15823 | 317 finch_request_add_buddy(PurpleAccount *account, const char *username, const char *grp, const char *alias) |
15818 | 318 { |
15823 | 319 PurpleRequestFields *fields = purple_request_fields_new(); |
320 PurpleRequestFieldGroup *group = purple_request_field_group_new(NULL); | |
321 PurpleRequestField *field; | |
15818 | 322 |
15823 | 323 purple_request_fields_add_group(fields, group); |
15818 | 324 |
15823 | 325 field = purple_request_field_string_new("screenname", _("Screen Name"), username, FALSE); |
326 purple_request_field_group_add_field(group, field); | |
15818 | 327 |
15823 | 328 field = purple_request_field_string_new("alias", _("Alias"), alias, FALSE); |
329 purple_request_field_group_add_field(group, field); | |
15818 | 330 |
15823 | 331 field = purple_request_field_string_new("group", _("Group"), grp, FALSE); |
332 purple_request_field_group_add_field(group, field); | |
15844
e74c2488448b
Group autocomplete for buddy adding
Richard Nelson <wabz@pidgin.im>
parents:
15823
diff
changeset
|
333 purple_request_field_set_type_hint(field, "group"); |
15818 | 334 |
15823 | 335 field = purple_request_field_account_new("account", _("Account"), NULL); |
336 purple_request_field_account_set_show_all(field, FALSE); | |
15818 | 337 if (account) |
15823 | 338 purple_request_field_account_set_value(field, account); |
339 purple_request_field_group_add_field(group, field); | |
15818 | 340 |
15823 | 341 purple_request_fields(NULL, _("Add Buddy"), NULL, _("Please enter buddy information."), |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
342 fields, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
343 _("Add"), G_CALLBACK(add_buddy_cb), |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
344 _("Cancel"), NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
345 account, NULL, NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
346 NULL); |
15818 | 347 } |
348 | |
349 static void | |
15823 | 350 add_chat_cb(void *data, PurpleRequestFields *allfields) |
15818 | 351 { |
15823 | 352 PurpleAccount *account; |
15818 | 353 const char *alias, *name, *group; |
15823 | 354 PurpleChat *chat; |
355 PurpleGroup *grp; | |
15818 | 356 GHashTable *hash = NULL; |
15823 | 357 PurpleConnection *gc; |
18586
4fda1fc6d7cf
Add an 'auto-join' checkbox in the 'Add Chat' dialog, thanks to fmoo's
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18585
diff
changeset
|
358 gboolean autojoin; |
15818 | 359 |
15823 | 360 account = purple_request_fields_get_account(allfields, "account"); |
361 name = purple_request_fields_get_string(allfields, "name"); | |
362 alias = purple_request_fields_get_string(allfields, "alias"); | |
363 group = purple_request_fields_get_string(allfields, "group"); | |
18586
4fda1fc6d7cf
Add an 'auto-join' checkbox in the 'Add Chat' dialog, thanks to fmoo's
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18585
diff
changeset
|
364 autojoin = purple_request_fields_get_bool(allfields, "autojoin"); |
15818 | 365 |
15823 | 366 if (!purple_account_is_connected(account) || !name || !*name) |
15818 | 367 return; |
368 | |
369 if (!group || !*group) | |
370 group = _("Chats"); | |
371 | |
15823 | 372 gc = purple_account_get_connection(account); |
15818 | 373 |
15823 | 374 if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL) |
375 hash = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, name); | |
15818 | 376 |
15823 | 377 chat = purple_chat_new(account, name, hash); |
15818 | 378 |
379 if (chat != NULL) { | |
15823 | 380 if ((grp = purple_find_group(group)) == NULL) { |
381 grp = purple_group_new(group); | |
382 purple_blist_add_group(grp, NULL); | |
15818 | 383 } |
15823 | 384 purple_blist_add_chat(chat, grp, NULL); |
385 purple_blist_alias_chat(chat, alias); | |
18586
4fda1fc6d7cf
Add an 'auto-join' checkbox in the 'Add Chat' dialog, thanks to fmoo's
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18585
diff
changeset
|
386 purple_blist_node_set_bool((PurpleBlistNode*)chat, "gnt-autojoin", autojoin); |
4fda1fc6d7cf
Add an 'auto-join' checkbox in the 'Add Chat' dialog, thanks to fmoo's
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18585
diff
changeset
|
387 if (autojoin) |
4fda1fc6d7cf
Add an 'auto-join' checkbox in the 'Add Chat' dialog, thanks to fmoo's
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18585
diff
changeset
|
388 serv_join_chat(chat->account->gc, chat->components); |
15818 | 389 } |
390 } | |
391 | |
392 static void | |
15823 | 393 finch_request_add_chat(PurpleAccount *account, PurpleGroup *grp, const char *alias, const char *name) |
15818 | 394 { |
15823 | 395 PurpleRequestFields *fields = purple_request_fields_new(); |
396 PurpleRequestFieldGroup *group = purple_request_field_group_new(NULL); | |
397 PurpleRequestField *field; | |
15818 | 398 |
15823 | 399 purple_request_fields_add_group(fields, group); |
15818 | 400 |
15823 | 401 field = purple_request_field_account_new("account", _("Account"), NULL); |
402 purple_request_field_account_set_show_all(field, FALSE); | |
15818 | 403 if (account) |
15823 | 404 purple_request_field_account_set_value(field, account); |
405 purple_request_field_group_add_field(group, field); | |
15818 | 406 |
15823 | 407 field = purple_request_field_string_new("name", _("Name"), name, FALSE); |
408 purple_request_field_group_add_field(group, field); | |
15818 | 409 |
15823 | 410 field = purple_request_field_string_new("alias", _("Alias"), alias, FALSE); |
411 purple_request_field_group_add_field(group, field); | |
15818 | 412 |
15823 | 413 field = purple_request_field_string_new("group", _("Group"), grp ? grp->name : NULL, FALSE); |
414 purple_request_field_group_add_field(group, field); | |
15818 | 415 |
18586
4fda1fc6d7cf
Add an 'auto-join' checkbox in the 'Add Chat' dialog, thanks to fmoo's
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18585
diff
changeset
|
416 field = purple_request_field_bool_new("autojoin", _("Auto-join"), FALSE); |
4fda1fc6d7cf
Add an 'auto-join' checkbox in the 'Add Chat' dialog, thanks to fmoo's
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18585
diff
changeset
|
417 purple_request_field_group_add_field(group, field); |
4fda1fc6d7cf
Add an 'auto-join' checkbox in the 'Add Chat' dialog, thanks to fmoo's
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18585
diff
changeset
|
418 |
15823 | 419 purple_request_fields(NULL, _("Add Chat"), NULL, |
15818 | 420 _("You can edit more information from the context menu later."), |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
421 fields, _("Add"), G_CALLBACK(add_chat_cb), _("Cancel"), NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
422 NULL, NULL, NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
423 NULL); |
15818 | 424 } |
425 | |
426 static void | |
427 add_group_cb(gpointer null, const char *group) | |
428 { | |
15823 | 429 PurpleGroup *grp; |
15818 | 430 |
431 if (!group || !*group) | |
432 { | |
15823 | 433 purple_notify_error(NULL, _("Error"), _("Error adding group"), |
15818 | 434 _("You must give a name for the group to add.")); |
435 return; | |
436 } | |
437 | |
15823 | 438 grp = purple_find_group(group); |
15818 | 439 if (!grp) |
440 { | |
15823 | 441 grp = purple_group_new(group); |
442 purple_blist_add_group(grp, NULL); | |
15818 | 443 } |
444 else | |
445 { | |
15823 | 446 purple_notify_error(NULL, _("Error"), _("Error adding group"), |
15818 | 447 _("A group with the name already exists.")); |
448 } | |
449 } | |
450 | |
451 static void | |
452 finch_request_add_group() | |
453 { | |
15823 | 454 purple_request_input(NULL, _("Add Group"), NULL, _("Enter the name of the group"), |
15818 | 455 NULL, FALSE, FALSE, NULL, |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
456 _("Add"), G_CALLBACK(add_group_cb), _("Cancel"), NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
457 NULL, NULL, NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
458 NULL); |
15818 | 459 } |
460 | |
15823 | 461 static PurpleBlistUiOps blist_ui_ops = |
15818 | 462 { |
463 new_list, | |
464 new_node, | |
465 blist_show, | |
466 node_update, | |
467 node_remove, | |
468 NULL, | |
469 NULL, | |
17104
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
16969
diff
changeset
|
470 finch_request_add_buddy, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
16969
diff
changeset
|
471 finch_request_add_chat, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
16969
diff
changeset
|
472 finch_request_add_group, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
16969
diff
changeset
|
473 NULL, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
16969
diff
changeset
|
474 NULL, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
16969
diff
changeset
|
475 NULL, |
46f2f86e08e4
Death to more futuristic struct initialization. This should be the last.
Richard Laager <rlaager@wiktel.com>
parents:
16969
diff
changeset
|
476 NULL |
15818 | 477 }; |
478 | |
479 static gpointer | |
480 finch_blist_get_handle() | |
481 { | |
482 static int handle; | |
483 | |
484 return &handle; | |
485 } | |
486 | |
487 static void | |
15823 | 488 add_group(PurpleGroup *group, FinchBlist *ggblist) |
15818 | 489 { |
15823 | 490 PurpleBlistNode *node = (PurpleBlistNode *)group; |
15818 | 491 if (node->ui_data) |
492 return; | |
493 node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), group, | |
494 gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), NULL, NULL); | |
16105
1983ecd15174
Remember the collapsed state of groups in the blist
Richard Nelson <wabz@pidgin.im>
parents:
15931
diff
changeset
|
495 gnt_tree_set_expanded(GNT_TREE(ggblist->tree), node, |
1983ecd15174
Remember the collapsed state of groups in the blist
Richard Nelson <wabz@pidgin.im>
parents:
15931
diff
changeset
|
496 !purple_blist_node_get_bool(node, "collapsed")); |
15818 | 497 } |
498 | |
499 static const char * | |
15823 | 500 get_display_name(PurpleBlistNode *node) |
15818 | 501 { |
502 static char text[2096]; | |
503 char status[8] = " "; | |
504 const char *name = NULL; | |
505 | |
15823 | 506 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) |
507 node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)node); /* XXX: this can return NULL?! */ | |
15818 | 508 |
509 if (node == NULL) | |
510 return NULL; | |
511 | |
15823 | 512 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
15818 | 513 { |
15823 | 514 PurpleBuddy *buddy = (PurpleBuddy *)node; |
515 PurpleStatusPrimitive prim; | |
516 PurplePresence *presence; | |
517 PurpleStatus *now; | |
15818 | 518 gboolean ascii = gnt_ascii_only(); |
519 | |
15823 | 520 presence = purple_buddy_get_presence(buddy); |
18437
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
521 if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_MOBILE)) |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
522 strncpy(status, ascii ? ":" : "☎", sizeof(status) - 1); |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
523 else { |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
524 now = purple_presence_get_active_status(presence); |
15818 | 525 |
18437
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
526 prim = purple_status_type_get_primitive(purple_status_get_type(now)); |
15818 | 527 |
18437
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
528 switch(prim) { |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
529 case PURPLE_STATUS_OFFLINE: |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
530 strncpy(status, ascii ? "x" : "⊗", sizeof(status) - 1); |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
531 break; |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
532 case PURPLE_STATUS_AVAILABLE: |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
533 strncpy(status, ascii ? "o" : "â—¯", sizeof(status) - 1); |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
534 break; |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
535 default: |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
536 strncpy(status, ascii ? "." : "⊖", sizeof(status) - 1); |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
537 break; |
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
538 } |
15818 | 539 } |
15823 | 540 name = purple_buddy_get_alias(buddy); |
15818 | 541 } |
15823 | 542 else if (PURPLE_BLIST_NODE_IS_CHAT(node)) |
15818 | 543 { |
15823 | 544 PurpleChat *chat = (PurpleChat*)node; |
545 name = purple_chat_get_name(chat); | |
15818 | 546 |
547 strncpy(status, "~", sizeof(status) - 1); | |
548 } | |
15823 | 549 else if (PURPLE_BLIST_NODE_IS_GROUP(node)) |
550 return ((PurpleGroup*)node)->name; | |
15818 | 551 |
552 snprintf(text, sizeof(text) - 1, "%s %s", status, name); | |
553 | |
554 return text; | |
555 } | |
556 | |
557 static void | |
15823 | 558 add_chat(PurpleChat *chat, FinchBlist *ggblist) |
15818 | 559 { |
15823 | 560 PurpleGroup *group; |
561 PurpleBlistNode *node = (PurpleBlistNode *)chat; | |
15818 | 562 if (node->ui_data) |
563 return; | |
15823 | 564 if (!purple_account_is_connected(chat->account)) |
15818 | 565 return; |
566 | |
15823 | 567 group = purple_chat_get_group(chat); |
568 add_node((PurpleBlistNode*)group, ggblist); | |
15818 | 569 |
570 node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), chat, | |
571 gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), | |
572 group, NULL); | |
573 } | |
574 | |
575 static void | |
15823 | 576 add_contact(PurpleContact *contact, FinchBlist *ggblist) |
15818 | 577 { |
15823 | 578 PurpleGroup *group; |
579 PurpleBlistNode *node = (PurpleBlistNode*)contact; | |
15818 | 580 const char *name; |
581 | |
582 if (node->ui_data) | |
583 return; | |
584 | |
585 name = get_display_name(node); | |
586 if (name == NULL) | |
587 return; | |
588 | |
15823 | 589 group = (PurpleGroup*)node->parent; |
590 add_node((PurpleBlistNode*)group, ggblist); | |
15818 | 591 |
592 node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), contact, | |
593 gnt_tree_create_row(GNT_TREE(ggblist->tree), name), | |
594 group, NULL); | |
595 | |
596 gnt_tree_set_expanded(GNT_TREE(ggblist->tree), contact, FALSE); | |
597 } | |
598 | |
599 static void | |
15823 | 600 add_buddy(PurpleBuddy *buddy, FinchBlist *ggblist) |
15818 | 601 { |
15823 | 602 PurpleContact *contact; |
603 PurpleBlistNode *node = (PurpleBlistNode *)buddy; | |
15818 | 604 if (node->ui_data) |
605 return; | |
606 | |
18428
1dbd8ce2f11f
Fix a bug where buddies from offline accounts were showing up.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
607 if (!purple_account_is_connected(buddy->account)) |
1dbd8ce2f11f
Fix a bug where buddies from offline accounts were showing up.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
608 return; |
1dbd8ce2f11f
Fix a bug where buddies from offline accounts were showing up.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
609 |
15823 | 610 contact = (PurpleContact*)node->parent; |
15818 | 611 if (!contact) /* When a new buddy is added and show-offline is set */ |
612 return; | |
15823 | 613 add_node((PurpleBlistNode*)contact, ggblist); |
15818 | 614 |
615 node->ui_data = gnt_tree_add_row_after(GNT_TREE(ggblist->tree), buddy, | |
616 gnt_tree_create_row(GNT_TREE(ggblist->tree), get_display_name(node)), | |
617 contact, NULL); | |
15823 | 618 if (purple_presence_is_idle(purple_buddy_get_presence(buddy))) { |
15818 | 619 gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, GNT_TEXT_FLAG_DIM); |
620 gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, GNT_TEXT_FLAG_DIM); | |
621 } else { | |
622 gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, 0); | |
623 gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, 0); | |
624 } | |
625 } | |
626 | |
627 #if 0 | |
628 static void | |
15823 | 629 buddy_signed_on(PurpleBuddy *buddy, FinchBlist *ggblist) |
15818 | 630 { |
15823 | 631 add_node((PurpleBlistNode*)buddy, ggblist); |
15818 | 632 } |
633 | |
634 static void | |
15823 | 635 buddy_signed_off(PurpleBuddy *buddy, FinchBlist *ggblist) |
15818 | 636 { |
15823 | 637 node_remove(purple_get_blist(), (PurpleBlistNode*)buddy); |
15818 | 638 } |
639 #endif | |
640 | |
15823 | 641 PurpleBlistUiOps *finch_blist_get_ui_ops() |
15818 | 642 { |
643 return &blist_ui_ops; | |
644 } | |
645 | |
646 static void | |
647 selection_activate(GntWidget *widget, FinchBlist *ggblist) | |
648 { | |
649 GntTree *tree = GNT_TREE(ggblist->tree); | |
15823 | 650 PurpleBlistNode *node = gnt_tree_get_selection_data(tree); |
15818 | 651 |
652 if (!node) | |
653 return; | |
654 | |
15823 | 655 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) |
656 node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)node); | |
15818 | 657 |
15823 | 658 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
15818 | 659 { |
15823 | 660 PurpleBuddy *buddy = (PurpleBuddy *)node; |
18071
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
661 PurpleConversation *conv; |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
662 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
663 purple_buddy_get_name(buddy), |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
664 purple_buddy_get_account(buddy)); |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
665 if (!conv) { |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
666 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
667 purple_buddy_get_account(buddy), |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
668 purple_buddy_get_name(buddy)); |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
669 } else { |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
670 FinchConv *ggconv = conv->ui_data; |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
671 gnt_window_present(ggconv->window); |
bb9cd8dfc61c
present existing conversation window if one exists
Richard Nelson <wabz@pidgin.im>
parents:
18069
diff
changeset
|
672 } |
15818 | 673 finch_conversation_set_active(conv); |
674 } | |
15823 | 675 else if (PURPLE_BLIST_NODE_IS_CHAT(node)) |
15818 | 676 { |
15823 | 677 PurpleChat *chat = (PurpleChat*)node; |
15818 | 678 serv_join_chat(chat->account->gc, chat->components); |
679 } | |
680 } | |
681 | |
682 static void | |
683 context_menu_callback(GntMenuItem *item, gpointer data) | |
684 { | |
15823 | 685 PurpleMenuAction *action = data; |
686 PurpleBlistNode *node = ggblist->cnode; | |
15818 | 687 if (action) { |
15823 | 688 void (*callback)(PurpleBlistNode *, gpointer); |
689 callback = (void (*)(PurpleBlistNode *, gpointer))action->callback; | |
15818 | 690 if (callback) |
18512
0cb139b20d65
I can pretty much swear this worked at some point. I am not sure when this
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18490
diff
changeset
|
691 callback(node, action->data); |
15818 | 692 else |
693 return; | |
694 } | |
695 } | |
696 | |
697 static void | |
15823 | 698 gnt_append_menu_action(GntMenu *menu, PurpleMenuAction *action, gpointer parent) |
15818 | 699 { |
700 GList *list; | |
701 GntMenuItem *item; | |
702 | |
703 if (action == NULL) | |
704 return; | |
705 | |
706 item = gnt_menuitem_new(action->label); | |
707 if (action->callback) | |
15931
f00f2e283ffb
Some define changes. This helps in generating the python bindings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15871
diff
changeset
|
708 gnt_menuitem_set_callback(GNT_MENU_ITEM(item), context_menu_callback, action); |
f00f2e283ffb
Some define changes. This helps in generating the python bindings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15871
diff
changeset
|
709 gnt_menu_add_item(menu, GNT_MENU_ITEM(item)); |
15818 | 710 |
711 if (action->children) { | |
712 GntWidget *sub = gnt_menu_new(GNT_MENU_POPUP); | |
713 gnt_menuitem_set_submenu(item, GNT_MENU(sub)); | |
714 for (list = action->children; list; list = list->next) | |
715 gnt_append_menu_action(GNT_MENU(sub), list->data, action); | |
716 } | |
717 } | |
718 | |
719 static void | |
15823 | 720 append_proto_menu(GntMenu *menu, PurpleConnection *gc, PurpleBlistNode *node) |
15818 | 721 { |
722 GList *list; | |
15823 | 723 PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); |
15818 | 724 |
725 if(!prpl_info || !prpl_info->blist_node_menu) | |
726 return; | |
727 | |
728 for(list = prpl_info->blist_node_menu(node); list; | |
729 list = g_list_delete_link(list, list)) | |
730 { | |
15823 | 731 PurpleMenuAction *act = (PurpleMenuAction *) list->data; |
15818 | 732 act->data = node; |
733 gnt_append_menu_action(menu, act, NULL); | |
734 } | |
735 } | |
736 | |
737 static void | |
15823 | 738 add_custom_action(GntMenu *menu, const char *label, PurpleCallback callback, |
15818 | 739 gpointer data) |
740 { | |
15823 | 741 PurpleMenuAction *action = purple_menu_action_new(label, callback, data, NULL); |
15818 | 742 gnt_append_menu_action(menu, action, NULL); |
743 g_signal_connect_swapped(G_OBJECT(menu), "destroy", | |
15823 | 744 G_CALLBACK(purple_menu_action_free), action); |
15818 | 745 } |
746 | |
747 static void | |
15823 | 748 chat_components_edit_ok(PurpleChat *chat, PurpleRequestFields *allfields) |
15818 | 749 { |
750 GList *groups, *fields; | |
751 | |
15823 | 752 for (groups = purple_request_fields_get_groups(allfields); groups; groups = groups->next) { |
753 fields = purple_request_field_group_get_fields(groups->data); | |
15818 | 754 for (; fields; fields = fields->next) { |
15823 | 755 PurpleRequestField *field = fields->data; |
15818 | 756 const char *id; |
757 char *val; | |
758 | |
15823 | 759 id = purple_request_field_get_id(field); |
760 if (purple_request_field_get_type(field) == PURPLE_REQUEST_FIELD_INTEGER) | |
761 val = g_strdup_printf("%d", purple_request_field_int_get_value(field)); | |
15818 | 762 else |
15823 | 763 val = g_strdup(purple_request_field_string_get_value(field)); |
15818 | 764 |
765 g_hash_table_replace(chat->components, g_strdup(id), val); /* val should not be free'd */ | |
766 } | |
767 } | |
768 } | |
769 | |
770 static void | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
771 chat_components_edit(PurpleBlistNode *selected, PurpleChat *chat) |
15818 | 772 { |
15823 | 773 PurpleRequestFields *fields = purple_request_fields_new(); |
774 PurpleRequestFieldGroup *group = purple_request_field_group_new(NULL); | |
775 PurpleRequestField *field; | |
15818 | 776 GList *parts, *iter; |
777 struct proto_chat_entry *pce; | |
778 | |
15823 | 779 purple_request_fields_add_group(fields, group); |
15818 | 780 |
15823 | 781 parts = PURPLE_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); |
15818 | 782 |
783 for (iter = parts; iter; iter = iter->next) { | |
784 pce = iter->data; | |
785 if (pce->is_int) { | |
786 int val; | |
787 const char *str = g_hash_table_lookup(chat->components, pce->identifier); | |
788 if (!str || sscanf(str, "%d", &val) != 1) | |
789 val = pce->min; | |
15823 | 790 field = purple_request_field_int_new(pce->identifier, pce->label, val); |
15818 | 791 } else { |
15823 | 792 field = purple_request_field_string_new(pce->identifier, pce->label, |
15818 | 793 g_hash_table_lookup(chat->components, pce->identifier), FALSE); |
794 } | |
795 | |
15823 | 796 purple_request_field_group_add_field(group, field); |
15818 | 797 g_free(pce); |
798 } | |
799 | |
800 g_list_free(parts); | |
801 | |
15823 | 802 purple_request_fields(NULL, _("Edit Chat"), NULL, _("Please Update the necessary fields."), |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
803 fields, _("Edit"), G_CALLBACK(chat_components_edit_ok), _("Cancel"), NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
804 NULL, NULL, NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
805 chat); |
15818 | 806 } |
807 | |
808 static void | |
809 autojoin_toggled(GntMenuItem *item, gpointer data) | |
810 { | |
15823 | 811 PurpleMenuAction *action = data; |
812 purple_blist_node_set_bool(action->data, "gnt-autojoin", | |
15931
f00f2e283ffb
Some define changes. This helps in generating the python bindings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15871
diff
changeset
|
813 gnt_menuitem_check_get_checked(GNT_MENU_ITEM_CHECK(item))); |
15818 | 814 } |
815 | |
816 static void | |
15823 | 817 create_chat_menu(GntMenu *menu, PurpleChat *chat) |
15818 | 818 { |
15823 | 819 PurpleMenuAction *action = purple_menu_action_new(_("Auto-join"), NULL, chat, NULL); |
15818 | 820 GntMenuItem *check = gnt_menuitem_check_new(action->label); |
15931
f00f2e283ffb
Some define changes. This helps in generating the python bindings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15871
diff
changeset
|
821 gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(check), |
15823 | 822 purple_blist_node_get_bool((PurpleBlistNode*)chat, "gnt-autojoin")); |
15818 | 823 gnt_menu_add_item(menu, check); |
824 gnt_menuitem_set_callback(check, autojoin_toggled, action); | |
825 g_signal_connect_swapped(G_OBJECT(menu), "destroy", | |
15823 | 826 G_CALLBACK(purple_menu_action_free), action); |
15818 | 827 |
15823 | 828 add_custom_action(menu, _("Edit Settings"), (PurpleCallback)chat_components_edit, chat); |
15818 | 829 } |
830 | |
831 static void | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
832 finch_add_buddy(PurpleBlistNode *selected, PurpleGroup *grp) |
15818 | 833 { |
15823 | 834 purple_blist_request_add_buddy(NULL, NULL, grp ? grp->name : NULL, NULL); |
15818 | 835 } |
836 | |
837 static void | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
838 finch_add_group(PurpleBlistNode *selected, PurpleGroup *grp) |
15818 | 839 { |
15823 | 840 purple_blist_request_add_group(); |
15818 | 841 } |
842 | |
843 static void | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
844 finch_add_chat(PurpleBlistNode *selected, PurpleGroup *grp) |
15818 | 845 { |
15823 | 846 purple_blist_request_add_chat(NULL, grp, NULL, NULL); |
15818 | 847 } |
848 | |
849 static void | |
15823 | 850 create_group_menu(GntMenu *menu, PurpleGroup *group) |
15818 | 851 { |
852 add_custom_action(menu, _("Add Buddy"), | |
15823 | 853 PURPLE_CALLBACK(finch_add_buddy), group); |
15818 | 854 add_custom_action(menu, _("Add Chat"), |
15823 | 855 PURPLE_CALLBACK(finch_add_chat), group); |
15818 | 856 add_custom_action(menu, _("Add Group"), |
15823 | 857 PURPLE_CALLBACK(finch_add_group), group); |
15818 | 858 } |
859 | |
17520
464840043c66
Show information about the user requesting authorization.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17395
diff
changeset
|
860 gpointer finch_retrieve_user_info(PurpleConnection *conn, const char *name) |
17275
319bcb73eb4e
Use utility functions to get user info. Closes #964.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17254
diff
changeset
|
861 { |
319bcb73eb4e
Use utility functions to get user info. Closes #964.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17254
diff
changeset
|
862 PurpleNotifyUserInfo *info = purple_notify_user_info_new(); |
17520
464840043c66
Show information about the user requesting authorization.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17395
diff
changeset
|
863 gpointer uihandle; |
17275
319bcb73eb4e
Use utility functions to get user info. Closes #964.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17254
diff
changeset
|
864 purple_notify_user_info_add_pair(info, _("Information"), _("Retrieving...")); |
17520
464840043c66
Show information about the user requesting authorization.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17395
diff
changeset
|
865 uihandle = purple_notify_userinfo(conn, name, info, NULL, NULL); |
17275
319bcb73eb4e
Use utility functions to get user info. Closes #964.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17254
diff
changeset
|
866 purple_notify_user_info_destroy(info); |
319bcb73eb4e
Use utility functions to get user info. Closes #964.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17254
diff
changeset
|
867 |
319bcb73eb4e
Use utility functions to get user info. Closes #964.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17254
diff
changeset
|
868 serv_get_info(conn, name); |
17520
464840043c66
Show information about the user requesting authorization.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17395
diff
changeset
|
869 return uihandle; |
17275
319bcb73eb4e
Use utility functions to get user info. Closes #964.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17254
diff
changeset
|
870 } |
319bcb73eb4e
Use utility functions to get user info. Closes #964.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17254
diff
changeset
|
871 |
15818 | 872 static void |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
873 finch_blist_get_buddy_info_cb(PurpleBlistNode *selected, PurpleBuddy *buddy) |
15818 | 874 { |
17275
319bcb73eb4e
Use utility functions to get user info. Closes #964.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17254
diff
changeset
|
875 finch_retrieve_user_info(buddy->account->gc, purple_buddy_get_name(buddy)); |
15818 | 876 } |
877 | |
878 static void | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
879 finch_blist_menu_send_file_cb(PurpleBlistNode *selected, PurpleBuddy *buddy) |
15818 | 880 { |
881 serv_send_file(buddy->account->gc, buddy->name, NULL); | |
882 } | |
883 | |
884 static void | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
885 finch_blist_pounce_node_cb(PurpleBlistNode *selected, PurpleBlistNode *node) |
15818 | 886 { |
15823 | 887 PurpleBuddy *b; |
888 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) | |
889 b = purple_contact_get_priority_buddy((PurpleContact *)node); | |
15818 | 890 else |
15823 | 891 b = (PurpleBuddy *)node; |
15818 | 892 finch_pounce_editor_show(b->account, b->name, NULL); |
893 } | |
894 | |
895 | |
896 static void | |
15823 | 897 create_buddy_menu(GntMenu *menu, PurpleBuddy *buddy) |
15818 | 898 { |
15823 | 899 PurplePluginProtocolInfo *prpl_info; |
15818 | 900 |
15823 | 901 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(buddy->account->gc->prpl); |
15818 | 902 if (prpl_info && prpl_info->get_info) |
903 { | |
904 add_custom_action(menu, _("Get Info"), | |
15823 | 905 PURPLE_CALLBACK(finch_blist_get_buddy_info_cb), buddy); |
15818 | 906 } |
907 | |
908 add_custom_action(menu, _("Add Buddy Pounce"), | |
15823 | 909 PURPLE_CALLBACK(finch_blist_pounce_node_cb), buddy); |
15818 | 910 |
911 if (prpl_info && prpl_info->send_file) | |
912 { | |
913 if (!prpl_info->can_receive_file || | |
914 prpl_info->can_receive_file(buddy->account->gc, buddy->name)) | |
915 add_custom_action(menu, _("Send File"), | |
15823 | 916 PURPLE_CALLBACK(finch_blist_menu_send_file_cb), buddy); |
15818 | 917 } |
918 #if 0 | |
919 add_custom_action(tree, _("View Log"), | |
15823 | 920 PURPLE_CALLBACK(finch_blist_view_log_cb)), buddy); |
15818 | 921 #endif |
922 | |
923 /* Protocol actions */ | |
924 append_proto_menu(menu, | |
15823 | 925 purple_account_get_connection(purple_buddy_get_account(buddy)), |
926 (PurpleBlistNode*)buddy); | |
15818 | 927 } |
928 | |
929 static void | |
15823 | 930 append_extended_menu(GntMenu *menu, PurpleBlistNode *node) |
15818 | 931 { |
932 GList *iter; | |
933 | |
15823 | 934 for (iter = purple_blist_node_get_extended_menu(node); |
15818 | 935 iter; iter = g_list_delete_link(iter, iter)) |
936 { | |
937 gnt_append_menu_action(menu, iter->data, NULL); | |
938 } | |
939 } | |
940 | |
15823 | 941 /* Xerox'd from gtkdialogs.c:purple_gtkdialogs_remove_contact_cb */ |
15818 | 942 static void |
15823 | 943 remove_contact(PurpleContact *contact) |
15818 | 944 { |
15823 | 945 PurpleBlistNode *bnode, *cnode; |
946 PurpleGroup *group; | |
15818 | 947 |
15823 | 948 cnode = (PurpleBlistNode *)contact; |
949 group = (PurpleGroup*)cnode->parent; | |
15818 | 950 for (bnode = cnode->child; bnode; bnode = bnode->next) { |
15823 | 951 PurpleBuddy *buddy = (PurpleBuddy*)bnode; |
952 if (purple_account_is_connected(buddy->account)) | |
953 purple_account_remove_buddy(buddy->account, buddy, group); | |
15818 | 954 } |
15823 | 955 purple_blist_remove_contact(contact); |
15818 | 956 } |
957 | |
958 static void | |
15823 | 959 rename_blist_node(PurpleBlistNode *node, const char *newname) |
15818 | 960 { |
961 const char *name = newname; | |
962 if (name && !*name) | |
963 name = NULL; | |
964 | |
15823 | 965 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
966 PurpleContact *contact = (PurpleContact*)node; | |
967 PurpleBuddy *buddy = purple_contact_get_priority_buddy(contact); | |
968 purple_blist_alias_contact(contact, name); | |
969 purple_blist_alias_buddy(buddy, name); | |
15818 | 970 serv_alias_buddy(buddy); |
15823 | 971 } else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { |
972 purple_blist_alias_buddy((PurpleBuddy*)node, name); | |
973 serv_alias_buddy((PurpleBuddy*)node); | |
974 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) | |
975 purple_blist_alias_chat((PurpleChat*)node, name); | |
976 else if (PURPLE_BLIST_NODE_IS_GROUP(node) && (name != NULL)) | |
977 purple_blist_rename_group((PurpleGroup*)node, name); | |
15818 | 978 else |
979 g_return_if_reached(); | |
980 } | |
981 | |
982 static void | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
983 finch_blist_rename_node_cb(PurpleBlistNode *selected, PurpleBlistNode *node) |
15818 | 984 { |
985 const char *name = NULL; | |
986 char *prompt; | |
16276
31dad9806e9d
Use 'alias' instead of 'rename' for non-group nodes. Thankfully, this does not introduce new strings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16194
diff
changeset
|
987 const char *text; |
15818 | 988 |
15823 | 989 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) |
990 name = purple_contact_get_alias((PurpleContact*)node); | |
991 else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) | |
992 name = purple_buddy_get_contact_alias((PurpleBuddy*)node); | |
993 else if (PURPLE_BLIST_NODE_IS_CHAT(node)) | |
994 name = purple_chat_get_name((PurpleChat*)node); | |
995 else if (PURPLE_BLIST_NODE_IS_GROUP(node)) | |
996 name = ((PurpleGroup*)node)->name; | |
15818 | 997 else |
998 g_return_if_reached(); | |
999 | |
1000 prompt = g_strdup_printf(_("Please enter the new name for %s"), name); | |
1001 | |
16969
1a336cfc410e
Change a string, and make sure non-functional items are not added in the conversation window menu.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16937
diff
changeset
|
1002 text = PURPLE_BLIST_NODE_IS_GROUP(node) ? _("Rename") : _("Set Alias"); |
16276
31dad9806e9d
Use 'alias' instead of 'rename' for non-group nodes. Thankfully, this does not introduce new strings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16194
diff
changeset
|
1003 purple_request_input(node, text, prompt, _("Enter empty string to reset the name."), |
31dad9806e9d
Use 'alias' instead of 'rename' for non-group nodes. Thankfully, this does not introduce new strings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16194
diff
changeset
|
1004 name, FALSE, FALSE, NULL, text, G_CALLBACK(rename_blist_node), |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1005 _("Cancel"), NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1006 NULL, NULL, NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1007 node); |
15818 | 1008 |
1009 g_free(prompt); | |
1010 } | |
1011 | |
15823 | 1012 /* Xeroxed from gtkdialogs.c:purple_gtkdialogs_remove_group_cb*/ |
15818 | 1013 static void |
15823 | 1014 remove_group(PurpleGroup *group) |
15818 | 1015 { |
15823 | 1016 PurpleBlistNode *cnode, *bnode; |
15818 | 1017 |
15823 | 1018 cnode = ((PurpleBlistNode*)group)->child; |
15818 | 1019 |
1020 while (cnode) { | |
15823 | 1021 if (PURPLE_BLIST_NODE_IS_CONTACT(cnode)) { |
15818 | 1022 bnode = cnode->child; |
1023 cnode = cnode->next; | |
1024 while (bnode) { | |
15823 | 1025 PurpleBuddy *buddy; |
1026 if (PURPLE_BLIST_NODE_IS_BUDDY(bnode)) { | |
1027 buddy = (PurpleBuddy*)bnode; | |
15818 | 1028 bnode = bnode->next; |
15823 | 1029 if (purple_account_is_connected(buddy->account)) { |
1030 purple_account_remove_buddy(buddy->account, buddy, group); | |
1031 purple_blist_remove_buddy(buddy); | |
15818 | 1032 } |
1033 } else { | |
1034 bnode = bnode->next; | |
1035 } | |
1036 } | |
15823 | 1037 } else if (PURPLE_BLIST_NODE_IS_CHAT(cnode)) { |
1038 PurpleChat *chat = (PurpleChat *)cnode; | |
15818 | 1039 cnode = cnode->next; |
15823 | 1040 if (purple_account_is_connected(chat->account)) |
1041 purple_blist_remove_chat(chat); | |
15818 | 1042 } else { |
1043 cnode = cnode->next; | |
1044 } | |
1045 } | |
1046 | |
15823 | 1047 purple_blist_remove_group(group); |
15818 | 1048 } |
1049 | |
1050 static void | |
15823 | 1051 finch_blist_remove_node(PurpleBlistNode *node) |
15818 | 1052 { |
15823 | 1053 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
1054 remove_contact((PurpleContact*)node); | |
1055 } else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { | |
1056 PurpleBuddy *buddy = (PurpleBuddy*)node; | |
1057 PurpleGroup *group = purple_buddy_get_group(buddy); | |
1058 purple_account_remove_buddy(purple_buddy_get_account(buddy), buddy, group); | |
1059 purple_blist_remove_buddy(buddy); | |
1060 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { | |
1061 purple_blist_remove_chat((PurpleChat*)node); | |
1062 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { | |
1063 remove_group((PurpleGroup*)node); | |
15818 | 1064 } |
1065 } | |
1066 | |
1067 static void | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
1068 finch_blist_remove_node_cb(PurpleBlistNode *selected, PurpleBlistNode *node) |
15818 | 1069 { |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1070 PurpleAccount *account = NULL; |
15818 | 1071 char *primary; |
1072 const char *name, *sec = NULL; | |
1073 | |
1074 /* XXX: could be a contact */ | |
15823 | 1075 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
1076 PurpleContact *c = (PurpleContact*)node; | |
1077 name = purple_contact_get_alias(c); | |
15818 | 1078 if (c->totalsize > 1) |
1079 sec = _("Removing this contact will also remove all the buddies in the contact"); | |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1080 } else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { |
15823 | 1081 name = purple_buddy_get_name((PurpleBuddy*)node); |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1082 account = purple_buddy_get_account((PurpleBuddy*)node); |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1083 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { |
15823 | 1084 name = purple_chat_get_name((PurpleChat*)node); |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1085 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { |
15823 | 1086 name = ((PurpleGroup*)node)->name; |
15818 | 1087 sec = _("Removing this group will also remove all the buddies in the group"); |
1088 } | |
1089 else | |
1090 return; | |
1091 | |
1092 primary = g_strdup_printf(_("Are you sure you want to remove %s?"), name); | |
1093 | |
1094 /* XXX: anything to do with the returned ui-handle? */ | |
15823 | 1095 purple_request_action(node, _("Confirm Remove"), |
15818 | 1096 primary, sec, |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1097 1, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1098 account, name, NULL, |
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
1099 node, 2, |
15818 | 1100 _("Remove"), finch_blist_remove_node, |
1101 _("Cancel"), NULL); | |
1102 g_free(primary); | |
1103 } | |
1104 | |
1105 static void | |
15823 | 1106 finch_blist_toggle_tag_buddy(PurpleBlistNode *node) |
15818 | 1107 { |
1108 GList *iter; | |
1109 if (node == NULL) | |
1110 return; | |
1111 if (ggblist->tagged && (iter = g_list_find(ggblist->tagged, node)) != NULL) { | |
1112 ggblist->tagged = g_list_delete_link(ggblist->tagged, iter); | |
1113 } else { | |
1114 ggblist->tagged = g_list_prepend(ggblist->tagged, node); | |
1115 } | |
15823 | 1116 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) |
1117 node = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)node); | |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1118 if (PURPLE_BLIST_NODE_IS_BUDDY(node)) |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1119 update_buddy_display((PurpleBuddy*)node, ggblist); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1120 else |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1121 update_node_display(node, ggblist); |
15818 | 1122 } |
1123 | |
1124 static void | |
15823 | 1125 finch_blist_place_tagged(PurpleBlistNode *target) |
15818 | 1126 { |
15823 | 1127 PurpleGroup *tg = NULL; |
1128 PurpleContact *tc = NULL; | |
15818 | 1129 |
1130 if (target == NULL) | |
1131 return; | |
1132 | |
15823 | 1133 if (PURPLE_BLIST_NODE_IS_GROUP(target)) |
1134 tg = (PurpleGroup*)target; | |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1135 else if (PURPLE_BLIST_NODE_IS_BUDDY(target)) { |
15823 | 1136 tc = (PurpleContact*)target->parent; |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1137 tg = (PurpleGroup*)target->parent->parent; |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1138 } else { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1139 if (PURPLE_BLIST_NODE_IS_CONTACT(target)) |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1140 tc = (PurpleContact*)target; |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1141 tg = (PurpleGroup*)target->parent; |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1142 } |
15818 | 1143 |
1144 if (ggblist->tagged) { | |
1145 GList *list = ggblist->tagged; | |
1146 ggblist->tagged = NULL; | |
1147 while (list) { | |
15823 | 1148 PurpleBlistNode *node = list->data; |
15818 | 1149 list = g_list_delete_link(list, list); |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1150 |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1151 if (PURPLE_BLIST_NODE_IS_GROUP(node)) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1152 update_node_display(node, ggblist); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1153 /* Add the group after the current group */ |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1154 purple_blist_add_group((PurpleGroup*)node, (PurpleBlistNode*)tg); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1155 } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1156 update_buddy_display(purple_contact_get_priority_buddy((PurpleContact*)node), ggblist); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1157 if ((PurpleBlistNode*)tg == target) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1158 /* The target is a group, just add the contact to the group. */ |
15823 | 1159 purple_blist_add_contact((PurpleContact*)node, tg, NULL); |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1160 } else if (tc) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1161 /* The target is either a buddy, or a contact. Merge with that contact. */ |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1162 purple_blist_merge_contact((PurpleContact*)node, (PurpleBlistNode*)tc); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1163 } else { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1164 /* The target is a chat. Add the contact to the group after this chat. */ |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1165 purple_blist_add_contact((PurpleContact*)node, NULL, target); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1166 } |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1167 } else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1168 update_buddy_display((PurpleBuddy*)node, ggblist); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1169 if ((PurpleBlistNode*)tg == target) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1170 /* The target is a group. Add this buddy in a new contact under this group. */ |
15823 | 1171 purple_blist_add_buddy((PurpleBuddy*)node, NULL, tg, NULL); |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1172 } else if (PURPLE_BLIST_NODE_IS_CONTACT(target)) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1173 /* Add to the contact. */ |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1174 purple_blist_add_buddy((PurpleBuddy*)node, tc, NULL, NULL); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1175 } else if (PURPLE_BLIST_NODE_IS_BUDDY(target)) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1176 /* Add to the contact after the selected buddy. */ |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1177 purple_blist_add_buddy((PurpleBuddy*)node, NULL, NULL, target); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1178 } else if (PURPLE_BLIST_NODE_IS_CHAT(target)) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1179 /* Add to the selected chat's group. */ |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1180 purple_blist_add_buddy((PurpleBuddy*)node, NULL, tg, NULL); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1181 } |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1182 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1183 update_node_display(node, ggblist); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1184 if ((PurpleBlistNode*)tg == target) |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1185 purple_blist_add_chat((PurpleChat*)node, tg, NULL); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1186 else |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1187 purple_blist_add_chat((PurpleChat*)node, NULL, target); |
15818 | 1188 } |
1189 } | |
1190 } | |
1191 } | |
1192 | |
1193 static void | |
1194 context_menu_destroyed(GntWidget *widget, FinchBlist *ggblist) | |
1195 { | |
1196 ggblist->context = NULL; | |
1197 } | |
1198 | |
1199 static void | |
1200 draw_context_menu(FinchBlist *ggblist) | |
1201 { | |
15823 | 1202 PurpleBlistNode *node = NULL; |
15818 | 1203 GntWidget *context = NULL; |
1204 GntTree *tree = NULL; | |
1205 int x, y, top, width; | |
1206 char *title = NULL; | |
1207 | |
16824
e79555933fc6
Do not build the context menu if one is already being shown.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
1208 if (ggblist->context) |
e79555933fc6
Do not build the context menu if one is already being shown.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
1209 return; |
e79555933fc6
Do not build the context menu if one is already being shown.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
1210 |
15818 | 1211 tree = GNT_TREE(ggblist->tree); |
1212 | |
1213 node = gnt_tree_get_selection_data(tree); | |
1214 | |
1215 if (ggblist->tooltip) | |
1216 remove_tooltip(ggblist); | |
1217 | |
1218 ggblist->cnode = node; | |
1219 | |
1220 ggblist->context = context = gnt_menu_new(GNT_MENU_POPUP); | |
1221 g_signal_connect(G_OBJECT(context), "destroy", G_CALLBACK(context_menu_destroyed), ggblist); | |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
1222 g_signal_connect(G_OBJECT(context), "hide", G_CALLBACK(gnt_widget_destroy), NULL); |
15818 | 1223 |
1224 if (!node) { | |
1225 create_group_menu(GNT_MENU(context), NULL); | |
1226 title = g_strdup(_("Buddy List")); | |
15823 | 1227 } else if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
18565
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
1228 ggblist->cnode = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)node); |
980d6e1b2d21
Fix a crash Eric found. These parameters were in reverse order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18535
diff
changeset
|
1229 create_buddy_menu(GNT_MENU(context), (PurpleBuddy*)ggblist->cnode); |
15823 | 1230 title = g_strdup(purple_contact_get_alias((PurpleContact*)node)); |
1231 } else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { | |
1232 PurpleBuddy *buddy = (PurpleBuddy *)node; | |
15818 | 1233 create_buddy_menu(GNT_MENU(context), buddy); |
15823 | 1234 title = g_strdup(purple_buddy_get_name(buddy)); |
1235 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { | |
1236 PurpleChat *chat = (PurpleChat*)node; | |
15818 | 1237 create_chat_menu(GNT_MENU(context), chat); |
15823 | 1238 title = g_strdup(purple_chat_get_name(chat)); |
1239 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { | |
1240 PurpleGroup *group = (PurpleGroup *)node; | |
15818 | 1241 create_group_menu(GNT_MENU(context), group); |
1242 title = g_strdup(group->name); | |
1243 } | |
1244 | |
1245 append_extended_menu(GNT_MENU(context), node); | |
1246 | |
1247 /* These are common for everything */ | |
1248 if (node) { | |
16276
31dad9806e9d
Use 'alias' instead of 'rename' for non-group nodes. Thankfully, this does not introduce new strings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16194
diff
changeset
|
1249 add_custom_action(GNT_MENU(context), |
31dad9806e9d
Use 'alias' instead of 'rename' for non-group nodes. Thankfully, this does not introduce new strings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16194
diff
changeset
|
1250 PURPLE_BLIST_NODE_IS_GROUP(node) ? _("Rename") : _("Alias"), |
15823 | 1251 PURPLE_CALLBACK(finch_blist_rename_node_cb), node); |
15818 | 1252 add_custom_action(GNT_MENU(context), _("Remove"), |
15823 | 1253 PURPLE_CALLBACK(finch_blist_remove_node_cb), node); |
15818 | 1254 |
15823 | 1255 if (ggblist->tagged && (PURPLE_BLIST_NODE_IS_CONTACT(node) |
1256 || PURPLE_BLIST_NODE_IS_GROUP(node))) { | |
15818 | 1257 add_custom_action(GNT_MENU(context), _("Place tagged"), |
15823 | 1258 PURPLE_CALLBACK(finch_blist_place_tagged), node); |
15818 | 1259 } |
1260 | |
15823 | 1261 if (PURPLE_BLIST_NODE_IS_BUDDY(node) || PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
15818 | 1262 add_custom_action(GNT_MENU(context), _("Toggle Tag"), |
15823 | 1263 PURPLE_CALLBACK(finch_blist_toggle_tag_buddy), node); |
15818 | 1264 } |
1265 } | |
1266 | |
1267 /* Set the position for the popup */ | |
1268 gnt_widget_get_position(GNT_WIDGET(tree), &x, &y); | |
1269 gnt_widget_get_size(GNT_WIDGET(tree), &width, NULL); | |
1270 top = gnt_tree_get_selection_visible_line(tree); | |
1271 | |
1272 x += width; | |
1273 y += top - 1; | |
1274 | |
1275 gnt_widget_set_position(context, x, y); | |
1276 gnt_screen_menu_show(GNT_MENU(context)); | |
1277 g_free(title); | |
1278 } | |
1279 | |
1280 static void | |
18332
1862a23b1751
Show better tooltips for contacts.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18316
diff
changeset
|
1281 tooltip_for_buddy(PurpleBuddy *buddy, GString *str, gboolean full) |
15818 | 1282 { |
15823 | 1283 PurplePlugin *prpl; |
1284 PurplePluginProtocolInfo *prpl_info; | |
1285 PurpleAccount *account; | |
1286 PurpleNotifyUserInfo *user_info; | |
18437
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
1287 PurplePresence *presence; |
15823 | 1288 const char *alias = purple_buddy_get_alias(buddy); |
15818 | 1289 char *tmp, *strip; |
1290 | |
15823 | 1291 user_info = purple_notify_user_info_new(); |
15818 | 1292 |
15823 | 1293 account = purple_buddy_get_account(buddy); |
18437
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
1294 presence = purple_buddy_get_presence(buddy); |
15818 | 1295 |
19305
f0b25c6fa806
Fix #2607. (Finch tooltip HTML display)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18635
diff
changeset
|
1296 if (!full || g_utf8_collate(purple_buddy_get_name(buddy), alias)) { |
f0b25c6fa806
Fix #2607. (Finch tooltip HTML display)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18635
diff
changeset
|
1297 char *esc = g_markup_escape_text(alias, -1); |
f0b25c6fa806
Fix #2607. (Finch tooltip HTML display)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18635
diff
changeset
|
1298 purple_notify_user_info_add_pair(user_info, _("Nickname"), esc); |
f0b25c6fa806
Fix #2607. (Finch tooltip HTML display)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18635
diff
changeset
|
1299 g_free(esc); |
f0b25c6fa806
Fix #2607. (Finch tooltip HTML display)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18635
diff
changeset
|
1300 } |
15818 | 1301 |
1302 tmp = g_strdup_printf("%s (%s)", | |
15823 | 1303 purple_account_get_username(account), |
1304 purple_account_get_protocol_name(account)); | |
1305 purple_notify_user_info_add_pair(user_info, _("Account"), tmp); | |
15818 | 1306 g_free(tmp); |
1307 | |
15823 | 1308 prpl = purple_find_prpl(purple_account_get_protocol_id(account)); |
1309 prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl); | |
15818 | 1310 if (prpl_info && prpl_info->tooltip_text) { |
18332
1862a23b1751
Show better tooltips for contacts.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18316
diff
changeset
|
1311 prpl_info->tooltip_text(buddy, user_info, full); |
15818 | 1312 } |
1313 | |
16427
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16276
diff
changeset
|
1314 if (purple_prefs_get_bool("/finch/blist/idletime")) { |
15823 | 1315 PurplePresence *pre = purple_buddy_get_presence(buddy); |
1316 if (purple_presence_is_idle(pre)) { | |
1317 time_t idle = purple_presence_get_idle_time(pre); | |
15818 | 1318 if (idle > 0) { |
15823 | 1319 char *st = purple_str_seconds_to_string(time(NULL) - idle); |
1320 purple_notify_user_info_add_pair(user_info, _("Idle"), st); | |
15818 | 1321 g_free(st); |
1322 } | |
1323 } | |
1324 } | |
1325 | |
15823 | 1326 tmp = purple_notify_user_info_get_text_with_newline(user_info, "<BR>"); |
1327 purple_notify_user_info_destroy(user_info); | |
15818 | 1328 |
15823 | 1329 strip = purple_markup_strip_html(tmp); |
15818 | 1330 g_string_append(str, strip); |
18437
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
1331 |
18635
5551e5ec1ce0
Insert a newline in the tooltip.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18586
diff
changeset
|
1332 if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_MOBILE)) { |
5551e5ec1ce0
Insert a newline in the tooltip.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18586
diff
changeset
|
1333 g_string_append(str, "\n"); |
18437
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
1334 g_string_append(str, _("On Mobile")); |
18635
5551e5ec1ce0
Insert a newline in the tooltip.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18586
diff
changeset
|
1335 } |
18437
ecb223f9f75b
Show a pimping cool unicode status emblem for buddies on mobile (thanks, elb).
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18428
diff
changeset
|
1336 |
15818 | 1337 g_free(strip); |
1338 g_free(tmp); | |
1339 } | |
1340 | |
1341 static GString* | |
1342 make_sure_text_fits(GString *string) | |
1343 { | |
1344 int maxw = getmaxx(stdscr) - 3; | |
1345 char *str = gnt_util_onscreen_fit_string(string->str, maxw); | |
1346 string = g_string_assign(string, str); | |
1347 g_free(str); | |
1348 return string; | |
1349 } | |
1350 | |
1351 static gboolean | |
1352 draw_tooltip_real(FinchBlist *ggblist) | |
1353 { | |
15823 | 1354 PurpleBlistNode *node; |
15818 | 1355 int x, y, top, width, w, h; |
1356 GString *str; | |
1357 GntTree *tree; | |
1358 GntWidget *widget, *box, *tv; | |
1359 char *title = NULL; | |
1360 int lastseen = 0; | |
1361 | |
1362 widget = ggblist->tree; | |
1363 tree = GNT_TREE(widget); | |
1364 | |
1365 if (!gnt_widget_has_focus(ggblist->tree) || | |
1366 (ggblist->context && !GNT_WIDGET_IS_FLAG_SET(ggblist->context, GNT_WIDGET_INVISIBLE))) | |
1367 return FALSE; | |
1368 | |
1369 if (ggblist->tooltip) | |
1370 { | |
1371 /* XXX: Once we can properly redraw on expose events, this can be removed at the end | |
1372 * to avoid the blinking*/ | |
1373 remove_tooltip(ggblist); | |
1374 } | |
1375 | |
1376 node = gnt_tree_get_selection_data(tree); | |
1377 if (!node) | |
1378 return FALSE; | |
1379 | |
1380 str = g_string_new(""); | |
1381 | |
15823 | 1382 if (PURPLE_BLIST_NODE_IS_CONTACT(node)) { |
1383 PurpleBuddy *pr = purple_contact_get_priority_buddy((PurpleContact*)node); | |
1384 gboolean offline = !PURPLE_BUDDY_IS_ONLINE(pr); | |
1385 gboolean showoffline = purple_prefs_get_bool(PREF_ROOT "/showoffline"); | |
1386 const char *name = purple_buddy_get_name(pr); | |
15818 | 1387 |
1388 title = g_strdup(name); | |
18332
1862a23b1751
Show better tooltips for contacts.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18316
diff
changeset
|
1389 tooltip_for_buddy(pr, str, TRUE); |
15818 | 1390 for (node = node->child; node; node = node->next) { |
15823 | 1391 PurpleBuddy *buddy = (PurpleBuddy*)node; |
15818 | 1392 if (offline) { |
15823 | 1393 int value = purple_blist_node_get_int(node, "last_seen"); |
15818 | 1394 if (value > lastseen) |
1395 lastseen = value; | |
1396 } | |
15823 | 1397 if (node == (PurpleBlistNode*)pr) |
15818 | 1398 continue; |
15823 | 1399 if (!purple_account_is_connected(buddy->account)) |
15818 | 1400 continue; |
15823 | 1401 if (!showoffline && !PURPLE_BUDDY_IS_ONLINE(buddy)) |
15818 | 1402 continue; |
1403 str = g_string_append(str, "\n----------\n"); | |
18332
1862a23b1751
Show better tooltips for contacts.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18316
diff
changeset
|
1404 tooltip_for_buddy(buddy, str, FALSE); |
15818 | 1405 } |
15823 | 1406 } else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { |
1407 PurpleBuddy *buddy = (PurpleBuddy *)node; | |
18332
1862a23b1751
Show better tooltips for contacts.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18316
diff
changeset
|
1408 tooltip_for_buddy(buddy, str, TRUE); |
15823 | 1409 title = g_strdup(purple_buddy_get_name(buddy)); |
1410 if (!PURPLE_BUDDY_IS_ONLINE((PurpleBuddy*)node)) | |
1411 lastseen = purple_blist_node_get_int(node, "last_seen"); | |
1412 } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { | |
1413 PurpleGroup *group = (PurpleGroup *)node; | |
15818 | 1414 |
1415 g_string_append_printf(str, _("Online: %d\nTotal: %d"), | |
15823 | 1416 purple_blist_get_group_online_count(group), |
1417 purple_blist_get_group_size(group, FALSE)); | |
15818 | 1418 |
1419 title = g_strdup(group->name); | |
15823 | 1420 } else if (PURPLE_BLIST_NODE_IS_CHAT(node)) { |
1421 PurpleChat *chat = (PurpleChat *)node; | |
1422 PurpleAccount *account = chat->account; | |
15818 | 1423 |
1424 g_string_append_printf(str, _("Account: %s (%s)"), | |
15823 | 1425 purple_account_get_username(account), |
1426 purple_account_get_protocol_name(account)); | |
15818 | 1427 |
15823 | 1428 title = g_strdup(purple_chat_get_name(chat)); |
15818 | 1429 } else { |
1430 g_string_free(str, TRUE); | |
1431 return FALSE; | |
1432 } | |
1433 | |
1434 if (lastseen > 0) { | |
15823 | 1435 char *tmp = purple_str_seconds_to_string(time(NULL) - lastseen); |
15818 | 1436 g_string_append_printf(str, _("\nLast Seen: %s ago"), tmp); |
1437 g_free(tmp); | |
1438 } | |
1439 | |
1440 gnt_widget_get_position(widget, &x, &y); | |
1441 gnt_widget_get_size(widget, &width, NULL); | |
1442 top = gnt_tree_get_selection_visible_line(tree); | |
1443 | |
1444 x += width; | |
1445 y += top - 1; | |
1446 | |
1447 box = gnt_box_new(FALSE, FALSE); | |
1448 gnt_box_set_toplevel(GNT_BOX(box), TRUE); | |
1449 GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_NO_SHADOW); | |
1450 gnt_box_set_title(GNT_BOX(box), title); | |
1451 | |
1452 str = make_sure_text_fits(str); | |
1453 gnt_util_get_text_bound(str->str, &w, &h); | |
18316
70325b0c5792
Use the new flags to make the tooltip look better.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18210
diff
changeset
|
1454 h = MAX(1, h); |
15818 | 1455 tv = gnt_text_view_new(); |
1456 gnt_widget_set_size(tv, w + 1, h); | |
18316
70325b0c5792
Use the new flags to make the tooltip look better.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18210
diff
changeset
|
1457 gnt_text_view_set_flag(GNT_TEXT_VIEW(tv), GNT_TEXT_VIEW_NO_SCROLL); |
15818 | 1458 gnt_box_add_widget(GNT_BOX(box), tv); |
1459 | |
1460 gnt_widget_set_position(box, x, y); | |
1461 GNT_WIDGET_UNSET_FLAGS(box, GNT_WIDGET_CAN_TAKE_FOCUS); | |
1462 GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_TRANSIENT); | |
1463 gnt_widget_draw(box); | |
1464 | |
1465 gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(tv), str->str, GNT_TEXT_FLAG_NORMAL); | |
1466 gnt_text_view_scroll(GNT_TEXT_VIEW(tv), 0); | |
1467 | |
1468 g_free(title); | |
1469 g_string_free(str, TRUE); | |
1470 ggblist->tooltip = box; | |
1471 ggblist->tnode = node; | |
1472 | |
1473 gnt_widget_set_name(ggblist->tooltip, "tooltip"); | |
1474 return FALSE; | |
1475 } | |
1476 | |
1477 static void | |
1478 draw_tooltip(FinchBlist *ggblist) | |
1479 { | |
1480 /* When an account has signed off, it removes one buddy at a time. | |
1481 * Drawing the tooltip after removing each buddy is expensive. On | |
1482 * top of that, if the selected buddy belongs to the disconnected | |
1483 * account, then retreiving the tooltip for that causes crash. So | |
1484 * let's make sure we wait for all the buddies to be removed first.*/ | |
1485 int id = g_timeout_add(0, (GSourceFunc)draw_tooltip_real, ggblist); | |
1486 g_object_set_data_full(G_OBJECT(ggblist->window), "draw_tooltip_calback", | |
1487 GINT_TO_POINTER(id), (GDestroyNotify)g_source_remove); | |
1488 } | |
1489 | |
1490 static void | |
1491 selection_changed(GntWidget *widget, gpointer old, gpointer current, FinchBlist *ggblist) | |
1492 { | |
16792
d0f9b2b217cf
Fix context menu unusualness in the buddylist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16782
diff
changeset
|
1493 remove_peripherals(ggblist); |
15818 | 1494 draw_tooltip(ggblist); |
1495 } | |
1496 | |
1497 static gboolean | |
1498 context_menu(GntWidget *widget, FinchBlist *ggblist) | |
1499 { | |
1500 draw_context_menu(ggblist); | |
1501 return TRUE; | |
1502 } | |
1503 | |
1504 static gboolean | |
1505 key_pressed(GntWidget *widget, const char *text, FinchBlist *ggblist) | |
1506 { | |
1507 if (text[0] == 27 && text[1] == 0) { | |
1508 /* Escape was pressed */ | |
1509 remove_peripherals(ggblist); | |
1510 } else if (strcmp(text, GNT_KEY_CTRL_O) == 0) { | |
15823 | 1511 purple_prefs_set_bool(PREF_ROOT "/showoffline", |
1512 !purple_prefs_get_bool(PREF_ROOT "/showoffline")); | |
18535
fad459189cc5
New feature: successful compilation.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18512
diff
changeset
|
1513 } else if (!gnt_tree_is_searching(GNT_TREE(ggblist->tree))) { |
15818 | 1514 if (strcmp(text, "t") == 0) { |
1515 finch_blist_toggle_tag_buddy(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree))); | |
1516 gnt_bindable_perform_action_named(GNT_BINDABLE(ggblist->tree), "move-down"); | |
1517 } else if (strcmp(text, "a") == 0) { | |
1518 finch_blist_place_tagged(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree))); | |
1519 } else | |
1520 return FALSE; | |
1521 } else | |
1522 return FALSE; | |
1523 | |
1524 return TRUE; | |
1525 } | |
1526 | |
1527 static void | |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1528 update_node_display(PurpleBlistNode *node, FinchBlist *ggblist) |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1529 { |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1530 GntTextFormatFlags flag = 0; |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1531 if (ggblist->tagged && g_list_find(ggblist->tagged, node)) |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1532 flag |= GNT_TEXT_FLAG_BOLD; |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1533 gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), node, flag); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1534 } |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1535 |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1536 static void |
15823 | 1537 update_buddy_display(PurpleBuddy *buddy, FinchBlist *ggblist) |
15818 | 1538 { |
15823 | 1539 PurpleContact *contact; |
15818 | 1540 GntTextFormatFlags bflag = 0, cflag = 0; |
1541 | |
15823 | 1542 contact = purple_buddy_get_contact(buddy); |
15818 | 1543 |
15823 | 1544 gnt_tree_change_text(GNT_TREE(ggblist->tree), buddy, 0, get_display_name((PurpleBlistNode*)buddy)); |
1545 gnt_tree_change_text(GNT_TREE(ggblist->tree), contact, 0, get_display_name((PurpleBlistNode*)contact)); | |
15818 | 1546 |
1547 if (ggblist->tagged && g_list_find(ggblist->tagged, buddy)) | |
1548 bflag |= GNT_TEXT_FLAG_BOLD; | |
1549 if (ggblist->tagged && g_list_find(ggblist->tagged, contact)) | |
1550 cflag |= GNT_TEXT_FLAG_BOLD; | |
1551 | |
15823 | 1552 if (ggblist->tnode == (PurpleBlistNode*)buddy) |
15818 | 1553 draw_tooltip(ggblist); |
1554 | |
15823 | 1555 if (purple_presence_is_idle(purple_buddy_get_presence(buddy))) { |
15818 | 1556 gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag | GNT_TEXT_FLAG_DIM); |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1557 if (buddy == purple_contact_get_priority_buddy(contact)) |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1558 gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag | GNT_TEXT_FLAG_DIM); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1559 else |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1560 update_buddy_display(purple_contact_get_priority_buddy(contact), ggblist); |
15818 | 1561 } else { |
1562 gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), buddy, bflag); | |
16575
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1563 if (buddy == purple_contact_get_priority_buddy(contact)) |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1564 gnt_tree_set_row_flags(GNT_TREE(ggblist->tree), contact, cflag); |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1565 else |
7b692d5dd704
This makes it possible to rearrange chats and groups using the tag+attach system. Thanks a bunch to wabz for testing this. Fixes #379.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16491
diff
changeset
|
1566 update_buddy_display(purple_contact_get_priority_buddy(contact), ggblist); |
15818 | 1567 } |
1568 } | |
1569 | |
1570 static void | |
15823 | 1571 buddy_status_changed(PurpleBuddy *buddy, PurpleStatus *old, PurpleStatus *now, FinchBlist *ggblist) |
15818 | 1572 { |
1573 update_buddy_display(buddy, ggblist); | |
1574 } | |
1575 | |
1576 static void | |
15823 | 1577 buddy_idle_changed(PurpleBuddy *buddy, int old, int new, FinchBlist *ggblist) |
15818 | 1578 { |
1579 update_buddy_display(buddy, ggblist); | |
1580 } | |
1581 | |
1582 static void | |
1583 remove_peripherals(FinchBlist *ggblist) | |
1584 { | |
1585 if (ggblist->tooltip) | |
1586 remove_tooltip(ggblist); | |
1587 else if (ggblist->context) | |
1588 gnt_widget_destroy(ggblist->context); | |
1589 } | |
1590 | |
1591 static void | |
1592 size_changed_cb(GntWidget *w, int wi, int h) | |
1593 { | |
1594 int width, height; | |
1595 gnt_widget_get_size(w, &width, &height); | |
15823 | 1596 purple_prefs_set_int(PREF_ROOT "/size/width", width); |
1597 purple_prefs_set_int(PREF_ROOT "/size/height", height); | |
15818 | 1598 } |
1599 | |
1600 static void | |
1601 save_position_cb(GntWidget *w, int x, int y) | |
1602 { | |
15823 | 1603 purple_prefs_set_int(PREF_ROOT "/position/x", x); |
1604 purple_prefs_set_int(PREF_ROOT "/position/y", y); | |
15818 | 1605 } |
1606 | |
1607 static void | |
1608 reset_blist_window(GntWidget *window, gpointer null) | |
1609 { | |
15823 | 1610 PurpleBlistNode *node; |
1611 purple_signals_disconnect_by_handle(finch_blist_get_handle()); | |
1612 purple_get_blist()->ui_data = NULL; | |
15818 | 1613 |
15823 | 1614 node = purple_blist_get_root(); |
15818 | 1615 while (node) { |
1616 node->ui_data = NULL; | |
15823 | 1617 node = purple_blist_node_next(node, TRUE); |
15818 | 1618 } |
1619 | |
1620 if (ggblist->typing) | |
1621 g_source_remove(ggblist->typing); | |
1622 remove_peripherals(ggblist); | |
1623 if (ggblist->tagged) | |
1624 g_list_free(ggblist->tagged); | |
1625 g_free(ggblist); | |
1626 ggblist = NULL; | |
1627 } | |
1628 | |
1629 static void | |
1630 populate_buddylist() | |
1631 { | |
15823 | 1632 PurpleBlistNode *node; |
1633 PurpleBuddyList *list; | |
15818 | 1634 |
15823 | 1635 if (strcmp(purple_prefs_get_string(PREF_ROOT "/sort_type"), "text") == 0) { |
15818 | 1636 gnt_tree_set_compare_func(GNT_TREE(ggblist->tree), |
1637 (GCompareFunc)blist_node_compare_text); | |
15823 | 1638 } else if (strcmp(purple_prefs_get_string(PREF_ROOT "/sort_type"), "status") == 0) { |
15818 | 1639 gnt_tree_set_compare_func(GNT_TREE(ggblist->tree), |
1640 (GCompareFunc)blist_node_compare_status); | |
15823 | 1641 } else if (strcmp(purple_prefs_get_string(PREF_ROOT "/sort_type"), "log") == 0) { |
15818 | 1642 gnt_tree_set_compare_func(GNT_TREE(ggblist->tree), |
1643 (GCompareFunc)blist_node_compare_log); | |
1644 } | |
1645 | |
15823 | 1646 list = purple_get_blist(); |
1647 node = purple_blist_get_root(); | |
15818 | 1648 while (node) |
1649 { | |
1650 node_update(list, node); | |
15823 | 1651 node = purple_blist_node_next(node, FALSE); |
15818 | 1652 } |
1653 } | |
1654 | |
1655 static void | |
1656 destroy_status_list(GList *list) | |
1657 { | |
1658 g_list_foreach(list, (GFunc)g_free, NULL); | |
1659 g_list_free(list); | |
1660 } | |
1661 | |
1662 static void | |
1663 populate_status_dropdown() | |
1664 { | |
1665 int i; | |
1666 GList *iter; | |
1667 GList *items = NULL; | |
1668 StatusBoxItem *item = NULL; | |
1669 | |
1670 /* First the primitives */ | |
15823 | 1671 PurpleStatusPrimitive prims[] = {PURPLE_STATUS_AVAILABLE, PURPLE_STATUS_AWAY, |
1672 PURPLE_STATUS_INVISIBLE, PURPLE_STATUS_OFFLINE, PURPLE_STATUS_UNSET}; | |
15818 | 1673 |
1674 gnt_combo_box_remove_all(GNT_COMBO_BOX(ggblist->status)); | |
1675 | |
15823 | 1676 for (i = 0; prims[i] != PURPLE_STATUS_UNSET; i++) |
15818 | 1677 { |
1678 item = g_new0(StatusBoxItem, 1); | |
1679 item->type = STATUS_PRIMITIVE; | |
1680 item->u.prim = prims[i]; | |
1681 items = g_list_prepend(items, item); | |
1682 gnt_combo_box_add_data(GNT_COMBO_BOX(ggblist->status), item, | |
15823 | 1683 purple_primitive_get_name_from_type(prims[i])); |
15818 | 1684 } |
1685 | |
1686 /* Now the popular statuses */ | |
18585
823946ddd527
Memory leak fix.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18584
diff
changeset
|
1687 for (iter = purple_savedstatuses_get_popular(6); iter; iter = g_list_delete_link(iter, iter)) |
15818 | 1688 { |
1689 item = g_new0(StatusBoxItem, 1); | |
1690 item->type = STATUS_SAVED_POPULAR; | |
1691 item->u.saved = iter->data; | |
1692 items = g_list_prepend(items, item); | |
1693 gnt_combo_box_add_data(GNT_COMBO_BOX(ggblist->status), item, | |
15823 | 1694 purple_savedstatus_get_title(iter->data)); |
15818 | 1695 } |
1696 | |
1697 /* New savedstatus */ | |
1698 item = g_new0(StatusBoxItem, 1); | |
1699 item->type = STATUS_SAVED_NEW; | |
1700 items = g_list_prepend(items, item); | |
1701 gnt_combo_box_add_data(GNT_COMBO_BOX(ggblist->status), item, | |
1702 _("New...")); | |
1703 | |
1704 /* More savedstatuses */ | |
1705 item = g_new0(StatusBoxItem, 1); | |
1706 item->type = STATUS_SAVED_ALL; | |
1707 items = g_list_prepend(items, item); | |
1708 gnt_combo_box_add_data(GNT_COMBO_BOX(ggblist->status), item, | |
1709 _("Saved...")); | |
1710 | |
1711 /* The keys for the combobox are created here, and never used | |
1712 * anywhere else. So make sure the keys are freed when the widget | |
1713 * is destroyed. */ | |
1714 g_object_set_data_full(G_OBJECT(ggblist->status), "list of statuses", | |
1715 items, (GDestroyNotify)destroy_status_list); | |
1716 } | |
1717 | |
1718 static void | |
15823 | 1719 redraw_blist(const char *name, PurplePrefType type, gconstpointer val, gpointer data) |
15818 | 1720 { |
15823 | 1721 PurpleBlistNode *node, *sel; |
15818 | 1722 if (ggblist == NULL || ggblist->window == NULL) |
1723 return; | |
1724 | |
1725 sel = gnt_tree_get_selection_data(GNT_TREE(ggblist->tree)); | |
1726 gnt_tree_remove_all(GNT_TREE(ggblist->tree)); | |
15823 | 1727 node = purple_blist_get_root(); |
1728 for (; node; node = purple_blist_node_next(node, TRUE)) | |
15818 | 1729 node->ui_data = NULL; |
1730 populate_buddylist(); | |
1731 gnt_tree_set_selected(GNT_TREE(ggblist->tree), sel); | |
1732 draw_tooltip(ggblist); | |
1733 } | |
1734 | |
1735 void finch_blist_init() | |
1736 { | |
15823 | 1737 purple_prefs_add_none(PREF_ROOT); |
1738 purple_prefs_add_none(PREF_ROOT "/size"); | |
1739 purple_prefs_add_int(PREF_ROOT "/size/width", 20); | |
1740 purple_prefs_add_int(PREF_ROOT "/size/height", 17); | |
1741 purple_prefs_add_none(PREF_ROOT "/position"); | |
1742 purple_prefs_add_int(PREF_ROOT "/position/x", 0); | |
1743 purple_prefs_add_int(PREF_ROOT "/position/y", 0); | |
1744 purple_prefs_add_bool(PREF_ROOT "/idletime", TRUE); | |
1745 purple_prefs_add_bool(PREF_ROOT "/showoffline", FALSE); | |
18441
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
1746 purple_prefs_add_bool(PREF_ROOT "/emptygroups", FALSE); |
15823 | 1747 purple_prefs_add_string(PREF_ROOT "/sort_type", "text"); |
15818 | 1748 |
15823 | 1749 purple_prefs_connect_callback(finch_blist_get_handle(), |
18441
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
1750 PREF_ROOT "/emptygroups", redraw_blist, NULL); |
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
1751 purple_prefs_connect_callback(finch_blist_get_handle(), |
15818 | 1752 PREF_ROOT "/showoffline", redraw_blist, NULL); |
15823 | 1753 purple_prefs_connect_callback(finch_blist_get_handle(), |
15818 | 1754 PREF_ROOT "/sort_type", redraw_blist, NULL); |
1755 | |
15823 | 1756 purple_signal_connect(purple_connections_get_handle(), "signed-on", purple_blist_get_handle(), |
15818 | 1757 G_CALLBACK(account_signed_on_cb), NULL); |
1758 return; | |
1759 } | |
1760 | |
1761 static gboolean | |
1762 remove_typing_cb(gpointer null) | |
1763 { | |
15823 | 1764 PurpleSavedStatus *current; |
15818 | 1765 const char *message, *newmessage; |
15823 | 1766 PurpleStatusPrimitive prim, newprim; |
15818 | 1767 StatusBoxItem *item; |
1768 | |
15823 | 1769 current = purple_savedstatus_get_current(); |
1770 message = purple_savedstatus_get_message(current); | |
1771 prim = purple_savedstatus_get_type(current); | |
15818 | 1772 |
1773 newmessage = gnt_entry_get_text(GNT_ENTRY(ggblist->statustext)); | |
1774 item = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(ggblist->status)); | |
16663
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1775 |
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1776 switch (item->type) { |
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1777 case STATUS_PRIMITIVE: |
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1778 newprim = item->u.prim; |
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1779 break; |
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1780 case STATUS_SAVED_POPULAR: |
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1781 newprim = purple_savedstatus_get_type(item->u.saved); |
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1782 break; |
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1783 default: |
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1784 goto end; /* 'New' or 'Saved' is selected, but this should never happen. */ |
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1785 } |
15818 | 1786 |
1787 if (newprim != prim || ((message && !newmessage) || | |
1788 (!message && newmessage) || | |
1789 (message && newmessage && g_utf8_collate(message, newmessage) != 0))) | |
1790 { | |
15823 | 1791 PurpleSavedStatus *status = purple_savedstatus_find_transient_by_type_and_message(newprim, newmessage); |
15818 | 1792 /* Holy Crap! That's a LAWNG function name */ |
1793 if (status == NULL) | |
1794 { | |
15823 | 1795 status = purple_savedstatus_new(NULL, newprim); |
1796 purple_savedstatus_set_message(status, newmessage); | |
15818 | 1797 } |
1798 | |
15823 | 1799 purple_savedstatus_activate(status); |
15818 | 1800 } |
1801 | |
1802 gnt_box_give_focus_to_child(GNT_BOX(ggblist->window), ggblist->tree); | |
16663
1c9835f8b29c
A rare crash fix for finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16575
diff
changeset
|
1803 end: |
15818 | 1804 if (ggblist->typing) |
1805 g_source_remove(ggblist->typing); | |
1806 ggblist->typing = 0; | |
1807 return FALSE; | |
1808 } | |
1809 | |
1810 static void | |
1811 status_selection_changed(GntComboBox *box, StatusBoxItem *old, StatusBoxItem *now, gpointer null) | |
1812 { | |
1813 gnt_entry_set_text(GNT_ENTRY(ggblist->statustext), NULL); | |
1814 if (now->type == STATUS_SAVED_POPULAR) | |
1815 { | |
1816 /* Set the status immediately */ | |
15823 | 1817 purple_savedstatus_activate(now->u.saved); |
15818 | 1818 } |
1819 else if (now->type == STATUS_PRIMITIVE) | |
1820 { | |
1821 /* Move the focus to the entry box */ | |
1822 /* XXX: Make sure the selected status can have a message */ | |
1823 gnt_box_move_focus(GNT_BOX(ggblist->window), 1); | |
1824 ggblist->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, NULL); | |
1825 } | |
1826 else if (now->type == STATUS_SAVED_ALL) | |
1827 { | |
1828 /* Restore the selection to reflect current status. */ | |
15823 | 1829 savedstatus_changed(purple_savedstatus_get_current(), NULL); |
15818 | 1830 gnt_box_give_focus_to_child(GNT_BOX(ggblist->window), ggblist->tree); |
1831 finch_savedstatus_show_all(); | |
1832 } | |
1833 else if (now->type == STATUS_SAVED_NEW) | |
1834 { | |
15823 | 1835 savedstatus_changed(purple_savedstatus_get_current(), NULL); |
15818 | 1836 gnt_box_give_focus_to_child(GNT_BOX(ggblist->window), ggblist->tree); |
1837 finch_savedstatus_edit(NULL); | |
1838 } | |
1839 else | |
1840 g_return_if_reached(); | |
1841 } | |
1842 | |
1843 static gboolean | |
1844 status_text_changed(GntEntry *entry, const char *text, gpointer null) | |
1845 { | |
1846 if ((text[0] == 27 || (text[0] == '\t' && text[1] == '\0')) && ggblist->typing == 0) | |
1847 return FALSE; | |
1848 | |
1849 if (ggblist->typing) | |
1850 g_source_remove(ggblist->typing); | |
1851 ggblist->typing = 0; | |
1852 | |
1853 if (text[0] == '\r' && text[1] == 0) | |
1854 { | |
1855 /* Set the status only after you press 'Enter' */ | |
1856 remove_typing_cb(NULL); | |
1857 return TRUE; | |
1858 } | |
1859 | |
1860 ggblist->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, NULL); | |
1861 return FALSE; | |
1862 } | |
1863 | |
1864 static void | |
15823 | 1865 savedstatus_changed(PurpleSavedStatus *now, PurpleSavedStatus *old) |
15818 | 1866 { |
1867 GList *list; | |
15823 | 1868 PurpleStatusPrimitive prim; |
15818 | 1869 const char *message; |
1870 gboolean found = FALSE, saved = TRUE; | |
1871 | |
1872 if (!ggblist) | |
1873 return; | |
1874 | |
1875 /* Block the signals we don't want to emit */ | |
1876 g_signal_handlers_block_matched(ggblist->status, G_SIGNAL_MATCH_FUNC, | |
1877 0, 0, NULL, status_selection_changed, NULL); | |
1878 g_signal_handlers_block_matched(ggblist->statustext, G_SIGNAL_MATCH_FUNC, | |
1879 0, 0, NULL, status_text_changed, NULL); | |
1880 | |
15823 | 1881 prim = purple_savedstatus_get_type(now); |
1882 message = purple_savedstatus_get_message(now); | |
15818 | 1883 |
1884 /* Rebuild the status dropdown */ | |
1885 populate_status_dropdown(); | |
1886 | |
1887 while (!found) { | |
1888 list = g_object_get_data(G_OBJECT(ggblist->status), "list of statuses"); | |
1889 for (; list; list = list->next) | |
1890 { | |
1891 StatusBoxItem *item = list->data; | |
1892 if ((saved && item->type != STATUS_PRIMITIVE && item->u.saved == now) || | |
1893 (!saved && item->type == STATUS_PRIMITIVE && item->u.prim == prim)) | |
1894 { | |
15823 | 1895 char *mess = purple_unescape_html(message); |
15818 | 1896 gnt_combo_box_set_selected(GNT_COMBO_BOX(ggblist->status), item); |
1897 gnt_entry_set_text(GNT_ENTRY(ggblist->statustext), mess); | |
1898 gnt_widget_draw(ggblist->status); | |
1899 g_free(mess); | |
1900 found = TRUE; | |
1901 break; | |
1902 } | |
1903 } | |
1904 if (!saved) | |
1905 break; | |
1906 saved = FALSE; | |
1907 } | |
1908 | |
1909 g_signal_handlers_unblock_matched(ggblist->status, G_SIGNAL_MATCH_FUNC, | |
1910 0, 0, NULL, status_selection_changed, NULL); | |
1911 g_signal_handlers_unblock_matched(ggblist->statustext, G_SIGNAL_MATCH_FUNC, | |
1912 0, 0, NULL, status_text_changed, NULL); | |
1913 } | |
1914 | |
1915 static int | |
16491
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1916 blist_node_compare_position(PurpleBlistNode *n1, PurpleBlistNode *n2) |
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1917 { |
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1918 while ((n1 = n1->prev) != NULL) |
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1919 if (n1 == n2) |
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1920 return 1; |
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1921 return -1; |
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1922 } |
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1923 |
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1924 static int |
15823 | 1925 blist_node_compare_text(PurpleBlistNode *n1, PurpleBlistNode *n2) |
15818 | 1926 { |
1927 const char *s1, *s2; | |
1928 char *us1, *us2; | |
1929 int ret; | |
17297
29b3dc9cc8c5
It's valid for different types to be compared. In that case, use existing positions.
Richard Nelson <wabz@pidgin.im>
parents:
17254
diff
changeset
|
1930 |
29b3dc9cc8c5
It's valid for different types to be compared. In that case, use existing positions.
Richard Nelson <wabz@pidgin.im>
parents:
17254
diff
changeset
|
1931 if (n1->type != n2->type) |
29b3dc9cc8c5
It's valid for different types to be compared. In that case, use existing positions.
Richard Nelson <wabz@pidgin.im>
parents:
17254
diff
changeset
|
1932 return blist_node_compare_position(n1, n2); |
29b3dc9cc8c5
It's valid for different types to be compared. In that case, use existing positions.
Richard Nelson <wabz@pidgin.im>
parents:
17254
diff
changeset
|
1933 |
15818 | 1934 switch (n1->type) |
1935 { | |
15823 | 1936 case PURPLE_BLIST_CHAT_NODE: |
1937 s1 = purple_chat_get_name((PurpleChat*)n1); | |
1938 s2 = purple_chat_get_name((PurpleChat*)n2); | |
15818 | 1939 break; |
15823 | 1940 case PURPLE_BLIST_BUDDY_NODE: |
1941 return purple_presence_compare(purple_buddy_get_presence((PurpleBuddy*)n1), | |
1942 purple_buddy_get_presence((PurpleBuddy*)n2)); | |
15818 | 1943 break; |
15823 | 1944 case PURPLE_BLIST_CONTACT_NODE: |
1945 s1 = purple_contact_get_alias((PurpleContact*)n1); | |
1946 s2 = purple_contact_get_alias((PurpleContact*)n2); | |
15818 | 1947 break; |
1948 default: | |
16491
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1949 return blist_node_compare_position(n1, n2); |
15818 | 1950 } |
1951 | |
1952 us1 = g_utf8_strup(s1, -1); | |
1953 us2 = g_utf8_strup(s2, -1); | |
1954 ret = g_utf8_collate(us1, us2); | |
1955 g_free(us1); | |
1956 g_free(us2); | |
1957 | |
1958 return ret; | |
1959 } | |
1960 | |
1961 static int | |
15823 | 1962 blist_node_compare_status(PurpleBlistNode *n1, PurpleBlistNode *n2) |
15818 | 1963 { |
1964 int ret; | |
1965 | |
17297
29b3dc9cc8c5
It's valid for different types to be compared. In that case, use existing positions.
Richard Nelson <wabz@pidgin.im>
parents:
17254
diff
changeset
|
1966 if (n1->type != n2->type) |
29b3dc9cc8c5
It's valid for different types to be compared. In that case, use existing positions.
Richard Nelson <wabz@pidgin.im>
parents:
17254
diff
changeset
|
1967 return blist_node_compare_position(n1, n2); |
15818 | 1968 |
1969 switch (n1->type) { | |
15823 | 1970 case PURPLE_BLIST_CONTACT_NODE: |
1971 n1 = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)n1); | |
1972 n2 = (PurpleBlistNode*)purple_contact_get_priority_buddy((PurpleContact*)n2); | |
15818 | 1973 /* now compare the presence of the priority buddies */ |
15823 | 1974 case PURPLE_BLIST_BUDDY_NODE: |
1975 ret = purple_presence_compare(purple_buddy_get_presence((PurpleBuddy*)n1), | |
1976 purple_buddy_get_presence((PurpleBuddy*)n2)); | |
15818 | 1977 if (ret != 0) |
1978 return ret; | |
1979 break; | |
1980 default: | |
16491
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
1981 return blist_node_compare_position(n1, n2); |
15818 | 1982 break; |
1983 } | |
1984 | |
1985 /* Sort alphabetically if presence is not comparable */ | |
1986 ret = blist_node_compare_text(n1, n2); | |
1987 | |
1988 return ret; | |
1989 } | |
1990 | |
1991 static int | |
15823 | 1992 get_contact_log_size(PurpleBlistNode *c) |
15818 | 1993 { |
1994 int log = 0; | |
15823 | 1995 PurpleBlistNode *node; |
15818 | 1996 |
1997 for (node = c->child; node; node = node->next) { | |
15823 | 1998 PurpleBuddy *b = (PurpleBuddy*)node; |
1999 log += purple_log_get_total_size(PURPLE_LOG_IM, b->name, b->account); | |
15818 | 2000 } |
2001 | |
2002 return log; | |
2003 } | |
2004 | |
2005 static int | |
15823 | 2006 blist_node_compare_log(PurpleBlistNode *n1, PurpleBlistNode *n2) |
15818 | 2007 { |
2008 int ret; | |
15823 | 2009 PurpleBuddy *b1, *b2; |
15818 | 2010 |
17297
29b3dc9cc8c5
It's valid for different types to be compared. In that case, use existing positions.
Richard Nelson <wabz@pidgin.im>
parents:
17254
diff
changeset
|
2011 if (n1->type != n2->type) |
29b3dc9cc8c5
It's valid for different types to be compared. In that case, use existing positions.
Richard Nelson <wabz@pidgin.im>
parents:
17254
diff
changeset
|
2012 return blist_node_compare_position(n1, n2); |
15818 | 2013 |
2014 switch (n1->type) { | |
15823 | 2015 case PURPLE_BLIST_BUDDY_NODE: |
2016 b1 = (PurpleBuddy*)n1; | |
2017 b2 = (PurpleBuddy*)n2; | |
2018 ret = purple_log_get_total_size(PURPLE_LOG_IM, b2->name, b2->account) - | |
2019 purple_log_get_total_size(PURPLE_LOG_IM, b1->name, b1->account); | |
15818 | 2020 if (ret != 0) |
2021 return ret; | |
2022 break; | |
15823 | 2023 case PURPLE_BLIST_CONTACT_NODE: |
15818 | 2024 ret = get_contact_log_size(n2) - get_contact_log_size(n1); |
2025 if (ret != 0) | |
2026 return ret; | |
2027 break; | |
2028 default: | |
16491
0b97b224a829
Never change the orders of chats or the groups.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16442
diff
changeset
|
2029 return blist_node_compare_position(n1, n2); |
15818 | 2030 } |
2031 ret = blist_node_compare_text(n1, n2); | |
2032 return ret; | |
2033 } | |
2034 | |
2035 static gboolean | |
2036 blist_clicked(GntTree *tree, GntMouseEvent event, int x, int y, gpointer ggblist) | |
2037 { | |
2038 if (event == GNT_RIGHT_MOUSE_DOWN) { | |
2039 draw_context_menu(ggblist); | |
2040 } | |
2041 return FALSE; | |
2042 } | |
2043 | |
2044 static void | |
2045 plugin_action(GntMenuItem *item, gpointer data) | |
2046 { | |
15823 | 2047 PurplePluginAction *action = data; |
15818 | 2048 if (action && action->callback) |
2049 action->callback(action); | |
2050 } | |
2051 | |
2052 static void | |
15823 | 2053 build_plugin_actions(GntMenuItem *item, PurplePlugin *plugin, gpointer context) |
15818 | 2054 { |
2055 GntWidget *sub = gnt_menu_new(GNT_MENU_POPUP); | |
2056 GList *actions; | |
2057 GntMenuItem *menuitem; | |
2058 | |
2059 gnt_menuitem_set_submenu(item, GNT_MENU(sub)); | |
15823 | 2060 for (actions = PURPLE_PLUGIN_ACTIONS(plugin, context); actions; |
15818 | 2061 actions = g_list_delete_link(actions, actions)) { |
2062 if (actions->data) { | |
15823 | 2063 PurplePluginAction *action = actions->data; |
15818 | 2064 action->plugin = plugin; |
2065 action->context = context; | |
2066 menuitem = gnt_menuitem_new(action->label); | |
2067 gnt_menu_add_item(GNT_MENU(sub), menuitem); | |
2068 | |
2069 gnt_menuitem_set_callback(menuitem, plugin_action, action); | |
2070 g_object_set_data_full(G_OBJECT(menuitem), "plugin_action", | |
15823 | 2071 action, (GDestroyNotify)purple_plugin_action_free); |
15818 | 2072 } |
2073 } | |
2074 } | |
2075 | |
2076 static void | |
2077 reconstruct_plugins_menu() | |
2078 { | |
2079 GntWidget *sub; | |
2080 GntMenuItem *plg; | |
2081 GList *iter; | |
2082 | |
2083 if (!ggblist) | |
2084 return; | |
2085 | |
2086 if (ggblist->plugins == NULL) | |
2087 ggblist->plugins = gnt_menuitem_new(_("Plugins")); | |
2088 | |
2089 plg = ggblist->plugins; | |
2090 sub = gnt_menu_new(GNT_MENU_POPUP); | |
2091 gnt_menuitem_set_submenu(plg, GNT_MENU(sub)); | |
2092 | |
15823 | 2093 for (iter = purple_plugins_get_loaded(); iter; iter = iter->next) { |
2094 PurplePlugin *plugin = iter->data; | |
15818 | 2095 GntMenuItem *item; |
15823 | 2096 if (PURPLE_IS_PROTOCOL_PLUGIN(plugin)) |
15818 | 2097 continue; |
2098 | |
15823 | 2099 if (!PURPLE_PLUGIN_HAS_ACTIONS(plugin)) |
15818 | 2100 continue; |
2101 | |
2102 item = gnt_menuitem_new(_(plugin->info->name)); | |
2103 gnt_menu_add_item(GNT_MENU(sub), item); | |
2104 build_plugin_actions(item, plugin, NULL); | |
2105 } | |
2106 } | |
2107 | |
2108 static void | |
2109 reconstruct_accounts_menu() | |
2110 { | |
2111 GntWidget *sub; | |
2112 GntMenuItem *acc, *item; | |
2113 GList *iter; | |
2114 | |
2115 if (!ggblist) | |
2116 return; | |
2117 | |
2118 if (ggblist->accounts == NULL) | |
2119 ggblist->accounts = gnt_menuitem_new(_("Accounts")); | |
2120 | |
2121 acc = ggblist->accounts; | |
2122 sub = gnt_menu_new(GNT_MENU_POPUP); | |
2123 gnt_menuitem_set_submenu(acc, GNT_MENU(sub)); | |
2124 | |
15823 | 2125 for (iter = purple_accounts_get_all_active(); iter; |
15818 | 2126 iter = g_list_delete_link(iter, iter)) { |
15823 | 2127 PurpleAccount *account = iter->data; |
2128 PurpleConnection *gc = purple_account_get_connection(account); | |
2129 PurplePlugin *prpl; | |
15818 | 2130 |
15823 | 2131 if (!gc || !PURPLE_CONNECTION_IS_CONNECTED(gc)) |
15818 | 2132 continue; |
2133 prpl = gc->prpl; | |
2134 | |
15823 | 2135 if (PURPLE_PLUGIN_HAS_ACTIONS(prpl)) { |
2136 item = gnt_menuitem_new(purple_account_get_username(account)); | |
15818 | 2137 gnt_menu_add_item(GNT_MENU(sub), item); |
2138 build_plugin_actions(item, prpl, gc); | |
2139 } | |
2140 } | |
2141 } | |
2142 | |
19375
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2143 static gboolean |
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2144 auto_join_chats(gpointer data) |
15818 | 2145 { |
15823 | 2146 PurpleBlistNode *node; |
19375
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2147 PurpleConnection *pc = data; |
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2148 PurpleAccount *account = purple_connection_get_account(pc); |
15818 | 2149 |
15823 | 2150 for (node = purple_blist_get_root(); node; |
2151 node = purple_blist_node_next(node, FALSE)) { | |
2152 if (PURPLE_BLIST_NODE_IS_CHAT(node)) { | |
2153 PurpleChat *chat = (PurpleChat*)node; | |
19375
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2154 if (chat->account == account && |
16782
d7ad8013b914
Fix this spectacularly braindead code. I must've been on the good stuff when I wrote this. Fixes #364.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16663
diff
changeset
|
2155 purple_blist_node_get_bool(node, "gnt-autojoin")) |
15823 | 2156 serv_join_chat(purple_account_get_connection(chat->account), chat->components); |
15818 | 2157 } |
2158 } | |
19375
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2159 return FALSE; |
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2160 } |
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2161 |
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2162 static void |
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2163 account_signed_on_cb(PurpleConnection *gc, gpointer null) |
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2164 { |
f520bf6dd4bc
I think this fixes the auto-rejoin-after-auto-reconnect bug in finch.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19305
diff
changeset
|
2165 g_idle_add(auto_join_chats, gc); |
15818 | 2166 } |
18442
6d8aed4adcd6
Minor changes to remove a couple of lines of duplication.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18441
diff
changeset
|
2167 |
6d8aed4adcd6
Minor changes to remove a couple of lines of duplication.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18441
diff
changeset
|
2168 static void toggle_pref_cb(GntMenuItem *item, gpointer n) |
18441
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
2169 { |
18442
6d8aed4adcd6
Minor changes to remove a couple of lines of duplication.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18441
diff
changeset
|
2170 purple_prefs_set_bool(n, !purple_prefs_get_bool(n)); |
15818 | 2171 } |
2172 | |
2173 static void sort_blist_change_cb(GntMenuItem *item, gpointer n) | |
2174 { | |
15823 | 2175 purple_prefs_set_string(PREF_ROOT "/sort_type", n); |
15818 | 2176 } |
2177 | |
18428
1dbd8ce2f11f
Fix a bug where buddies from offline accounts were showing up.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
2178 /* send_im_select* -- Xerox */ |
15818 | 2179 static void |
15823 | 2180 send_im_select_cb(gpointer data, PurpleRequestFields *fields) |
15818 | 2181 { |
15823 | 2182 PurpleAccount *account; |
15818 | 2183 const char *username; |
2184 | |
15823 | 2185 account = purple_request_fields_get_account(fields, "account"); |
2186 username = purple_request_fields_get_string(fields, "screenname"); | |
15818 | 2187 |
15823 | 2188 purple_conversation_new(PURPLE_CONV_TYPE_IM, account, username); |
15818 | 2189 } |
2190 | |
2191 static void | |
2192 send_im_select(GntMenuItem *item, gpointer n) | |
2193 { | |
15823 | 2194 PurpleRequestFields *fields; |
2195 PurpleRequestFieldGroup *group; | |
2196 PurpleRequestField *field; | |
15818 | 2197 |
15823 | 2198 fields = purple_request_fields_new(); |
15818 | 2199 |
15823 | 2200 group = purple_request_field_group_new(NULL); |
2201 purple_request_fields_add_group(fields, group); | |
15818 | 2202 |
15823 | 2203 field = purple_request_field_string_new("screenname", _("_Name"), NULL, FALSE); |
2204 purple_request_field_set_type_hint(field, "screenname"); | |
2205 purple_request_field_set_required(field, TRUE); | |
2206 purple_request_field_group_add_field(group, field); | |
15818 | 2207 |
15823 | 2208 field = purple_request_field_account_new("account", _("_Account"), NULL); |
2209 purple_request_field_set_type_hint(field, "account"); | |
2210 purple_request_field_set_visible(field, | |
2211 (purple_connections_get_all() != NULL && | |
2212 purple_connections_get_all()->next != NULL)); | |
2213 purple_request_field_set_required(field, TRUE); | |
2214 purple_request_field_group_add_field(group, field); | |
15818 | 2215 |
15823 | 2216 purple_request_fields(purple_get_blist(), _("New Instant Message"), |
15818 | 2217 NULL, |
2218 _("Please enter the screen name or alias of the person " | |
2219 "you would like to IM."), | |
2220 fields, | |
2221 _("OK"), G_CALLBACK(send_im_select_cb), | |
2222 _("Cancel"), NULL, | |
16442
08db93bbd798
Added account, who, and conversation parameters to the request API calls, and updated all code to match. I can't compile the Perl module, so I'd appreciate it if someone who knows it would verify that this doesn't break Perl.
Evan Schoenberg <evan.s@dreskin.net>
parents:
16427
diff
changeset
|
2223 NULL, NULL, NULL, |
15818 | 2224 NULL); |
2225 } | |
2226 | |
2227 static void | |
2228 create_menu() | |
2229 { | |
2230 GntWidget *menu, *sub; | |
2231 GntMenuItem *item; | |
2232 GntWindow *window; | |
2233 | |
2234 if (!ggblist) | |
2235 return; | |
2236 | |
2237 window = GNT_WINDOW(ggblist->window); | |
2238 ggblist->menu = menu = gnt_menu_new(GNT_MENU_TOPLEVEL); | |
2239 gnt_window_set_menu(window, GNT_MENU(menu)); | |
2240 | |
2241 item = gnt_menuitem_new(_("Options")); | |
2242 gnt_menu_add_item(GNT_MENU(menu), item); | |
2243 | |
2244 sub = gnt_menu_new(GNT_MENU_POPUP); | |
2245 gnt_menuitem_set_submenu(item, GNT_MENU(sub)); | |
2246 | |
2247 item = gnt_menuitem_new(_("Send IM...")); | |
2248 gnt_menu_add_item(GNT_MENU(sub), item); | |
15931
f00f2e283ffb
Some define changes. This helps in generating the python bindings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15871
diff
changeset
|
2249 gnt_menuitem_set_callback(GNT_MENU_ITEM(item), send_im_select, NULL); |
15818 | 2250 |
18441
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
2251 item = gnt_menuitem_check_new(_("Show empty groups")); |
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
2252 gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item), |
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
2253 purple_prefs_get_bool(PREF_ROOT "/emptygroups")); |
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
2254 gnt_menu_add_item(GNT_MENU(sub), item); |
18442
6d8aed4adcd6
Minor changes to remove a couple of lines of duplication.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18441
diff
changeset
|
2255 gnt_menuitem_set_callback(GNT_MENU_ITEM(item), toggle_pref_cb, PREF_ROOT "/emptygroups"); |
18441
24ecab0d40b3
Plucked revision from im.pidgin.soc.2007.finchfeat to allow showing empty
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18437
diff
changeset
|
2256 |
16935
49f66fab6b31
Change a string.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16824
diff
changeset
|
2257 item = gnt_menuitem_check_new(_("Show offline buddies")); |
15931
f00f2e283ffb
Some define changes. This helps in generating the python bindings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15871
diff
changeset
|
2258 gnt_menuitem_check_set_checked(GNT_MENU_ITEM_CHECK(item), |
15823 | 2259 purple_prefs_get_bool(PREF_ROOT "/showoffline")); |
15818 | 2260 gnt_menu_add_item(GNT_MENU(sub), item); |
18442
6d8aed4adcd6
Minor changes to remove a couple of lines of duplication.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18441
diff
changeset
|
2261 gnt_menuitem_set_callback(GNT_MENU_ITEM(item), toggle_pref_cb, PREF_ROOT "/showoffline"); |
15818 | 2262 |
2263 item = gnt_menuitem_new(_("Sort by status")); | |
2264 gnt_menu_add_item(GNT_MENU(sub), item); | |
15931
f00f2e283ffb
Some define changes. This helps in generating the python bindings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15871
diff
changeset
|
2265 gnt_menuitem_set_callback(GNT_MENU_ITEM(item), sort_blist_change_cb, "status"); |
15818 | 2266 |
2267 item = gnt_menuitem_new(_("Sort alphabetically")); | |
2268 gnt_menu_add_item(GNT_MENU(sub), item); | |
15931
f00f2e283ffb
Some define changes. This helps in generating the python bindings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15871
diff
changeset
|
2269 gnt_menuitem_set_callback(GNT_MENU_ITEM(item), sort_blist_change_cb, "text"); |
15818 | 2270 |
2271 item = gnt_menuitem_new(_("Sort by log size")); | |
2272 gnt_menu_add_item(GNT_MENU(sub), item); | |
15931
f00f2e283ffb
Some define changes. This helps in generating the python bindings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15871
diff
changeset
|
2273 gnt_menuitem_set_callback(GNT_MENU_ITEM(item), sort_blist_change_cb, "log"); |
15818 | 2274 |
2275 reconstruct_accounts_menu(); | |
2276 gnt_menu_add_item(GNT_MENU(menu), ggblist->accounts); | |
2277 | |
2278 reconstruct_plugins_menu(); | |
2279 gnt_menu_add_item(GNT_MENU(menu), ggblist->plugins); | |
2280 } | |
2281 | |
2282 void finch_blist_show() | |
2283 { | |
15823 | 2284 blist_show(purple_get_blist()); |
15818 | 2285 } |
2286 | |
2287 static void | |
16105
1983ecd15174
Remember the collapsed state of groups in the blist
Richard Nelson <wabz@pidgin.im>
parents:
15931
diff
changeset
|
2288 group_collapsed(GntWidget *widget, PurpleBlistNode *node, gboolean collapsed, gpointer null) |
1983ecd15174
Remember the collapsed state of groups in the blist
Richard Nelson <wabz@pidgin.im>
parents:
15931
diff
changeset
|
2289 { |
16106 | 2290 if (PURPLE_BLIST_NODE_IS_GROUP(node)) |
2291 purple_blist_node_set_bool(node, "collapsed", collapsed); | |
16105
1983ecd15174
Remember the collapsed state of groups in the blist
Richard Nelson <wabz@pidgin.im>
parents:
15931
diff
changeset
|
2292 } |
1983ecd15174
Remember the collapsed state of groups in the blist
Richard Nelson <wabz@pidgin.im>
parents:
15931
diff
changeset
|
2293 |
1983ecd15174
Remember the collapsed state of groups in the blist
Richard Nelson <wabz@pidgin.im>
parents:
15931
diff
changeset
|
2294 static void |
15823 | 2295 blist_show(PurpleBuddyList *list) |
15818 | 2296 { |
2297 if (ggblist == NULL) | |
2298 new_list(list); | |
18345
2d4df5ef0090
If the action-windows are already there, then bring them to front when
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18332
diff
changeset
|
2299 else if (ggblist->window) { |
2d4df5ef0090
If the action-windows are already there, then bring them to front when
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18332
diff
changeset
|
2300 gnt_window_present(ggblist->window); |
15818 | 2301 return; |
18345
2d4df5ef0090
If the action-windows are already there, then bring them to front when
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18332
diff
changeset
|
2302 } |
15818 | 2303 |
2304 ggblist->window = gnt_vwindow_new(FALSE); | |
2305 gnt_widget_set_name(ggblist->window, "buddylist"); | |
2306 gnt_box_set_toplevel(GNT_BOX(ggblist->window), TRUE); | |
2307 gnt_box_set_title(GNT_BOX(ggblist->window), _("Buddy List")); | |
2308 gnt_box_set_pad(GNT_BOX(ggblist->window), 0); | |
2309 | |
2310 ggblist->tree = gnt_tree_new(); | |
2311 | |
2312 GNT_WIDGET_SET_FLAGS(ggblist->tree, GNT_WIDGET_NO_BORDER); | |
15823 | 2313 gnt_widget_set_size(ggblist->tree, purple_prefs_get_int(PREF_ROOT "/size/width"), |
2314 purple_prefs_get_int(PREF_ROOT "/size/height")); | |
2315 gnt_widget_set_position(ggblist->window, purple_prefs_get_int(PREF_ROOT "/position/x"), | |
2316 purple_prefs_get_int(PREF_ROOT "/position/y")); | |
15818 | 2317 |
2318 gnt_tree_set_col_width(GNT_TREE(ggblist->tree), 0, | |
15823 | 2319 purple_prefs_get_int(PREF_ROOT "/size/width") - 1); |
15818 | 2320 |
2321 gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->tree); | |
2322 | |
2323 ggblist->status = gnt_combo_box_new(); | |
2324 gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->status); | |
2325 ggblist->statustext = gnt_entry_new(NULL); | |
2326 gnt_box_add_widget(GNT_BOX(ggblist->window), ggblist->statustext); | |
2327 | |
2328 gnt_widget_show(ggblist->window); | |
2329 | |
15823 | 2330 purple_signal_connect(purple_connections_get_handle(), "signed-on", finch_blist_get_handle(), |
2331 PURPLE_CALLBACK(reconstruct_accounts_menu), NULL); | |
2332 purple_signal_connect(purple_connections_get_handle(), "signed-off", finch_blist_get_handle(), | |
2333 PURPLE_CALLBACK(reconstruct_accounts_menu), NULL); | |
2334 purple_signal_connect(purple_blist_get_handle(), "buddy-status-changed", finch_blist_get_handle(), | |
2335 PURPLE_CALLBACK(buddy_status_changed), ggblist); | |
2336 purple_signal_connect(purple_blist_get_handle(), "buddy-idle-changed", finch_blist_get_handle(), | |
2337 PURPLE_CALLBACK(buddy_idle_changed), ggblist); | |
15818 | 2338 |
15823 | 2339 purple_signal_connect(purple_plugins_get_handle(), "plugin-load", finch_blist_get_handle(), |
2340 PURPLE_CALLBACK(reconstruct_plugins_menu), NULL); | |
2341 purple_signal_connect(purple_plugins_get_handle(), "plugin-unload", finch_blist_get_handle(), | |
2342 PURPLE_CALLBACK(reconstruct_plugins_menu), NULL); | |
15818 | 2343 |
2344 #if 0 | |
15823 | 2345 purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", finch_blist_get_handle(), |
2346 PURPLE_CALLBACK(buddy_signed_on), ggblist); | |
2347 purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", finch_blist_get_handle(), | |
2348 PURPLE_CALLBACK(buddy_signed_off), ggblist); | |
15818 | 2349 |
2350 /* These I plan to use to indicate unread-messages etc. */ | |
15823 | 2351 purple_signal_connect(purple_conversations_get_handle(), "received-im-msg", finch_blist_get_handle(), |
2352 PURPLE_CALLBACK(received_im_msg), list); | |
2353 purple_signal_connect(purple_conversations_get_handle(), "sent-im-msg", finch_blist_get_handle(), | |
2354 PURPLE_CALLBACK(sent_im_msg), NULL); | |
15818 | 2355 |
15823 | 2356 purple_signal_connect(purple_conversations_get_handle(), "received-chat-msg", finch_blist_get_handle(), |
2357 PURPLE_CALLBACK(received_chat_msg), list); | |
15818 | 2358 #endif |
2359 | |
2360 g_signal_connect(G_OBJECT(ggblist->tree), "selection_changed", G_CALLBACK(selection_changed), ggblist); | |
2361 g_signal_connect(G_OBJECT(ggblist->tree), "key_pressed", G_CALLBACK(key_pressed), ggblist); | |
2362 g_signal_connect(G_OBJECT(ggblist->tree), "context-menu", G_CALLBACK(context_menu), ggblist); | |
16105
1983ecd15174
Remember the collapsed state of groups in the blist
Richard Nelson <wabz@pidgin.im>
parents:
15931
diff
changeset
|
2363 g_signal_connect(G_OBJECT(ggblist->tree), "collapse-toggled", G_CALLBACK(group_collapsed), NULL); |
15818 | 2364 g_signal_connect_after(G_OBJECT(ggblist->tree), "clicked", G_CALLBACK(blist_clicked), ggblist); |
2365 g_signal_connect(G_OBJECT(ggblist->tree), "activate", G_CALLBACK(selection_activate), ggblist); | |
2366 g_signal_connect_data(G_OBJECT(ggblist->tree), "gained-focus", G_CALLBACK(draw_tooltip), | |
2367 ggblist, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); | |
2368 g_signal_connect_data(G_OBJECT(ggblist->tree), "lost-focus", G_CALLBACK(remove_peripherals), | |
2369 ggblist, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); | |
16731
3c3fc1432a01
Let windows know when the workspace they are in is being hidden/shown
Richard Nelson <wabz@pidgin.im>
parents:
16663
diff
changeset
|
2370 g_signal_connect_data(G_OBJECT(ggblist->window), "workspace-hidden", G_CALLBACK(remove_peripherals), |
3c3fc1432a01
Let windows know when the workspace they are in is being hidden/shown
Richard Nelson <wabz@pidgin.im>
parents:
16663
diff
changeset
|
2371 ggblist, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); |
15818 | 2372 g_signal_connect(G_OBJECT(ggblist->tree), "size_changed", G_CALLBACK(size_changed_cb), NULL); |
2373 g_signal_connect(G_OBJECT(ggblist->window), "position_set", G_CALLBACK(save_position_cb), NULL); | |
2374 g_signal_connect(G_OBJECT(ggblist->window), "destroy", G_CALLBACK(reset_blist_window), NULL); | |
2375 | |
2376 /* Status signals */ | |
15823 | 2377 purple_signal_connect(purple_savedstatuses_get_handle(), "savedstatus-changed", finch_blist_get_handle(), |
2378 PURPLE_CALLBACK(savedstatus_changed), NULL); | |
15818 | 2379 g_signal_connect(G_OBJECT(ggblist->status), "selection_changed", |
2380 G_CALLBACK(status_selection_changed), NULL); | |
2381 g_signal_connect(G_OBJECT(ggblist->statustext), "key_pressed", | |
2382 G_CALLBACK(status_text_changed), NULL); | |
2383 | |
2384 create_menu(); | |
2385 | |
2386 populate_buddylist(); | |
2387 | |
15823 | 2388 savedstatus_changed(purple_savedstatus_get_current(), NULL); |
15818 | 2389 } |
2390 | |
2391 void finch_blist_uninit() | |
2392 { | |
2393 if (ggblist == NULL) | |
2394 return; | |
2395 | |
2396 gnt_widget_destroy(ggblist->window); | |
2397 g_free(ggblist); | |
2398 ggblist = NULL; | |
2399 } | |
2400 | |
2401 gboolean finch_blist_get_position(int *x, int *y) | |
2402 { | |
2403 if (!ggblist || !ggblist->window) | |
2404 return FALSE; | |
2405 gnt_widget_get_position(ggblist->window, x, y); | |
2406 return TRUE; | |
2407 } | |
2408 | |
2409 void finch_blist_set_position(int x, int y) | |
2410 { | |
2411 gnt_widget_set_position(ggblist->window, x, y); | |
2412 } | |
2413 | |
2414 gboolean finch_blist_get_size(int *width, int *height) | |
2415 { | |
2416 if (!ggblist || !ggblist->window) | |
2417 return FALSE; | |
2418 gnt_widget_get_size(ggblist->window, width, height); | |
2419 return TRUE; | |
2420 } | |
2421 | |
2422 void finch_blist_set_size(int width, int height) | |
2423 { | |
2424 gnt_widget_set_size(ggblist->window, width, height); | |
2425 } | |
2426 |