comparison gtk/plugins/mailchk.c @ 14191:009db0b357b5

This is a hand-crafted commit to migrate across subversion revisions 16854:16861, due to some vagaries of the way the original renames were done. Witness that monotone can do in one revision what svn had to spread across several.
author Ethan Blanton <elb@pidgin.im>
date Sat, 16 Dec 2006 04:59:55 +0000
parents
children
comparison
equal deleted inserted replaced
14190:366be2ce35a7 14191:009db0b357b5
1 #include "internal.h"
2
3 #include "debug.h"
4 #include "sound.h"
5 #include "version.h"
6
7 #include "gtkblist.h"
8 #include "gtkplugin.h"
9
10 #define MAILCHK_PLUGIN_ID "gtk-mailchk"
11
12 #define ANY_MAIL 0x01
13 #define UNREAD_MAIL 0x02
14 #define NEW_MAIL 0x04
15
16 static guint32 timer = 0;
17 static GtkWidget *mail = NULL;
18
19 static gint
20 check_mail()
21 {
22 static off_t oldsize = 0;
23 gchar *filename;
24 off_t newsize;
25 struct stat s;
26 gint ret = 0;
27
28 filename = g_strdup(g_getenv("MAIL"));
29 if (!filename)
30 filename = g_strconcat("/var/spool/mail/", g_get_user_name(), NULL);
31
32 if (g_stat(filename, &s) < 0) {
33 g_free(filename);
34 return -1;
35 }
36
37 newsize = s.st_size;
38 if (newsize) ret |= ANY_MAIL;
39 if (s.st_mtime > s.st_atime && newsize) ret |= UNREAD_MAIL;
40 if (newsize != oldsize && (ret & UNREAD_MAIL)) ret |= NEW_MAIL;
41 oldsize = newsize;
42
43 g_free(filename);
44
45 return ret;
46 }
47
48 static void
49 destroy_cb()
50 {
51 mail = NULL;
52 }
53
54 static gboolean
55 check_timeout(gpointer data)
56 {
57 gint count = check_mail();
58 GaimBuddyList *list = gaim_get_blist();
59
60 if (count == -1)
61 return FALSE;
62
63 if (!list || !GAIM_IS_GTK_BLIST(list) || !(GAIM_GTK_BLIST(list)->vbox))
64 return TRUE;
65
66 if (!mail) {
67 /* guess we better build it then :P */
68 GtkWidget *vbox = GAIM_GTK_BLIST(list)->vbox;
69
70 mail = gtk_label_new("No mail messages.");
71 gtk_box_pack_start(GTK_BOX(vbox), mail, FALSE, FALSE, 0);
72 gtk_box_reorder_child(GTK_BOX(vbox), mail, 1);
73 g_signal_connect(G_OBJECT(mail), "destroy", G_CALLBACK(destroy_cb), NULL);
74 gtk_widget_show(mail);
75 }
76
77 if (count & NEW_MAIL)
78 gaim_sound_play_event(GAIM_SOUND_POUNCE_DEFAULT, NULL);
79
80 if (count & UNREAD_MAIL)
81 gtk_label_set_text(GTK_LABEL(mail), "You have new mail!");
82 else if (count & ANY_MAIL)
83 gtk_label_set_text(GTK_LABEL(mail), "You have mail.");
84 else
85 gtk_label_set_text(GTK_LABEL(mail), "No mail messages.");
86
87 return TRUE;
88 }
89
90 static void
91 signon_cb(GaimConnection *gc)
92 {
93 GaimBuddyList *list = gaim_get_blist();
94 if (list && GAIM_IS_GTK_BLIST(list) && !timer) {
95 check_timeout(NULL); /* we want the box to be drawn immediately */
96 timer = g_timeout_add(2000, check_timeout, NULL);
97 }
98 }
99
100 static void
101 signoff_cb(GaimConnection *gc)
102 {
103 GaimBuddyList *list = gaim_get_blist();
104 if ((!list || !GAIM_IS_GTK_BLIST(list) || !GAIM_GTK_BLIST(list)->vbox) && timer) {
105 g_source_remove(timer);
106 timer = 0;
107 }
108 }
109
110 /*
111 * EXPORTED FUNCTIONS
112 */
113
114 static gboolean
115 plugin_load(GaimPlugin *plugin)
116 {
117 GaimBuddyList *list = gaim_get_blist();
118 void *conn_handle = gaim_connections_get_handle();
119
120 if (!check_timeout(NULL)) {
121 gaim_debug_warning("mailchk", "Could not read $MAIL or /var/spool/mail/$USER");
122 return FALSE;
123 }
124
125 if (list && GAIM_IS_GTK_BLIST(list) && GAIM_GTK_BLIST(list)->vbox)
126 timer = g_timeout_add(2000, check_timeout, NULL);
127
128 gaim_signal_connect(conn_handle, "signed-on",
129 plugin, GAIM_CALLBACK(signon_cb), NULL);
130 gaim_signal_connect(conn_handle, "signed-off",
131 plugin, GAIM_CALLBACK(signoff_cb), NULL);
132
133 return TRUE;
134 }
135
136 static gboolean
137 plugin_unload(GaimPlugin *plugin)
138 {
139 if (timer)
140 g_source_remove(timer);
141 timer = 0;
142 if (mail)
143 gtk_widget_destroy(mail);
144 mail = NULL;
145
146 return TRUE;
147 }
148
149 static GaimPluginInfo info =
150 {
151 GAIM_PLUGIN_MAGIC,
152 GAIM_MAJOR_VERSION,
153 GAIM_MINOR_VERSION,
154 GAIM_PLUGIN_STANDARD,
155 GAIM_GTK_PLUGIN_TYPE,
156 0,
157 NULL,
158 GAIM_PRIORITY_DEFAULT,
159 MAILCHK_PLUGIN_ID,
160 N_("Mail Checker"),
161 VERSION,
162 N_("Checks for new local mail."),
163 N_("Adds a small box to the buddy list that"
164 " shows if you have new mail."),
165 "Eric Warmenhoven <eric@warmenhoven.org>",
166 GAIM_WEBSITE,
167 plugin_load,
168 plugin_unload,
169 NULL,
170 NULL,
171 NULL,
172 NULL,
173 NULL
174 };
175
176 static void
177 init_plugin(GaimPlugin *plugin)
178 {
179 }
180
181 GAIM_INIT_PLUGIN(mailchk, init_plugin, info)