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