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 }