Mercurial > pidgin.yaz
annotate libgaim/prpl.c @ 15185:a505577b6f4b
[gaim-migrate @ 17973]
I realized doing Gmail notifications that mail notifications spawn dialogs that are non-user-initiated.
I no longer like this, so I came up with "headlines," non-critical alerts that appear at the top of the
buddy list until they're clicked or a new headline is set. Now, when you get a new mail notification,
a headline will appear saying "You have 60 new e-mails." When you click it, the old mail notification
will show up.
Also, it looks wicked awesome: http://gaim.sf.net/sean/images/headline.png
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Tue, 12 Dec 2006 08:53:35 +0000 |
parents | 45a939f70f1d |
children | 4730550da5fa |
rev | line source |
---|---|
14192 | 1 /* |
2 * gaim | |
3 * | |
4 * Gaim is the legal property of its developers, whose names are too numerous | |
5 * to list here. Please refer to the COPYRIGHT file distributed with this | |
6 * source distribution. | |
7 * | |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 * | |
22 */ | |
23 #include "internal.h" | |
24 #include "conversation.h" | |
25 #include "debug.h" | |
26 #include "notify.h" | |
27 #include "prpl.h" | |
28 #include "request.h" | |
29 #include "util.h" | |
30 | |
31 /**************************************************************************/ | |
32 /** @name Protocol Plugin API */ | |
33 /**************************************************************************/ | |
34 void | |
35 gaim_prpl_got_account_idle(GaimAccount *account, gboolean idle, | |
36 time_t idle_time) | |
37 { | |
38 g_return_if_fail(account != NULL); | |
39 g_return_if_fail(gaim_account_is_connected(account)); | |
40 | |
41 gaim_presence_set_idle(gaim_account_get_presence(account), | |
42 idle, idle_time); | |
43 } | |
44 | |
45 void | |
46 gaim_prpl_got_account_login_time(GaimAccount *account, time_t login_time) | |
47 { | |
48 GaimPresence *presence; | |
49 | |
50 g_return_if_fail(account != NULL); | |
51 g_return_if_fail(gaim_account_is_connected(account)); | |
52 | |
53 if (login_time == 0) | |
54 login_time = time(NULL); | |
55 | |
56 presence = gaim_account_get_presence(account); | |
57 | |
58 gaim_presence_set_login_time(presence, login_time); | |
59 } | |
60 | |
61 void | |
62 gaim_prpl_got_account_status(GaimAccount *account, const char *status_id, ...) | |
63 { | |
64 GaimPresence *presence; | |
65 GaimStatus *status; | |
66 va_list args; | |
67 | |
68 g_return_if_fail(account != NULL); | |
69 g_return_if_fail(status_id != NULL); | |
70 g_return_if_fail(gaim_account_is_connected(account)); | |
71 | |
72 presence = gaim_account_get_presence(account); | |
73 status = gaim_presence_get_status(presence, status_id); | |
74 | |
75 g_return_if_fail(status != NULL); | |
76 | |
77 va_start(args, status_id); | |
78 gaim_status_set_active_with_attrs(status, TRUE, args); | |
79 va_end(args); | |
80 } | |
81 | |
82 void | |
83 gaim_prpl_got_user_idle(GaimAccount *account, const char *name, | |
84 gboolean idle, time_t idle_time) | |
85 { | |
86 GaimBuddy *buddy; | |
87 GaimPresence *presence; | |
88 | |
89 g_return_if_fail(account != NULL); | |
90 g_return_if_fail(name != NULL); | |
91 g_return_if_fail(gaim_account_is_connected(account)); | |
92 | |
93 if ((buddy = gaim_find_buddy(account, name)) == NULL) | |
94 return; | |
95 | |
96 presence = gaim_buddy_get_presence(buddy); | |
97 | |
98 gaim_presence_set_idle(presence, idle, idle_time); | |
99 } | |
100 | |
101 void | |
102 gaim_prpl_got_user_login_time(GaimAccount *account, const char *name, | |
103 time_t login_time) | |
104 { | |
105 GaimBuddy *buddy; | |
106 GaimPresence *presence; | |
107 | |
108 g_return_if_fail(account != NULL); | |
109 g_return_if_fail(name != NULL); | |
110 | |
111 if ((buddy = gaim_find_buddy(account, name)) == NULL) | |
112 return; | |
113 | |
114 if (login_time == 0) | |
115 login_time = time(NULL); | |
116 | |
117 presence = gaim_buddy_get_presence(buddy); | |
118 | |
119 gaim_presence_set_login_time(presence, login_time); | |
15151
45a939f70f1d
[gaim-migrate @ 17936]
Evan Schoenberg <evan.s@dreskin.net>
parents:
14192
diff
changeset
|
120 |
45a939f70f1d
[gaim-migrate @ 17936]
Evan Schoenberg <evan.s@dreskin.net>
parents:
14192
diff
changeset
|
121 gaim_signal_emit(gaim_blist_get_handle(), "buddy-got-login-time", buddy); |
14192 | 122 } |
123 | |
124 void | |
125 gaim_prpl_got_user_status(GaimAccount *account, const char *name, | |
126 const char *status_id, ...) | |
127 { | |
128 GSList *list; | |
129 GaimBuddy *buddy; | |
130 GaimPresence *presence; | |
131 GaimStatus *status; | |
132 GaimStatus *old_status; | |
133 va_list args; | |
134 | |
135 g_return_if_fail(account != NULL); | |
136 g_return_if_fail(name != NULL); | |
137 g_return_if_fail(status_id != NULL); | |
138 g_return_if_fail(gaim_account_is_connected(account) || gaim_account_is_connecting(account)); | |
139 | |
140 if ((buddy = gaim_find_buddy(account, name)) == NULL) | |
141 return; | |
142 | |
143 presence = gaim_buddy_get_presence(buddy); | |
144 status = gaim_presence_get_status(presence, status_id); | |
145 | |
146 g_return_if_fail(status != NULL); | |
147 | |
148 old_status = gaim_presence_get_active_status(presence); | |
149 | |
150 va_start(args, status_id); | |
151 gaim_status_set_active_with_attrs(status, TRUE, args); | |
152 va_end(args); | |
153 | |
154 list = gaim_find_buddies(account, name); | |
155 g_slist_foreach(list, (GFunc)gaim_blist_update_buddy_status, old_status); | |
156 g_slist_free(list); | |
157 | |
158 if (!gaim_status_is_online(status)) | |
159 serv_got_typing_stopped(gaim_account_get_connection(account), name); | |
160 } | |
161 | |
162 static void | |
163 do_prpl_change_account_status(GaimAccount *account, | |
164 GaimStatus *old_status, GaimStatus *new_status) | |
165 { | |
166 GaimPlugin *prpl; | |
167 GaimPluginProtocolInfo *prpl_info; | |
168 | |
169 if (gaim_status_is_online(new_status) && | |
170 gaim_account_is_disconnected(account)) | |
171 { | |
172 gaim_account_connect(account); | |
173 return; | |
174 } | |
175 | |
176 if (!gaim_status_is_online(new_status)) | |
177 { | |
178 if (!gaim_account_is_disconnected(account)) | |
179 gaim_account_disconnect(account); | |
180 return; | |
181 } | |
182 | |
183 if (gaim_account_is_connecting(account)) | |
184 /* | |
185 * We don't need to call the set_status PRPL function because | |
186 * the PRPL will take care of setting its status during the | |
187 * connection process. | |
188 */ | |
189 return; | |
190 | |
191 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); | |
192 | |
193 if (prpl == NULL) | |
194 return; | |
195 | |
196 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
197 | |
198 if (!gaim_account_is_disconnected(account) && prpl_info->set_status != NULL) | |
199 { | |
200 prpl_info->set_status(account, new_status); | |
201 } | |
202 } | |
203 | |
204 void | |
205 gaim_prpl_change_account_status(GaimAccount *account, | |
206 GaimStatus *old_status, GaimStatus *new_status) | |
207 { | |
208 g_return_if_fail(account != NULL); | |
209 g_return_if_fail(old_status != NULL); | |
210 g_return_if_fail(new_status != NULL); | |
211 | |
212 do_prpl_change_account_status(account, old_status, new_status); | |
213 | |
214 gaim_signal_emit(gaim_accounts_get_handle(), "account-status-changed", | |
215 account, old_status, new_status); | |
216 } | |
217 | |
218 GList * | |
219 gaim_prpl_get_statuses(GaimAccount *account, GaimPresence *presence) | |
220 { | |
221 GaimPlugin *prpl; | |
222 GaimPluginProtocolInfo *prpl_info; | |
223 GList *statuses = NULL; | |
224 GList *l, *list; | |
225 GaimStatus *status; | |
226 | |
227 g_return_val_if_fail(account != NULL, NULL); | |
228 g_return_val_if_fail(presence != NULL, NULL); | |
229 | |
230 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); | |
231 | |
232 if (prpl == NULL) | |
233 return NULL; | |
234 | |
235 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
236 if (prpl_info == NULL || prpl_info->status_types == NULL) | |
237 return NULL; | |
238 | |
239 for (l = list = prpl_info->status_types(account); l != NULL; l = l->next) | |
240 { | |
241 status = gaim_status_new((GaimStatusType *)l->data, presence); | |
242 statuses = g_list_append(statuses, status); | |
243 } | |
244 | |
245 g_list_free(list); | |
246 | |
247 return statuses; | |
248 } | |
249 | |
250 | |
251 /************************************************************************** | |
252 * Protocol Plugin Subsystem API | |
253 **************************************************************************/ | |
254 | |
255 GaimPlugin * | |
256 gaim_find_prpl(const char *id) | |
257 { | |
258 GList *l; | |
259 GaimPlugin *plugin; | |
260 | |
261 g_return_val_if_fail(id != NULL, NULL); | |
262 | |
263 for (l = gaim_plugins_get_protocols(); l != NULL; l = l->next) { | |
264 plugin = (GaimPlugin *)l->data; | |
265 | |
266 if (!strcmp(plugin->info->id, id)) | |
267 return plugin; | |
268 } | |
269 | |
270 return NULL; | |
271 } |