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 {
|
|
93 if (timer)
|
|
94 gtk_timeout_remove(timer);
|
|
95 timer = 0;
|
|
96 }
|
|
97
|
|
98 char *gaim_plugin_init(GModule *m)
|
|
99 {
|
|
100 if (!check_timeout(NULL))
|
|
101 return "Could not read $MAIL or /var/spool/mail/$USER";
|
|
102 if (blist)
|
|
103 timer = gtk_timeout_add(2000, check_timeout, NULL);
|
|
104 gaim_signal_connect(m, event_signon, mail_signon, NULL);
|
|
105 gaim_signal_connect(m, event_signoff, mail_signoff, NULL);
|
|
106 return NULL;
|
|
107 }
|
|
108
|
|
109 void gaim_plugin_remove()
|
|
110 {
|
|
111 if (timer)
|
|
112 gtk_timeout_remove(timer);
|
|
113 timer = 0;
|
|
114 if (mail)
|
|
115 gtk_widget_destroy(mail);
|
|
116 mail = NULL;
|
|
117 }
|
|
118
|
|
119 char *name()
|
|
120 {
|
|
121 return "Mail Check";
|
|
122 }
|
|
123
|
|
124 char *description()
|
|
125 {
|
|
126 return "Checks for new local mail";
|
|
127 }
|