2006-07-31 [wwp] 2.4.0cvs3
[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         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
753          NULL, NULL, NULL},
754         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
755          NULL, NULL, NULL},
756
757         /* Hidden */
758         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
759          NULL, NULL, NULL},
760         {"utf8_instead_of_locale_for_broken_mail", "0", 
761          &prefs_common.broken_are_utf8, P_INT,
762          NULL, NULL, NULL},
763         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
764          NULL, NULL, NULL},
765         {"enable_rules_hint", "TRUE", &prefs_common.enable_rules_hint, P_BOOL,
766          NULL, NULL, NULL},
767         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
768          NULL, NULL, NULL},
769         {"folderview_vscrollbar_policy", "0",
770          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
771          NULL, NULL, NULL},
772         {"textview_cursor_visible", "FALSE",
773          &prefs_common.textview_cursor_visible, P_BOOL,
774          NULL, NULL, NULL},
775         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
776          NULL, NULL, NULL},
777         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
778          NULL, NULL, NULL},
779         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
780          NULL, NULL, NULL},
781         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
782         P_INT, NULL, NULL, NULL },
783         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
784          NULL, NULL, NULL},
785         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
786          NULL, NULL, NULL},
787         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
788          NULL, NULL, NULL},
789         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
790          NULL, NULL, NULL},
791         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
792          NULL, NULL, NULL},
793
794         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
795 };
796
797 PrefsCommon *prefs_common_get(void)
798 {
799         return &prefs_common;
800 }
801
802 /*
803  * Read history list from the specified history file
804  */
805 GList *prefs_common_read_history(const gchar *history) 
806 {
807         FILE *fp;
808         gchar *path;
809         gchar buf[PREFSBUFSIZE];
810         GList *tmp = NULL;
811
812         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
813                            NULL);
814         if ((fp = g_fopen(path, "rb")) == NULL) {
815                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
816                 g_free(path);
817                 return NULL;
818         }
819         g_free(path);
820         while (fgets(buf, sizeof(buf), fp) != NULL) {
821                 g_strstrip(buf);
822                 if (buf[0] == '\0') continue;
823                 tmp = add_history(tmp, buf);
824         }
825         fclose(fp);
826
827         tmp = g_list_reverse(tmp);
828
829         return tmp;
830 }
831
832 void prefs_common_read_config(void)
833 {
834         gchar *rcpath;
835         gchar *tmp;
836
837         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
838         prefs_read_config(param, "Common", rcpath, NULL);
839 #ifdef G_OS_WIN32
840         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
841 #endif
842
843         g_free(rcpath);
844
845         tmp = g_strdup(gettext(prefs_common.quotefmt));
846         g_free(prefs_common.quotefmt);
847         prefs_common.quotefmt = tmp;
848
849         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
850         g_free(prefs_common.fw_quotefmt);
851         prefs_common.fw_quotefmt = tmp;
852         
853         tmp = g_strdup(gettext(prefs_common.date_format));
854         g_free(prefs_common.date_format);
855         prefs_common.date_format = tmp;
856
857         prefs_common.mime_open_cmd_history =
858                 prefs_common_read_history(COMMAND_HISTORY);
859         prefs_common.summary_quicksearch_history =
860                 prefs_common_read_history(QUICKSEARCH_HISTORY);
861
862         colorlabel_update_colortable_from_prefs();
863 }
864
865 /*
866  * Save history list to the specified history file
867  */
868 void prefs_common_save_history(const gchar *history, GList *list)
869 {
870         GList *cur;
871         FILE *fp;
872         gchar *path;
873
874         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
875                            NULL);
876         if ((fp = g_fopen(path, "wb")) == NULL) {
877                 FILE_OP_ERROR(path, "fopen");
878                 g_free(path);
879                 return;
880         }
881
882         for (cur = list; cur != NULL; cur = cur->next) {
883                 fputs((gchar *)cur->data, fp);
884                 fputc('\n', fp);
885         }
886
887         fclose(fp);
888         g_free(path);
889 }
890
891 void prefs_common_write_config(void)
892 {
893         prefs_write_config(param, "Common", COMMON_RC);
894 #ifdef G_OS_WIN32
895         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
896 #endif
897
898         prefs_common_save_history(COMMAND_HISTORY, 
899                 prefs_common.mime_open_cmd_history);
900         prefs_common_save_history(QUICKSEARCH_HISTORY, 
901                 prefs_common.summary_quicksearch_history);
902 }
903
904 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
905 {
906         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
907         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
908         gchar *t = txt;
909         memset(out, 0, strlen(txt)+1);
910         o_out = out;
911         while (*t != '\0') {
912                 if (*t == '\\' && *(t+1) == 'n') {
913                         *out++ = '\n';
914                         t++;
915                 } else if (*t == '\\') {
916                         t++;
917                 } else {
918                         *out++ = *t;
919                 }
920                 t++;
921         }
922         *out='\0';
923
924         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
925         g_free(o_out);
926 }
927
928 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
929 {
930         GtkTextBuffer *buffer;
931         GtkTextIter start, end;
932         gchar *o_out, *out, *tmp, *t;
933         
934         buffer = gtk_text_view_get_buffer(textview);
935         gtk_text_buffer_get_start_iter(buffer, &start);
936         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
937         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
938         t = tmp;
939         o_out = out = malloc(2*strlen(tmp)+1);
940         
941         while (*t != '\0') {
942                 if (*t == '\n') {
943                         *out++ = '\\';
944                         *out++ = 'n';
945                 } else if (*t == '\\') {
946                         *out++ = '\\';
947                         *out++ = '\\';
948                 } else {
949                         *out++ = *t;
950                 }
951                 t++;
952         }
953         *out = '\0';
954         g_free(tmp);
955
956         return o_out;
957 }