# HG changeset patch # User Luke Schierer # Date 1126796063 0 # Node ID 78aad676fdb2bacd1f4452ec0dc2b9950df0880b # Parent ec2335d98b83961f84f88fedbf09ccba15175ce8 [gaim-migrate @ 13806] This creates an unidle menu option for the I'dle Mak'er plugin. I like having this. committer: Tailor Script diff -r ec2335d98b83 -r 78aad676fdb2 COPYRIGHT --- a/COPYRIGHT Thu Sep 15 06:12:21 2005 +0000 +++ b/COPYRIGHT Thu Sep 15 14:54:23 2005 +0000 @@ -10,6 +10,7 @@ Daniel Atallah Paul Aurich Patrick Aussems +John Bailey Levi Bard Kevin Barry Derek Battams diff -r ec2335d98b83 -r 78aad676fdb2 plugins/idle.c --- a/plugins/idle.c Thu Sep 15 06:12:21 2005 +0000 +++ b/plugins/idle.c Thu Sep 15 14:54:23 2005 +0000 @@ -1,6 +1,25 @@ -/* a nifty little plugin to set your idle time to whatever you want it to be. - * useful for almost nothing. mostly just a demo plugin. but it's fun to have - * 40-day idle times. +/* + * idle.c - I'dle Mak'er plugin for Gaim + * + * This file is part of Gaim. + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "internal.h" @@ -10,31 +29,71 @@ #include "plugin.h" #include "request.h" #include "server.h" +#include "status.h" #include "version.h" #define IDLE_PLUGIN_ID "gtk-idle" +static GList *idled_accts; + +static gboolean +idle_filter(GaimAccount *acct) +{ + if(g_list_find(idled_accts, acct)) + return TRUE; + + return FALSE; +} + +static void +set_idle_time(GaimAccount *acct, int mins_idle) +{ + time_t t = time(NULL); /* grab the current time */ + GaimConnection *gc = gaim_account_get_connection(acct); + GaimPresence *presence = gaim_account_get_presence(acct); + + gaim_debug(GAIM_DEBUG_INFO, "idle", + "setting idle time for %s to %d\n", + gaim_account_get_username(acct), mins_idle); + + t -= 60 * mins_idle; /* subtract seconds idle from current time */ + gc->last_sent_time = t; + gc->is_idle = 0; + + gaim_presence_set_idle(presence, mins_idle ? TRUE : FALSE, t); +} static void idle_action_ok(void *ignored, GaimRequestFields *fields) { - time_t t; - int tm; - GaimAccount *acct; - GaimConnection *gc; - - tm = gaim_request_fields_get_integer(fields, "mins"); - acct = gaim_request_fields_get_account(fields, "acct"); - gc = gaim_account_get_connection(acct); + GList *l = idled_accts; + gboolean acct_found = FALSE; + int tm = gaim_request_fields_get_integer(fields, "mins"); + GaimAccount *acct = gaim_request_fields_get_account(fields, "acct"); - gaim_debug(GAIM_DEBUG_INFO, "idle", - "setting idle time for %s to %d\n", - gaim_account_get_username(acct), tm); - time(&t); - t -= 60 * tm; - gc->last_sent_time = t; - serv_set_idle(gc, 60 * tm); - gc->is_idle = 0; + /* only add the account to the GList if it's not already been idled */ + if((l = g_list_find(idled_accts, acct)) && (GaimAccount *)(l->data) == acct) + acct_found = TRUE; + + if(!acct_found) { + gaim_debug_misc("idle", + "%s hasn't been idled yet; adding to list.\n", + gaim_account_get_username(acct)); + idled_accts = g_list_append(idled_accts, acct); + } + + set_idle_time(acct, tm); +} + +static void +unidle_action_ok(void *ignored, GaimRequestFields *fields) +{ + GaimAccount *acct = gaim_request_fields_get_account(fields, "acct"); + + set_idle_time(acct, 0); /* unidle the account */ + + /* once the account has been unidled it shouldn't be in the list */ + g_list_remove(idled_accts, acct); } @@ -69,6 +128,46 @@ NULL); } +static void +unidle_action(GaimPluginAction *action) +{ + GaimRequestFields *request; + GaimRequestFieldGroup *group; + GaimRequestField *field; + + group = gaim_request_field_group_new(NULL); + + field = gaim_request_field_account_new("acct", _("Account"), NULL); + gaim_request_field_account_set_filter(field, idle_filter); + gaim_request_field_account_set_show_all(field, FALSE); + gaim_request_field_group_add_field(group, field); + + request = gaim_request_fields_new(); + gaim_request_fields_add_group(request, group); + + gaim_request_fields(action->plugin, + N_("I'dle Mak'er"), + _("Unset Account Idle Time"), + NULL, + request, + _("_Unset"), G_CALLBACK(unidle_action_ok), + _("_Cancel"), NULL, + NULL); +} + +static void +unidle_all_action(GaimPluginAction *action) +{ + GList *l; + + /* freeing the list here will cause segfaults if the user idles an account + * after the list is freed */ + for (l = idled_accts; l; l = l->next) { + set_idle_time((GaimAccount *)(l->data), 0); + g_list_remove(idled_accts, l->data); + } + +} static GList * actions(GaimPlugin *plugin, gpointer context) @@ -80,9 +179,30 @@ idle_action); l = g_list_append(l, act); + act = gaim_plugin_action_new(_("Unset Account Idle Time"), + unidle_action); + l = g_list_append(l, act); + + act = gaim_plugin_action_new( + _("Unset Idle Time For All Idled Accounts"), unidle_all_action); + l = g_list_append(l, act); + return l; } +static gboolean +plugin_unload(GaimPlugin *plugin) +{ + GList *l; + + for (l = idled_accts; l; l = l->next) + set_idle_time((GaimAccount *)(l->data), 0); + + g_list_free(idled_accts); + + return TRUE; +} + static GaimPluginInfo info = { GAIM_PLUGIN_MAGIC, @@ -96,12 +216,12 @@ IDLE_PLUGIN_ID, N_("I'dle Mak'er"), VERSION, - N_("Allows you to hand-configure how long you've been idle for"), - N_("Allows you to hand-configure how long you've been idle for"), + N_("Allows you to hand-configure how long you've been idle"), + N_("Allows you to hand-configure how long you've been idle"), "Eric Warmenhoven ", GAIM_WEBSITE, NULL, - NULL, + plugin_unload, NULL, NULL, NULL, diff -r ec2335d98b83 -r 78aad676fdb2 src/status.c --- a/src/status.c Thu Sep 15 06:12:21 2005 +0000 +++ b/src/status.c Thu Sep 15 14:54:23 2005 +0000 @@ -1366,6 +1366,19 @@ old_idle, idle); } } + else if(gaim_presence_get_context(presence) == GAIM_PRESENCE_CONTEXT_ACCOUNT) + { + GaimConnection *gc = + gaim_account_get_connection(gaim_presence_get_account(presence)); + GaimPluginProtocolInfo *prpl_info = NULL; + + if (gc != NULL && gc->prpl != NULL) + prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); + + if (prpl_info && g_list_find(gaim_connections_get_all(), gc) && + prpl_info->set_idle) + prpl_info->set_idle(gc, time(NULL) - idle_time); + } } void