# HG changeset patch # User Eric Warmenhoven # Date 973283018 0 # Node ID 4927ce25d8cc4676af1f31169712f21db8a06f0b # Parent d50d3abb9eb70934f41ea5f555ba6facb5090e27 [gaim-migrate @ 1068] idle times for single connections; deleting an account signs it off if need be committer: Tailor Script diff -r d50d3abb9eb7 -r 4927ce25d8cc plugins/SIGNALS --- a/plugins/SIGNALS Fri Nov 03 10:46:58 2000 +0000 +++ b/plugins/SIGNALS Fri Nov 03 20:23:38 2000 +0000 @@ -11,6 +11,7 @@ event_buddy_back, event_buddy_idle, event_buddy_unidle, + event_blist_update, event_chat_invited, event_chat_join, event_chat_leave, @@ -130,6 +131,11 @@ 'who' is who is no longer idle. +event_blist_update: + (none) + + called when the idle times are updated in the buddy list + event_chat_invited: struct gaim_connection *gc, char *who, char *room, char *message diff -r d50d3abb9eb7 -r 4927ce25d8cc src/aim.c --- a/src/aim.c Fri Nov 03 10:46:58 2000 +0000 +++ b/src/aim.c Fri Nov 03 20:23:38 2000 +0000 @@ -576,8 +576,6 @@ if (general_options & OPT_GEN_DEBUG) show_debug(NULL); - gdk_threads_enter(); - #ifdef USE_PERL perl_init(); perl_autoload(); @@ -627,7 +625,6 @@ gtk_main(); #endif /* USE_APPLET */ - gdk_threads_leave(); return 0; diff -r d50d3abb9eb7 -r 4927ce25d8cc src/buddy.c --- a/src/buddy.c Fri Nov 03 10:46:58 2000 +0000 +++ b/src/buddy.c Fri Nov 03 20:23:38 2000 +0000 @@ -1353,6 +1353,10 @@ gtk_box_pack_start(GTK_BOX(box), b->label, TRUE, TRUE, 1); gtk_widget_show(b->label); + b->idle = gtk_label_new(""); + gtk_box_pack_start(GTK_BOX(box), b->idle, FALSE, FALSE, 1); + gtk_widget_show(b->idle); + gs->members = g_slist_insert(gs->members, b, pos); return b; } @@ -1416,6 +1420,58 @@ return FALSE; } +static void update_idle_time(struct buddy_show *bs) { + char idlet[16]; + time_t t; + int ihrs, imin; + struct buddy *b; + GSList *c; + + time(&t); + if (g_slist_length(bs->connlist) == 1) { + b = find_buddy(bs->connlist->data, bs->name); + if (!b) return; + ihrs = (t - b->idle) / 3600; imin = ((t - b->idle) / 60) % 60; + + if (ihrs) + g_snprintf(idlet, sizeof idlet, "(%d:%02d)", ihrs, imin); + else + g_snprintf(idlet, sizeof idlet, "(%d)", imin); + + gtk_widget_hide(bs->idle); + if (b->idle) + gtk_label_set(GTK_LABEL(bs->idle), idlet); + else + gtk_label_set(GTK_LABEL(bs->idle), ""); + if (display_options & OPT_DISP_SHOW_IDLETIME) + gtk_widget_show(bs->idle); + } else { + /* FIXME */ + } +} + +void update_idle_times() { + GSList *grp = shows; + GSList *mem; + struct buddy_show *b; + struct group_show *g; + struct buddy *bud; + time_t t; + char idlet[16]; + int ihrs, imin; + + while (grp) { + g = (struct group_show *)grp->data; + mem = g->members; + while (mem) { + b = (struct buddy_show *)mem->data; + update_idle_time(b); + mem = mem->next; + } + grp = grp->next; + } +} + void set_buddy(struct gaim_connection *gc, struct buddy *b) { struct group *g = find_group_by_buddy(gc, b->name); @@ -1424,6 +1480,7 @@ GdkPixmap *pm; GdkBitmap *bm; char **xpm = NULL; + if (b->present) { if ((gs = find_group_show(g->name)) == NULL) gs = new_group_show(g->name); @@ -1460,6 +1517,7 @@ gdk_pixmap_unref(pm); gdk_bitmap_unref(bm); } + update_idle_time(bs); } else { play_sound(BUDDY_LEAVE); gs = find_group_show(g->name); diff -r d50d3abb9eb7 -r 4927ce25d8cc src/gaim.h --- a/src/gaim.h Fri Nov 03 10:46:58 2000 +0000 +++ b/src/gaim.h Fri Nov 03 20:23:38 2000 +0000 @@ -183,6 +183,7 @@ event_buddy_back, event_buddy_idle, event_buddy_unidle, + event_blist_update, event_chat_invited, event_chat_join, event_chat_leave, @@ -232,6 +233,7 @@ GtkWidget *item; GtkWidget *pix; GtkWidget *label; + GtkWidget *idle; char *name; char *show; GSList *connlist; @@ -594,6 +596,7 @@ extern void do_quit(); extern void update_chat_button_pix(); extern void update_im_button_pix(); +extern void update_idle_times(); /* Functions in html.c */ extern char *fix_url(char *); diff -r d50d3abb9eb7 -r 4927ce25d8cc src/idle.c --- a/src/idle.c Fri Nov 03 10:46:58 2000 +0000 +++ b/src/idle.c Fri Nov 03 20:23:38 2000 +0000 @@ -46,6 +46,9 @@ #endif /* Not idle, really... :) */ + update_idle_times(); + + plugin_event(event_blist_update, 0, 0, 0, 0); time(&t); diff -r d50d3abb9eb7 -r 4927ce25d8cc src/multi.c --- a/src/multi.c Fri Nov 03 10:46:58 2000 +0000 +++ b/src/multi.c Fri Nov 03 20:23:38 2000 +0000 @@ -535,6 +535,8 @@ if (row != -1) { u = g_list_nth_data(aim_users, row); if (u) { + if (u->gc) + signoff(u->gc); aim_users = g_list_remove(aim_users, u); save_prefs(); } diff -r d50d3abb9eb7 -r 4927ce25d8cc src/plugins.c --- a/src/plugins.c Fri Nov 03 10:46:58 2000 +0000 +++ b/src/plugins.c Fri Nov 03 20:23:38 2000 +0000 @@ -576,6 +576,9 @@ case event_buddy_unidle: sprintf(buf, "event_buddy_unidle"); break; + case event_blist_update: + sprintf(buf, "event_blist_update"); + break; case event_chat_invited: sprintf(buf, "event_chat_invited"); break; @@ -642,6 +645,7 @@ /* no args */ case event_away: case event_back: + case event_blist_update: case event_quit: { void (*function)(void *) = g->function; @@ -775,6 +779,9 @@ case event_buddy_unidle: g_snprintf(buf, sizeof buf, "\"%s\"", (char *)arg2); break; + case event_blist_update: + buf[0] = 0; + break; case event_chat_invited: g_snprintf(buf, sizeof buf, "\"%s\" \"%s\" %s", (char *)arg2, (char *)arg3, (char *)arg4); break;