Mercurial > pidgin.yaz
comparison plugins/docklet/docklet.c @ 4157:9c31ddae80a1
[gaim-migrate @ 4385]
I'm commiting this so Robot101 will leave me alone.
Here's some session management stuff. Happy Gnome People.
committer: Tailor Script <tailor@pidgin.im>
author | Rob Flynn <gaim@robflynn.com> |
---|---|
date | Tue, 31 Dec 2002 05:22:56 +0000 |
parents | 274cb26ba8dc |
children | 3b884e35e6b5 |
comparison
equal
deleted
inserted
replaced
4156:d833bacc054f | 4157:9c31ddae80a1 |
---|---|
37 #define GAIM_PLUGINS | 37 #define GAIM_PLUGINS |
38 #endif | 38 #endif |
39 | 39 |
40 /* types */ | 40 /* types */ |
41 enum docklet_status { | 41 enum docklet_status { |
42 offline, | |
43 offline_connecting, | |
42 online, | 44 online, |
45 online_connecting, | |
46 online_pending, | |
43 away, | 47 away, |
44 away_pending, | 48 away_pending |
45 unread_pending, | |
46 connecting, | |
47 offline | |
48 }; | 49 }; |
49 | 50 |
50 /* functions */ | 51 /* functions */ |
51 static gboolean docklet_create(); | 52 static gboolean docklet_create(); |
52 static void docklet_update_status(); | 53 static gboolean docklet_update_status(); |
53 void gaim_plugin_remove(); | 54 void gaim_plugin_remove(); |
54 | 55 |
55 /* globals */ | 56 /* globals */ |
56 static EggTrayIcon *docklet = NULL; | 57 static EggTrayIcon *docklet = NULL; |
57 static GtkWidget *icon; | 58 static GtkWidget *icon; |
86 gtk_widget_destroy(menu); | 87 gtk_widget_destroy(menu); |
87 } | 88 } |
88 | 89 |
89 menu = gtk_menu_new(); | 90 menu = gtk_menu_new(); |
90 | 91 |
91 if (status == offline) { | 92 switch (status) { |
92 entry = gtk_menu_item_new_with_label(_("Auto-login")); | 93 case offline: |
93 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(auto_login), NULL); | 94 case offline_connecting: |
94 gtk_menu_append(GTK_MENU(menu), entry); | 95 break; |
95 } else { | 96 case online: |
96 if (status == online) { | 97 case online_connecting: |
98 case online_pending: { | |
97 GtkWidget *docklet_awaymenu; | 99 GtkWidget *docklet_awaymenu; |
98 GSList *awy = NULL; | 100 GSList *awy = NULL; |
99 struct away_message *a = NULL; | 101 struct away_message *a = NULL; |
100 | 102 |
101 docklet_awaymenu = gtk_menu_new(); | 103 docklet_awaymenu = gtk_menu_new(); |
109 gtk_menu_append(GTK_MENU(docklet_awaymenu), entry); | 111 gtk_menu_append(GTK_MENU(docklet_awaymenu), entry); |
110 | 112 |
111 awy = g_slist_next(awy); | 113 awy = g_slist_next(awy); |
112 } | 114 } |
113 | 115 |
114 entry = gtk_separator_menu_item_new(); | 116 if (away_messages) |
115 gtk_menu_append(GTK_MENU(docklet_awaymenu), entry); | 117 gaim_separator(docklet_awaymenu); |
116 | 118 |
117 entry = gtk_menu_item_new_with_label(_("New...")); | 119 entry = gtk_menu_item_new_with_label(_("New...")); |
118 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(create_away_mess), NULL); | 120 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(create_away_mess), NULL); |
119 gtk_menu_append(GTK_MENU(docklet_awaymenu), entry); | 121 gtk_menu_append(GTK_MENU(docklet_awaymenu), entry); |
120 | 122 |
121 entry = gtk_menu_item_new_with_label(_("Away")); | 123 entry = gtk_menu_item_new_with_label(_("Away")); |
122 gtk_menu_item_set_submenu(GTK_MENU_ITEM(entry), docklet_awaymenu); | 124 gtk_menu_item_set_submenu(GTK_MENU_ITEM(entry), docklet_awaymenu); |
123 gtk_menu_append(GTK_MENU(menu), entry); | 125 gtk_menu_append(GTK_MENU(menu), entry); |
124 } else { | 126 } break; |
127 case away: | |
128 case away_pending: | |
125 entry = gtk_menu_item_new_with_label(_("Back")); | 129 entry = gtk_menu_item_new_with_label(_("Back")); |
126 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(do_im_back), NULL); | 130 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(do_im_back), NULL); |
127 gtk_menu_append(GTK_MENU(menu), entry); | 131 gtk_menu_append(GTK_MENU(menu), entry); |
128 } | 132 break; |
129 | 133 } |
130 entry = gtk_menu_item_new_with_label(_("Signoff")); | 134 |
131 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(signoff_all), NULL); | 135 switch (status) { |
132 gtk_menu_append(GTK_MENU(menu), entry); | 136 case offline: |
133 } | 137 case offline_connecting: |
134 | 138 entry = gtk_menu_item_new_with_label(_("Auto-login")); |
135 entry = gtk_separator_menu_item_new(); | 139 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(auto_login), NULL); |
136 gtk_menu_append(GTK_MENU(menu), entry); | 140 gtk_menu_append(GTK_MENU(menu), entry); |
141 break; | |
142 default: | |
143 entry = gtk_menu_item_new_with_label(_("Signoff")); | |
144 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(signoff_all), NULL); | |
145 gtk_menu_append(GTK_MENU(menu), entry); | |
146 break; | |
147 } | |
148 | |
149 gaim_separator(menu); | |
137 | 150 |
138 entry = gtk_check_menu_item_new_with_label(_("Mute Sounds")); | 151 entry = gtk_check_menu_item_new_with_label(_("Mute Sounds")); |
139 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(entry), mute_sounds); | 152 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(entry), mute_sounds); |
140 g_signal_connect(G_OBJECT(entry), "toggled", G_CALLBACK(docklet_toggle_mute), NULL); | 153 g_signal_connect(G_OBJECT(entry), "toggled", G_CALLBACK(docklet_toggle_mute), NULL); |
141 gtk_menu_append(GTK_MENU(menu), entry); | 154 gtk_menu_append(GTK_MENU(menu), entry); |
142 | 155 |
143 entry = gtk_menu_item_new_with_label(_("Accounts")); | 156 gaim_new_item_from_pixbuf(menu, _("Accounts..."), "accounts-menu.png", G_CALLBACK(account_editor), NULL, 0, 0, 0); |
144 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(account_editor), NULL); | 157 gaim_new_item_from_stock(menu, _("Preferences..."), GTK_STOCK_PREFERENCES, G_CALLBACK(show_prefs), NULL, 0, 0, 0); |
145 gtk_menu_append(GTK_MENU(menu), entry); | 158 |
146 | 159 gaim_separator(menu); |
147 entry = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); | 160 |
148 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(show_prefs), NULL); | 161 gaim_new_item_from_pixbuf(menu, _("About Gaim..."), "about_menu.png", G_CALLBACK(show_about), NULL, 0, 0, 0); |
149 gtk_menu_append(GTK_MENU(menu), entry); | 162 gaim_new_item_from_stock(menu, _("Quit"), GTK_STOCK_QUIT, G_CALLBACK(do_quit), NULL, 0, 0, 0); |
150 | |
151 entry = gtk_separator_menu_item_new(); | |
152 gtk_menu_append(GTK_MENU(menu), entry); | |
153 | |
154 entry = gtk_menu_item_new_with_label(_("About")); | |
155 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(show_about), NULL); | |
156 gtk_menu_append(GTK_MENU(menu), entry); | |
157 | |
158 entry = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); | |
159 g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(do_quit), NULL); | |
160 gtk_menu_append(GTK_MENU(menu), entry); | |
161 | 163 |
162 gtk_widget_show_all(menu); | 164 gtk_widget_show_all(menu); |
163 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time); | 165 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time); |
164 } | 166 } |
165 | 167 |
187 static void docklet_update_icon() { | 189 static void docklet_update_icon() { |
188 gchar *filename = NULL; | 190 gchar *filename = NULL; |
189 GdkPixbuf *unscaled; | 191 GdkPixbuf *unscaled; |
190 | 192 |
191 switch (status) { | 193 switch (status) { |
194 case offline: | |
195 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "offline.png", NULL); | |
196 break; | |
197 case offline_connecting: | |
198 case online_connecting: | |
199 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "connect.png", NULL); | |
200 break; | |
192 case online: | 201 case online: |
193 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "online.png", NULL); | 202 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "online.png", NULL); |
194 break; | 203 break; |
204 case online_pending: | |
205 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "msgunread.png", NULL); | |
206 break; | |
195 case away: | 207 case away: |
196 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "away.png", NULL); | 208 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "away.png", NULL); |
197 break; | 209 break; |
198 case away_pending: | 210 case away_pending: |
199 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "msgpend.png", NULL); | 211 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "msgpend.png", NULL); |
200 break; | 212 break; |
201 case unread_pending: | |
202 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "msgunread.png", NULL); | |
203 break; | |
204 case connecting: | |
205 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "connect.png", NULL); | |
206 break; | |
207 case offline: | |
208 filename = g_build_filename(DATADIR, "pixmaps", "gaim", "offline.png", NULL); | |
209 } | 213 } |
210 | 214 |
211 unscaled = gdk_pixbuf_new_from_file(filename, NULL); | 215 unscaled = gdk_pixbuf_new_from_file(filename, NULL); |
212 | 216 |
213 if (unscaled) { | 217 if (unscaled) { |
224 } | 228 } |
225 | 229 |
226 g_free(filename); | 230 g_free(filename); |
227 } | 231 } |
228 | 232 |
229 static void docklet_update_status() { | 233 static gboolean docklet_update_status() { |
230 enum docklet_status oldstatus; | 234 enum docklet_status oldstatus; |
231 | 235 |
232 oldstatus = status; | 236 oldstatus = status; |
233 | 237 |
234 if (connections) { | 238 if (connections) { |
235 if (unread_message_queue) { | 239 if (unread_message_queue) { |
236 status = unread_pending; | 240 status = online_pending; |
237 } else if (awaymessage) { | 241 } else if (awaymessage) { |
238 if (message_queue) { | 242 if (message_queue) { |
239 status = away_pending; | 243 status = away_pending; |
240 } else { | 244 } else { |
241 status = away; | 245 status = away; |
242 } | 246 } |
243 } else if (connecting_count) { | 247 } else if (connecting_count) { |
244 status = connecting; | 248 status = online_connecting; |
245 } else { | 249 } else { |
246 status = online; | 250 status = online; |
247 } | 251 } |
248 } else { | 252 } else { |
249 if (connecting_count) { | 253 if (connecting_count) { |
250 status = connecting; | 254 status = offline_connecting; |
251 } else { | 255 } else { |
252 status = offline; | 256 status = offline; |
253 } | 257 } |
254 } | 258 } |
255 | 259 |
256 if (status != oldstatus) { | 260 if (status != oldstatus) { |
257 docklet_update_icon(); | 261 docklet_update_icon(); |
258 } | 262 } |
263 | |
264 return FALSE; /* for when we're called by the glib idle handler */ | |
259 } | 265 } |
260 | 266 |
261 static void docklet_embedded(GtkWidget *widget, void *data) { | 267 static void docklet_embedded(GtkWidget *widget, void *data) { |
262 debug_printf("Tray Icon: embedded\n"); | 268 debug_printf("Tray Icon: embedded\n"); |
263 docklet_add(); | 269 docklet_add(); |
312 static void gaim_signon(struct gaim_connection *gc, void *data) { | 318 static void gaim_signon(struct gaim_connection *gc, void *data) { |
313 docklet_update_status(); | 319 docklet_update_status(); |
314 } | 320 } |
315 | 321 |
316 static void gaim_signoff(struct gaim_connection *gc, void *data) { | 322 static void gaim_signoff(struct gaim_connection *gc, void *data) { |
317 docklet_update_status(); | 323 /* do this when idle so that if the prpl was connecting |
324 and was cancelled, we register that connecting_count | |
325 has returned to 0 */ | |
326 g_idle_add(docklet_update_status, NULL); | |
318 } | 327 } |
319 | 328 |
320 static void gaim_connecting(struct aim_user *user, void *data) { | 329 static void gaim_connecting(struct aim_user *user, void *data) { |
321 docklet_update_status(); | 330 docklet_update_status(); |
322 } | 331 } |