Mercurial > pidgin
annotate plugins/docklet/docklet.c @ 5234:890b29f00b68
[gaim-migrate @ 5604]
Chats in the buddy list!
You can now put chat rooms in your buddy list, and double-click them to join
them, instead of having to do all that typing. I'm eventually gonna add
auto-join support, so that ugly hack involving pouncing can go away.
Someone should make some new artwork so we don't have 2 + icons next to
each other in the menus.
This also has some fixes to let gaim compile again, after the renaming of
the buddy list files.
This also fixes the problem with offline buddies not showing up in the list
sometimes for accounts that didn't log in at startup.
This probably fixes other stuff, but I can't remember any of it off the top
of my head.
I'm going to stop typing and let people play with this now.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sat, 26 Apr 2003 20:30:43 +0000 |
parents | 6d1707dc8c3d |
children | 2c4c975620f0 |
rev | line source |
---|---|
4093 | 1 /* System tray icon (aka docklet) plugin for Gaim |
3510 | 2 * Copyright (C) 2002 Robert McQueen <robot101@debian.org> |
3 * Inspired by a similar plugin by: | |
4 * John (J5) Palmieri <johnp@martianrock.com> | |
5 * | |
6 * This program is free software; you can redistribute it and/or | |
7 * modify it under the terms of the GNU General Public License as | |
8 * published by the Free Software Foundation; either version 2 of the | |
9 * License, or (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, but | |
12 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
19 * 02111-1307, USA. | |
20 */ | |
21 | |
22 /* todo (in order of importance): | |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
23 - unify the queue so we can have a global away without the dialog |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
24 - handle and update tooltips to show your current accounts/queued messages? |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
25 - show a count of queued messages in the unified queue |
3510 | 26 - dernyi's account status menu in the right click |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
27 - optional pop up notices when GNOME2's system-tray-applet supports it */ |
3510 | 28 |
29 /* includes */ | |
30 #include <gtk/gtk.h> | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
31 #include "gtkplugin.h" |
3510 | 32 #include "gaim.h" |
4561 | 33 #include "sound.h" |
3510 | 34 #include "eggtrayicon.h" |
5234 | 35 #include "gtkblist.h" |
3510 | 36 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
37 #define DOCKLET_PLUGIN_ID "gtk-docklet" |
3867 | 38 |
3510 | 39 /* types */ |
40 enum docklet_status { | |
4157 | 41 offline, |
42 offline_connecting, | |
3510 | 43 online, |
4157 | 44 online_connecting, |
45 online_pending, | |
3510 | 46 away, |
4157 | 47 away_pending |
3510 | 48 }; |
49 | |
50 /* functions */ | |
4093 | 51 static gboolean docklet_create(); |
4157 | 52 static gboolean docklet_update_status(); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
53 static gboolean plugin_unload(GaimPlugin *plugin); |
3510 | 54 |
55 /* globals */ | |
3513 | 56 static EggTrayIcon *docklet = NULL; |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
57 static GtkWidget *image = NULL; |
3510 | 58 static enum docklet_status status; |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
59 static enum docklet_status icon; |
3510 | 60 |
3554 | 61 static void docklet_toggle_mute(GtkWidget *toggle, void *data) { |
4561 | 62 gaim_sound_set_mute(GTK_CHECK_MENU_ITEM(toggle)->active); |
3510 | 63 } |
64 | |
3554 | 65 static void docklet_toggle_queue(GtkWidget *widget, void *data) { |
66 away_options ^= OPT_AWAY_QUEUE_UNREAD; | |
67 save_prefs(); | |
3510 | 68 } |
3570 | 69 |
70 /* static void docklet_toggle_blist_show(GtkWidget *widget, void *data) { | |
71 blist_options ^= OPT_BLIST_APP_BUDDY_SHOW; | |
72 save_prefs(); | |
73 } */ | |
74 | |
3554 | 75 static void docklet_flush_queue() { |
3570 | 76 if (unread_message_queue) { |
4274 | 77 purge_away_queue(&unread_message_queue); |
3570 | 78 } |
3510 | 79 } |
80 | |
81 static void docklet_menu(GdkEventButton *event) { | |
3513 | 82 static GtkWidget *menu = NULL; |
3512 | 83 GtkWidget *entry; |
3510 | 84 |
85 if (menu) { | |
86 gtk_widget_destroy(menu); | |
87 } | |
88 | |
89 menu = gtk_menu_new(); | |
90 | |
4157 | 91 switch (status) { |
92 case offline: | |
93 case offline_connecting: | |
5024 | 94 gaim_new_item_from_stock(menu, _("Auto-login"), GAIM_STOCK_SIGN_ON, G_CALLBACK(auto_login), NULL, 0, 0, NULL); |
4567 | 95 break; |
96 default: | |
5024 | 97 gaim_new_item_from_stock(menu, _("New Message.."), GAIM_STOCK_IM, G_CALLBACK(show_im_dialog), NULL, 0, 0, NULL); |
98 gaim_new_item_from_stock(menu, _("Join A Chat..."), GAIM_STOCK_CHAT, G_CALLBACK(join_chat), NULL, 0, 0, NULL); | |
4567 | 99 break; |
100 } | |
101 | |
102 switch (status) { | |
103 case offline: | |
104 case offline_connecting: | |
4157 | 105 break; |
106 case online: | |
107 case online_connecting: | |
108 case online_pending: { | |
3510 | 109 GtkWidget *docklet_awaymenu; |
110 GSList *awy = NULL; | |
111 struct away_message *a = NULL; | |
112 | |
113 docklet_awaymenu = gtk_menu_new(); | |
114 awy = away_messages; | |
115 | |
116 while (awy) { | |
117 a = (struct away_message *)awy->data; | |
118 | |
119 entry = gtk_menu_item_new_with_label(a->name); | |
3554 | 120 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(do_away_message), a); |
4635 | 121 gtk_menu_shell_append(GTK_MENU_SHELL(docklet_awaymenu), entry); |
3510 | 122 |
123 awy = g_slist_next(awy); | |
124 } | |
125 | |
4157 | 126 if (away_messages) |
127 gaim_separator(docklet_awaymenu); | |
3510 | 128 |
129 entry = gtk_menu_item_new_with_label(_("New...")); | |
3554 | 130 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(create_away_mess), NULL); |
4635 | 131 gtk_menu_shell_append(GTK_MENU_SHELL(docklet_awaymenu), entry); |
3510 | 132 |
133 entry = gtk_menu_item_new_with_label(_("Away")); | |
3512 | 134 gtk_menu_item_set_submenu(GTK_MENU_ITEM(entry), docklet_awaymenu); |
4635 | 135 gtk_menu_shell_append(GTK_MENU_SHELL(menu), entry); |
4157 | 136 } break; |
137 case away: | |
138 case away_pending: | |
3510 | 139 entry = gtk_menu_item_new_with_label(_("Back")); |
3554 | 140 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(do_im_back), NULL); |
4635 | 141 gtk_menu_shell_append(GTK_MENU_SHELL(menu), entry); |
4157 | 142 break; |
3510 | 143 } |
144 | |
4567 | 145 gaim_separator(menu); |
146 | |
147 entry = gtk_check_menu_item_new_with_label(_("Mute Sounds")); | |
148 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(entry), gaim_sound_get_mute()); | |
149 g_signal_connect(G_OBJECT(entry), "toggled", G_CALLBACK(docklet_toggle_mute), NULL); | |
4635 | 150 gtk_menu_shell_append(GTK_MENU_SHELL(menu), entry); |
4567 | 151 |
5024 | 152 gaim_new_item_from_stock(menu, _("File Transfers..."), GAIM_STOCK_FILE_TRANSFER, G_CALLBACK(gaim_show_xfer_dialog), NULL, 0, 0, NULL); |
153 gaim_new_item_from_stock(menu, _("Accounts..."), GAIM_STOCK_ACCOUNTS, G_CALLBACK(account_editor), NULL, 0, 0, NULL); | |
4567 | 154 gaim_new_item_from_stock(menu, _("Preferences..."), GTK_STOCK_PREFERENCES, G_CALLBACK(show_prefs), NULL, 0, 0, NULL); |
155 | |
156 gaim_separator(menu); | |
157 | |
4157 | 158 switch (status) { |
159 case offline: | |
160 case offline_connecting: | |
161 break; | |
162 default: | |
5024 | 163 gaim_new_item_from_stock(menu, _("Signoff"), GTK_STOCK_CLOSE, G_CALLBACK(signoff_all), NULL, 0, 0, 0); |
4157 | 164 break; |
165 } | |
166 | |
167 gaim_new_item_from_stock(menu, _("Quit"), GTK_STOCK_QUIT, G_CALLBACK(do_quit), NULL, 0, 0, 0); | |
3510 | 168 |
169 gtk_widget_show_all(menu); | |
170 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time); | |
171 } | |
172 | |
173 static void docklet_clicked(GtkWidget *button, GdkEventButton *event, void *data) { | |
3939 | 174 if (event->type != GDK_BUTTON_PRESS) |
175 return; | |
176 | |
3510 | 177 switch (event->button) { |
178 case 1: | |
3517 | 179 if (unread_message_queue) { |
3570 | 180 docklet_flush_queue(); |
3517 | 181 docklet_update_status(); |
3570 | 182 } else { |
4698 | 183 gaim_gtk_blist_docklet_toggle(); |
3554 | 184 } |
3510 | 185 break; |
186 case 2: | |
187 break; | |
188 case 3: | |
189 docklet_menu(event); | |
190 break; | |
191 } | |
192 } | |
193 | |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
194 static void docklet_update_icon() { |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
195 const gchar *icon_name = NULL; |
3510 | 196 |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
197 switch (icon) { |
4157 | 198 case offline: |
5024 | 199 icon_name = GAIM_STOCK_ICON_OFFLINE; |
4157 | 200 break; |
201 case offline_connecting: | |
202 case online_connecting: | |
5024 | 203 icon_name = GAIM_STOCK_ICON_CONNECT; |
4157 | 204 break; |
3510 | 205 case online: |
5024 | 206 icon_name = GAIM_STOCK_ICON_ONLINE; |
3510 | 207 break; |
4157 | 208 case online_pending: |
5024 | 209 icon_name = GAIM_STOCK_ICON_ONLINE_MSG; |
4157 | 210 break; |
3510 | 211 case away: |
5024 | 212 icon_name = GAIM_STOCK_ICON_AWAY; |
3510 | 213 break; |
214 case away_pending: | |
5024 | 215 icon_name = GAIM_STOCK_ICON_AWAY_MSG; |
3510 | 216 break; |
217 } | |
218 | |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
219 gtk_image_set_from_stock(GTK_IMAGE(image), icon_name, GTK_ICON_SIZE_LARGE_TOOLBAR); |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
220 } |
3510 | 221 |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
222 static gboolean docklet_blink_icon() { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
223 if (status == online_pending) { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
224 if (status == icon) { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
225 /* last icon was the right one... let's change it */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
226 icon = online; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
227 } else { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
228 /* last icon was the wrong one, change it back */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
229 icon = online_pending; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
230 } |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
231 } else if (status == away_pending) { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
232 if (status == icon) { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
233 /* last icon was the right one... let's change it */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
234 icon = away; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
235 } else { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
236 /* last icon was the wrong one, change it back */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
237 icon = away_pending; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
238 } |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
239 } else { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
240 /* no messages, stop blinking */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
241 return FALSE; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
242 } |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
243 |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
244 docklet_update_icon(); |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
245 |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
246 return TRUE; /* keep blinking */ |
3510 | 247 } |
248 | |
4157 | 249 static gboolean docklet_update_status() { |
3510 | 250 enum docklet_status oldstatus; |
251 | |
252 oldstatus = status; | |
253 | |
254 if (connections) { | |
3517 | 255 if (unread_message_queue) { |
4157 | 256 status = online_pending; |
3517 | 257 } else if (awaymessage) { |
3510 | 258 if (message_queue) { |
259 status = away_pending; | |
260 } else { | |
261 status = away; | |
262 } | |
3554 | 263 } else if (connecting_count) { |
4157 | 264 status = online_connecting; |
3510 | 265 } else { |
266 status = online; | |
267 } | |
268 } else { | |
3517 | 269 if (connecting_count) { |
4157 | 270 status = offline_connecting; |
3517 | 271 } else { |
272 status = offline; | |
273 } | |
3510 | 274 } |
275 | |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
276 /* update the icon if we changed status */ |
3510 | 277 if (status != oldstatus) { |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
278 icon = status; |
3510 | 279 docklet_update_icon(); |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
280 |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
281 /* and schedule the blinker function if messages are pending */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
282 if (status == online_pending || status == away_pending) { |
4274 | 283 g_timeout_add(500, docklet_blink_icon, &docklet); |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
284 } |
3510 | 285 } |
4157 | 286 |
287 return FALSE; /* for when we're called by the glib idle handler */ | |
3510 | 288 } |
289 | |
3554 | 290 static void docklet_embedded(GtkWidget *widget, void *data) { |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
291 gaim_debug(GAIM_DEBUG_INFO, "docklet", "Tray Icon: embedded\n"); |
4698 | 292 gaim_gtk_blist_docklet_add(); |
3554 | 293 } |
294 | |
4274 | 295 static void docklet_remove_callbacks() { |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
296 gaim_debug(GAIM_DEBUG_INFO, "docklet", "Tray Icon: removing callbacks"); |
4274 | 297 |
298 while (g_source_remove_by_user_data(&docklet)) { | |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
299 gaim_debug(GAIM_DEBUG_INFO, NULL, "."); |
4274 | 300 } |
301 | |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
302 gaim_debug(GAIM_DEBUG_INFO, NULL, "\n"); |
4274 | 303 } |
304 | |
3554 | 305 static void docklet_destroyed(GtkWidget *widget, void *data) { |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
306 gaim_debug(GAIM_DEBUG_INFO, "docklet", "Tray Icon: destroyed\n"); |
4093 | 307 |
4698 | 308 gaim_gtk_blist_docklet_remove(); |
4093 | 309 |
3570 | 310 docklet_flush_queue(); |
4093 | 311 |
4274 | 312 docklet_remove_callbacks(); |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
313 |
4093 | 314 g_object_unref(G_OBJECT(docklet)); |
315 docklet = NULL; | |
316 | |
4274 | 317 g_idle_add(docklet_create, &docklet); |
3554 | 318 } |
319 | |
4274 | 320 static gboolean docklet_create() { |
3510 | 321 GtkWidget *box; |
322 | |
3570 | 323 if (docklet) { |
4093 | 324 /* if this is being called when a tray icon exists, it's because |
325 something messed up. try destroying it before we proceed, | |
326 although docklet_refcount may be all hosed. hopefully won't happen. */ | |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
327 gaim_debug(GAIM_DEBUG_WARNING, "docklet", |
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
328 "Tray Icon: trying to create icon but it already exists?\n"); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
329 plugin_unload(NULL); |
3510 | 330 } |
331 | |
332 docklet = egg_tray_icon_new("Gaim"); | |
333 box = gtk_event_box_new(); | |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
334 image = gtk_image_new(); |
3510 | 335 |
3554 | 336 g_signal_connect(G_OBJECT(docklet), "embedded", G_CALLBACK(docklet_embedded), NULL); |
337 g_signal_connect(G_OBJECT(docklet), "destroy", G_CALLBACK(docklet_destroyed), NULL); | |
338 g_signal_connect(G_OBJECT(box), "button-press-event", G_CALLBACK(docklet_clicked), NULL); | |
3510 | 339 |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
340 gtk_container_add(GTK_CONTAINER(box), image); |
3510 | 341 gtk_container_add(GTK_CONTAINER(docklet), box); |
342 gtk_widget_show_all(GTK_WIDGET(docklet)); | |
343 | |
3554 | 344 /* ref the docklet before we bandy it about the place */ |
345 g_object_ref(G_OBJECT(docklet)); | |
3510 | 346 docklet_update_status(); |
347 docklet_update_icon(); | |
348 | |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
349 gaim_debug(GAIM_DEBUG_INFO, "docklet", "Tray Icon: created\n"); |
4093 | 350 |
351 return FALSE; /* for when we're called by the glib idle handler */ | |
3510 | 352 } |
353 | |
354 static void gaim_signon(struct gaim_connection *gc, void *data) { | |
355 docklet_update_status(); | |
356 } | |
357 | |
358 static void gaim_signoff(struct gaim_connection *gc, void *data) { | |
4157 | 359 /* do this when idle so that if the prpl was connecting |
360 and was cancelled, we register that connecting_count | |
361 has returned to 0 */ | |
4274 | 362 g_idle_add(docklet_update_status, &docklet); |
3510 | 363 } |
364 | |
4491 | 365 static void gaim_connecting(struct gaim_account *account, void *data) { |
3510 | 366 docklet_update_status(); |
367 } | |
368 | |
369 static void gaim_away(struct gaim_connection *gc, char *state, char *message, void *data) { | |
370 /* we only support global away. this is the way it is, ok? */ | |
371 docklet_update_status(); | |
372 } | |
373 | |
4274 | 374 static void gaim_im_recv(struct gaim_connection *gc, char **who, char **what, void *data) { |
3510 | 375 /* if message queuing while away is enabled, this event could be the first |
4274 | 376 message so we need to see if the status (and hence icon) needs changing. |
377 do this when idle so that all message processing is completed, queuing | |
378 etc, before we run. */ | |
379 g_idle_add(docklet_update_status, &docklet); | |
3510 | 380 } |
381 | |
3570 | 382 /* static void gaim_buddy_signon(struct gaim_connection *gc, char *who, void *data) { |
3510 | 383 } |
384 | |
385 static void gaim_buddy_signoff(struct gaim_connection *gc, char *who, void *data) { | |
386 } | |
387 | |
388 static void gaim_buddy_away(struct gaim_connection *gc, char *who, void *data) { | |
389 } | |
390 | |
391 static void gaim_buddy_back(struct gaim_connection *gc, char *who, void *data) { | |
392 } | |
393 | |
394 static void gaim_new_conversation(char *who, void *data) { | |
3570 | 395 } */ |
3510 | 396 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
397 static gboolean |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
398 plugin_load(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
399 { |
4093 | 400 docklet_create(NULL); |
3510 | 401 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
402 gaim_signal_connect(plugin, event_signon, gaim_signon, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
403 gaim_signal_connect(plugin, event_signoff, gaim_signoff, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
404 gaim_signal_connect(plugin, event_connecting, gaim_connecting, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
405 gaim_signal_connect(plugin, event_away, gaim_away, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
406 gaim_signal_connect(plugin, event_im_recv, gaim_im_recv, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
407 /* gaim_signal_connect(plugin, event_buddy_signon, gaim_buddy_signon, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
408 gaim_signal_connect(plugin, event_buddy_signoff, gaim_buddy_signoff, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
409 gaim_signal_connect(plugin, event_buddy_away, gaim_buddy_away, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
410 gaim_signal_connect(plugin, event_buddy_back, gaim_buddy_back, NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
411 gaim_signal_connect(plugin, event_new_conversation, gaim_new_conversation, NULL); */ |
3510 | 412 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
413 return TRUE; |
3510 | 414 } |
415 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
416 static gboolean |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
417 plugin_unload(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
418 { |
3570 | 419 if (GTK_WIDGET_VISIBLE(docklet)) { |
4698 | 420 gaim_gtk_blist_docklet_remove(); |
3570 | 421 } |
3554 | 422 |
3570 | 423 docklet_flush_queue(); |
3554 | 424 |
4274 | 425 docklet_remove_callbacks(); |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
426 |
3570 | 427 g_signal_handlers_disconnect_by_func(G_OBJECT(docklet), G_CALLBACK(docklet_destroyed), NULL); |
428 gtk_widget_destroy(GTK_WIDGET(docklet)); | |
3554 | 429 |
4093 | 430 g_object_unref(G_OBJECT(docklet)); |
431 docklet = NULL; | |
432 | |
4567 | 433 /* do this while gaim has no other way to toggle the global mute */ |
434 gaim_sound_set_mute(FALSE); | |
435 | |
5227
6d1707dc8c3d
[gaim-migrate @ 5597]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
436 gaim_debug(GAIM_DEBUG_INFO, "docklet", "Tray Icon: removed\n"); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
437 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
438 return TRUE; |
3554 | 439 } |
440 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
441 static GtkWidget * |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
442 get_config_frame(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
443 { |
3570 | 444 GtkWidget *frame; |
445 GtkWidget *vbox, *hbox; | |
446 GtkWidget *toggle; | |
3517 | 447 |
3570 | 448 frame = gtk_vbox_new(FALSE, 18); |
449 gtk_container_set_border_width(GTK_CONTAINER(frame), 12); | |
450 | |
4093 | 451 vbox = make_frame(frame, _("Tray Icon Configuration")); |
3570 | 452 hbox = gtk_hbox_new(FALSE, 18); |
453 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
3517 | 454 |
3570 | 455 /* toggle = gtk_check_button_new_with_mnemonic(_("_Automatically show buddy list on sign on")); |
456 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), blist_options & OPT_BLIST_APP_BUDDY_SHOW); | |
457 g_signal_connect(G_OBJECT(toggle), "clicked", G_CALLBACK(docklet_toggle_blist_show), NULL); | |
458 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); */ | |
3517 | 459 |
4093 | 460 toggle = gtk_check_button_new_with_mnemonic(_("_Hide new messages until tray icon is clicked")); |
3570 | 461 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), away_options & OPT_AWAY_QUEUE_UNREAD); |
462 g_signal_connect(G_OBJECT(toggle), "clicked", G_CALLBACK(docklet_toggle_queue), NULL); | |
463 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); | |
464 | |
465 gtk_widget_show_all(frame); | |
466 return frame; | |
3517 | 467 } |
3570 | 468 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
469 static GaimGtkPluginUiInfo ui_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
470 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
471 get_config_frame |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
472 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
473 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
474 static GaimPluginInfo info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
475 { |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
476 2, /**< api_version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
477 GAIM_PLUGIN_STANDARD, /**< type */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
478 GAIM_GTK_PLUGIN_TYPE, /**< ui_requirement */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
479 0, /**< flags */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
480 NULL, /**< dependencies */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
481 GAIM_PRIORITY_DEFAULT, /**< priority */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
482 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
483 DOCKLET_PLUGIN_ID, /**< id */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
484 N_("System Tray Icon"), /**< name */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
485 VERSION, /**< version */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
486 /** summary */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
487 N_("Displays an icon for Gaim in the system tray."), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
488 /** description */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
489 N_("Interacts with a Notification Area applet (in GNOME or KDE, " |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
490 "for example) to display the current status of Gaim, allow fast " |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
491 "access to commonly used functions, and to toggle display of the " |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
492 "buddy list or login window. Also allows messages to be queued " |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
493 "until the icon is clicked, similar to ICQ."), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
494 "Robert McQueen <robot101@debian.org>", /**< author */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
495 WEBSITE, /**< homepage */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
496 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
497 plugin_load, /**< load */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
498 plugin_unload, /**< unload */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
499 NULL, /**< destroy */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
500 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
501 &ui_info, /**< ui_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
502 NULL /**< extra_info */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
503 }; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
504 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
505 static void |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
506 __init_plugin(GaimPlugin *plugin) |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
507 { |
3551 | 508 } |
3510 | 509 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
510 GAIM_INIT_PLUGIN(docklet, __init_plugin, info); |