2 * Claws Mail -- a GTK based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2018 the Claws Mail Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * The structure of this file has been borrowed from the structure of
21 * the image_viewer plugin file. I also used it as an example of how to
22 * build the preferences for the dillo plugin.
27 #include "claws-features.h"
33 #include <glib/gi18n.h>
39 #include "prefs_gtk.h"
40 #include "prefswindow.h"
42 #include "addressbook.h"
44 #include "dillo_prefs.h"
46 #define PREFS_BLOCK_NAME "Dillo"
48 DilloBrowserPrefs dillo_prefs
;
50 typedef struct _DilloBrowserPage DilloBrowserPage
;
52 struct _DilloBrowserPage
{
55 GtkWidget
*whitelist_ab
;
56 GtkWidget
*whitelist_ab_folder_combo
;
57 GtkWidget
*whitelist_ab_select_btn
;
61 static PrefParam param
[] = {
62 {"local_browse", "TRUE", &dillo_prefs
.local
, P_BOOL
, NULL
, NULL
, NULL
},
63 {"full_window", "TRUE", &dillo_prefs
.full
, P_BOOL
, NULL
, NULL
, NULL
},
64 {"whitelist_ab", "FALSE", &dillo_prefs
.whitelist_ab
, P_BOOL
,
66 {"whitelist_ab_folder", N_("Any"), &dillo_prefs
.whitelist_ab_folder
, P_STRING
,
72 static DilloBrowserPage prefs_page
;
74 static void create_dillo_prefs_page (PrefsPage
*page
,
77 static void destroy_dillo_prefs_page (PrefsPage
*page
);
78 static void save_dillo_prefs (PrefsPage
*page
);
80 #ifndef USE_ALT_ADDRBOOK
81 static void dillo_whitelist_ab_select_cb(GtkWidget
*widget
, gpointer data
)
83 DilloBrowserPage
*page
= (DilloBrowserPage
*) data
;
84 const gchar
*folderpath
= NULL
;
85 gchar
*new_path
= NULL
;
87 folderpath
= gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((page
->whitelist_ab_folder_combo
)))));
88 new_path
= addressbook_folder_selection(folderpath
);
90 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((page
->whitelist_ab_folder_combo
)))), new_path
);
96 static void local_checkbox_toggled(GtkToggleButton
*button
,
99 gboolean active
= gtk_toggle_button_get_active(button
);
100 DilloBrowserPage
*prefs_page
= (DilloBrowserPage
*) user_data
;
102 gtk_widget_set_sensitive(prefs_page
->whitelist_ab
, active
);
103 gtk_widget_set_sensitive(prefs_page
->whitelist_ab_folder_combo
, active
&&
104 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prefs_page
->whitelist_ab
)));
105 #ifndef USE_NEW_ADDRBOOK
106 gtk_widget_set_sensitive(prefs_page
->whitelist_ab_select_btn
, active
&&
107 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prefs_page
->whitelist_ab
)));
111 static void whitelist_checkbox_toggled(GtkToggleButton
*button
,
114 gboolean active
= gtk_toggle_button_get_active(button
);
115 DilloBrowserPage
*prefs_page
= (DilloBrowserPage
*) user_data
;
117 active
&= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prefs_page
->local
));
119 gtk_widget_set_sensitive(prefs_page
->whitelist_ab_folder_combo
, active
);
120 gtk_widget_set_sensitive(prefs_page
->whitelist_ab_select_btn
, active
);
123 void dillo_prefs_init(void)
125 static gchar
*path
[3];
128 path
[0] = _("Plugins");
129 path
[1] = _("Dillo Browser");
132 prefs_set_default(param
);
133 rcpath
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
, COMMON_RC
, NULL
);
134 prefs_read_config(param
, PREFS_BLOCK_NAME
, rcpath
, NULL
);
137 prefs_page
.page
.path
= path
;
138 prefs_page
.page
.create_widget
= create_dillo_prefs_page
;
139 prefs_page
.page
.destroy_widget
= destroy_dillo_prefs_page
;
140 prefs_page
.page
.save_page
= save_dillo_prefs
;
141 prefs_page
.page
.weight
= 35.0;
142 prefs_gtk_register_page((PrefsPage
*) &prefs_page
);
145 void dillo_prefs_done(void)
147 prefs_gtk_unregister_page((PrefsPage
*) &prefs_page
);
150 static void create_dillo_prefs_page(PrefsPage
*page
,
154 DilloBrowserPage
*prefs_page
= (DilloBrowserPage
*) page
;
157 GtkWidget
*local_checkbox
;
158 GtkWidget
*full_checkbox
;
160 GtkWidget
*whitelist_ab_checkbtn
;
161 GtkWidget
*whitelist_ab_folder_combo
;
162 GtkWidget
*whitelist_ab_select_btn
;
163 GtkWidget
*hbox_whitelist
, *spacer
;
165 vbox
= gtk_box_new(GTK_ORIENTATION_VERTICAL
, 3);
166 gtk_container_set_border_width(GTK_CONTAINER(vbox
), VBOX_BORDER
);
167 gtk_widget_show(vbox
);
169 local_checkbox
= gtk_check_button_new_with_label
170 (_("Load remote links in mails"));
171 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(local_checkbox
),
173 gtk_box_pack_start(GTK_BOX(vbox
), local_checkbox
, FALSE
, FALSE
, 0);
174 gtk_widget_show(local_checkbox
);
175 CLAWS_SET_TIP(local_checkbox
,
176 _("Equivalent to Dillo's '--local' option"));
178 label
= gtk_label_new(_("You can still load remote links "
179 "by reloading the page"));
180 gtk_box_pack_start(GTK_BOX(vbox
), label
, FALSE
, FALSE
, 0);
181 gtk_label_set_xalign(GTK_LABEL(label
), 0.0);
182 gtkut_widget_set_small_font_size (label
);
183 gtk_widget_show(label
);
185 hbox_whitelist
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, 8);
186 gtk_widget_show(hbox_whitelist
);
187 gtk_box_pack_start (GTK_BOX (vbox
), hbox_whitelist
, FALSE
, FALSE
, 0);
189 spacer
= gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, 0);
190 gtk_widget_set_size_request(spacer
, 12, -1);
191 gtk_widget_show(spacer
);
192 gtk_box_pack_start(GTK_BOX(hbox_whitelist
), spacer
, FALSE
, FALSE
, 0);
194 whitelist_ab_checkbtn
= gtk_check_button_new_with_label(_("Only for senders found in address book/folder"));
195 gtk_widget_show(whitelist_ab_checkbtn
);
196 gtk_box_pack_start(GTK_BOX(hbox_whitelist
), whitelist_ab_checkbtn
, FALSE
, FALSE
, 0);
198 whitelist_ab_folder_combo
= combobox_text_new(TRUE
, _("Any"), NULL
);
199 gtk_widget_set_size_request(whitelist_ab_folder_combo
, 100, -1);
200 gtk_box_pack_start (GTK_BOX (hbox_whitelist
), whitelist_ab_folder_combo
, TRUE
, TRUE
, 0);
202 whitelist_ab_select_btn
= gtk_button_new_with_label(_("Select ..."));
203 gtk_widget_show (whitelist_ab_select_btn
);
204 gtk_box_pack_start (GTK_BOX (hbox_whitelist
), whitelist_ab_select_btn
, FALSE
, FALSE
, 0);
206 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(whitelist_ab_checkbtn
), dillo_prefs
.whitelist_ab
);
207 if (dillo_prefs
.whitelist_ab_folder
!= NULL
) {
208 /* translate "Any" (stored UNtranslated) */
209 if (strcasecmp(dillo_prefs
.whitelist_ab_folder
, "Any") == 0)
210 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((whitelist_ab_folder_combo
)))),
213 /* backward compatibility (when translated "Any" was stored) */
214 if (g_utf8_collate(dillo_prefs
.whitelist_ab_folder
, _("Any")) == 0)
215 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((whitelist_ab_folder_combo
)))),
216 dillo_prefs
.whitelist_ab_folder
);
218 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((whitelist_ab_folder_combo
)))),
219 dillo_prefs
.whitelist_ab_folder
);
222 full_checkbox
= gtk_check_button_new_with_label
223 (_("Full window mode (hide controls)"));
224 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(full_checkbox
),
226 gtk_box_pack_start(GTK_BOX(vbox
), full_checkbox
, FALSE
, FALSE
, 0);
227 gtk_widget_show(full_checkbox
);
228 CLAWS_SET_TIP(full_checkbox
,
229 _("Equivalent to Dillo's '--fullwindow' option"));
231 g_signal_connect(G_OBJECT(local_checkbox
), "toggled",
232 G_CALLBACK(local_checkbox_toggled
),
235 g_signal_connect(G_OBJECT(whitelist_ab_checkbtn
), "toggled",
236 G_CALLBACK(whitelist_checkbox_toggled
),
239 #ifndef USE_ALT_ADDRBOOK
240 g_signal_connect(G_OBJECT (whitelist_ab_select_btn
), "clicked",
241 G_CALLBACK(dillo_whitelist_ab_select_cb
), prefs_page
);
243 gtk_widget_set_sensitive(GTK_WIDGET(whitelist_ab_select_btn
), FALSE
);
245 gtk_widget_set_sensitive(whitelist_ab_checkbtn
, !dillo_prefs
.local
);
246 gtk_widget_set_sensitive(whitelist_ab_folder_combo
, !dillo_prefs
.local
&& dillo_prefs
.whitelist_ab
);
247 gtk_widget_set_sensitive(whitelist_ab_select_btn
, !dillo_prefs
.local
&& dillo_prefs
.whitelist_ab
);
250 prefs_page
->local
= local_checkbox
;
251 prefs_page
->full
= full_checkbox
;
252 prefs_page
->whitelist_ab
= whitelist_ab_checkbtn
;
253 prefs_page
->whitelist_ab_folder_combo
= whitelist_ab_folder_combo
;
254 prefs_page
->whitelist_ab_select_btn
= whitelist_ab_select_btn
;
255 prefs_page
->page
.widget
= vbox
;
258 static void destroy_dillo_prefs_page(PrefsPage
*page
)
263 static void save_dillo_prefs(PrefsPage
*page
)
265 DilloBrowserPage
*prefs_page
= (DilloBrowserPage
*) page
;
267 gchar
*rc_file_path
= g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S
,
270 dillo_prefs
.local
= !gtk_toggle_button_get_active
271 (GTK_TOGGLE_BUTTON(prefs_page
->local
));
272 dillo_prefs
.full
= gtk_toggle_button_get_active
273 (GTK_TOGGLE_BUTTON(prefs_page
->full
));
275 dillo_prefs
.whitelist_ab
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prefs_page
->whitelist_ab
));
276 g_free(dillo_prefs
.whitelist_ab_folder
);
277 dillo_prefs
.whitelist_ab_folder
= gtk_editable_get_chars(
278 GTK_EDITABLE(gtk_bin_get_child(GTK_BIN((prefs_page
->whitelist_ab_folder_combo
)))), 0, -1);
279 /* store UNtranslated "Any" */
280 if (g_utf8_collate(dillo_prefs
.whitelist_ab_folder
, _("Any")) == 0) {
281 g_free(dillo_prefs
.whitelist_ab_folder
);
282 dillo_prefs
.whitelist_ab_folder
= g_strdup("Any");
285 pref_file
= prefs_write_open(rc_file_path
);
286 g_free(rc_file_path
);
289 (prefs_set_block_label(pref_file
, PREFS_BLOCK_NAME
) < 0))
292 if (prefs_write_param(param
, pref_file
->fp
) < 0) {
293 g_warning("failed to write Dillo plugin configuration");
294 prefs_file_close_revert(pref_file
);
298 if (fprintf(pref_file
->fp
, "\n") < 0) {
299 FILE_OP_ERROR(rc_file_path
, "fprintf");
300 prefs_file_close_revert(pref_file
);
302 prefs_file_close(pref_file
);