53abf3e2d3c8908c5a42b2f4d2ae064f6db509da
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Sylpheed-Claws 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 2 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, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #  include "config.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
63 enum {
64         DATEFMT_FMT,
65         DATEFMT_TXT,
66         N_DATEFMT_COLUMNS
67 };
68
69 PrefsCommon prefs_common;
70
71 GtkWidget *notebook;
72
73 #ifdef G_OS_WIN32
74 /*
75  * In the Windows version prefs_common contains
76  *   - the non-OS-specific settings of the "Common" section and
77  *   - the OS-specific settings of the "CommonWin32" section
78  * The OS-specific settings of the "Common" section are not used
79  * but saved in prefs_unix.
80  */
81
82 #  define SPECIFIC_PREFS prefs_unix
83
84 static PrefsCommon prefs_unix;
85
86 static PrefParam param_os_specific[] = {
87         /* Receive */
88         {"ext_inc_path", "",
89          &prefs_common.extinc_cmd, P_STRING, NULL, NULL, NULL},
90         {"newmail_notify_cmd", "",
91          &prefs_common.newmail_notify_cmd, P_STRING, NULL, NULL, NULL},
92
93         /* new fonts */
94         {"widget_font_gtk2",    NULL,
95           &prefs_common.widgetfont,             P_STRING, NULL, NULL, NULL},
96         {"message_font_gtk2",   "Monospace 9",
97          &prefs_common.textfont,                P_STRING, NULL, NULL, NULL},
98         {"print_font_gtk2",     "Monospace 9",
99          &prefs_common.printfont,               P_STRING, NULL, NULL, NULL},
100         {"small_font_gtk2",     "Sans 9",
101           &prefs_common.smallfont,              P_STRING, NULL, NULL, NULL},
102         {"normal_font_gtk2",    "Sans 9",
103           &prefs_common.normalfont,             P_STRING, NULL, NULL, NULL},
104
105         /* Message */
106         {"attach_save_directory", NULL,
107          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
108         {"attach_load_directory", NULL,
109          &prefs_common.attach_load_dir, P_STRING, NULL, NULL, NULL},
110
111         /* MIME viewer */
112         {"mime_textviewer", NULL,
113          &prefs_common.mime_textviewer,   P_STRING, NULL, NULL, NULL},
114         {"mime_open_command", "notepad '%s'",
115          &prefs_common.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
116
117         /* Interface */
118         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
119          &prefs_common.pixmap_theme_path, P_STRING, NULL, NULL, NULL},
120
121         /* Other */
122         {"uri_open_command", NULL,
123          &prefs_common.uri_cmd, P_STRING, NULL, NULL, NULL},
124         {"print_command", "notepad /p %s",
125          &prefs_common.print_cmd, P_STRING, NULL, NULL, NULL},
126         {"ext_editor_command", "notepad %s",
127          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
128
129         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
130 };
131 #else
132 #  define SPECIFIC_PREFS prefs_common
133 #endif
134
135 /*
136    parameter name, default value, pointer to the prefs variable, data type,
137    pointer to the widget pointer,
138    pointer to the function for data setting,
139    pointer to the function for widget setting
140  */
141
142 static PrefParam param[] = {
143         /* Receive */
144         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
145          NULL, NULL, NULL},
146         {"ext_inc_path", DEFAULT_INC_PATH, &SPECIFIC_PREFS.extinc_cmd, P_STRING,
147          NULL, NULL, NULL},
148
149         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
150          NULL, NULL, NULL},
151         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
152          NULL, NULL, NULL},
153         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
154          NULL, NULL, NULL},
155         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
156          P_BOOL, NULL, NULL, NULL},
157         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
158          P_BOOL, NULL, NULL, NULL},
159         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
160          P_BOOL, NULL, NULL, NULL},
161         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
162         P_BOOL, NULL, NULL, NULL},
163         {"newmail_notify_cmd", "", &SPECIFIC_PREFS.newmail_notify_cmd, P_STRING,
164          NULL, NULL, NULL},
165         {"receive_dialog_mode", "1", &prefs_common.recv_dialog_mode, P_ENUM,
166          NULL, NULL, NULL},
167         {"receivewin_width", "460", &prefs_common.receivewin_width, P_INT,
168          NULL, NULL, NULL},
169         {"receivewin_height", "-1", &prefs_common.receivewin_height, P_INT,
170          NULL, NULL, NULL},
171         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
172          P_BOOL, NULL, NULL, NULL},
173         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
174          P_BOOL, NULL, NULL, NULL},
175  
176         /* Send */
177         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
178          NULL, NULL, NULL},
179         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
180          P_BOOL, NULL, NULL, NULL},
181         {"send_dialog_mode", "0", &prefs_common.send_dialog_mode, P_ENUM,
182          NULL, NULL, NULL},
183         {"sendwin_width", "460", &prefs_common.sendwin_width, P_INT,
184          NULL, NULL, NULL},
185         {"sendwin_height", "-1", &prefs_common.sendwin_height, P_INT,
186          NULL, NULL, NULL},
187
188         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
189          NULL, NULL, NULL},
190         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
191          NULL, NULL, NULL},
192
193         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
194          P_BOOL, NULL, NULL, NULL},
195
196         /* Compose */
197         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
198          NULL, NULL, NULL},
199         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
200          P_BOOL, NULL, NULL, NULL},
201         {"redirect_keep_from", "FALSE",
202          &prefs_common.redirect_keep_from, P_BOOL,
203          NULL, NULL, NULL},
204         {"undo_level", "50", &prefs_common.undolevels, P_INT,
205          NULL, NULL, NULL},
206
207         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
208          NULL, NULL, NULL},
209         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
210          NULL, NULL, NULL},
211         {"linewrap_pastes", "TRUE", &prefs_common.linewrap_pastes, P_BOOL,
212          NULL, NULL, NULL},
213         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
214          NULL, NULL, NULL},
215         {"autosave", "TRUE", &prefs_common.autosave,
216          P_BOOL, NULL, NULL, NULL},
217         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
218          NULL, NULL, NULL},
219 #if USE_ASPELL
220         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
221          NULL, NULL, NULL},
222         {"aspell_path", ASPELL_PATH, &prefs_common.aspell_path, P_STRING,
223          NULL, NULL, NULL},
224         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
225          NULL, NULL, NULL},
226         {"aspell_sugmode", "1", &prefs_common.aspell_sugmode, P_INT,
227          NULL, NULL, NULL},
228         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
229          NULL, NULL, NULL},
230         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
231          NULL, NULL, NULL},
232         {"recheck_when_changing_dict", "TRUE", &prefs_common.recheck_when_changing_dict,
233          P_BOOL, NULL, NULL, NULL},
234         {"misspelled_color", "16711680", &prefs_common.misspelled_col, P_COLOR,
235          NULL, NULL, NULL},
236 #endif
237         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
238          NULL, NULL, NULL},
239         {"compose_dnd_insert_or_attach", "0", &prefs_common.compose_dnd_mode, P_ENUM,
240          NULL, NULL, NULL},
241
242         /* Account autoselection */
243         {"reply_account_autoselect", "TRUE",
244          &prefs_common.reply_account_autosel, P_BOOL,
245          NULL, NULL, NULL},
246         {"forward_account_autoselect", "TRUE",
247          &prefs_common.forward_account_autosel, P_BOOL,
248          NULL, NULL, NULL},
249         {"reedit_account_autoselect", "TRUE",
250          &prefs_common.reedit_account_autosel, P_BOOL,
251          NULL, NULL, NULL},
252
253         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
254          NULL, NULL, NULL},
255
256         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
257          NULL, NULL, NULL},
258
259         /* Quote */
260         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
261          NULL, NULL, NULL},
262         {"reply_quote_format", N_("On %d\\n%f wrote:\\n\\n%q"),
263          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
264
265         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
266          NULL, NULL, NULL},
267         {"forward_quote_format",
268          N_("\\n\\nBegin forwarded message:\\n\\n"
269          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
270          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M"),
271          &prefs_common.fw_quotefmt, P_STRING, NULL, NULL, NULL},
272         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
273          NULL, NULL, NULL},
274
275         /* Display */
276         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
277         {"widget_font",         NULL,
278           &prefs_common.widgetfont_gtk1,        P_STRING, NULL, NULL, NULL},
279         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
280          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
281         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
282           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
283         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
284           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
285         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
286           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
287
288         /* new fonts */
289         {"widget_font_gtk2",    NULL,
290           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
291         {"message_font_gtk2",   "Monospace 9",
292          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
293         {"print_font_gtk2",     "Monospace 9",
294          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
295         {"small_font_gtk2",     "Sans 9",
296           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
297         {"normal_font_gtk2",    "Sans 9",
298           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
299
300         /* custom colors */
301         {"custom_color1", "#ff9900", &prefs_common.custom_colorlabel[0].color, P_COLOR,
302          NULL, NULL, NULL},
303         {"custom_colorlabel1", N_("Orange"), &prefs_common.custom_colorlabel[0].label, P_STRING,
304          NULL, NULL, NULL},
305         {"custom_color2", "#ff0000", &prefs_common.custom_colorlabel[1].color, P_COLOR,
306          NULL, NULL, NULL},
307         {"custom_colorlabel2", N_("Red"), &prefs_common.custom_colorlabel[1].label, P_STRING,
308          NULL, NULL, NULL},
309         {"custom_color3", "#ff66ff", &prefs_common.custom_colorlabel[2].color, P_COLOR,
310          NULL, NULL, NULL},
311         {"custom_colorlabel3", N_("Pink"), &prefs_common.custom_colorlabel[2].label, P_STRING,
312          NULL, NULL, NULL},
313         {"custom_color4", "#00ccff", &prefs_common.custom_colorlabel[3].color, P_COLOR,
314          NULL, NULL, NULL},
315         {"custom_colorlabel4", N_("Sky blue"), &prefs_common.custom_colorlabel[3].label, P_STRING,
316          NULL, NULL, NULL},
317         {"custom_color5", "#0000ff", &prefs_common.custom_colorlabel[4].color, P_COLOR,
318          NULL, NULL, NULL},
319         {"custom_colorlabel5", N_("Blue"), &prefs_common.custom_colorlabel[4].label, P_STRING,
320          NULL, NULL, NULL},
321         {"custom_color6", "#009900", &prefs_common.custom_colorlabel[5].color, P_COLOR,
322          NULL, NULL, NULL},
323         {"custom_colorlabel6", N_("Green"), &prefs_common.custom_colorlabel[5].label, P_STRING,
324          NULL, NULL, NULL},
325         {"custom_color7", "#663366", &prefs_common.custom_colorlabel[6].color, P_COLOR,
326          NULL, NULL, NULL},
327         {"custom_colorlabel7", N_("Brown"), &prefs_common.custom_colorlabel[6].label, P_STRING,
328          NULL, NULL, NULL},
329
330         /* image viewer */
331         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
332          NULL, NULL, NULL},
333         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
334          NULL, NULL, NULL},
335         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
336          NULL, NULL, NULL},
337
338         {"display_folder_unread_num", "FALSE",
339          &prefs_common.display_folder_unread, P_BOOL,
340          NULL, NULL, NULL},
341         {"newsgroup_abbrev_len", "16",
342          &prefs_common.ng_abbrev_len, P_INT,
343          NULL, NULL, NULL},
344
345         {"translate_header", "FALSE", &prefs_common.trans_hdr, P_BOOL,
346          NULL, NULL, NULL},
347
348         /* Display: Summary View */
349         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
350          NULL, NULL, NULL},
351         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
352          NULL, NULL, NULL},
353         {"date_format", N_("%y/%m/%d(%a) %H:%M"), &prefs_common.date_format,
354          P_STRING, NULL, NULL, NULL},
355
356         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
357          NULL, NULL, NULL},
358
359         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
360          NULL, NULL, NULL},
361         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
362          NULL, NULL, NULL},
363         {"toolbar_detachable", "FALSE", &prefs_common.toolbar_detachable, P_BOOL,
364          NULL, NULL, NULL},
365         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
366          NULL, NULL, NULL},
367         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
368          NULL, NULL, NULL},
369
370
371         {"summary_col_show_mark", "TRUE",
372          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
373         {"summary_col_show_unread", "TRUE",
374          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
375         {"summary_col_show_mime", "TRUE",
376          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
377         {"summary_col_show_subject", "TRUE",
378          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
379         {"summary_col_show_from", "TRUE",
380          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
381         {"summary_col_show_to", "FALSE",
382          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
383         {"summary_col_show_date", "TRUE",
384          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
385         {"summary_col_show_size", "TRUE",
386          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
387         {"summary_col_show_number", "FALSE",
388          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
389         {"summary_col_show_score", "FALSE",
390          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
391         {"summary_col_show_locked", "FALSE",
392          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
393
394         {"summary_col_pos_mark", "0",
395           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
396         {"summary_col_pos_unread", "1",
397           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
398         {"summary_col_pos_mime", "2",
399           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
400         {"summary_col_pos_subject", "3",
401           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
402         {"summary_col_pos_from", "4",
403           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
404         {"summary_col_pos_date", "5",
405           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
406         {"summary_col_pos_size", "6",
407           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
408         {"summary_col_pos_number", "7",
409           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
410         {"summary_col_pos_score", "8",
411          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
412         {"summary_col_pos_locked", "9",
413          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
414         {"summary_col_pos_to", "10",
415           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
416
417         {"summary_col_size_mark", "10",
418          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
419         {"summary_col_size_unread", "13",
420          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
421         {"summary_col_size_mime", "10",
422          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
423         {"summary_col_size_subject", "200",
424          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
425         {"summary_col_size_from", "120",
426          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
427         {"summary_col_size_to", "120",
428          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
429         {"summary_col_size_date", "118",
430          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
431         {"summary_col_size_size", "45",
432          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
433         {"summary_col_size_number", "40",
434          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
435         {"summary_col_size_score", "40",
436          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
437         {"summary_col_size_locked", "13",
438          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
439
440         /* Widget size */
441         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
442          NULL, NULL, NULL},
443         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
444          NULL, NULL, NULL},
445         {"folderview_width", "270", &prefs_common.folderview_width, P_INT,
446          NULL, NULL, NULL},
447         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
448          NULL, NULL, NULL},
449         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
450          NULL, NULL, NULL},
451
452         {"folder_col_show_folder", "TRUE",
453          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
454         {"folder_col_show_new", "TRUE",
455          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
456         {"folder_col_show_unread", "TRUE",
457          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
458         {"folder_col_show_total", "TRUE",
459          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
460
461         {"folder_col_pos_folder", "0",
462          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
463         {"folder_col_pos_new", "1",
464          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
465         {"folder_col_pos_unread", "2",
466          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
467         {"folder_col_pos_total", "3",
468          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
469
470         {"folder_col_size_folder", "120",
471          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
472         {"folder_col_size_new", "32",
473          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
474         {"folder_col_size_unread", "32",
475          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
476         {"folder_col_size_total", "32",
477          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
478
479         {"summaryview_width", "500", &prefs_common.summaryview_width, P_INT,
480          NULL, NULL, NULL},
481         {"summaryview_height", "244", &prefs_common.summaryview_height, P_INT,
482          NULL, NULL, NULL},
483
484         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
485          NULL, NULL, NULL},
486         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
487          NULL, NULL, NULL},
488         {"messageview_width", "500", &prefs_common.msgview_width, P_INT,
489          NULL, NULL, NULL},
490         {"messageview_height", "213", &prefs_common.msgview_height, P_INT,
491          NULL, NULL, NULL},
492         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
493          NULL, NULL, NULL},
494
495         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
496          NULL, NULL, NULL},
497         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
498          NULL, NULL, NULL},
499         {"mainview_width", "500", &prefs_common.mainview_width, P_INT,
500          NULL, NULL, NULL},
501         {"mainview_height", "400", &prefs_common.mainview_height, P_INT,
502          NULL, NULL, NULL},
503         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
504          NULL, NULL, NULL},
505         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
506          NULL, NULL, NULL},
507         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
508          NULL, NULL, NULL},
509         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
510          NULL, NULL, NULL},
511         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
512          NULL, NULL, NULL},
513         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
514          NULL, NULL, NULL},
515         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
516          NULL, NULL, NULL},
517         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
518          NULL, NULL, NULL},
519         {"compose_width", "600", &prefs_common.compose_width, P_INT,
520          NULL, NULL, NULL},
521         {"compose_height", "560", &prefs_common.compose_height, P_INT,
522          NULL, NULL, NULL},
523         {"compose_x", "0", &prefs_common.compose_x, P_INT,
524          NULL, NULL, NULL},
525         {"compose_y", "0", &prefs_common.compose_y, P_INT,
526          NULL, NULL, NULL},
527         /* Message */
528         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
529          NULL, NULL, NULL},
530
531         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_COLOR,
532          NULL, NULL, NULL},
533         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_COLOR,
534          NULL, NULL, NULL},
535         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_COLOR,
536          NULL, NULL, NULL},
537         {"enable_bgcolor", "FALSE", &prefs_common.enable_bgcolor, P_BOOL,
538          NULL, NULL, NULL},
539         {"quote_level1_bgcolor", "13421772", &prefs_common.quote_level1_bgcol, P_COLOR,
540          NULL, NULL, NULL},
541         {"quote_level2_bgcolor", "13948116", &prefs_common.quote_level2_bgcol, P_COLOR,
542          NULL, NULL, NULL},
543         {"quote_level3_bgcolor", "14540253", &prefs_common.quote_level3_bgcol, P_COLOR,
544          NULL, NULL, NULL},
545         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
546          NULL, NULL, NULL},
547         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
548          NULL, NULL, NULL},
549         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
550          NULL, NULL, NULL},
551         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
552          P_BOOL, NULL, NULL, NULL},
553
554         {"display_header_pane", "FALSE", &prefs_common.display_header_pane,
555          P_BOOL, NULL, NULL, NULL},
556         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
557          NULL, NULL, NULL},
558         {"display_xface", "TRUE", &prefs_common.display_xface,
559          P_BOOL, NULL, NULL, NULL},
560         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
561          NULL, NULL, NULL},
562         {"invoke_plugin_on_html", "FALSE", &prefs_common.invoke_plugin_on_html, P_BOOL,
563          NULL, NULL, NULL},
564         {"line_space", "2", &prefs_common.line_space, P_INT,
565          NULL, NULL, NULL},
566         {"never_send_retrcpt", "FALSE", &prefs_common.never_send_retrcpt, P_BOOL,
567          NULL, NULL, NULL},
568
569         {"enable_smooth_scroll", "FALSE",
570          &prefs_common.enable_smooth_scroll, P_BOOL,
571          NULL, NULL, NULL},
572         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
573          NULL, NULL, NULL},
574         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
575          NULL, NULL, NULL},
576
577         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
578          NULL, NULL, NULL},
579
580         {"use_different_print_font", "FALSE", &prefs_common.use_different_print_font, P_BOOL,
581          NULL, NULL, NULL},
582
583         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
584          NULL, NULL, NULL},
585         {"attach_save_directory", NULL,
586          &SPECIFIC_PREFS.attach_save_dir, P_STRING, NULL, NULL, NULL},
587         {"attach_load_directory", NULL,
588          &SPECIFIC_PREFS.attach_load_dir, P_STRING, NULL, NULL, NULL},
589
590         /* MIME viewer */
591         {"mime_textviewer",   NULL,
592          &SPECIFIC_PREFS.mime_textviewer,   P_STRING, NULL, NULL, NULL},
593         {"mime_open_command", "gedit '%s'",
594          &SPECIFIC_PREFS.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
595
596         /* Interface */
597         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
598          NULL, NULL, NULL},
599         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
600          NULL, NULL, NULL},
601
602         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
603          NULL, NULL, NULL}, */
604         {"always_show_message_when_selected", "FALSE",
605          &prefs_common.always_show_msg,
606          P_BOOL, NULL, NULL, NULL},
607         {"select_on_entry", "2", &prefs_common.select_on_entry,
608          P_ENUM, NULL, NULL, NULL},
609         {"mark_as_read_on_new_window", "FALSE",
610          &prefs_common.mark_as_read_on_new_window,
611          P_BOOL, NULL, NULL, NULL},
612         {"mark_as_read_delay", "0",
613          &prefs_common.mark_as_read_delay, P_INT, 
614          NULL, NULL, NULL},
615         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
616          NULL, NULL, NULL},
617         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
618          NULL, NULL, NULL},
619
620         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
621          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
622          NULL, NULL, NULL},
623
624         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
625          NULL, NULL, NULL},
626
627         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
628          NULL, NULL, NULL},
629         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
630          NULL, NULL, NULL},
631
632         /* Other */
633         {"uri_open_command", DEFAULT_BROWSER_CMD,
634          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
635         {"print_command", "lpr %s",
636          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
637         {"ext_editor_command", DEFAULT_EDITOR_CMD,
638          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
639
640         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
641          P_BOOL, NULL, NULL, NULL},
642         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
643          NULL, NULL, NULL},
644         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
645          NULL, NULL, NULL},
646         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
647          NULL, NULL, NULL},
648         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
649          P_BOOL, NULL, NULL, NULL},
650         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
651          NULL, NULL, NULL},
652         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
653          NULL, NULL, NULL},
654         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
655          NULL, NULL, NULL},
656
657         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
658          P_INT, NULL, NULL, NULL},
659         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
660          NULL, NULL, NULL},
661         {"important_score", "1", &prefs_common.important_score, P_INT,
662          NULL, NULL, NULL},
663         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
664          NULL, NULL, NULL},
665         {"log_length", "500", &prefs_common.loglength, P_INT,
666          NULL, NULL, NULL},
667         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
668          NULL, NULL, NULL},
669         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
670          NULL, NULL, NULL},
671         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
672          NULL, NULL, NULL},
673         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
674          NULL, NULL, NULL},
675         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
676          NULL, NULL, NULL},
677
678         {"color_new", "179", &prefs_common.color_new, P_COLOR,
679          NULL, NULL, NULL},
680
681         /* Some windows' sizes */
682         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
683          NULL, NULL, NULL},
684         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
685          NULL, NULL, NULL},
686
687         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
688          NULL, NULL, NULL},
689         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
690          NULL, NULL, NULL},
691
692         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
693          NULL, NULL, NULL},
694         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
695          NULL, NULL, NULL},
696
697         {"templateswin_width", "440", &prefs_common.templateswin_width, P_INT,
698          NULL, NULL, NULL},
699         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
700          NULL, NULL, NULL},
701
702         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
703          NULL, NULL, NULL},
704         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
705          NULL, NULL, NULL},
706
707         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
708          NULL, NULL, NULL},
709         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
710          NULL, NULL, NULL},
711
712         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
713          NULL, NULL, NULL},
714         {"addressbookeditpersonwin_height", "-1", &prefs_common.addressbookeditpersonwin_height, P_INT,
715          NULL, NULL, NULL},
716
717         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
718          NULL, NULL, NULL},
719         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
720          NULL, NULL, NULL},
721
722         {"pluginswin_width", "480", &prefs_common.pluginswin_width, P_INT,
723          NULL, NULL, NULL},
724         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
725          NULL, NULL, NULL},
726
727         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
728          NULL, NULL, NULL},
729         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
730          NULL, NULL, NULL},
731
732         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
733          NULL, NULL, NULL},
734         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
735          NULL, NULL, NULL},
736
737         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
738          NULL, NULL, NULL},
739         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
740          NULL, NULL, NULL},
741
742         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
743          NULL, NULL, NULL},
744         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
745          NULL, NULL, NULL},
746
747         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
748          NULL, NULL, NULL},
749         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
750          NULL, NULL, NULL},
751
752         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
753          NULL, NULL, NULL},
754         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
755          NULL, NULL, NULL},
756
757         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
758          NULL, NULL, NULL},
759         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
760          NULL, NULL, NULL},
761
762         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
763          NULL, NULL, NULL},
764         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
765          NULL, NULL, NULL},
766
767         /* Hidden */
768         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
769          NULL, NULL, NULL},
770         {"utf8_instead_of_locale_for_broken_mail", "0", 
771          &prefs_common.broken_are_utf8, P_INT,
772          NULL, NULL, NULL},
773         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
774          NULL, NULL, NULL},
775         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
776          NULL, NULL, NULL},
777         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
778          NULL, NULL, NULL},
779         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
780          NULL, NULL, NULL},
781         {"enable_dotted_lines", "FALSE", &prefs_common.enable_dotted_lines, P_BOOL,
782          NULL, NULL, NULL},
783         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
784          NULL, NULL, NULL},
785         {"folderview_vscrollbar_policy", "0",
786          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
787          NULL, NULL, NULL},
788         {"textview_cursor_visible", "FALSE",
789          &prefs_common.textview_cursor_visible, P_BOOL,
790          NULL, NULL, NULL},
791         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
792          NULL, NULL, NULL},
793         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
794          NULL, NULL, NULL},
795         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
796          NULL, NULL, NULL},
797         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
798         P_INT, NULL, NULL, NULL },
799         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
800          NULL, NULL, NULL},
801         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
802          NULL, NULL, NULL},
803         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
804          NULL, NULL, NULL},
805         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
806          NULL, NULL, NULL},
807         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
808          NULL, NULL, NULL},
809         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
810          NULL, NULL, NULL},
811
812         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
813 };
814
815 PrefsCommon *prefs_common_get(void)
816 {
817         return &prefs_common;
818 }
819
820 /*
821  * Read history list from the specified history file
822  */
823 GList *prefs_common_read_history(const gchar *history) 
824 {
825         FILE *fp;
826         gchar *path;
827         gchar buf[PREFSBUFSIZE];
828         GList *tmp = NULL;
829
830         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
831                            NULL);
832         if ((fp = g_fopen(path, "rb")) == NULL) {
833                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
834                 g_free(path);
835                 return NULL;
836         }
837         g_free(path);
838         while (fgets(buf, sizeof(buf), fp) != NULL) {
839                 g_strstrip(buf);
840                 if (buf[0] == '\0') continue;
841                 tmp = add_history(tmp, buf);
842         }
843         fclose(fp);
844
845         tmp = g_list_reverse(tmp);
846
847         return tmp;
848 }
849
850 void prefs_common_read_config(void)
851 {
852         gchar *rcpath;
853         gchar *tmp;
854
855         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
856         prefs_read_config(param, "Common", rcpath, NULL);
857 #ifdef G_OS_WIN32
858         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
859 #endif
860
861         g_free(rcpath);
862
863         tmp = g_strdup(gettext(prefs_common.quotefmt));
864         g_free(prefs_common.quotefmt);
865         prefs_common.quotefmt = tmp;
866
867         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
868         g_free(prefs_common.fw_quotefmt);
869         prefs_common.fw_quotefmt = tmp;
870         
871         tmp = g_strdup(gettext(prefs_common.date_format));
872         g_free(prefs_common.date_format);
873         prefs_common.date_format = tmp;
874
875         prefs_common.mime_open_cmd_history =
876                 prefs_common_read_history(COMMAND_HISTORY);
877         prefs_common.summary_quicksearch_history =
878                 prefs_common_read_history(QUICKSEARCH_HISTORY);
879
880         colorlabel_update_colortable_from_prefs();
881 }
882
883 /*
884  * Save history list to the specified history file
885  */
886 void prefs_common_save_history(const gchar *history, GList *list)
887 {
888         GList *cur;
889         FILE *fp;
890         gchar *path;
891
892         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
893                            NULL);
894         if ((fp = g_fopen(path, "wb")) == NULL) {
895                 FILE_OP_ERROR(path, "fopen");
896                 g_free(path);
897                 return;
898         }
899
900         for (cur = list; cur != NULL; cur = cur->next) {
901                 fputs((gchar *)cur->data, fp);
902                 fputc('\n', fp);
903         }
904
905         fclose(fp);
906         g_free(path);
907 }
908
909 void prefs_common_write_config(void)
910 {
911         prefs_write_config(param, "Common", COMMON_RC);
912 #ifdef G_OS_WIN32
913         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
914 #endif
915
916         prefs_common_save_history(COMMAND_HISTORY, 
917                 prefs_common.mime_open_cmd_history);
918         prefs_common_save_history(QUICKSEARCH_HISTORY, 
919                 prefs_common.summary_quicksearch_history);
920 }
921
922 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
923 {
924         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
925         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
926         gchar *t = txt;
927         memset(out, 0, strlen(txt)+1);
928         o_out = out;
929         while (*t != '\0') {
930                 if (*t == '\\' && *(t+1) == 'n') {
931                         *out++ = '\n';
932                         t++;
933                 } else if (*t == '\\') {
934                         t++;
935                 } else {
936                         *out++ = *t;
937                 }
938                 t++;
939         }
940         *out='\0';
941
942         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
943         g_free(o_out);
944 }
945
946 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
947 {
948         GtkTextBuffer *buffer;
949         GtkTextIter start, end;
950         gchar *o_out, *out, *tmp, *t;
951         
952         buffer = gtk_text_view_get_buffer(textview);
953         gtk_text_buffer_get_start_iter(buffer, &start);
954         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
955         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
956         t = tmp;
957         o_out = out = malloc(2*strlen(tmp)+1);
958         
959         while (*t != '\0') {
960                 if (*t == '\n') {
961                         *out++ = '\\';
962                         *out++ = 'n';
963                 } else if (*t == '\\') {
964                         *out++ = '\\';
965                         *out++ = '\\';
966                 } else {
967                         *out++ = *t;
968                 }
969                 t++;
970         }
971         *out = '\0';
972         g_free(tmp);
973
974         return o_out;
975 }