comparison src/away.c @ 1401:bf041349b11e

[gaim-migrate @ 1411] abliity to set accounts away independent of each other. also allows for all the other states (like in yahoo and icq). probably breaks MSN, so don't use it until rob fixes it. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Wed, 10 Jan 2001 22:15:24 +0000
parents 868f9c98db13
children 96e93119268d
comparison
equal deleted inserted replaced
1400:476b24cdfa32 1401:bf041349b11e
32 #include <stdlib.h> 32 #include <stdlib.h>
33 #include <time.h> 33 #include <time.h>
34 34
35 #include <gtk/gtk.h> 35 #include <gtk/gtk.h>
36 #include "gaim.h" 36 #include "gaim.h"
37 #include "prpl.h"
37 #include "pixmaps/join.xpm" 38 #include "pixmaps/join.xpm"
38 39
39 GtkWidget *imaway = NULL; 40 GtkWidget *imaway = NULL;
40 41
41 GtkWidget *awaymenu = NULL; 42 GtkWidget *awaymenu = NULL;
57 imaway = NULL; 58 imaway = NULL;
58 gtk_widget_destroy(tmp); 59 gtk_widget_destroy(tmp);
59 plugin_event(event_back, 0, 0, 0, 0); 60 plugin_event(event_back, 0, 0, 0, 0);
60 } 61 }
61 62
62 serv_set_away(NULL); 63 serv_set_away_all(NULL);
63 awaymessage = NULL; 64 awaymessage = NULL;
64 #ifdef USE_APPLET 65 #ifdef USE_APPLET
65 applet_widget_unregister_callback(APPLET_WIDGET(applet), "away"); 66 applet_widget_unregister_callback(APPLET_WIDGET(applet), "away");
66 set_user_state(online); 67 set_user_state(online);
67 insert_applet_away(); 68 insert_applet_away();
154 } 155 }
155 156
156 157
157 buf2 = g_malloc(strlen(awaymessage->message) * 4 + 1); 158 buf2 = g_malloc(strlen(awaymessage->message) * 4 + 1);
158 strncpy_withhtml(buf2, awaymessage->message, strlen(awaymessage->message) * 4 + 1); 159 strncpy_withhtml(buf2, awaymessage->message, strlen(awaymessage->message) * 4 + 1);
159 serv_set_away(buf2); 160 serv_set_away_all(buf2);
160 g_free(buf2); 161 g_free(buf2);
161 gtk_widget_show(imaway); 162 gtk_widget_show(imaway);
162 plugin_event(event_away, 0, 0, 0, 0); 163 plugin_event(event_away, 0, 0, 0, 0);
163 } 164 }
164 165
185 g_free(a); 186 g_free(a);
186 do_away_menu(); 187 do_away_menu();
187 save_prefs(); 188 save_prefs();
188 } 189 }
189 190
191 static void set_gc_away(GtkObject *obj, struct gaim_connection *gc)
192 {
193 struct away_message *awy = gtk_object_get_user_data(obj);
194
195 if (awy)
196 serv_set_away(gc, GAIM_AWAY_CUSTOM, awy->message);
197 else
198 serv_set_away(gc, GAIM_AWAY_CUSTOM, NULL);
199 }
200
201 static void set_gc_state(GtkObject *obj, struct gaim_connection *gc)
202 {
203 char *awy = gtk_object_get_user_data(obj);
204
205 serv_set_away(gc, awy, NULL);
206 }
190 207
191 void do_away_menu() 208 void do_away_menu()
192 { 209 {
193 GtkWidget *menuitem; 210 GtkWidget *menuitem;
194 static GtkWidget *remmenu; 211 GtkWidget *remmenu;
212 GtkWidget *submenu, *submenu2;
195 GtkWidget *remitem; 213 GtkWidget *remitem;
196 GtkWidget *label; 214 GtkWidget *label;
197 GtkWidget *sep; 215 GtkWidget *sep;
198 GList *l; 216 GList *l;
199 GtkWidget *list_item; 217 GtkWidget *list_item;
200 GSList *awy = away_messages; 218 GSList *awy = away_messages;
201 struct away_message *a; 219 struct away_message *a;
220 GSList *con = connections;
221 struct gaim_connection *gc;
222 int count = 0;
202 223
203 #ifdef USE_APPLET 224 #ifdef USE_APPLET
204 remove_applet_away(); 225 remove_applet_away();
205 if (imaway) 226 if (imaway)
206 applet_widget_register_callback(APPLET_WIDGET(applet), 227 applet_widget_register_callback(APPLET_WIDGET(applet),
274 gtk_container_add(GTK_CONTAINER(menuitem), sep); 295 gtk_container_add(GTK_CONTAINER(menuitem), sep);
275 gtk_widget_set_sensitive(menuitem, FALSE); 296 gtk_widget_set_sensitive(menuitem, FALSE);
276 gtk_widget_show(menuitem); 297 gtk_widget_show(menuitem);
277 gtk_widget_show(sep); 298 gtk_widget_show(sep);
278 299
279 awy = away_messages; 300 while (con) {
280 301 gc = con->data;
281 while (awy) { 302 if (gc->prpl->away_states && gc->prpl->set_away)
282 a = (struct away_message *)awy->data; 303 count++;
283 304 con = g_slist_next(con);
284 menuitem = gtk_menu_item_new_with_label(a->name); 305 }
306 con = connections;
307
308 if (count == 0) {
309 } else if (count == 1) {
310 GList *msgs, *tmp;
311 while (con) {
312 gc = con->data;
313 if (gc->prpl->away_states && gc->prpl->set_away)
314 break;
315 con = g_slist_next(con);
316 }
317
318 tmp = msgs = (*gc->prpl->away_states)();
319
320 if ((g_list_length(msgs) == 1) && !strcmp(msgs->data, GAIM_AWAY_CUSTOM)) {
321 awy = away_messages;
322
323 while (awy) {
324 a = (struct away_message *)awy->data;
325
326 menuitem = gtk_menu_item_new_with_label(a->name);
327 gtk_object_set_user_data(GTK_OBJECT(menuitem), a);
328 gtk_menu_append(GTK_MENU(awaymenu), menuitem);
329 gtk_widget_show(menuitem);
330 gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
331 GTK_SIGNAL_FUNC(do_away_message), a);
332
333 awy = g_slist_next(awy);
334 }
335 } else while (msgs) {
336 awy = away_messages;
337
338 menuitem = gtk_menu_item_new_with_label(msgs->data);
339 gtk_object_set_user_data(GTK_OBJECT(menuitem), msgs->data);
340 gtk_menu_append(GTK_MENU(awaymenu), menuitem);
341 gtk_widget_show(menuitem);
342
343 if (strcmp(msgs->data, GAIM_AWAY_CUSTOM)) {
344 gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
345 GTK_SIGNAL_FUNC(set_gc_state), gc);
346 } else {
347 submenu = gtk_menu_new();
348 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
349 gtk_widget_show(submenu);
350
351 while (awy) {
352 a = (struct away_message *)awy->data;
353
354 menuitem = gtk_menu_item_new_with_label(a->name);
355 gtk_object_set_user_data(GTK_OBJECT(menuitem), a);
356 gtk_menu_append(GTK_MENU(submenu), menuitem);
357 gtk_widget_show(menuitem);
358 gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
359 GTK_SIGNAL_FUNC(set_gc_away), gc);
360
361 awy = g_slist_next(awy);
362 }
363 }
364 msgs = g_list_next(msgs);
365 }
366 } else {
367 while (con) {
368 char buf[256];
369 GList *msgs, *tmp;
370 gc = con->data;
371
372 if (!gc->prpl->away_states || !gc->prpl->set_away)
373 continue;
374
375 g_snprintf(buf, sizeof(buf), "%s (%s)",
376 gc->username, (*gc->prpl->name)());
377 menuitem = gtk_menu_item_new_with_label(buf);
378 gtk_menu_append(GTK_MENU(awaymenu), menuitem);
379 gtk_widget_show(menuitem);
380
381 submenu = gtk_menu_new();
382 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
383 gtk_widget_show(submenu);
384
385 tmp = msgs = (*gc->prpl->away_states)();
386
387 if ((g_list_length(msgs) == 1) &&
388 (!strcmp(msgs->data, GAIM_AWAY_CUSTOM))) {
389 menuitem = gtk_menu_item_new_with_label(_("Back"));
390 gtk_menu_append(GTK_MENU(submenu), menuitem);
391 gtk_widget_show(menuitem);
392 gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
393 GTK_SIGNAL_FUNC(set_gc_away), gc);
394
395 sep = gtk_hseparator_new();
396 menuitem = gtk_menu_item_new();
397 gtk_menu_append(GTK_MENU(submenu), menuitem);
398 gtk_container_add(GTK_CONTAINER(menuitem), sep);
399 gtk_widget_set_sensitive(menuitem, FALSE);
400 gtk_widget_show(menuitem);
401 gtk_widget_show(sep);
402
403 awy = away_messages;
404
405 while (awy) {
406 a = (struct away_message *)awy->data;
407
408 menuitem = gtk_menu_item_new_with_label(a->name);
409 gtk_object_set_user_data(GTK_OBJECT(menuitem), a);
410 gtk_menu_append(GTK_MENU(submenu), menuitem);
411 gtk_widget_show(menuitem);
412 gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
413 GTK_SIGNAL_FUNC(set_gc_away), gc);
414
415 awy = g_slist_next(awy);
416 }
417 } else while (msgs) {
418 awy = away_messages;
419
420 menuitem = gtk_menu_item_new_with_label(msgs->data);
421 gtk_object_set_user_data(GTK_OBJECT(menuitem), msgs->data);
422 gtk_menu_append(GTK_MENU(submenu), menuitem);
423 gtk_widget_show(menuitem);
424
425 if (strcmp(msgs->data, GAIM_AWAY_CUSTOM)) {
426 gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
427 GTK_SIGNAL_FUNC(set_gc_state), gc);
428 } else {
429 submenu2 = gtk_menu_new();
430 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem),
431 submenu2);
432 gtk_widget_show(submenu2);
433
434 while (awy) {
435 a = (struct away_message *)awy->data;
436
437 menuitem = gtk_menu_item_new_with_label(a->name);
438 gtk_object_set_user_data(GTK_OBJECT(menuitem),
439 a);
440 gtk_menu_append(GTK_MENU(submenu2), menuitem);
441 gtk_widget_show(menuitem);
442 gtk_signal_connect(GTK_OBJECT(menuitem),
443 "activate",
444 GTK_SIGNAL_FUNC(set_gc_away),
445 gc);
446
447 awy = g_slist_next(awy);
448 }
449 }
450 msgs = g_list_next(msgs);
451 }
452
453 g_list_free(tmp);
454
455 con = g_slist_next(con);
456 }
457
458 menuitem = gtk_menu_item_new_with_label(_("Set All Away"));
285 gtk_menu_append(GTK_MENU(awaymenu), menuitem); 459 gtk_menu_append(GTK_MENU(awaymenu), menuitem);
286 gtk_widget_show(menuitem); 460 gtk_widget_show(menuitem);
287 gtk_signal_connect(GTK_OBJECT(menuitem), "activate", 461
288 GTK_SIGNAL_FUNC(do_away_message), a); 462 submenu = gtk_menu_new();
289 463 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
290 awy = g_slist_next(awy); 464 gtk_widget_show(submenu);
291 465
466 awy = away_messages;
467
468 while (awy) {
469 a = (struct away_message *)awy->data;
470
471 menuitem = gtk_menu_item_new_with_label(a->name);
472 gtk_object_set_user_data(GTK_OBJECT(menuitem), a);
473 gtk_menu_append(GTK_MENU(submenu), menuitem);
474 gtk_widget_show(menuitem);
475 gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
476 GTK_SIGNAL_FUNC(do_away_message), a);
477
478 awy = g_slist_next(awy);
479 }
292 } 480 }
293 } 481 }
294 if (prefs_away_menu) { 482 if (prefs_away_menu) {
295 l = gtk_container_children(GTK_CONTAINER(prefs_away_menu)); 483 l = gtk_container_children(GTK_CONTAINER(prefs_away_menu));
296 while (l) { 484 while (l) {