Mercurial > pidgin
diff 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 |
line wrap: on
line diff
--- a/src/away.c Wed Jan 10 19:56:39 2001 +0000 +++ b/src/away.c Wed Jan 10 22:15:24 2001 +0000 @@ -34,6 +34,7 @@ #include <gtk/gtk.h> #include "gaim.h" +#include "prpl.h" #include "pixmaps/join.xpm" GtkWidget *imaway = NULL; @@ -59,7 +60,7 @@ plugin_event(event_back, 0, 0, 0, 0); } - serv_set_away(NULL); + serv_set_away_all(NULL); awaymessage = NULL; #ifdef USE_APPLET applet_widget_unregister_callback(APPLET_WIDGET(applet), "away"); @@ -156,7 +157,7 @@ buf2 = g_malloc(strlen(awaymessage->message) * 4 + 1); strncpy_withhtml(buf2, awaymessage->message, strlen(awaymessage->message) * 4 + 1); - serv_set_away(buf2); + serv_set_away_all(buf2); g_free(buf2); gtk_widget_show(imaway); plugin_event(event_away, 0, 0, 0, 0); @@ -187,11 +188,28 @@ save_prefs(); } +static void set_gc_away(GtkObject *obj, struct gaim_connection *gc) +{ + struct away_message *awy = gtk_object_get_user_data(obj); + + if (awy) + serv_set_away(gc, GAIM_AWAY_CUSTOM, awy->message); + else + serv_set_away(gc, GAIM_AWAY_CUSTOM, NULL); +} + +static void set_gc_state(GtkObject *obj, struct gaim_connection *gc) +{ + char *awy = gtk_object_get_user_data(obj); + + serv_set_away(gc, awy, NULL); +} void do_away_menu() { GtkWidget *menuitem; - static GtkWidget *remmenu; + GtkWidget *remmenu; + GtkWidget *submenu, *submenu2; GtkWidget *remitem; GtkWidget *label; GtkWidget *sep; @@ -199,6 +217,9 @@ GtkWidget *list_item; GSList *awy = away_messages; struct away_message *a; + GSList *con = connections; + struct gaim_connection *gc; + int count = 0; #ifdef USE_APPLET remove_applet_away(); @@ -276,19 +297,186 @@ gtk_widget_show(menuitem); gtk_widget_show(sep); - awy = away_messages; + while (con) { + gc = con->data; + if (gc->prpl->away_states && gc->prpl->set_away) + count++; + con = g_slist_next(con); + } + con = connections; + + if (count == 0) { + } else if (count == 1) { + GList *msgs, *tmp; + while (con) { + gc = con->data; + if (gc->prpl->away_states && gc->prpl->set_away) + break; + con = g_slist_next(con); + } + + tmp = msgs = (*gc->prpl->away_states)(); + + if ((g_list_length(msgs) == 1) && !strcmp(msgs->data, GAIM_AWAY_CUSTOM)) { + awy = away_messages; + + while (awy) { + a = (struct away_message *)awy->data; + + menuitem = gtk_menu_item_new_with_label(a->name); + gtk_object_set_user_data(GTK_OBJECT(menuitem), a); + gtk_menu_append(GTK_MENU(awaymenu), menuitem); + gtk_widget_show(menuitem); + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(do_away_message), a); + + awy = g_slist_next(awy); + } + } else while (msgs) { + awy = away_messages; + + menuitem = gtk_menu_item_new_with_label(msgs->data); + gtk_object_set_user_data(GTK_OBJECT(menuitem), msgs->data); + gtk_menu_append(GTK_MENU(awaymenu), menuitem); + gtk_widget_show(menuitem); + + if (strcmp(msgs->data, GAIM_AWAY_CUSTOM)) { + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(set_gc_state), gc); + } else { + submenu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); + gtk_widget_show(submenu); + + while (awy) { + a = (struct away_message *)awy->data; + + menuitem = gtk_menu_item_new_with_label(a->name); + gtk_object_set_user_data(GTK_OBJECT(menuitem), a); + gtk_menu_append(GTK_MENU(submenu), menuitem); + gtk_widget_show(menuitem); + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(set_gc_away), gc); + + awy = g_slist_next(awy); + } + } + msgs = g_list_next(msgs); + } + } else { + while (con) { + char buf[256]; + GList *msgs, *tmp; + gc = con->data; + + if (!gc->prpl->away_states || !gc->prpl->set_away) + continue; - while (awy) { - a = (struct away_message *)awy->data; + g_snprintf(buf, sizeof(buf), "%s (%s)", + gc->username, (*gc->prpl->name)()); + menuitem = gtk_menu_item_new_with_label(buf); + gtk_menu_append(GTK_MENU(awaymenu), menuitem); + gtk_widget_show(menuitem); + + submenu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); + gtk_widget_show(submenu); + + tmp = msgs = (*gc->prpl->away_states)(); + + if ((g_list_length(msgs) == 1) && + (!strcmp(msgs->data, GAIM_AWAY_CUSTOM))) { + menuitem = gtk_menu_item_new_with_label(_("Back")); + gtk_menu_append(GTK_MENU(submenu), menuitem); + gtk_widget_show(menuitem); + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(set_gc_away), gc); + + sep = gtk_hseparator_new(); + menuitem = gtk_menu_item_new(); + gtk_menu_append(GTK_MENU(submenu), menuitem); + gtk_container_add(GTK_CONTAINER(menuitem), sep); + gtk_widget_set_sensitive(menuitem, FALSE); + gtk_widget_show(menuitem); + gtk_widget_show(sep); + + awy = away_messages; + + while (awy) { + a = (struct away_message *)awy->data; + + menuitem = gtk_menu_item_new_with_label(a->name); + gtk_object_set_user_data(GTK_OBJECT(menuitem), a); + gtk_menu_append(GTK_MENU(submenu), menuitem); + gtk_widget_show(menuitem); + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(set_gc_away), gc); - menuitem = gtk_menu_item_new_with_label(a->name); + awy = g_slist_next(awy); + } + } else while (msgs) { + awy = away_messages; + + menuitem = gtk_menu_item_new_with_label(msgs->data); + gtk_object_set_user_data(GTK_OBJECT(menuitem), msgs->data); + gtk_menu_append(GTK_MENU(submenu), menuitem); + gtk_widget_show(menuitem); + + if (strcmp(msgs->data, GAIM_AWAY_CUSTOM)) { + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(set_gc_state), gc); + } else { + submenu2 = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), + submenu2); + gtk_widget_show(submenu2); + + while (awy) { + a = (struct away_message *)awy->data; + + menuitem = gtk_menu_item_new_with_label(a->name); + gtk_object_set_user_data(GTK_OBJECT(menuitem), + a); + gtk_menu_append(GTK_MENU(submenu2), menuitem); + gtk_widget_show(menuitem); + gtk_signal_connect(GTK_OBJECT(menuitem), + "activate", + GTK_SIGNAL_FUNC(set_gc_away), + gc); + + awy = g_slist_next(awy); + } + } + msgs = g_list_next(msgs); + } + + g_list_free(tmp); + + con = g_slist_next(con); + } + + menuitem = gtk_menu_item_new_with_label(_("Set All Away")); gtk_menu_append(GTK_MENU(awaymenu), menuitem); gtk_widget_show(menuitem); - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - GTK_SIGNAL_FUNC(do_away_message), a); + + submenu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); + gtk_widget_show(submenu); + + awy = away_messages; + + while (awy) { + a = (struct away_message *)awy->data; - awy = g_slist_next(awy); + menuitem = gtk_menu_item_new_with_label(a->name); + gtk_object_set_user_data(GTK_OBJECT(menuitem), a); + gtk_menu_append(GTK_MENU(submenu), menuitem); + gtk_widget_show(menuitem); + gtk_signal_connect(GTK_OBJECT(menuitem), "activate", + GTK_SIGNAL_FUNC(do_away_message), a); + awy = g_slist_next(awy); + } } } if (prefs_away_menu) {
