Fix two memory leaks around use of privacy_get_system_ids().
[claws.git] / src / prefs_common.c
1 /*
2  * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2016 Hiroyuki Yamamoto and the Claws Mail team
4  *
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.
9  *
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.
14  *
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/>.
17  */
18
19 #ifdef HAVE_CONFIG_H
20 #include "config.h"
21 #include "claws-features.h"
22 #endif
23
24 #include "defs.h"
25
26 #include <glib.h>
27 #include <glib/gi18n.h>
28 #include <gtk/gtk.h>
29 #include <gdk/gdkkeysyms.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <unistd.h>
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #include <errno.h>
37
38 #include "main.h"
39 #include "prefs_gtk.h"
40 #include "prefs_common.h"
41 #include "prefs_display_header.h"
42 #include "prefs_summary_column.h"
43 #include "prefs_folder_column.h"
44 #include "mainwindow.h"
45 #include "summaryview.h"
46 #include "folderview.h"
47 #include "messageview.h"
48 #include "manage_window.h"
49 #include "inc.h"
50 #include "menu.h"
51 #include "codeconv.h"
52 #include "utils.h"
53 #include "gtkutils.h"
54 #include "alertpanel.h"
55 #include "folder.h"
56 #include "socket.h"
57 #include "filesel.h"
58 #include "folderview.h"
59 #include "stock_pixmap.h"
60 #include "prefswindow.h"
61 #include "colorlabel.h"
62 #ifndef USE_ALT_ADDRBOOK
63         #include "addrcustomattr.h"
64 #endif
65
66 enum {
67         DATEFMT_FMT,
68         DATEFMT_TXT,
69         N_DATEFMT_COLUMNS
70 };
71
72 PrefsCommon prefs_common;
73
74 GtkWidget *notebook;
75
76 #ifdef G_OS_WIN32
77 /*
78  * In the Windows version prefs_common contains
79  *   - the non-OS-specific settings of the "Common" section and
80  *   - the OS-specific settings of the "CommonWin32" section
81  * The OS-specific settings of the "Common" section are not used
82  * but saved in prefs_unix.
83  */
84
85 #  define SPECIFIC_PREFS prefs_unix
86
87 static PrefsCommon prefs_unix;
88
89 static PrefParam param_os_specific[] = {
90         /* Receive */
91         {"ext_inc_path", "",
92          &prefs_common.extinc_cmd, P_STRING, NULL, NULL, NULL},
93         {"newmail_notify_cmd", "",
94          &prefs_common.newmail_notify_cmd, P_STRING, NULL, NULL, NULL},
95
96         /* new fonts */
97         {"message_font_gtk2",   "Monospace 9",
98          &prefs_common.textfont,                P_STRING, NULL, NULL, NULL},
99         {"print_font_gtk2",     "Monospace 9",
100          &prefs_common.printfont,               P_STRING, NULL, NULL, NULL},
101         {"small_font_gtk2",     "Sans 9",
102           &prefs_common.smallfont,              P_STRING, NULL, NULL, NULL},
103         {"normal_font_gtk2",    "Sans 9",
104           &prefs_common.normalfont,             P_STRING, NULL, NULL, NULL},
105         {"bold_font_gtk2",      "Sans 9 Bold",
106           &prefs_common.boldfont,               P_STRING, NULL, NULL, NULL},
107         /* Message */
108         {"attach_save_directory", NULL,
109          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
110         {"attach_load_directory", NULL,
111          &prefs_common.attach_load_dir, P_STRING, NULL, NULL, NULL},
112
113         /* MIME viewer */
114         {"mime_textviewer", NULL,
115          &prefs_common.mime_textviewer,   P_STRING, NULL, NULL, NULL},
116         {"mime_open_command", "notepad '%s'",
117          &prefs_common.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
118
119         /* Interface */
120         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
121          &prefs_common.pixmap_theme_path, P_STRING, NULL, NULL, NULL},
122 #ifdef HAVE_SVG
123         {"enable_alpha_svg", "TRUE",
124          &prefs_common.enable_alpha_svg, P_BOOL, NULL, NULL, NULL},
125         {"enable_pixmap_scaling", "TRUE",
126          &prefs_common.enable_pixmap_scaling, P_BOOL, NULL, NULL, NULL},
127         {"pixmap_scaling_auto", "TRUE",
128          &prefs_common.pixmap_scaling_auto, P_BOOL, NULL, NULL, NULL},
129         {"pixmap_scaling_ppi", "96",
130          &prefs_common.pixmap_scaling_ppi, P_INT, NULL, NULL, NULL},
131 #endif
132
133         /* Other */
134         {"ext_editor_command", "notepad %s",
135          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
136
137         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
138 };
139 #else
140 #  define SPECIFIC_PREFS prefs_common
141 #endif
142
143 /*
144    parameter name, default value, pointer to the prefs variable, data type,
145    pointer to the widget pointer,
146    pointer to the function for data setting,
147    pointer to the function for widget setting
148  */
149
150 static PrefParam param[] = {
151         {"config_version", "0",
152          &prefs_common.config_version, P_INT, NULL, NULL, NULL},
153
154         /* Receive */
155         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
156          NULL, NULL, NULL},
157         {"ext_inc_path", DEFAULT_INC_PATH, &SPECIFIC_PREFS.extinc_cmd, P_STRING,
158          NULL, NULL, NULL},
159
160         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
161          NULL, NULL, NULL},
162         {"autochk_interval", "600", &prefs_common.autochk_itv, P_INT,
163          NULL, NULL, NULL},
164         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
165          NULL, NULL, NULL},
166         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
167          P_BOOL, NULL, NULL, NULL},
168         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
169          P_BOOL, NULL, NULL, NULL},
170         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
171          P_BOOL, NULL, NULL, NULL},
172         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
173         P_BOOL, NULL, NULL, NULL},
174         {"newmail_notify_cmd", "", &SPECIFIC_PREFS.newmail_notify_cmd, P_STRING,
175          NULL, NULL, NULL},
176         {"receive_dialog_mode", "2", &prefs_common.recv_dialog_mode, P_ENUM,
177          NULL, NULL, NULL},
178         {"receivewin_width", "460", &prefs_common.receivewin_width, P_INT,
179          NULL, NULL, NULL},
180         {"receivewin_height", "-1", &prefs_common.receivewin_height, P_INT,
181          NULL, NULL, NULL},
182         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
183          P_BOOL, NULL, NULL, NULL},
184         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
185          P_BOOL, NULL, NULL, NULL},
186  
187         /* Send */
188         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
189          NULL, NULL, NULL},
190         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
191          P_BOOL, NULL, NULL, NULL},
192 #ifndef GENERIC_UMPC
193         {"send_dialog_mode", "0", &prefs_common.send_dialog_invisible, P_BOOL,
194          NULL, NULL, NULL},
195 #else
196         {"send_dialog_mode", "1", &prefs_common.send_dialog_invisible, P_BOOL,
197          NULL, NULL, NULL},
198 #endif
199         {"sendwin_width", "460", &prefs_common.sendwin_width, P_INT,
200          NULL, NULL, NULL},
201         {"sendwin_height", "-1", &prefs_common.sendwin_height, P_INT,
202          NULL, NULL, NULL},
203
204         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
205          NULL, NULL, NULL},
206         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
207          NULL, NULL, NULL},
208         {"outgoing_fallback_to_ascii", "TRUE", &prefs_common.outgoing_fallback_to_ascii, P_BOOL,
209          NULL, NULL, NULL},
210          {"rewrite_first_from", "TRUE", &prefs_common.rewrite_first_from,
211           P_BOOL, NULL, NULL, NULL},
212         {"warn_empty_subj", "TRUE", &prefs_common.warn_empty_subj,
213          P_BOOL, NULL, NULL, NULL},
214         {"warn_sending_many_recipients_num", "0", &prefs_common.warn_sending_many_recipients_num, P_INT,
215          NULL, NULL, NULL},
216         {"hide_timezone", "FALSE", &prefs_common.hide_timezone,
217          P_BOOL, NULL, NULL, NULL},
218         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
219          P_BOOL, NULL, NULL, NULL},
220
221         /* Compose */
222         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
223          NULL, NULL, NULL},
224         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
225          P_BOOL, NULL, NULL, NULL},
226         {"redirect_keep_from", "FALSE",
227          &prefs_common.redirect_keep_from, P_BOOL,
228          NULL, NULL, NULL},
229         {"undo_level", "50", &prefs_common.undolevels, P_INT,
230          NULL, NULL, NULL},
231         {"compose_with_format", "FALSE", &prefs_common.compose_with_format, P_BOOL,
232          NULL, NULL, NULL},
233         {"compose_subject_format", "",
234          &prefs_common.compose_subject_format, P_STRING, NULL, NULL, NULL},
235         {"compose_body_format", N_("Hello,\\n"),
236          &prefs_common.compose_body_format, P_STRING, NULL, NULL, NULL},
237         {"show_compose_margin", "FALSE", &prefs_common.show_compose_margin, P_BOOL,
238          NULL, NULL, NULL},
239         {"type_any_header", "FALSE", &prefs_common.type_any_header, P_BOOL,
240          NULL, NULL, NULL},
241         
242
243         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
244          NULL, NULL, NULL},
245         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
246          NULL, NULL, NULL},
247         {"linewrap_pastes", "TRUE", &prefs_common.linewrap_pastes, P_BOOL,
248          NULL, NULL, NULL},
249         {"primary_paste_unselects", "FALSE", &prefs_common.primary_paste_unselects, P_BOOL,
250          NULL, NULL, NULL},
251         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
252          NULL, NULL, NULL},
253         {"auto_indent", "TRUE", &prefs_common.auto_indent, P_BOOL,
254          NULL, NULL, NULL},
255         {"autosave", "TRUE", &prefs_common.autosave,
256          P_BOOL, NULL, NULL, NULL},
257         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
258          NULL, NULL, NULL},
259         {"autosave_encrypted", "FALSE", &prefs_common.autosave_encrypted,
260          P_BOOL, NULL, NULL, NULL},
261         {"warn_large_insert", "TRUE", &prefs_common.warn_large_insert,
262          P_BOOL, NULL, NULL, NULL},
263         {"warn_large_insert_size", "500", &prefs_common.warn_large_insert_size,
264          P_INT, NULL, NULL, NULL},
265
266         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
267          NULL, NULL, NULL},
268         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
269          NULL, NULL, NULL},
270         {"alt_dictionary",  "", &prefs_common.alt_dictionary, P_STRING,
271          NULL, NULL, NULL},
272         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
273          NULL, NULL, NULL},
274         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
275          NULL, NULL, NULL},
276         {"recheck_when_changing_dict", "TRUE", &prefs_common.recheck_when_changing_dict,
277          P_BOOL, NULL, NULL, NULL},
278         {"misspelled_color", "#ff0000", &prefs_common.misspelled_col, P_COLOR,
279          NULL, NULL, NULL},
280         {"use_both_dicts", "FALSE", &prefs_common.use_both_dicts, P_BOOL,
281          NULL, NULL, NULL},
282
283         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
284          NULL, NULL, NULL},
285         {"compose_dnd_insert_or_attach", "0", &prefs_common.compose_dnd_mode, P_ENUM,
286          NULL, NULL, NULL},
287
288         /* Account autoselection */
289         {"reply_account_autoselect", "TRUE",
290          &prefs_common.reply_account_autosel, P_BOOL,
291          NULL, NULL, NULL},
292         {"forward_account_autoselect", "TRUE",
293          &prefs_common.forward_account_autosel, P_BOOL,
294          NULL, NULL, NULL},
295         {"reedit_account_autoselect", "TRUE",
296          &prefs_common.reedit_account_autosel, P_BOOL,
297          NULL, NULL, NULL},
298
299         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
300          NULL, NULL, NULL},
301
302 #ifndef GENERIC_UMPC
303         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
304          NULL, NULL, NULL},
305 #else
306         {"show_ruler", "FALSE", &prefs_common.show_ruler, P_BOOL,
307          NULL, NULL, NULL},
308 #endif
309
310         /* Quote */
311         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
312          NULL, NULL, NULL},
313         {"reply_quote_format", N_("On %d\\n%f wrote:\\n\\n%q\\n%X"),
314          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
315
316         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
317          NULL, NULL, NULL},
318         {"forward_quote_format",
319          N_("\\n\\nBegin forwarded message:\\n\\n"
320          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
321          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M"),
322          &prefs_common.fw_quotefmt, P_STRING,
323          NULL, NULL, NULL},
324         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
325          NULL, NULL, NULL},
326
327         /* Display */
328         /* fonts */
329 #ifndef GENERIC_UMPC
330         {"message_font_gtk2",   "Monospace 9",
331          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
332         {"print_font_gtk2",     "Monospace 9",
333          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
334         {"small_font_gtk2",     "Sans 9",
335           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
336         {"normal_font_gtk2",    "Sans 9",
337           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
338         {"bold_font_gtk2",      "Sans Bold 9",
339           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
340 #else
341         {"message_font_gtk2",   "Monospace 8",
342          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
343         {"print_font_gtk2",     "Monospace 8",
344          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
345         {"small_font_gtk2",     "Sans 8",
346           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
347         {"normal_font_gtk2",    "Sans 8",
348           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
349         {"bold_font_gtk2",      "Sans Bold 8",
350           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
351 #endif
352
353         {"use_different_print_font", "FALSE", &prefs_common.use_different_print_font, P_BOOL,
354          NULL, NULL, NULL},
355         {"derive_from_normal_font", "TRUE", &prefs_common.derive_from_normal_font, P_BOOL,
356          NULL, NULL, NULL},
357
358         /* custom colors */
359         {"custom_color1", "#ff9900", &prefs_common.custom_colorlabel[0].color, P_COLOR,
360          NULL, NULL, NULL},
361         {"custom_colorlabel1", N_("Orange"), &prefs_common.custom_colorlabel[0].label, P_STRING,
362          NULL, NULL, NULL},
363         {"custom_color2", "#ff0000", &prefs_common.custom_colorlabel[1].color, P_COLOR,
364          NULL, NULL, NULL},
365         {"custom_colorlabel2", N_("Red"), &prefs_common.custom_colorlabel[1].label, P_STRING,
366          NULL, NULL, NULL},
367         {"custom_color3", "#ff66ff", &prefs_common.custom_colorlabel[2].color, P_COLOR,
368          NULL, NULL, NULL},
369         {"custom_colorlabel3", N_("Pink"), &prefs_common.custom_colorlabel[2].label, P_STRING,
370          NULL, NULL, NULL},
371         {"custom_color4", "#00ccff", &prefs_common.custom_colorlabel[3].color, P_COLOR,
372          NULL, NULL, NULL},
373         {"custom_colorlabel4", N_("Sky blue"), &prefs_common.custom_colorlabel[3].label, P_STRING,
374          NULL, NULL, NULL},
375         {"custom_color5", "#0000ff", &prefs_common.custom_colorlabel[4].color, P_COLOR,
376          NULL, NULL, NULL},
377         {"custom_colorlabel5", N_("Blue"), &prefs_common.custom_colorlabel[4].label, P_STRING,
378          NULL, NULL, NULL},
379         {"custom_color6", "#009900", &prefs_common.custom_colorlabel[5].color, P_COLOR,
380          NULL, NULL, NULL},
381         {"custom_colorlabel6", N_("Green"), &prefs_common.custom_colorlabel[5].label, P_STRING,
382          NULL, NULL, NULL},
383         {"custom_color7", "#663333", &prefs_common.custom_colorlabel[6].color, P_COLOR,
384          NULL, NULL, NULL},
385         {"custom_colorlabel7", N_("Brown"), &prefs_common.custom_colorlabel[6].label, P_STRING,
386          NULL, NULL, NULL},
387         {"custom_color8", "#aaaaaa", &prefs_common.custom_colorlabel[7].color, P_COLOR,
388          NULL, NULL, NULL},
389         {"custom_colorlabel8", N_("Grey"), &prefs_common.custom_colorlabel[7].label, P_STRING,
390          NULL, NULL, NULL},
391         {"custom_color9", "#c07254", &prefs_common.custom_colorlabel[8].color, P_COLOR,
392          NULL, NULL, NULL},
393         {"custom_colorlabel9", N_("Light brown"), &prefs_common.custom_colorlabel[8].label, P_STRING,
394          NULL, NULL, NULL},
395         {"custom_color10", "#c00000", &prefs_common.custom_colorlabel[9].color, P_COLOR,
396          NULL, NULL, NULL},
397         {"custom_colorlabel10", N_("Dark red"), &prefs_common.custom_colorlabel[9].label, P_STRING,
398          NULL, NULL, NULL},
399         {"custom_color11", "#cc1074", &prefs_common.custom_colorlabel[10].color, P_COLOR,
400          NULL, NULL, NULL},
401         {"custom_colorlabel11", N_("Dark pink"), &prefs_common.custom_colorlabel[10].label, P_STRING,
402          NULL, NULL, NULL},
403         {"custom_color12", "#5094cd", &prefs_common.custom_colorlabel[11].color, P_COLOR,
404          NULL, NULL, NULL},
405         {"custom_colorlabel12", N_("Steel blue"), &prefs_common.custom_colorlabel[11].label, P_STRING,
406          NULL, NULL, NULL},
407         {"custom_color13", "#ffd500", &prefs_common.custom_colorlabel[12].color, P_COLOR,
408          NULL, NULL, NULL},
409         {"custom_colorlabel13", N_("Gold"), &prefs_common.custom_colorlabel[12].label, P_STRING,
410          NULL, NULL, NULL},
411         {"custom_color14", "#00d800", &prefs_common.custom_colorlabel[13].color, P_COLOR,
412          NULL, NULL, NULL},
413         {"custom_colorlabel14", N_("Bright green"), &prefs_common.custom_colorlabel[13].label, P_STRING,
414          NULL, NULL, NULL},
415         {"custom_color15", "#c060c0", &prefs_common.custom_colorlabel[14].color, P_COLOR,
416          NULL, NULL, NULL},
417         {"custom_colorlabel15", N_("Magenta"), &prefs_common.custom_colorlabel[14].label, P_STRING,
418          NULL, NULL, NULL},
419
420         /* image viewer */
421         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
422          NULL, NULL, NULL},
423         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
424          NULL, NULL, NULL},
425         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
426          NULL, NULL, NULL},
427
428         {"display_folder_unread_num", "0",
429          &prefs_common.display_folder_unread, P_INT,
430          NULL, NULL, NULL},
431         {"newsgroup_abbrev_len", "16",
432          &prefs_common.ng_abbrev_len, P_INT,
433          NULL, NULL, NULL},
434
435         {"translate_header", "FALSE", &prefs_common.trans_hdr, P_BOOL,
436          NULL, NULL, NULL},
437
438         /* Display: Summary View */
439         {"default_sort_key", "3", &prefs_common.default_sort_key, P_ENUM,
440          NULL, NULL, NULL},
441         {"default_sort_type", "1", &prefs_common.default_sort_type, P_ENUM,
442          NULL, NULL, NULL},
443         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
444          NULL, NULL, NULL},
445         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
446          NULL, NULL, NULL},
447         {"date_format", N_("%x(%a) %H:%M"), &prefs_common.date_format,
448          P_STRING, NULL, NULL, NULL},
449         {"msgview_date_format", "FALSE", &prefs_common.msgview_date_format, P_BOOL,
450          NULL, NULL, NULL},
451
452         {"next_on_delete", "FALSE", &prefs_common.next_on_delete, P_BOOL,
453          NULL, NULL, NULL},
454
455          {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
456          NULL, NULL, NULL},
457
458         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
459          NULL, NULL, NULL},
460 #ifndef GENERIC_UMPC
461         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
462          NULL, NULL, NULL},
463 #else
464         {"toolbar_style", "1", &prefs_common.toolbar_style, P_ENUM,
465          NULL, NULL, NULL},
466 #endif
467         {"toolbar_detachable", "FALSE", &prefs_common.toolbar_detachable, P_BOOL,
468          NULL, NULL, NULL},
469         {"show_col_headers", "TRUE", &prefs_common.show_col_headers, P_BOOL,
470          NULL, NULL, NULL},
471 #ifndef GENERIC_UMPC
472         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
473          NULL, NULL, NULL},
474         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
475          NULL, NULL, NULL},
476 #else
477         {"show_statusbar", "FALSE", &prefs_common.show_statusbar, P_BOOL,
478          NULL, NULL, NULL},
479         {"show_searchbar", "FALSE", &prefs_common.show_searchbar, P_BOOL,
480          NULL, NULL, NULL},
481 #endif
482
483         {"summary_col_show_mark", "TRUE",
484          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
485         {"summary_col_show_unread", "TRUE",
486          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
487         {"summary_col_show_subject", "TRUE",
488          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
489         {"summary_col_show_from", "TRUE",
490          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
491         {"summary_col_show_to", "FALSE",
492          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
493         {"summary_col_show_date", "TRUE",
494          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
495         {"summary_col_show_mime", "TRUE",
496          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
497         {"summary_col_show_size", "TRUE",
498          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
499         {"summary_col_show_number", "FALSE",
500          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
501         {"summary_col_show_score", "FALSE",
502          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
503         {"summary_col_show_locked", "FALSE",
504          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
505         {"summary_col_show_tags", "FALSE",
506          &prefs_common.summary_col_visible[S_COL_TAGS], P_BOOL, NULL, NULL, NULL},
507
508         {"summary_col_pos_mark", "0",
509           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
510         {"summary_col_pos_unread", "1",
511           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
512         {"summary_col_pos_mime", "2",
513           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
514         {"summary_col_pos_subject", "3",
515           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
516         {"summary_col_pos_from", "4",
517           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
518         {"summary_col_pos_date", "5",
519           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
520         {"summary_col_pos_size", "6",
521           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
522         {"summary_col_pos_number", "7",
523           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
524         {"summary_col_pos_score", "8",
525          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
526         {"summary_col_pos_locked", "9",
527          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
528         {"summary_col_pos_to", "10",
529           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
530         {"summary_col_pos_tags", "11",
531           &prefs_common.summary_col_pos[S_COL_TAGS], P_INT, NULL, NULL, NULL},
532
533         {"summary_col_size_mark", "10",
534          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
535         {"summary_col_size_unread", "13",
536          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
537         {"summary_col_size_mime", "10",
538          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
539 #ifndef GENERIC_UMPC
540         {"summary_col_size_subject", "200",
541          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
542         {"summary_col_size_from", "120",
543          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
544         {"summary_col_size_to", "120",
545          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
546 #else
547         {"summary_col_size_subject", "300",
548          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
549         {"summary_col_size_from", "150",
550          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
551         {"summary_col_size_to", "150",
552          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
553
554 #endif
555         {"summary_col_size_date", "118",
556          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
557         {"summary_col_size_size", "45",
558          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
559         {"summary_col_size_number", "40",
560          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
561         {"summary_col_size_score", "40",
562          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
563         {"summary_col_size_locked", "13",
564          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
565         {"summary_col_size_tags", "150",
566          &prefs_common.summary_col_size[S_COL_TAGS], P_INT, NULL, NULL, NULL},
567
568         /* Widget size */
569         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
570          NULL, NULL, NULL},
571         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
572          NULL, NULL, NULL},
573         {"folderview_width", "270", &prefs_common.folderview_width, P_INT,
574          NULL, NULL, NULL},
575         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
576          NULL, NULL, NULL},
577         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
578          NULL, NULL, NULL},
579
580         {"folder_col_show_folder", "TRUE",
581          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
582         {"folder_col_show_new", "TRUE",
583          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
584         {"folder_col_show_unread", "TRUE",
585          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
586         {"folder_col_show_total", "TRUE",
587          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
588
589         {"folder_col_pos_folder", "0",
590          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
591         {"folder_col_pos_new", "1",
592          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
593         {"folder_col_pos_unread", "2",
594          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
595         {"folder_col_pos_total", "3",
596          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
597
598 #ifndef GENERIC_UMPC
599         {"folder_col_size_folder", "120",
600          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
601         {"folder_col_size_new", "32",
602          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
603         {"folder_col_size_unread", "32",
604          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
605         {"folder_col_size_total", "32",
606          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
607 #else
608         {"folder_col_size_folder", "400",
609          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
610         {"folder_col_size_new", "32",
611          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
612         {"folder_col_size_unread", "32",
613          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
614         {"folder_col_size_total", "32",
615          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
616 #endif
617         {"summaryview_width", "500", &prefs_common.summaryview_width, P_INT,
618          NULL, NULL, NULL},
619         {"summaryview_height", "244", &prefs_common.summaryview_height, P_INT,
620          NULL, NULL, NULL},
621
622         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
623          NULL, NULL, NULL},
624         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
625          NULL, NULL, NULL},
626         {"messageview_width", "500", &prefs_common.msgview_width, P_INT,
627          NULL, NULL, NULL},
628         {"messageview_height", "213", &prefs_common.msgview_height, P_INT,
629          NULL, NULL, NULL},
630         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
631          NULL, NULL, NULL},
632
633         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
634          NULL, NULL, NULL},
635         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
636          NULL, NULL, NULL},
637         {"mainview_width", "500", &prefs_common.mainview_width, P_INT,
638          NULL, NULL, NULL},
639         {"mainview_height", "400", &prefs_common.mainview_height, P_INT,
640          NULL, NULL, NULL},
641         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
642          NULL, NULL, NULL},
643         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
644          NULL, NULL, NULL},
645         {"mainwin_maximised", "FALSE", &prefs_common.mainwin_maximised, P_BOOL,
646          NULL, NULL, NULL},
647         {"mainwin_fullscreen", "FALSE", &prefs_common.mainwin_fullscreen, P_BOOL,
648          NULL, NULL, NULL},
649         {"mainwin_menubar", "TRUE", &prefs_common.mainwin_menubar, P_BOOL,
650          NULL, NULL, NULL},
651 #ifndef GENERIC_UMPC
652         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
653          NULL, NULL, NULL},
654         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
655          NULL, NULL, NULL},
656         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
657          NULL, NULL, NULL},
658         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
659          NULL, NULL, NULL},
660         {"mimeview_tree_height", "60", &prefs_common.mimeview_tree_height, P_INT,
661          NULL, NULL, NULL},      
662         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
663          NULL, NULL, NULL},
664         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
665          NULL, NULL, NULL},
666         {"compose_width", "600", &prefs_common.compose_width, P_INT,
667          NULL, NULL, NULL},
668         {"compose_height", "560", &prefs_common.compose_height, P_INT,
669          NULL, NULL, NULL},
670 #else
671         {"mainwin_width", "700", &prefs_common.mainwin_width, P_INT,
672          NULL, NULL, NULL},
673         {"mainwin_height", "470", &prefs_common.mainwin_height, P_INT,
674          NULL, NULL, NULL},
675         {"messagewin_width", "700", &prefs_common.msgwin_width, P_INT,
676          NULL, NULL, NULL},
677         {"messagewin_height", "470", &prefs_common.msgwin_height, P_INT,
678          NULL, NULL, NULL},
679         {"sourcewin_width", "700", &prefs_common.sourcewin_width, P_INT,
680          NULL, NULL, NULL},
681         {"sourcewin_height", "470", &prefs_common.sourcewin_height, P_INT,
682          NULL, NULL, NULL},
683         {"compose_width", "700", &prefs_common.compose_width, P_INT,
684          NULL, NULL, NULL},
685         {"compose_height", "470", &prefs_common.compose_height, P_INT,
686          NULL, NULL, NULL},
687 #endif
688         {"compose_notebook_height", "130", &prefs_common.compose_notebook_height, P_INT,
689          NULL, NULL, NULL},
690         {"compose_x", "0", &prefs_common.compose_x, P_INT,
691          NULL, NULL, NULL},
692         {"compose_y", "0", &prefs_common.compose_y, P_INT,
693          NULL, NULL, NULL},
694         /* Message */
695         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
696          NULL, NULL, NULL},
697
698         {"quote_level1_color", "#0000b3", &prefs_common.quote_level1_col, P_COLOR,
699          NULL, NULL, NULL},
700         {"quote_level2_color", "#0000b3", &prefs_common.quote_level2_col, P_COLOR,
701          NULL, NULL, NULL},
702         {"quote_level3_color", "#0000b3", &prefs_common.quote_level3_col, P_COLOR,
703          NULL, NULL, NULL},
704         {"enable_bgcolor", "FALSE", &prefs_common.enable_bgcolor, P_BOOL,
705          NULL, NULL, NULL},
706         {"quote_level1_bgcolor", "#cccccc", &prefs_common.quote_level1_bgcol, P_COLOR,
707          NULL, NULL, NULL},
708         {"quote_level2_bgcolor", "#d4d4d4", &prefs_common.quote_level2_bgcol, P_COLOR,
709          NULL, NULL, NULL},
710         {"quote_level3_bgcolor", "#dddddd", &prefs_common.quote_level3_bgcol, P_COLOR,
711          NULL, NULL, NULL},
712         {"uri_color", "#007f00", &prefs_common.uri_col, P_COLOR,
713          NULL, NULL, NULL},
714         {"emphasis_color", "#0000cf", &prefs_common.emphasis_col, P_COLOR,
715          NULL, NULL, NULL},
716         {"target_folder_color", "#da1cca", &prefs_common.tgt_folder_col, P_COLOR,
717          NULL, NULL, NULL},
718         {"signature_color", "#797979", &prefs_common.signature_col, P_COLOR,
719          NULL, NULL, NULL},
720         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
721          P_BOOL, NULL, NULL, NULL},
722
723         {"default_header_color", "#000000", &prefs_common.default_header_color, P_COLOR,
724          NULL, NULL, NULL},
725         {"default_header_bgcolor", "#f5f6be", &prefs_common.default_header_bgcolor, P_COLOR,
726          NULL, NULL, NULL},
727         {"tags_color", "#000000", &prefs_common.tags_color, P_COLOR,
728          NULL, NULL, NULL},
729         {"tags_bgcolor", "#f5f6be", &prefs_common.tags_bgcolor, P_COLOR,
730          NULL, NULL, NULL},
731         {"qs_active_color", "#000000", &prefs_common.qs_active_color, P_COLOR,
732          NULL, NULL, NULL},
733         {"qs_active_bgcolor", "#f5f6be", &prefs_common.qs_active_bgcolor, P_COLOR,
734          NULL, NULL, NULL},
735         {"qs_error_color", "#000000", &prefs_common.qs_error_color, P_COLOR,
736          NULL, NULL, NULL},
737         {"qs_error_bgcolor", "#ff7070", &prefs_common.qs_error_bgcolor, P_COLOR,
738          NULL, NULL, NULL},
739
740         {"display_header_pane", "FALSE", &prefs_common.display_header_pane,
741          P_BOOL, NULL, NULL, NULL},
742         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
743          NULL, NULL, NULL},
744         {"display_xface", "TRUE", &prefs_common.display_xface,
745          P_BOOL, NULL, NULL, NULL},
746         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
747          NULL, NULL, NULL},
748         {"invoke_plugin_on_html", "FALSE", &prefs_common.invoke_plugin_on_html, P_BOOL,
749          NULL, NULL, NULL},
750         {"promote_html_part", "FALSE", &prefs_common.promote_html_part, P_BOOL,
751          NULL, NULL, NULL},
752         {"line_space", "2", &prefs_common.line_space, P_INT,
753          NULL, NULL, NULL},
754         {"never_send_retrcpt", "FALSE", &prefs_common.never_send_retrcpt, P_BOOL,
755          NULL, NULL, NULL},
756
757         {"enable_smooth_scroll", "FALSE",
758          &prefs_common.enable_smooth_scroll, P_BOOL,
759          NULL, NULL, NULL},
760         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
761          NULL, NULL, NULL},
762         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
763          NULL, NULL, NULL},
764         {"hide_quoted", "TRUE",
765          &prefs_common.hide_quoted, P_BOOL,
766          NULL, NULL, NULL},
767         {"respect_flowed_format", "FALSE", &prefs_common.respect_flowed_format, P_BOOL,
768          NULL, NULL, NULL},
769         {"show_all_headers", "FALSE", &prefs_common.show_all_headers, P_BOOL,
770          NULL, NULL, NULL},
771
772         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
773          NULL, NULL, NULL},
774
775         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
776          NULL, NULL, NULL},
777         {"attach_save_directory", NULL,
778          &SPECIFIC_PREFS.attach_save_dir, P_STRING, NULL, NULL, NULL},
779         {"attach_load_directory", NULL,
780          &SPECIFIC_PREFS.attach_load_dir, P_STRING, NULL, NULL, NULL},
781
782         /* MIME viewer */
783         {"mime_textviewer",   NULL,
784          &SPECIFIC_PREFS.mime_textviewer,   P_STRING, NULL, NULL, NULL},
785         {"mime_open_command", "xdg-open '%s'",
786          &SPECIFIC_PREFS.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
787         {"show_inline_attachments", "TRUE", 
788          &prefs_common.show_inline_attachments, P_BOOL, NULL, NULL, NULL},
789
790         /* Interface */
791 #ifndef GENERIC_UMPC
792         {"layout_mode", "0", &prefs_common.layout_mode, P_INT,
793          NULL, NULL, NULL},
794 #else
795         {"layout_mode", "5", &prefs_common.layout_mode, P_INT,
796          NULL, NULL, NULL},
797 #endif
798         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
799          NULL, NULL, NULL}, */
800         {"open_selected_message_on_folder_open", "FALSE",
801          &prefs_common.open_selected_on_folder_open,
802          P_BOOL, NULL, NULL, NULL},
803         {"open_selected_message_on_search_results", "FALSE",
804          &prefs_common.open_selected_on_search_results,
805          P_BOOL, NULL, NULL, NULL},
806         {"open_selected_message_on_prevnext", "FALSE",
807          &prefs_common.open_selected_on_prevnext,
808          P_BOOL, NULL, NULL, NULL},
809         {"open_selected_message_on_deletemove", "FALSE",
810          &prefs_common.open_selected_on_deletemove,
811          P_BOOL, NULL, NULL, NULL},
812         {"open_selected_message_on_directional", "FALSE",
813          &prefs_common.open_selected_on_directional,
814          P_BOOL, NULL, NULL, NULL},
815         {"always_show_message_when_selected", "FALSE",
816          &prefs_common.always_show_msg,
817          P_BOOL, NULL, NULL, NULL},
818         {"select_on_entry", "3", &prefs_common.select_on_entry,
819          P_ENUM, NULL, NULL, NULL},
820         {"show_tooltips", "TRUE", &prefs_common.show_tooltips,
821          P_BOOL, NULL, NULL, NULL},
822
823         /* do it SUMMARY_OPEN_ACTIONS-1 times */
824         {"summary_select_prio1", "0", &prefs_common.summary_select_prio[0], P_ENUM,
825          NULL, NULL, NULL},
826         {"summary_select_prio2", "0", &prefs_common.summary_select_prio[1], P_ENUM,
827          NULL, NULL, NULL},
828         {"summary_select_prio3", "0", &prefs_common.summary_select_prio[2], P_ENUM,
829          NULL, NULL, NULL},
830         {"summary_select_prio4", "0", &prefs_common.summary_select_prio[3], P_ENUM,
831          NULL, NULL, NULL},
832         {"summary_select_prio5", "0", &prefs_common.summary_select_prio[4], P_ENUM,
833          NULL, NULL, NULL},
834         {"summary_select_prio6", "0", &prefs_common.summary_select_prio[5], P_ENUM,
835          NULL, NULL, NULL},
836         {"summary_select_prio7", "0", &prefs_common.summary_select_prio[6], P_ENUM,
837          NULL, NULL, NULL},
838
839         {"mark_as_read_on_new_window", "FALSE",
840          &prefs_common.mark_as_read_on_new_window,
841          P_BOOL, NULL, NULL, NULL},
842         {"mark_as_read_delay", "0",
843          &prefs_common.mark_as_read_delay, P_INT, 
844          NULL, NULL, NULL},
845         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
846          NULL, NULL, NULL},
847         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
848          NULL, NULL, NULL},
849         {"summary_from_show", "0", &prefs_common.summary_from_show, P_ENUM,
850          NULL, NULL, NULL},
851
852         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
853          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
854          NULL, NULL, NULL},
855 #ifdef HAVE_SVG
856         {"enable_alpha_svg", "TRUE",
857          &SPECIFIC_PREFS.enable_alpha_svg, P_BOOL,
858          NULL, NULL, NULL},
859         {"enable_pixmap_scaling", "TRUE",
860          &SPECIFIC_PREFS.enable_pixmap_scaling, P_BOOL,
861          NULL, NULL, NULL},
862         {"pixmap_scaling_auto", "TRUE",
863          &SPECIFIC_PREFS.pixmap_scaling_auto, P_BOOL,
864          NULL, NULL, NULL},
865         {"pixmap_scaling_ppi", "96",
866          &SPECIFIC_PREFS.pixmap_scaling_ppi, P_INT,
867          NULL, NULL, NULL},
868 #endif
869
870         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
871          NULL, NULL, NULL},
872
873         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
874          NULL, NULL, NULL},
875         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
876          NULL, NULL, NULL},
877
878         /* Addressbook */
879         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
880          P_BOOL, NULL, NULL, NULL},
881         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
882          P_INT, NULL, NULL, NULL},
883         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
884          P_INT, NULL, NULL, NULL},
885
886         /* Other */
887 #ifndef G_OS_WIN32
888         {"uri_open_command", DEFAULT_BROWSER_CMD,
889          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
890 #else
891         {"gtk_theme", DEFAULT_W32_GTK_THEME,
892          &SPECIFIC_PREFS.gtk_theme, P_STRING, NULL, NULL, NULL},
893 #endif
894         {"ext_editor_command", DEFAULT_EDITOR_CMD,
895          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
896         {"cmds_use_system_default", "TRUE",
897          &prefs_common.cmds_use_system_default, P_BOOL, NULL, NULL, NULL},
898         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
899          P_BOOL, NULL, NULL, NULL},
900         {"session_passwords", "FALSE", &prefs_common.session_passwords,
901          P_BOOL, NULL, NULL, NULL},
902         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
903          NULL, NULL, NULL},
904         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
905          NULL, NULL, NULL},
906         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
907          NULL, NULL, NULL},
908         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
909          P_BOOL, NULL, NULL, NULL},
910         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
911          NULL, NULL, NULL},
912         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
913          NULL, NULL, NULL},
914 #ifndef GENERIC_UMPC
915         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
916          NULL, NULL, NULL},
917 #else
918         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
919          NULL, NULL, NULL},
920 #endif
921
922 #if defined(__OpenBSD__)
923         {"io_timeout_secs", "80", &prefs_common.io_timeout_secs,
924          P_INT, NULL, NULL, NULL},
925 #else
926         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
927          P_INT, NULL, NULL, NULL},
928 #endif
929         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
930          NULL, NULL, NULL},
931         {"important_score", "1", &prefs_common.important_score, P_INT,
932          NULL, NULL, NULL},
933
934         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
935          NULL, NULL, NULL},
936         {"log_length", "500", &prefs_common.loglength, P_INT,
937          NULL, NULL, NULL},
938 #ifndef GENERIC_UMPC
939         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
940          NULL, NULL, NULL},
941         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
942          NULL, NULL, NULL},
943         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
944          NULL, NULL, NULL},
945         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
946          NULL, NULL, NULL},
947 #else
948         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
949          NULL, NULL, NULL},
950         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
951          NULL, NULL, NULL},
952         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
953          NULL, NULL, NULL},
954         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
955          NULL, NULL, NULL},
956 #endif
957         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
958          NULL, NULL, NULL},
959         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
960          NULL, NULL, NULL},
961         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
962          NULL, NULL, NULL},
963         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
964          NULL, NULL, NULL},
965         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
966          NULL, NULL, NULL},
967         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
968          NULL, NULL, NULL},
969         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
970          NULL, NULL, NULL},
971         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
972          NULL, NULL, NULL},
973
974     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
975          NULL, NULL, NULL},
976     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
977          NULL, NULL, NULL},
978     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
979          NULL, NULL, NULL},
980     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
981          NULL, NULL, NULL},
982     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
983          NULL, NULL, NULL},
984     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
985          NULL, NULL, NULL},
986     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
987          NULL, NULL, NULL},
988     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
989          NULL, NULL, NULL},
990         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
991          NULL, NULL, NULL},
992
993         {"gtk_can_change_accels", "FALSE", &prefs_common.gtk_can_change_accels, P_BOOL,
994          NULL, NULL, NULL},
995
996         {"color_new", "#0000b3", &prefs_common.color_new, P_COLOR,
997          NULL, NULL, NULL},
998
999         /* Some windows' sizes */
1000         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
1001          NULL, NULL, NULL},
1002         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
1003          NULL, NULL, NULL},
1004
1005         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
1006          NULL, NULL, NULL},
1007         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
1008          NULL, NULL, NULL},
1009
1010         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
1011          NULL, NULL, NULL},
1012         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
1013          NULL, NULL, NULL},
1014
1015         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
1016          NULL, NULL, NULL},
1017         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
1018          NULL, NULL, NULL},
1019
1020         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
1021          NULL, NULL, NULL},
1022         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
1023          NULL, NULL, NULL},
1024
1025         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
1026          NULL, NULL, NULL},
1027         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
1028          NULL, NULL, NULL},
1029
1030         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
1031          NULL, NULL, NULL},
1032         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
1033          NULL, NULL, NULL},
1034
1035         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
1036          NULL, NULL, NULL},
1037         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
1038          NULL, NULL, NULL},
1039
1040         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
1041          NULL, NULL, NULL},
1042         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
1043          NULL, NULL, NULL},
1044
1045         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
1046          NULL, NULL, NULL},
1047         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
1048          NULL, NULL, NULL},
1049
1050         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
1051          NULL, NULL, NULL},
1052         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
1053          NULL, NULL, NULL},
1054
1055         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
1056          NULL, NULL, NULL},
1057         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
1058          NULL, NULL, NULL},
1059
1060         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
1061          NULL, NULL, NULL},
1062
1063         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
1064          NULL, NULL, NULL},
1065         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
1066          NULL, NULL, NULL},
1067
1068         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
1069          NULL, NULL, NULL},
1070         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
1071          NULL, NULL, NULL},
1072
1073         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
1074          NULL, NULL, NULL},
1075         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
1076          NULL, NULL, NULL},
1077
1078         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
1079          NULL, NULL, NULL},
1080         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
1081          NULL, NULL, NULL},
1082
1083         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
1084          NULL, NULL, NULL},
1085         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
1086          NULL, NULL, NULL},
1087
1088         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
1089          NULL, NULL, NULL},
1090         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
1091          NULL, NULL, NULL},
1092
1093         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
1094          NULL, NULL, NULL},
1095         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
1096          NULL, NULL, NULL},
1097
1098         {"aboutwin_width", "450", &prefs_common.aboutwin_width, P_INT,
1099          NULL, NULL, NULL},
1100         {"aboutwin_height", "500", &prefs_common.aboutwin_height, P_INT,
1101          NULL, NULL, NULL},
1102
1103         {"addrgather_width", "450", &prefs_common.addrgather_width, P_INT,
1104          NULL, NULL, NULL},
1105         {"addrgather_height", "-1", &prefs_common.addrgather_height, P_INT,
1106          NULL, NULL, NULL},
1107
1108         {"news_subscribe_width", "450", &prefs_common.news_subscribe_width, P_INT,
1109          NULL, NULL, NULL},
1110         {"news_subscribe_height", "400", &prefs_common.news_subscribe_height, P_INT,
1111          NULL, NULL, NULL},
1112
1113         /* Hidden */
1114         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
1115          NULL, NULL, NULL},
1116         {"utf8_instead_of_locale_for_broken_mail", "0", 
1117          &prefs_common.broken_are_utf8, P_INT,
1118          NULL, NULL, NULL},
1119         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
1120          NULL, NULL, NULL},
1121         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
1122          NULL, NULL, NULL},
1123         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
1124          NULL, NULL, NULL},
1125         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
1126          NULL, NULL, NULL},
1127         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
1128          NULL, NULL, NULL},
1129         {"folderview_vscrollbar_policy", "0",
1130          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1131          NULL, NULL, NULL},
1132         {"textview_cursor_visible", "FALSE",
1133          &prefs_common.textview_cursor_visible, P_BOOL,
1134          NULL, NULL, NULL},
1135         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1136          NULL, NULL, NULL},
1137 #ifndef GENERIC_UMPC
1138         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1139          NULL, NULL, NULL},
1140         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1141          NULL, NULL, NULL},
1142 #else
1143         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1144          NULL, NULL, NULL},
1145         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1146          NULL, NULL, NULL},
1147 #endif
1148         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1149         P_INT, NULL, NULL, NULL },
1150         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1151         P_STRING, NULL, NULL, NULL },
1152         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1153         P_BOOL, NULL, NULL, NULL },
1154         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1155          NULL, NULL, NULL},
1156         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1157          NULL, NULL, NULL},
1158         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1159          NULL, NULL, NULL},
1160         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1161          NULL, NULL, NULL},
1162         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1163          NULL, NULL, NULL},
1164         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1165          NULL, NULL, NULL},
1166         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1167          NULL, NULL, NULL},
1168         {"save_parts_readwrite", "FALSE", &prefs_common.save_parts_readwrite, P_BOOL,
1169          NULL, NULL, NULL},
1170         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1171          NULL, NULL, NULL},
1172         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1173          NULL, NULL, NULL},
1174 #ifndef GENERIC_UMPC
1175         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1176          NULL, NULL, NULL},
1177 #else
1178         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1179          NULL, NULL, NULL},
1180 #endif
1181
1182         {"print_paper_type", NULL, &prefs_common.print_paper_type, P_STRING,
1183          NULL, NULL, NULL},
1184         {"print_paper_orientation", "0", &prefs_common.print_paper_orientation, P_INT,
1185          NULL, NULL, NULL},
1186         {"print_margin_top", "-1", &prefs_common.print_margin_top, P_INT,
1187          NULL, NULL, NULL},
1188         {"print_margin_bottom", "-1", &prefs_common.print_margin_bottom, P_INT,
1189          NULL, NULL, NULL},
1190         {"print_margin_left", "-1", &prefs_common.print_margin_left, P_INT,
1191          NULL, NULL, NULL},
1192         {"print_margin_right", "-1", &prefs_common.print_margin_right, P_INT,
1193          NULL, NULL, NULL},
1194         {"print_use_color", "0", &prefs_common.print_use_color, P_INT,
1195          NULL, NULL, NULL},
1196         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1197          NULL, NULL, NULL},
1198         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1199          NULL, NULL, NULL},
1200         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1201          NULL, NULL, NULL},
1202         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1203          NULL, NULL, NULL},
1204         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1205          NULL, NULL, NULL},
1206         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1207          NULL, NULL, NULL},
1208         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1209          NULL, NULL, NULL},
1210         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1211          NULL, NULL, NULL},
1212
1213         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1214         P_BOOL, NULL, NULL, NULL },
1215
1216         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1217          NULL, NULL, NULL},
1218
1219         {"flush_metadata", "TRUE", &prefs_common.flush_metadata, P_BOOL,
1220          NULL, NULL, NULL},
1221
1222         {"nav_history_length", "50", &prefs_common.nav_history_length, P_INT,
1223          NULL, NULL, NULL},
1224
1225         {"diff_added_color", "#008b8b", &prefs_common.diff_added_color, P_COLOR,
1226          NULL, NULL, NULL},
1227         {"diff_deleted_color", "#6a5acd", &prefs_common.diff_deleted_color, P_COLOR,
1228          NULL, NULL, NULL},
1229         {"diff_hunk_color", "#a52a2a", &prefs_common.diff_hunk_color, P_COLOR,
1230          NULL, NULL, NULL},
1231
1232         {"folder_search_wildcard", "TRUE", &prefs_common.folder_search_wildcard, P_BOOL,
1233          NULL, NULL, NULL},
1234         {"address_search_wildcard", "TRUE", &prefs_common.address_search_wildcard, P_BOOL,
1235          NULL, NULL, NULL},
1236         {"enable_avatars", "3", &prefs_common.enable_avatars, P_INT, NULL, NULL, NULL},
1237 #ifndef PASSWORD_CRYPTO_OLD
1238         {"use_master_passphrase", FALSE, &prefs_common.use_master_passphrase, P_BOOL, NULL, NULL, NULL },
1239         {"master_passphrase", "", &prefs_common.master_passphrase, P_STRING, NULL, NULL, NULL },
1240         {"master_passphrase_salt", "", &prefs_common.master_passphrase_salt, P_STRING, NULL, NULL, NULL },
1241         {"master_passphrase_pbkdf2_rounds", "50000", &prefs_common.master_passphrase_pbkdf2_rounds, P_INT, NULL, NULL, NULL},
1242 #endif
1243
1244         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1245 };
1246
1247 /*
1248  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1249  * Fallback to default_list if history file is not found
1250  */
1251 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1252                                                                                                                           GList *default_list)
1253 {
1254         FILE *fp;
1255         gchar *path;
1256         gchar buf[PREFSBUFSIZE];
1257         GList *tmp = NULL;
1258
1259         if (dirname) {
1260                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1261                                    G_DIR_SEPARATOR_S, history,
1262                                    NULL);
1263         } else {
1264         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1265                            NULL);
1266         }
1267         if ((fp = g_fopen(path, "rb")) == NULL) {
1268                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1269                 g_free(path);
1270                 /* returns default list if set, otherwise NULL */
1271                 return default_list;
1272         }
1273         g_free(path);
1274         while (fgets(buf, sizeof(buf), fp) != NULL) {
1275                 g_strstrip(buf);
1276                 if (buf[0] == '\0') continue;
1277                 tmp = add_history(tmp, buf);
1278         }
1279         fclose(fp);
1280
1281         tmp = g_list_reverse(tmp);
1282
1283         return tmp;
1284 }
1285
1286 /*
1287  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1288  */
1289 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1290 {
1291         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1292 }
1293
1294 /*
1295  * Read history list from the specified history file
1296  */
1297 static GList *prefs_common_read_history(const gchar *history) 
1298 {
1299         return prefs_common_read_history_from_dir(NULL, history);
1300 }
1301
1302 void prefs_common_read_config(void)
1303 {
1304         gchar *rcpath;
1305         gchar *tmp;
1306
1307         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1308         prefs_read_config(param, "Common", rcpath, NULL);
1309 #ifdef G_OS_WIN32
1310         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1311 #endif
1312
1313         g_free(rcpath);
1314
1315         tmp = g_strdup(gettext(prefs_common.date_format));
1316         g_free(prefs_common.date_format);
1317         prefs_common.date_format = tmp;
1318
1319         prefs_common.mime_open_cmd_history =
1320                 prefs_common_read_history(COMMAND_HISTORY);
1321         prefs_common.summary_quicksearch_history =
1322                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1323         prefs_common.summary_search_from_history =
1324                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1325         prefs_common.summary_search_to_history =
1326                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1327         prefs_common.summary_search_subject_history =
1328                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1329         prefs_common.summary_search_body_history =
1330                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1331         prefs_common.summary_search_adv_condition_history =
1332                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1333         prefs_common.message_search_history =
1334                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1335         prefs_common.compose_save_to_history =
1336                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1337 #ifndef USE_ALT_ADDRBOOK
1338         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1339 #endif
1340         colorlabel_update_colortable_from_prefs();
1341 }
1342
1343 #define TRY(func) \
1344 if (!(func)) \
1345 { \
1346         g_warning("failed to write"); \
1347         goto out;                       \
1348 } \
1349
1350 /*
1351  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1352  */
1353 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1354 {
1355         GList *cur;
1356         FILE *fp;
1357         gchar *path, *tmp_path;
1358
1359         if (dirname) {
1360                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1361                                    G_DIR_SEPARATOR_S, history,
1362                                    NULL);
1363         } else {
1364         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1365                            NULL);
1366         }
1367         tmp_path = g_strconcat(path, ".tmp", NULL);
1368
1369         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1370                 FILE_OP_ERROR(tmp_path, "fopen");
1371                 goto out;
1372         }
1373
1374         for (cur = list; cur != NULL; cur = cur->next) {
1375                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1376                     fputc('\n', fp) != EOF);
1377         }
1378
1379         if (fclose(fp) == EOF) {
1380                 FILE_OP_ERROR(tmp_path, "fclose");
1381                 fp = NULL;
1382                 goto out;
1383         }
1384         fp = NULL;
1385 #ifdef G_OS_WIN32
1386         claws_unlink(path);
1387 #endif
1388         if (g_rename(tmp_path, path) < 0) {
1389                 FILE_OP_ERROR(path, "rename");
1390                 goto out;
1391         }
1392
1393 out:
1394         if (fp)
1395                 fclose(fp);
1396         g_free(tmp_path);
1397         g_free(path);
1398 }
1399
1400 /*
1401  * Save history list to the specified history file
1402  */
1403 static void prefs_common_save_history(const gchar *history, GList *list)
1404 {
1405         prefs_common_save_history_to_dir(NULL, history, list);
1406 }
1407
1408 #undef TRY
1409
1410 void prefs_common_write_config(void)
1411 {
1412         prefs_write_config(param, "Common", COMMON_RC);
1413 #ifdef G_OS_WIN32
1414         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1415 #endif
1416
1417         prefs_common_save_history(COMMAND_HISTORY, 
1418                 prefs_common.mime_open_cmd_history);
1419         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1420                 prefs_common.summary_quicksearch_history);
1421         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1422                 prefs_common.summary_search_from_history);
1423         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1424                 prefs_common.summary_search_to_history);
1425         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1426                 prefs_common.summary_search_subject_history);
1427         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1428                 prefs_common.summary_search_body_history);
1429         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1430                 prefs_common.summary_search_adv_condition_history);
1431         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1432                 prefs_common.message_search_history);
1433         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1434                 prefs_common.compose_save_to_history);
1435
1436 #ifndef USE_ALT_ADDRBOOK
1437                 prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1438                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1439                 prefs_common.addressbook_custom_attributes);
1440 #endif
1441 }
1442
1443 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1444    both 'in' and 'out' must be non-NULL.
1445    'out' must be a pointer to a buffer whose size is at least equal
1446    to strlen(txt)+1, this buffer will get cleared. out's contents
1447    will always get set to a valid string, even if it's "".*/
1448 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1449 {
1450         const gchar *i;
1451         gchar *o;
1452
1453         *out = '\0';
1454
1455         cm_return_if_fail( in != NULL );
1456         cm_return_if_fail( out != NULL );
1457
1458         i = in;
1459         o = out;
1460         memset(out, 0, strlen(in)+1);
1461         while (*i != '\0') {
1462                 if (*i == '\\' && *(i+1) == 'n') {
1463                         *o++ = '\n';
1464                         i++;
1465                 } else if (*i == '\\' && *(i+1) == 't') {
1466                         *o++ = '\t';
1467                         i++;
1468                 } else if (*i == '\\' && *(i+1) == '\\') {
1469                         *o++ = '\\';
1470                         i++;
1471                 } else {
1472                         *o++ = *i;
1473                 }
1474                 i++;
1475         }
1476         *o='\0';
1477 }
1478
1479 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1480    both 'in' and 'out' must be non-NULL.
1481    'out' must be a pointer to a buffer whose size is at least equal
1482    to 2*strlen(txt)+1. out's contents will always get set to a valid
1483    string, even if it's "". */
1484 void pref_get_escaped_pref(gchar *out, const gchar *in)
1485 {
1486         const gchar *i;
1487         gchar *o;
1488
1489         *out = '\0';
1490
1491         cm_return_if_fail( in != NULL );
1492         cm_return_if_fail( out != NULL );
1493
1494         i = in;
1495         o = out;
1496         while (*i != '\0') {
1497                 if (*i == '\n') {
1498                         *o++ = '\\';
1499                         *o++ = 'n';
1500                 } else if (*i == '\t') {
1501                         *o++ = '\\';
1502                         *o++ = 't';
1503                 } else if (*i == '\\') {
1504                         *o++ = '\\';
1505                         *o++ = '\\';
1506                 } else {
1507                         *o++ = *i;
1508                 }
1509                 i++;
1510         }
1511         *o = '\0';
1512 }
1513                 
1514 /* set the contents of a textview widget from the internal \-escaped
1515   representation of a pref string. both txt and textview must be non-NULL. */
1516 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1517 {
1518         GtkTextBuffer *buffer;
1519         gchar *out = NULL;
1520
1521         cm_return_if_fail( textview != NULL );
1522
1523         buffer = gtk_text_view_get_buffer(textview);
1524
1525         if (!txt) {
1526                 gtk_text_buffer_set_text(buffer, "", -1);
1527         } else {
1528                 out = g_malloc(strlen(txt)+1);
1529
1530                 pref_get_unescaped_pref(out, txt);
1531
1532                 gtk_text_buffer_set_text(buffer, out, -1);
1533                 g_free(out);
1534         }
1535 }
1536
1537 /* set the contents of a gtkentry widget from the internal \-escaped
1538   representation of a pref string. both txt and entry must be non-NULL. */
1539 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1540 {
1541         gchar *out = NULL;
1542
1543         cm_return_if_fail( entry != NULL );
1544         if (!txt) {
1545                 gtk_entry_set_text(entry, "");
1546         } else {
1547                 out = g_malloc(strlen(txt)+1);
1548
1549                 pref_get_unescaped_pref(out, txt);
1550
1551                 gtk_entry_set_text(entry, out);
1552                 g_free(out);
1553         }
1554 }
1555
1556 /* get the \-escaped internal representation of a pref from the contents of
1557    a textview widget. textview must be non-NULL. */
1558 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1559 {
1560         GtkTextBuffer *buffer;
1561         GtkTextIter start, end;
1562         gchar *out, *tmp;
1563         
1564         cm_return_val_if_fail( textview != NULL, "" );
1565
1566         buffer = gtk_text_view_get_buffer(textview);
1567         gtk_text_buffer_get_start_iter(buffer, &start);
1568         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1569         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1570         out = malloc(2*strlen(tmp)+1);
1571         if (out)
1572                 pref_get_escaped_pref(out, tmp);
1573         g_free(tmp);
1574
1575         return out?out:"";
1576 }
1577
1578 /* get the \-escaped internal representation of a pref from the contents of
1579    a gtkentry widget. entry must be non-NULL. */
1580 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1581 {
1582         gchar *out, *tmp;
1583
1584         cm_return_val_if_fail( entry != NULL, "" );
1585
1586         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1587         out = malloc(2*strlen(tmp)+1);
1588         
1589         if (out)
1590                 pref_get_escaped_pref(out, tmp);
1591         g_free(tmp);
1592
1593         return out?out:"";
1594 }
1595
1596 /* ugly hack to be able to get this pref from ssl_certificate.c */
1597 gboolean prefs_common_unsafe_ssl_certs(void)
1598 {
1599         return prefs_common.unsafe_ssl_certs;
1600 }
1601
1602 gboolean prefs_common_enable_log_standard(void)
1603 {
1604         return prefs_common.enable_log_standard;
1605 }
1606
1607 gboolean prefs_common_enable_log_warning(void)
1608 {
1609         return prefs_common.enable_log_warning;
1610 }
1611 gboolean prefs_common_enable_log_error(void)
1612 {
1613         return prefs_common.enable_log_error;
1614 }
1615 gboolean prefs_common_enable_log_status(void)
1616 {
1617         return prefs_common.enable_log_status;
1618 }
1619
1620 /**
1621    return the translated name of a header, if the translate_header option is
1622    set, otherwise return the untranslated header name (header_name itself).
1623    this function is provided for convenience, it's an interface to
1624    prefs_common.trans_hdr.
1625    works with header names either with or without trailing colon, provided
1626    that gettext found such header name in the sources (they should all be
1627    found in src/gtk/headers.h anyway).
1628 */
1629 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1630 {
1631         if (header_name == NULL || *header_name == '\0')
1632                 return header_name;
1633
1634         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1635 }
1636
1637 const gchar *prefs_common_get_uri_cmd(void)
1638 {
1639 #ifdef G_OS_WIN32
1640         return NULL;
1641 #else
1642         gchar *tmp = NULL;
1643         
1644         if (!prefs_common.cmds_use_system_default)
1645                 return prefs_common.uri_cmd;
1646         
1647         tmp = g_find_program_in_path("xdg-open");
1648         if (!tmp) 
1649                 return prefs_common.uri_cmd;
1650         
1651         g_free(tmp);
1652         return "xdg-open %s";
1653 #endif
1654 }
1655
1656 const gchar *prefs_common_get_ext_editor_cmd(void)
1657 {
1658         return prefs_common.ext_editor_cmd;
1659 #if 0 /* we should do that, but it detaches the editor and breaks
1660          compose.c's external composition. */
1661         gchar *tmp = NULL;
1662         
1663         if (!prefs_common.cmds_use_system_default)
1664                 return prefs_common.ext_editor_cmd;
1665         
1666         tmp = g_find_program_in_path("xdg-open");
1667         if (!tmp) 
1668                 return prefs_common.ext_editor_cmd;
1669         
1670         g_free(tmp);
1671         return "xdg-open %s";
1672 #endif 
1673 }
1674
1675 gboolean prefs_common_get_use_shred(void)
1676 {
1677         return prefs_common.use_shred;
1678 }
1679
1680 gboolean prefs_common_get_flush_metadata (void)
1681 {
1682         return prefs_common.flush_metadata;
1683 }
1684
1685 PrefsCommon *prefs_common_get_prefs(void)
1686 {
1687         return &prefs_common;
1688 }