Thu, 27 Sep 2001 23:29:23 +0000
[gaim-migrate @ 2390]
thanks decklin
committer: Eric Warmenhoven <warmenhoven@yahoo.com>
| 1803 | 1 | #define GAIM_PLUGINS |
| 2 | #include "gaim.h" | |
| 3 | #include <sys/stat.h> | |
| 4 | #include <sys/types.h> | |
| 5 | #include <unistd.h> | |
| 6 | ||
| 7 | #define ANY_MAIL 0x01 | |
| 8 | #define UNREAD_MAIL 0x02 | |
| 9 | #define NEW_MAIL 0x04 | |
| 10 | ||
| 11 | static guint32 timer = 0; | |
| 12 | static GtkWidget *mail = NULL; | |
| 13 | ||
| 14 | static gint check_mail() | |
| 15 | { | |
| 16 | static off_t oldsize = 0; | |
| 17 | gchar *filename; | |
| 18 | off_t newsize; | |
| 19 | struct stat s; | |
| 20 | gint ret = 0; | |
| 21 | ||
| 22 | filename = g_getenv("MAIL"); | |
| 23 | if (!filename) | |
| 24 | filename = g_strconcat("/var/spool/mail/", g_get_user_name(), NULL); | |
| 25 | else | |
| 26 | filename = g_strdup(filename); | |
| 27 | ||
| 28 | if (stat(filename, &s) < 0) { | |
| 29 | g_free(filename); | |
| 30 | return -1; | |
| 31 | } | |
| 32 | ||
| 33 | newsize = s.st_size; | |
| 34 | if (newsize) ret |= ANY_MAIL; | |
| 35 | if (s.st_mtime > s.st_atime && newsize) ret |= UNREAD_MAIL; | |
| 36 | if (newsize != oldsize && (ret & UNREAD_MAIL)) ret |= NEW_MAIL; | |
| 37 | oldsize = newsize; | |
| 38 | ||
| 39 | g_free(filename); | |
| 40 | ||
| 41 | return ret; | |
| 42 | } | |
| 43 | ||
| 44 | static void maildes() | |
| 45 | { | |
| 46 | mail = NULL; | |
| 47 | } | |
| 48 | ||
| 49 | static gboolean check_timeout(gpointer data) | |
| 50 | { | |
| 51 | gint count = check_mail(); | |
| 52 | char buf[256]; | |
| 53 | ||
| 54 | if (count == -1) | |
| 55 | return FALSE; | |
| 56 | ||
| 57 | if (!blist) | |
| 58 | return TRUE; | |
| 59 | ||
| 60 | if (!mail) { | |
| 61 | /* guess we better build it then :P */ | |
| 62 | GList *tmp = gtk_container_children(GTK_CONTAINER(blist)); | |
| 63 | GtkWidget *vbox2 = (GtkWidget *)tmp->data; | |
| 64 | ||
| 65 | mail = gtk_label_new("No mail messages."); | |
| 66 | gtk_box_pack_start(GTK_BOX(vbox2), mail, FALSE, FALSE, 0); | |
| 67 | gtk_box_reorder_child(GTK_BOX(vbox2), mail, 1); | |
| 68 | gtk_signal_connect(GTK_OBJECT(mail), "destroy", GTK_SIGNAL_FUNC(maildes), NULL); | |
| 69 | gtk_widget_show(mail); | |
| 70 | } | |
| 71 | ||
| 72 | if (count & NEW_MAIL) | |
| 73 | play_sound(POUNCE_DEFAULT); | |
| 74 | ||
| 75 | if (count & UNREAD_MAIL) | |
| 76 | gtk_label_set_text(GTK_LABEL(mail), "You have new mail!"); | |
| 77 | else if (count & ANY_MAIL) | |
| 78 | gtk_label_set_text(GTK_LABEL(mail), "You have mail."); | |
| 79 | else | |
| 80 | gtk_label_set_text(GTK_LABEL(mail), "No mail messages."); | |
| 81 | ||
| 82 | return TRUE; | |
| 83 | } | |
| 84 | ||
| 85 | static void mail_signon(struct gaim_connection *gc) | |
| 86 | { | |
| 87 | if (blist && !timer) | |
| 88 | timer = gtk_timeout_add(2000, check_timeout, NULL); | |
| 89 | } | |
| 90 | ||
| 91 | static void mail_signoff(struct gaim_connection *gc) | |
| 92 | { | |
| 2259 | 93 | if (!blist && timer) { |
| 1803 | 94 | gtk_timeout_remove(timer); |
| 2259 | 95 | timer = 0; |
| 96 | } | |
| 1803 | 97 | } |
| 98 | ||
| 99 | char *gaim_plugin_init(GModule *m) | |
| 100 | { | |
| 101 | if (!check_timeout(NULL)) | |
| 102 | return "Could not read $MAIL or /var/spool/mail/$USER"; | |
| 103 | if (blist) | |
| 104 | timer = gtk_timeout_add(2000, check_timeout, NULL); | |
| 105 | gaim_signal_connect(m, event_signon, mail_signon, NULL); | |
| 106 | gaim_signal_connect(m, event_signoff, mail_signoff, NULL); | |
| 107 | return NULL; | |
| 108 | } | |
| 109 | ||
| 110 | void gaim_plugin_remove() | |
| 111 | { | |
| 112 | if (timer) | |
| 113 | gtk_timeout_remove(timer); | |
| 114 | timer = 0; | |
| 115 | if (mail) | |
| 116 | gtk_widget_destroy(mail); | |
| 117 | mail = NULL; | |
| 118 | } | |
| 119 | ||
| 120 | char *name() | |
| 121 | { | |
| 122 | return "Mail Check"; | |
| 123 | } | |
| 124 | ||
| 125 | char *description() | |
| 126 | { | |
| 127 | return "Checks for new local mail"; | |
| 128 | } |