Mercurial > pidgin
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) |