2006-08-02 [colin] 2.4.0cvs17
[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         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
794          NULL, NULL, NULL},
795
796         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
797 };
798
799 PrefsCommon *prefs_common_get(void)
800 {
801         return &prefs_common;
802 }
803
804 /*
805  * Read history list from the specified history file
806  */
807 GList *prefs_common_read_history(const gchar *history) 
808 {
809         FILE *fp;
810         gchar *path;
811         gchar buf[PREFSBUFSIZE];
812         GList *tmp = NULL;
813
814         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
815                            NULL);
816         if ((fp = g_fopen(path, "rb")) == NULL) {
817                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
818                 g_free(path);
819                 return NULL;
820         }
821         g_free(path);
822         while (fgets(buf, sizeof(buf), fp) != NULL) {
823                 g_strstrip(buf);
824                 if (buf[0] == '\0') continue;
825                 tmp = add_history(tmp, buf);
826         }
827         fclose(fp);
828
829         tmp = g_list_reverse(tmp);
830
831         return tmp;
832 }
833
834 void prefs_common_read_config(void)
835 {
836         gchar *rcpath;
837         gchar *tmp;
838
839         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
840         prefs_read_config(param, "Common", rcpath, NULL);
841 #ifdef G_OS_WIN32
842         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
843 #endif
844
845         g_free(rcpath);
846
847         tmp = g_strdup(gettext(prefs_common.quotefmt));
848         g_free(prefs_common.quotefmt);
849         prefs_common.quotefmt = tmp;
850
851         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
852         g_free(prefs_common.fw_quotefmt);
853         prefs_common.fw_quotefmt = tmp;
854         
855         tmp = g_strdup(gettext(prefs_common.date_format));
856         g_free(prefs_common.date_format);
857         prefs_common.date_format = tmp;
858
859         prefs_common.mime_open_cmd_history =
860                 prefs_common_read_history(COMMAND_HISTORY);
861         prefs_common.summary_quicksearch_history =
862                 prefs_common_read_history(QUICKSEARCH_HISTORY);
863
864         colorlabel_update_colortable_from_prefs();
865 }
866
867 /*
868  * Save history list to the specified history file
869  */
870 void prefs_common_save_history(const gchar *history, GList *list)
871 {
872         GList *cur;
873         FILE *fp;
874         gchar *path;
875
876         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
877                            NULL);
878         if ((fp = g_fopen(path, "wb")) == NULL) {
879                 FILE_OP_ERROR(path, "fopen");
880                 g_free(path);
881                 return;
882         }
883
884         for (cur = list; cur != NULL; cur = cur->next) {
885                 fputs((gchar *)cur->data, fp);
886                 fputc('\n', fp);
887         }
888
889         fclose(fp);
890         g_free(path);
891 }
892
893 void prefs_common_write_config(void)
894 {
895         prefs_write_config(param, "Common", COMMON_RC);
896 #ifdef G_OS_WIN32
897         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
898 #endif
899
900         prefs_common_save_history(COMMAND_HISTORY, 
901                 prefs_common.mime_open_cmd_history);
902         prefs_common_save_history(QUICKSEARCH_HISTORY, 
903                 prefs_common.summary_quicksearch_history);
904 }
905
906 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
907 {
908         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
909         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
910         gchar *t = txt;
911         memset(out, 0, strlen(txt)+1);
912         o_out = out;
913         while (*t != '\0') {
914                 if (*t == '\\' && *(t+1) == 'n') {
915                         *out++ = '\n';
916                         t++;
917                 } else if (*t == '\\') {
918                         t++;
919                 } else {
920                         *out++ = *t;
921                 }
922                 t++;
923         }
924         *out='\0';
925
926         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
927         g_free(o_out);
928 }
929
930 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
931 {
932         GtkTextBuffer *buffer;
933         GtkTextIter start, end;
934         gchar *o_out, *out, *tmp, *t;
935         
936         buffer = gtk_text_view_get_buffer(textview);
937         gtk_text_buffer_get_start_iter(buffer, &start);
938         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
939         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
940         t = tmp;
941         o_out = out = malloc(2*strlen(tmp)+1);
942         
943         while (*t != '\0') {
944                 if (*t == '\n') {
945                         *out++ = '\\';
946                         *out++ = 'n';
947                 } else if (*t == '\\') {
948                         *out++ = '\\';
949                         *out++ = '\\';
950                 } else {
951                         *out++ = *t;
952                 }
953                 t++;
954         }
955         *out = '\0';
956         g_free(tmp);
957
958         return o_out;
959 }