2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2014 Hiroyuki Yamamoto and the Claws Mail Team
4 * Copyright (C) 2014 Ricardo Mones
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "claws-features.h"
26 #include <glib/gi18n.h>
28 #include "libravatar.h"
31 #include <gtk/filesel.h>
34 #include "libravatar_prefs.h"
35 #include "prefs_common.h"
36 #include "prefs_gtk.h"
38 #define PREFS_BLOCK_NAME "Libravatar"
39 #define NUM_DEF_BUTTONS 7
40 /* cache interval goes from 1 hour to 30 days */
41 #define INTERVAL_MIN_H 1.0
42 #define INTERVAL_MAX_H 720.0
44 LibravatarPrefs libravatarprefs;
45 GHashTable *libravatarmisses;
47 struct LibravatarPrefsPage
51 GtkWidget *cache_interval_spin;
52 GtkWidget *cache_icons_check;
53 GtkWidget *defm_radio[NUM_DEF_BUTTONS];
54 GtkWidget *defm_url_text;
55 GtkWidget *allow_redirects_check;
58 struct LibravatarPrefsPage libravatarprefs_page;
60 static PrefParam param[] = {
61 { "base_url", "http://cdn.libravatar.org/avatar",
62 &libravatarprefs.base_url,
63 P_STRING, NULL, NULL, NULL },
64 { "cache_interval", "24",
65 &libravatarprefs.cache_interval,
66 P_INT, NULL, NULL, NULL },
67 { "cache_icons", "TRUE",
68 &libravatarprefs.cache_icons,
69 P_BOOL, NULL, NULL, NULL },
70 { "default_mode", "0",
71 &libravatarprefs.default_mode,
72 P_INT, NULL, NULL, NULL },
73 { "default_mode_url", "",
74 &libravatarprefs.default_mode_url,
75 P_STRING, NULL, NULL, NULL },
76 { "allow_redirects", "TRUE",
77 &libravatarprefs.allow_redirects,
78 P_BOOL, NULL, NULL, NULL },
79 {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
82 static GtkWidget *create_checkbox(gchar *label, gchar *hint)
84 GtkWidget *cb = gtk_check_button_new_with_mnemonic(label);
85 CLAWS_SET_TIP(cb, hint);
91 static void cache_icons_check_toggled_cb(GtkToggleButton *button, gpointer data)
93 gtk_widget_set_sensitive(libravatarprefs_page.cache_interval_spin,
94 gtk_toggle_button_get_active(button));
97 static GtkWidget *p_create_frame_cache(struct LibravatarPrefsPage *page)
99 GtkWidget *vbox, *checkbox, *lbl, *lbla, *spinner, *hbox;
102 vbox = gtk_vbox_new(FALSE, 6);
104 checkbox = create_checkbox(_("_Use cached icons"),
105 _("Keep icons on disk for reusing instead "
106 "of making another network request"));
107 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
108 libravatarprefs.cache_icons);
109 g_signal_connect(checkbox, "toggled",
110 G_CALLBACK(cache_icons_check_toggled_cb), NULL);
111 page->cache_icons_check = checkbox;
113 lbl = gtk_label_new(_("Cache refresh interval"));
114 gtk_widget_show(lbl);
115 lbla = gtk_label_new(_("hours"));
116 gtk_widget_show(lbla);
117 adj = (GtkAdjustment *) gtk_adjustment_new(
118 libravatarprefs.cache_interval,
119 INTERVAL_MIN_H, INTERVAL_MAX_H, 1.0,
121 spinner = gtk_spin_button_new(adj, 1.0, 0);
122 gtk_widget_show(spinner);
123 gtk_widget_set_sensitive(spinner, libravatarprefs.cache_icons);
124 hbox = gtk_hbox_new(FALSE, 6);
125 gtk_box_pack_start(GTK_BOX(hbox), lbl, FALSE, FALSE, 0);
126 gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
127 gtk_box_pack_start(GTK_BOX(hbox), lbla, FALSE, FALSE, 0);
128 page->cache_interval_spin = spinner;
130 gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
131 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
136 static void default_mode_radio_button_cb(GtkToggleButton *button, gpointer data)
141 if (gtk_toggle_button_get_active(button) != TRUE)
144 mode = *((guint *)data);
145 is_url = (mode == DEF_MODE_URL)? TRUE: FALSE;
147 gtk_widget_set_sensitive(libravatarprefs_page.defm_url_text, is_url);
148 if (is_url) /* custom URL requires following redirects */
149 gtk_toggle_button_set_active(
150 GTK_TOGGLE_BUTTON(libravatarprefs_page.allow_redirects_check),
153 if (mode == DEF_MODE_NONE) {
154 prefs_common.enable_avatars = AVATARS_ENABLE_BOTH;
156 /* don't waste time with headers that won't be displayed */
157 prefs_common.enable_avatars = AVATARS_DISABLE;
158 /* empty missing cache when switching to generated */
159 g_hash_table_remove_all(libravatarmisses);
163 static const guint radio_value[] = {
173 static GtkWidget *p_create_frame_missing(struct LibravatarPrefsPage *page)
175 GtkWidget *vbox, *radio[NUM_DEF_BUTTONS], *hbox, *label, *entry;
176 gboolean enable = FALSE;
178 gchar *radio_label[] = {
187 gchar *radio_hint[] = {
189 _("The unobtrusive low-contrast greyish silhouette"),
190 _("A generated geometric pattern"),
191 _("A generated full-body monster"),
192 _("A generated almost unique face"),
193 _("A generated 8-bit arcade-style pixelated image"),
194 _("Redirect to a user provided URL")
197 vbox = gtk_vbox_new(FALSE, 6);
199 for (i = 0; i < NUM_DEF_BUTTONS; ++i) {
200 enable = (libravatarprefs.default_mode == radio_value[i])? TRUE: FALSE;
202 radio[i] = gtk_radio_button_new_with_label_from_widget(
203 (i > 0)? GTK_RADIO_BUTTON(radio[i - 1]): NULL, radio_label[i]);
204 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio[i]), enable);
205 gtk_box_pack_start(GTK_BOX(vbox), radio[i], FALSE, FALSE, 0);
206 g_signal_connect(radio[i], "toggled",
207 G_CALLBACK(default_mode_radio_button_cb),
208 (gpointer) &(radio_value[i]));
209 CLAWS_SET_TIP(radio[i], radio_hint[i]);
210 gtk_widget_show(radio[i]);
211 page->defm_radio[i] = radio[i];
213 if (e == 0) { /* unknown value, go default */
214 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio[0]), TRUE);
215 libravatarprefs.default_mode = DEF_MODE_NONE;
217 /* don't waste time with headers that won't be displayed */
218 prefs_common.enable_avatars = (libravatarprefs.default_mode == DEF_MODE_NONE)
219 ? AVATARS_ENABLE_BOTH: AVATARS_DISABLE;
221 label = gtk_label_new(_("URL:"));
222 gtk_widget_show(label);
223 entry = gtk_entry_new_with_max_length(MAX_URL_LENGTH);
224 gtk_widget_show(entry);
225 gtk_entry_set_text(GTK_ENTRY(entry), libravatarprefs.default_mode_url);
227 hbox = gtk_hbox_new(FALSE, 6);
228 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
229 gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
230 gtk_widget_set_sensitive(entry,
231 (libravatarprefs.default_mode == DEF_MODE_URL)? TRUE: FALSE);
232 page->defm_url_text = entry;
234 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
239 static GtkWidget *p_create_frame_network(struct LibravatarPrefsPage *page)
241 GtkWidget *vbox, *checkbox;
243 vbox = gtk_vbox_new(FALSE, 6);
245 checkbox = create_checkbox(_("_Allow redirects to other sites"),
246 _("Follow redirect responses received from "
247 "libravatar server to other avatar "
248 "services like gravatar.com"));
249 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox),
250 libravatarprefs.allow_redirects);
251 page->allow_redirects_check = checkbox;
253 gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
259 ┌─Icon cache───────────────────────────────────────────┐
260 │ [✔] Use cached icons │
261 │ Cache refresh interval [ 24 |⬘] hours │
262 └──────────────────────────────────────────────────────┘
263 ┌─Default missing icon mode────────────────────────────┐
271 │ URL: [_________________________________________] │
272 └──────────────────────────────────────────────────────┘
273 ┌─Network──────────────────────────────────────────────┐
274 │ [✔] Allow redirects │
275 └──────────────────────────────────────────────────────┘
277 static void libravatar_prefs_create_widget_func(PrefsPage * _page,
281 struct LibravatarPrefsPage *page = (struct LibravatarPrefsPage *) _page;
282 GtkWidget *vbox, *vbox1, *vbox2, *vbox3, *frame;
284 vbox1 = p_create_frame_cache(page);
285 vbox2 = p_create_frame_missing(page);
286 vbox3 = p_create_frame_network(page);
288 vbox = gtk_vbox_new(FALSE, 6);
289 gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
291 PACK_FRAME (vbox, frame, _("Icon cache"));
292 gtk_container_set_border_width(GTK_CONTAINER(vbox1), 6);
293 gtk_container_add(GTK_CONTAINER(frame), vbox1);
295 PACK_FRAME (vbox, frame, _("Default missing icon mode"));
296 gtk_container_set_border_width(GTK_CONTAINER(vbox2), 6);
297 gtk_container_add(GTK_CONTAINER(frame), vbox2);
299 PACK_FRAME (vbox, frame, _("Network"));
300 gtk_container_set_border_width(GTK_CONTAINER(vbox3), 6);
301 gtk_container_add(GTK_CONTAINER(frame), vbox3);
303 gtk_widget_show_all(vbox);
304 page->page.widget = vbox;
307 static void libravatar_prefs_destroy_widget_func(PrefsPage *_page)
312 static void libravatar_save_config(void)
317 debug_print("Saving Libravatar Page\n");
319 rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
320 pfile = prefs_write_open(rcpath);
322 if (!pfile || (prefs_set_block_label(pfile, PREFS_BLOCK_NAME) < 0))
325 if (prefs_write_param(param, pfile->fp) < 0) {
326 g_warning("Failed to write Libravatar configuration to file\n");
327 prefs_file_close_revert(pfile);
330 if (fprintf(pfile->fp, "\n") < 0) {
331 FILE_OP_ERROR(rcpath, "fprintf");
332 prefs_file_close_revert(pfile);
334 prefs_file_close(pfile);
337 static void libravatar_prefs_save_func(PrefsPage * _page)
339 struct LibravatarPrefsPage *page = (struct LibravatarPrefsPage *) _page;
343 libravatarprefs.cache_icons = gtk_toggle_button_get_active(
344 GTK_TOGGLE_BUTTON(page->cache_icons_check));
346 libravatarprefs.cache_interval = gtk_spin_button_get_value_as_int(
347 GTK_SPIN_BUTTON(page->cache_interval_spin));
349 for (i = 0; i < NUM_DEF_BUTTONS; ++i) {
350 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->defm_radio[i]))) {
351 libravatarprefs.default_mode = radio_value[i];
356 if (libravatarprefs.default_mode_url != NULL) {
357 g_free(libravatarprefs.default_mode_url);
359 libravatarprefs.default_mode_url = gtk_editable_get_chars(
360 GTK_EDITABLE(page->defm_url_text), 0, -1);
362 libravatarprefs.allow_redirects = gtk_toggle_button_get_active(
363 GTK_TOGGLE_BUTTON(page->allow_redirects_check));
365 libravatar_save_config();
368 void libravatar_prefs_init(void)
370 static gchar *path[3];
373 path[0] = _("Plugins");
374 path[1] = _("Libravatar");
377 prefs_set_default(param);
378 rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
379 prefs_read_config(param, PREFS_BLOCK_NAME, rcpath, NULL);
382 libravatarprefs_page.page.path = path;
383 libravatarprefs_page.page.create_widget = libravatar_prefs_create_widget_func;
384 libravatarprefs_page.page.destroy_widget = libravatar_prefs_destroy_widget_func;
385 libravatarprefs_page.page.save_page = libravatar_prefs_save_func;
387 prefs_gtk_register_page((PrefsPage *) &libravatarprefs_page);
390 void libravatar_prefs_done(void)
392 prefs_gtk_unregister_page((PrefsPage *) &libravatarprefs_page);