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