Mercurial > pidgin.yaz
diff plugins/mailchk.c @ 1803:d36f759df56d
[gaim-migrate @ 1813]
mailcheck plugin
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Sat, 05 May 2001 00:15:23 +0000 |
parents | |
children | c7b288ea3892 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/mailchk.c Sat May 05 00:15:23 2001 +0000 @@ -0,0 +1,128 @@ +#define GAIM_PLUGINS +#include "gaim.h" +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +#define ANY_MAIL 0x01 +#define UNREAD_MAIL 0x02 +#define NEW_MAIL 0x04 + +static guint32 timer = 0; +static GtkWidget *mail = NULL; + +static gint check_mail() +{ + static off_t oldsize = 0; + gchar *filename; + off_t newsize; + struct stat s; + gint ret = 0; + + filename = g_getenv("MAIL"); + if (!filename) + filename = g_strconcat("/var/spool/mail/", g_get_user_name(), NULL); + else + filename = g_strdup(filename); + + if (stat(filename, &s) < 0) { + g_free(filename); + return -1; + } + + newsize = s.st_size; + if (newsize) ret |= ANY_MAIL; + if (s.st_mtime > s.st_atime && newsize) ret |= UNREAD_MAIL; + if (newsize != oldsize && (ret & UNREAD_MAIL)) ret |= NEW_MAIL; + oldsize = newsize; + + g_free(filename); + + return ret; +} + +static void maildes() +{ + mail = NULL; +} + +static gboolean check_timeout(gpointer data) +{ + gint count = check_mail(); + char buf[256]; + + if (count == -1) + return FALSE; + + if (!blist) + return TRUE; + + if (!mail) { + /* guess we better build it then :P */ + GList *tmp = gtk_container_children(GTK_CONTAINER(blist)); + GtkWidget *vbox2 = (GtkWidget *)tmp->data; + + mail = gtk_label_new("No mail messages."); + gtk_label_set_justify(GTK_LABEL(mail), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(vbox2), mail, FALSE, FALSE, 0); + gtk_box_reorder_child(GTK_BOX(vbox2), mail, 1); + gtk_signal_connect(GTK_OBJECT(mail), "destroy", GTK_SIGNAL_FUNC(maildes), NULL); + gtk_widget_show(mail); + } + + if (count & NEW_MAIL) + play_sound(POUNCE_DEFAULT); + + if (count & UNREAD_MAIL) + gtk_label_set_text(GTK_LABEL(mail), "You have new mail!"); + else if (count & ANY_MAIL) + gtk_label_set_text(GTK_LABEL(mail), "You have mail."); + else + gtk_label_set_text(GTK_LABEL(mail), "No mail messages."); + + return TRUE; +} + +static void mail_signon(struct gaim_connection *gc) +{ + if (blist && !timer) + timer = gtk_timeout_add(2000, check_timeout, NULL); +} + +static void mail_signoff(struct gaim_connection *gc) +{ + if (timer) + gtk_timeout_remove(timer); + timer = 0; +} + +char *gaim_plugin_init(GModule *m) +{ + if (!check_timeout(NULL)) + return "Could not read $MAIL or /var/spool/mail/$USER"; + if (blist) + timer = gtk_timeout_add(2000, check_timeout, NULL); + gaim_signal_connect(m, event_signon, mail_signon, NULL); + gaim_signal_connect(m, event_signoff, mail_signoff, NULL); + return NULL; +} + +void gaim_plugin_remove() +{ + if (timer) + gtk_timeout_remove(timer); + timer = 0; + if (mail) + gtk_widget_destroy(mail); + mail = NULL; +} + +char *name() +{ + return "Mail Check"; +} + +char *description() +{ + return "Checks for new local mail"; +}