Mercurial > pidgin
annotate plugins/docklet/docklet.c @ 4561:9df99116840a
[gaim-migrate @ 4842]
This is the new sound subsystem
Lots of stuff got renamed, and everything sound-wise is documented.
Gaim now uses libaudiofile and libao to play sounds. Lots of ugly hacks
were removed, and now we support playing audio through anything that
libao will support.
If you need to (you shouldn't) you can force libao to use a specific
output driver, by putting a line into ~/.libao like:
default_driver=esd
You shouldn't need to do this, libao is pretty good at figuring out what
driver to use.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sun, 09 Feb 2003 01:55:35 +0000 |
parents | 3196d9044a45 |
children | 493f050dc11a |
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 - check removing the icon factory actually frees the icons |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
24 - 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
|
25 - handle and update tooltips to show your current accounts/queued messages? |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
26 - show a count of queued messages in the unified queue |
3510 | 27 - dernyi's account status menu in the right click |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
28 - optional pop up notices when GNOME2's system-tray-applet supports it */ |
3510 | 29 |
30 /* includes */ | |
31 #include <gtk/gtk.h> | |
32 #include "gaim.h" | |
4561 | 33 #include "sound.h" |
3510 | 34 #include "eggtrayicon.h" |
35 | |
3867 | 36 #ifndef GAIM_PLUGINS |
37 #define GAIM_PLUGINS | |
38 #endif | |
39 | |
3510 | 40 /* types */ |
41 enum docklet_status { | |
4157 | 42 offline, |
43 offline_connecting, | |
3510 | 44 online, |
4157 | 45 online_connecting, |
46 online_pending, | |
3510 | 47 away, |
4157 | 48 away_pending |
3510 | 49 }; |
50 | |
51 /* functions */ | |
4093 | 52 static gboolean docklet_create(); |
4157 | 53 static gboolean docklet_update_status(); |
4093 | 54 void gaim_plugin_remove(); |
3510 | 55 |
56 /* globals */ | |
3513 | 57 static EggTrayIcon *docklet = NULL; |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
58 static GtkWidget *image = NULL; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
59 static GtkIconFactory *icon_factory = NULL; |
3510 | 60 static enum docklet_status status; |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
61 static enum docklet_status icon; |
3510 | 62 |
3554 | 63 static void docklet_toggle_mute(GtkWidget *toggle, void *data) { |
4561 | 64 gaim_sound_set_mute(GTK_CHECK_MENU_ITEM(toggle)->active); |
3510 | 65 } |
66 | |
3554 | 67 static void docklet_toggle_queue(GtkWidget *widget, void *data) { |
68 away_options ^= OPT_AWAY_QUEUE_UNREAD; | |
69 save_prefs(); | |
3510 | 70 } |
3570 | 71 |
72 /* static void docklet_toggle_blist_show(GtkWidget *widget, void *data) { | |
73 blist_options ^= OPT_BLIST_APP_BUDDY_SHOW; | |
74 save_prefs(); | |
75 } */ | |
76 | |
3554 | 77 static void docklet_flush_queue() { |
3570 | 78 if (unread_message_queue) { |
4274 | 79 purge_away_queue(&unread_message_queue); |
3570 | 80 } |
3510 | 81 } |
82 | |
83 static void docklet_menu(GdkEventButton *event) { | |
3513 | 84 static GtkWidget *menu = NULL; |
3512 | 85 GtkWidget *entry; |
3510 | 86 |
87 if (menu) { | |
88 gtk_widget_destroy(menu); | |
89 } | |
90 | |
91 menu = gtk_menu_new(); | |
92 | |
4157 | 93 switch (status) { |
94 case offline: | |
95 case offline_connecting: | |
96 break; | |
97 case online: | |
98 case online_connecting: | |
99 case online_pending: { | |
3510 | 100 GtkWidget *docklet_awaymenu; |
101 GSList *awy = NULL; | |
102 struct away_message *a = NULL; | |
103 | |
104 docklet_awaymenu = gtk_menu_new(); | |
105 awy = away_messages; | |
106 | |
107 while (awy) { | |
108 a = (struct away_message *)awy->data; | |
109 | |
110 entry = gtk_menu_item_new_with_label(a->name); | |
3554 | 111 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(do_away_message), a); |
3510 | 112 gtk_menu_append(GTK_MENU(docklet_awaymenu), entry); |
113 | |
114 awy = g_slist_next(awy); | |
115 } | |
116 | |
4157 | 117 if (away_messages) |
118 gaim_separator(docklet_awaymenu); | |
3510 | 119 |
120 entry = gtk_menu_item_new_with_label(_("New...")); | |
3554 | 121 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(create_away_mess), NULL); |
3510 | 122 gtk_menu_append(GTK_MENU(docklet_awaymenu), entry); |
123 | |
124 entry = gtk_menu_item_new_with_label(_("Away")); | |
3512 | 125 gtk_menu_item_set_submenu(GTK_MENU_ITEM(entry), docklet_awaymenu); |
3510 | 126 gtk_menu_append(GTK_MENU(menu), entry); |
4157 | 127 } break; |
128 case away: | |
129 case away_pending: | |
3510 | 130 entry = gtk_menu_item_new_with_label(_("Back")); |
3554 | 131 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(do_im_back), NULL); |
3510 | 132 gtk_menu_append(GTK_MENU(menu), entry); |
4157 | 133 break; |
3510 | 134 } |
135 | |
4157 | 136 switch (status) { |
137 case offline: | |
138 case offline_connecting: | |
139 entry = gtk_menu_item_new_with_label(_("Auto-login")); | |
140 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(auto_login), NULL); | |
141 gtk_menu_append(GTK_MENU(menu), entry); | |
142 break; | |
143 default: | |
144 entry = gtk_menu_item_new_with_label(_("Signoff")); | |
145 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(signoff_all), NULL); | |
146 gtk_menu_append(GTK_MENU(menu), entry); | |
147 break; | |
148 } | |
149 | |
150 gaim_separator(menu); | |
3510 | 151 |
3517 | 152 entry = gtk_check_menu_item_new_with_label(_("Mute Sounds")); |
4561 | 153 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(entry), gaim_sound_get_mute()); |
3554 | 154 g_signal_connect(G_OBJECT(entry), "toggled", G_CALLBACK(docklet_toggle_mute), NULL); |
3517 | 155 gtk_menu_append(GTK_MENU(menu), entry); |
156 | |
4157 | 157 gaim_new_item_from_pixbuf(menu, _("Accounts..."), "accounts-menu.png", G_CALLBACK(account_editor), NULL, 0, 0, 0); |
158 gaim_new_item_from_stock(menu, _("Preferences..."), GTK_STOCK_PREFERENCES, G_CALLBACK(show_prefs), NULL, 0, 0, 0); | |
3510 | 159 |
4157 | 160 gaim_separator(menu); |
3510 | 161 |
4157 | 162 gaim_new_item_from_pixbuf(menu, _("About Gaim..."), "about_menu.png", G_CALLBACK(show_about), NULL, 0, 0, 0); |
163 gaim_new_item_from_stock(menu, _("Quit"), GTK_STOCK_QUIT, G_CALLBACK(do_quit), NULL, 0, 0, 0); | |
3510 | 164 |
165 gtk_widget_show_all(menu); | |
166 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time); | |
167 } | |
168 | |
169 static void docklet_clicked(GtkWidget *button, GdkEventButton *event, void *data) { | |
3939 | 170 if (event->type != GDK_BUTTON_PRESS) |
171 return; | |
172 | |
3510 | 173 switch (event->button) { |
174 case 1: | |
3517 | 175 if (unread_message_queue) { |
3570 | 176 docklet_flush_queue(); |
3517 | 177 docklet_update_status(); |
3570 | 178 } else { |
3517 | 179 docklet_toggle(); |
3554 | 180 } |
3510 | 181 break; |
182 case 2: | |
183 break; | |
184 case 3: | |
185 docklet_menu(event); | |
186 break; | |
187 } | |
188 } | |
189 | |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
190 static void docklet_update_icon() { |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
191 const gchar *icon_name = NULL; |
3510 | 192 |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
193 switch (icon) { |
4157 | 194 case offline: |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
195 icon_name = "gaim-docklet-offline"; |
4157 | 196 break; |
197 case offline_connecting: | |
198 case online_connecting: | |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
199 icon_name = "gaim-docklet-connect"; |
4157 | 200 break; |
3510 | 201 case online: |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
202 icon_name = "gaim-docklet-online"; |
3510 | 203 break; |
4157 | 204 case online_pending: |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
205 icon_name = "gaim-docklet-msgunread"; |
4157 | 206 break; |
3510 | 207 case away: |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
208 icon_name = "gaim-docklet-away"; |
3510 | 209 break; |
210 case away_pending: | |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
211 icon_name = "gaim-docklet-msgpend"; |
3510 | 212 break; |
213 } | |
214 | |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
215 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
|
216 |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
217 debug_printf("Tray Icon: updated icon to '%s'\n", icon_name); |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
218 } |
3510 | 219 |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
220 static gboolean docklet_blink_icon() { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
221 if (status == online_pending) { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
222 if (status == icon) { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
223 /* last icon was the right one... let's change it */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
224 icon = online; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
225 } else { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
226 /* last icon was the wrong one, change it back */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
227 icon = online_pending; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
228 } |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
229 } else if (status == away_pending) { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
230 if (status == icon) { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
231 /* last icon was the right one... let's change it */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
232 icon = away; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
233 } else { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
234 /* last icon was the wrong one, change it back */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
235 icon = away_pending; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
236 } |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
237 } else { |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
238 /* no messages, stop blinking */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
239 return FALSE; |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
240 } |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
241 |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
242 docklet_update_icon(); |
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 return TRUE; /* keep blinking */ |
3510 | 245 } |
246 | |
4157 | 247 static gboolean docklet_update_status() { |
3510 | 248 enum docklet_status oldstatus; |
249 | |
250 oldstatus = status; | |
251 | |
252 if (connections) { | |
3517 | 253 if (unread_message_queue) { |
4157 | 254 status = online_pending; |
3517 | 255 } else if (awaymessage) { |
3510 | 256 if (message_queue) { |
257 status = away_pending; | |
258 } else { | |
259 status = away; | |
260 } | |
3554 | 261 } else if (connecting_count) { |
4157 | 262 status = online_connecting; |
3510 | 263 } else { |
264 status = online; | |
265 } | |
266 } else { | |
3517 | 267 if (connecting_count) { |
4157 | 268 status = offline_connecting; |
3517 | 269 } else { |
270 status = offline; | |
271 } | |
3510 | 272 } |
273 | |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
274 /* update the icon if we changed status */ |
3510 | 275 if (status != oldstatus) { |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
276 icon = status; |
3510 | 277 docklet_update_icon(); |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
278 |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
279 /* and schedule the blinker function if messages are pending */ |
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
280 if (status == online_pending || status == away_pending) { |
4274 | 281 g_timeout_add(500, docklet_blink_icon, &docklet); |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
282 } |
3510 | 283 } |
4157 | 284 |
285 return FALSE; /* for when we're called by the glib idle handler */ | |
3510 | 286 } |
287 | |
3554 | 288 static void docklet_embedded(GtkWidget *widget, void *data) { |
4093 | 289 debug_printf("Tray Icon: embedded\n"); |
3570 | 290 docklet_add(); |
3554 | 291 } |
292 | |
4274 | 293 static void docklet_remove_callbacks() { |
294 debug_printf("Tray Icon: removing callbacks"); | |
295 | |
296 while (g_source_remove_by_user_data(&docklet)) { | |
297 debug_printf("."); | |
298 } | |
299 | |
300 debug_printf("\n"); | |
301 } | |
302 | |
3554 | 303 static void docklet_destroyed(GtkWidget *widget, void *data) { |
4093 | 304 debug_printf("Tray Icon: destroyed\n"); |
305 | |
306 docklet_remove(); | |
307 | |
3570 | 308 docklet_flush_queue(); |
4093 | 309 |
4274 | 310 docklet_remove_callbacks(); |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
311 |
4093 | 312 g_object_unref(G_OBJECT(docklet)); |
313 docklet = NULL; | |
314 | |
4274 | 315 g_idle_add(docklet_create, &docklet); |
3554 | 316 } |
317 | |
4274 | 318 static gboolean docklet_create() { |
3510 | 319 GtkWidget *box; |
320 | |
3570 | 321 if (docklet) { |
4093 | 322 /* if this is being called when a tray icon exists, it's because |
323 something messed up. try destroying it before we proceed, | |
324 although docklet_refcount may be all hosed. hopefully won't happen. */ | |
325 debug_printf("Tray Icon: trying to create icon but it already exists?\n"); | |
326 gaim_plugin_remove(); | |
3510 | 327 } |
328 | |
329 docklet = egg_tray_icon_new("Gaim"); | |
330 box = gtk_event_box_new(); | |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
331 image = gtk_image_new(); |
3510 | 332 |
3554 | 333 g_signal_connect(G_OBJECT(docklet), "embedded", G_CALLBACK(docklet_embedded), NULL); |
334 g_signal_connect(G_OBJECT(docklet), "destroy", G_CALLBACK(docklet_destroyed), NULL); | |
335 g_signal_connect(G_OBJECT(box), "button-press-event", G_CALLBACK(docklet_clicked), NULL); | |
3510 | 336 |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
337 gtk_container_add(GTK_CONTAINER(box), image); |
3510 | 338 gtk_container_add(GTK_CONTAINER(docklet), box); |
339 gtk_widget_show_all(GTK_WIDGET(docklet)); | |
340 | |
3554 | 341 /* ref the docklet before we bandy it about the place */ |
342 g_object_ref(G_OBJECT(docklet)); | |
3510 | 343 docklet_update_status(); |
344 docklet_update_icon(); | |
345 | |
4093 | 346 debug_printf("Tray Icon: created\n"); |
347 | |
348 return FALSE; /* for when we're called by the glib idle handler */ | |
3510 | 349 } |
350 | |
351 static void gaim_signon(struct gaim_connection *gc, void *data) { | |
352 docklet_update_status(); | |
353 } | |
354 | |
355 static void gaim_signoff(struct gaim_connection *gc, void *data) { | |
4157 | 356 /* do this when idle so that if the prpl was connecting |
357 and was cancelled, we register that connecting_count | |
358 has returned to 0 */ | |
4274 | 359 g_idle_add(docklet_update_status, &docklet); |
3510 | 360 } |
361 | |
4491 | 362 static void gaim_connecting(struct gaim_account *account, void *data) { |
3510 | 363 docklet_update_status(); |
364 } | |
365 | |
366 static void gaim_away(struct gaim_connection *gc, char *state, char *message, void *data) { | |
367 /* we only support global away. this is the way it is, ok? */ | |
368 docklet_update_status(); | |
369 } | |
370 | |
4274 | 371 static void gaim_im_recv(struct gaim_connection *gc, char **who, char **what, void *data) { |
3510 | 372 /* if message queuing while away is enabled, this event could be the first |
4274 | 373 message so we need to see if the status (and hence icon) needs changing. |
374 do this when idle so that all message processing is completed, queuing | |
375 etc, before we run. */ | |
376 g_idle_add(docklet_update_status, &docklet); | |
3510 | 377 } |
378 | |
3570 | 379 /* static void gaim_buddy_signon(struct gaim_connection *gc, char *who, void *data) { |
3510 | 380 } |
381 | |
382 static void gaim_buddy_signoff(struct gaim_connection *gc, char *who, void *data) { | |
383 } | |
384 | |
385 static void gaim_buddy_away(struct gaim_connection *gc, char *who, void *data) { | |
386 } | |
387 | |
388 static void gaim_buddy_back(struct gaim_connection *gc, char *who, void *data) { | |
389 } | |
390 | |
391 static void gaim_new_conversation(char *who, void *data) { | |
3570 | 392 } */ |
3510 | 393 |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
394 static void docklet_register_icon(const char *name, char *fn) { |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
395 gchar *filename; |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
396 |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
397 filename = g_build_filename(DATADIR, "pixmaps", "gaim", fn, NULL); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
398 gtk_icon_factory_add(icon_factory, name, |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
399 gtk_icon_set_new_from_pixbuf(gdk_pixbuf_new_from_file(filename, NULL))); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
400 g_free(filename); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
401 } |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
402 |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
403 static void docklet_register_icon_factory() { |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
404 icon_factory = gtk_icon_factory_new(); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
405 |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
406 docklet_register_icon("gaim-docklet-offline", "offline.png"); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
407 docklet_register_icon("gaim-docklet-connect", "connect.png"); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
408 docklet_register_icon("gaim-docklet-online", "online.png"); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
409 docklet_register_icon("gaim-docklet-msgunread", "msgunread.png"); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
410 docklet_register_icon("gaim-docklet-away", "away.png"); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
411 docklet_register_icon("gaim-docklet-msgpend", "msgpend.png"); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
412 |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
413 gtk_icon_factory_add_default(icon_factory); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
414 } |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
415 |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
416 static void docklet_unregister_icon_factory() { |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
417 gtk_icon_factory_remove_default(icon_factory); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
418 } |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
419 |
3510 | 420 char *gaim_plugin_init(GModule *handle) { |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
421 docklet_register_icon_factory(); |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
422 |
4093 | 423 docklet_create(NULL); |
3510 | 424 |
425 gaim_signal_connect(handle, event_signon, gaim_signon, NULL); | |
426 gaim_signal_connect(handle, event_signoff, gaim_signoff, NULL); | |
427 gaim_signal_connect(handle, event_connecting, gaim_connecting, NULL); | |
428 gaim_signal_connect(handle, event_away, gaim_away, NULL); | |
4274 | 429 gaim_signal_connect(handle, event_im_recv, gaim_im_recv, NULL); |
3570 | 430 /* gaim_signal_connect(handle, event_buddy_signon, gaim_buddy_signon, NULL); |
3510 | 431 gaim_signal_connect(handle, event_buddy_signoff, gaim_buddy_signoff, NULL); |
432 gaim_signal_connect(handle, event_buddy_away, gaim_buddy_away, NULL); | |
433 gaim_signal_connect(handle, event_buddy_back, gaim_buddy_back, NULL); | |
3570 | 434 gaim_signal_connect(handle, event_new_conversation, gaim_new_conversation, NULL); */ |
3510 | 435 |
436 return NULL; | |
437 } | |
438 | |
3554 | 439 void gaim_plugin_remove() { |
3570 | 440 if (GTK_WIDGET_VISIBLE(docklet)) { |
441 docklet_remove(); | |
442 } | |
3554 | 443 |
3570 | 444 docklet_flush_queue(); |
3554 | 445 |
4274 | 446 docklet_remove_callbacks(); |
4261
e252238f99df
[gaim-migrate @ 4512]
Christian Hammond <chipx86@chipx86.com>
parents:
4250
diff
changeset
|
447 |
3570 | 448 g_signal_handlers_disconnect_by_func(G_OBJECT(docklet), G_CALLBACK(docklet_destroyed), NULL); |
449 gtk_widget_destroy(GTK_WIDGET(docklet)); | |
3554 | 450 |
4093 | 451 g_object_unref(G_OBJECT(docklet)); |
452 docklet = NULL; | |
4250
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
453 |
3b884e35e6b5
[gaim-migrate @ 4500]
Christian Hammond <chipx86@chipx86.com>
parents:
4157
diff
changeset
|
454 docklet_unregister_icon_factory(); |
4093 | 455 |
456 debug_printf("Tray Icon: removed\n"); | |
3554 | 457 } |
458 | |
3570 | 459 GtkWidget *gaim_plugin_config_gtk() { |
460 GtkWidget *frame; | |
461 GtkWidget *vbox, *hbox; | |
462 GtkWidget *toggle; | |
3517 | 463 |
3570 | 464 frame = gtk_vbox_new(FALSE, 18); |
465 gtk_container_set_border_width(GTK_CONTAINER(frame), 12); | |
466 | |
4093 | 467 vbox = make_frame(frame, _("Tray Icon Configuration")); |
3570 | 468 hbox = gtk_hbox_new(FALSE, 18); |
469 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
3517 | 470 |
3570 | 471 /* toggle = gtk_check_button_new_with_mnemonic(_("_Automatically show buddy list on sign on")); |
472 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), blist_options & OPT_BLIST_APP_BUDDY_SHOW); | |
473 g_signal_connect(G_OBJECT(toggle), "clicked", G_CALLBACK(docklet_toggle_blist_show), NULL); | |
474 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); */ | |
3517 | 475 |
4093 | 476 toggle = gtk_check_button_new_with_mnemonic(_("_Hide new messages until tray icon is clicked")); |
3570 | 477 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), away_options & OPT_AWAY_QUEUE_UNREAD); |
478 g_signal_connect(G_OBJECT(toggle), "clicked", G_CALLBACK(docklet_toggle_queue), NULL); | |
479 gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0); | |
480 | |
481 gtk_widget_show_all(frame); | |
482 return frame; | |
3517 | 483 } |
3570 | 484 |
3551 | 485 struct gaim_plugin_description desc; |
486 struct gaim_plugin_description *gaim_plugin_desc() { | |
487 desc.api_version = PLUGIN_API_VERSION; | |
3773 | 488 desc.name = g_strdup(_("Tray Icon")); |
3551 | 489 desc.version = g_strdup(VERSION); |
4108 | 490 desc.description = g_strdup(_("Interacts with a System Tray applet (in GNOME or KDE, for example) to display the current status of Gaim, allow fast access to commonly used functions, and to toggle display of the buddy list or login window. Also allows messages to be queued until the icon is clicked, similar to ICQ (although the icon doesn't flash yet =).")); |
3570 | 491 desc.authors = g_strdup(_("Robert McQueen <robot101@debian.org>")); |
3551 | 492 desc.url = g_strdup(WEBSITE); |
493 return &desc; | |
494 } | |
3510 | 495 |
3570 | 496 char *name() { |
4093 | 497 return _("System Tray Icon"); |
3510 | 498 } |
499 | |
3570 | 500 char *description() { |
4093 | 501 return _("Interacts with a System Tray applet (in GNOME or KDE, for example) to display the current status of Gaim, allow fast access to commonly used functions, and to toggle display of the buddy list or login window. Also allows messages to be queued until the icon is clicked, similar to ICQ (although the icon doesn't flash yet =)."); |
3510 | 502 } |