# HG changeset patch # User Myhailo Danylenko # Date 1263978483 -7200 # Node ID 9a0ed33fb91b547994829d87e6840947ed2fa178 # Parent 96b5484423af6505b5b3337289db80e29d8362aa Fix autoaway diff -r 96b5484423af -r 9a0ed33fb91b mcabber/mcabber/screen.c --- a/mcabber/mcabber/screen.c Sat Jan 16 12:12:45 2010 +0200 +++ b/mcabber/mcabber/screen.c Wed Jan 20 11:08:03 2010 +0200 @@ -123,7 +123,7 @@ static bool Curses; static bool log_win_on_top; static bool roster_win_on_right; -static time_t LastActivity; +static guint autoaway_source = 0; static char inputLine[INPUTLINE_LENGTH+1]; #if defined(WITH_ENCHANT) || defined(WITH_ASPELL) @@ -2197,27 +2197,44 @@ } #endif -// Check if we should enter/leave automatic away status +static gboolean scr_autoaway_timeout_callback(gpointer data) +{ + enum imstatus cur_st = xmpp_getstatus(); + if (cur_st != available && cur_st != freeforchat) + // Some non-user-originated status changes, let's wait more. + // Maybe the proper fix for that will be set global variable + // "autoaway_delayed" and check that variable in postconnect + // hook (afaik, only source for such status changes are + // error disconnects). + return TRUE; + set_autoaway(TRUE); + // source will be destroyed after return + autoaway_source = 0; + return FALSE; +} + +static void scr_ReinstallAutoAwayTimeout(void) +{ + unsigned int autoaway_timeout = settings_opt_get_int("autoaway"); + enum imstatus cur_st = xmpp_getstatus(); + if (autoaway_source) { + g_source_remove(autoaway_source); + autoaway_source = 0; + } + if (autoaway_timeout && (cur_st == available || cur_st == freeforchat)) + autoaway_source = g_timeout_add_seconds(autoaway_timeout, + scr_autoaway_timeout_callback, + NULL); +} + +// Check if we should reset autoaway timeout source void scr_CheckAutoAway(int activity) { - enum imstatus cur_st; - unsigned int autoaway_timeout = settings_opt_get_int("autoaway"); - - if (Autoaway && activity) set_autoaway(FALSE); - if (!autoaway_timeout) return; - if (!LastActivity || activity) time(&LastActivity); - - cur_st = xmpp_getstatus(); - // Auto-away is disabled for the following states - if ((cur_st != available) && (cur_st != freeforchat)) - return; - - if (!activity) { - time_t now; - time(&now); - if (!Autoaway && (now > LastActivity + (time_t)autoaway_timeout)) - set_autoaway(TRUE); - } + if (Autoaway && activity) { + scr_ReinstallAutoAwayTimeout(); + set_autoaway(FALSE); + } else if (activity || !autoaway_source) + scr_ReinstallAutoAwayTimeout(); } // set_current_buddy(newbuddy)