Code

Cleanup of named icon background rendering and added pref for workaround
[inkscape.git] / src / ui / dialog / inkscape-preferences.cpp
index 82f6ddf5b47ce62b6fcd121ffe5a5b00ce1a89b8..62c8750e2b46b1293ac38e8767de2da6d1b64aad 100644 (file)
@@ -79,33 +79,42 @@ InkscapePreferences::InkscapePreferences()
     _page_list_model = Gtk::TreeStore::create(_page_list_columns);
     _page_list.set_model(_page_list_model);
     _page_list.append_column("name",_page_list_columns._col_name);
-       Glib::RefPtr<Gtk::TreeSelection> page_list_selection = _page_list.get_selection();
-       page_list_selection->signal_changed().connect(sigc::mem_fun(*this, &InkscapePreferences::on_pagelist_selection_changed));
-       page_list_selection->set_mode(Gtk::SELECTION_BROWSE);
+    Glib::RefPtr<Gtk::TreeSelection> page_list_selection = _page_list.get_selection();
+    page_list_selection->signal_changed().connect(sigc::mem_fun(*this, &InkscapePreferences::on_pagelist_selection_changed));
+    page_list_selection->set_mode(Gtk::SELECTION_BROWSE);
 
     //Pages
     Gtk::VBox* vbox_page = Gtk::manage(new Gtk::VBox());
     Gtk::Frame* title_frame = Gtk::manage(new Gtk::Frame());
-    hbox_list_page->pack_start(*vbox_page, true, true, 0);
+
+    Gtk::ScrolledWindow* pageScroller = Gtk::manage(new Gtk::ScrolledWindow());
+    pageScroller->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+    pageScroller->add(*vbox_page);
+    hbox_list_page->pack_start(*pageScroller, true, true, 0);
+
     title_frame->add(_page_title);
     vbox_page->pack_start(*title_frame, false, false, 0);
     vbox_page->pack_start(_page_frame, true, true, 0);
     _page_frame.set_shadow_type(Gtk::SHADOW_IN);
     title_frame->set_shadow_type(Gtk::SHADOW_IN);
 
-    initPageMouse();
-    initPageScrolling();
-    initPageSteps();
     initPageTools();
-    initPageWindows();
+    initPageSelecting();
+    initPageTransforms();
     initPageClones();
     initPageMasks();
-    initPageTransforms();
     initPageFilters();
-    initPageSelecting();
-    initPageImportExport();
+    initPageBitmaps();
     initPageCMS();
     initPageGrids();
+    initPageSVGOutput();
+    initPageAutosave();
+    initPageImportExport();
+    initPageUI();
+    initPageMouse();
+    initPageScrolling();
+    initPageSteps();
+    initPageWindows();
     initPageMisc();
 
     signalPresent().connect(sigc::mem_fun(*this, &InkscapePreferences::_presentPages));
@@ -155,6 +164,9 @@ void InkscapePreferences::initPageMouse()
     _page_mouse.add_line(true, "",_mouse_use_ext_input, "",
                         _("Use the capabilities of a tablet or other pressure-sensitive device. Disable this only if you have problems with the tablet (you can still use it as a mouse)"));
 
+    _mouse_switch_on_ext_input.init( _("Switch tool based on tablet device (requires restart)"), "options.switchonextinput", "value", false);
+    _page_mouse.add_line(true, "",_mouse_switch_on_ext_input, "",
+                        _("Change tool as different devices are used on the tablet (pen, eraser, mouse)"));
 }
 
 void InkscapePreferences::initPageScrolling()
@@ -294,11 +306,12 @@ void StyleFromSelectionToTool(gchar const *prefs_path, StyleSwatch *swatch)
     }
 }
 
-void InkscapePreferences::AddNewObjectsStyle(DialogPage& p, const std::string& prefs_path)
+void InkscapePreferences::AddNewObjectsStyle(DialogPage& p, const std::string& prefs_path, const gchar* banner)
 {
-
-
-    p.add_group_header( _("Create new objects with:"));
+    if (banner)
+        p.add_group_header(banner);
+    else
+        p.add_group_header( _("Create new objects with:"));
     PrefRadioButton* current = Gtk::manage( new PrefRadioButton);
     current->init ( _("Last used style"), prefs_path, "usecurrent", 1, true, 0);
     p.add_line( true, "", *current, "",
@@ -337,10 +350,10 @@ void InkscapePreferences::initPageTools()
     _path_tools = _page_list.get_model()->get_path(iter_tools);
 
     _page_tools.add_group_header( _("Bounding box to use:"));
-    _t_bbox_visual.init ( _("Visual bounding box"), "tools", "bounding_box", "visual", false, 0);
+    _t_bbox_visual.init ( _("Visual bounding box"), "tools", "bounding_box", "0", false, 0); // 0 means visual
     _page_tools.add_line( true, "", _t_bbox_visual, "",
                             _("This bounding box includes stroke width, markers, filter margins, etc."));
-    _t_bbox_geometric.init ( _("Geometric bounding box"), "tools", "bounding_box", "geometric", true, &_t_bbox_visual);
+    _t_bbox_geometric.init ( _("Geometric bounding box"), "tools", "bounding_box", "1", true, &_t_bbox_visual); // 1 means geometric
     _page_tools.add_line( true, "", _t_bbox_geometric, "",
                             _("This bounding box includes only the bare path"));
 
@@ -348,6 +361,9 @@ void InkscapePreferences::initPageTools()
     _t_cvg_keep_objects.init ( _("Keep objects after conversion to guides"), "tools", "cvg_keep_objects", false);
     _page_tools.add_line( true, "", _t_cvg_keep_objects, "",
                             _("When converting an object to guides, don't delete the object after the conversion."));
+    _t_cvg_convert_whole_groups.init ( _("Treat groups as a single object"), "tools", "cvg_convert_whole_groups", false);
+    _page_tools.add_line( true, "", _t_cvg_convert_whole_groups, "",
+                            _("Treat groups as a single object during conversion to guides rather than converting each child separately."));
 
     _calligrapy_use_abs_size.init ( _("Width is in absolute units"), "tools.calligraphic", "abs_width", false);
     _calligrapy_keep_selected.init ( _("Select new path"), "tools.calligraphic", "keep_selected", true);
@@ -379,50 +395,65 @@ void InkscapePreferences::initPageTools()
     this->AddPage(_page_node, _("Node"), iter_tools, PREFS_PAGE_TOOLS_NODE);
     AddSelcueCheckbox(_page_node, "tools.nodes", true);
     AddGradientCheckbox(_page_node, "tools.nodes", true);
+    _page_node.add_group_header( _("Path outline:"));
+    _t_node_pathoutline_color.init(_("Path outline color"), "tools.nodes", "highlight_color", 0xff0000ff);
+    _page_node.add_line( false, _("Path outline color"), _t_node_pathoutline_color, "", _("Selects the color used for showing the path outline."), false);
+    _t_node_pathflash_enabled.init ( _("Path outline flash on mouse-over"), "tools.nodes", "pathflash_enabled", false);
+    _page_node.add_line( true, "", _t_node_pathflash_enabled, "", _("When hovering over a path, briefly flash its outline."));
+    _t_node_pathflash_timeout.init("tools.nodes", "pathflash_timeout", 0, 10000.0, 100.0, 100.0, 1000.0, true, false);
+    _page_node.add_line( false, _("Flash time"), _t_node_pathflash_timeout, "ms", _("Specifies how long the path outline will be visible after a mouse-over (in milliseconds). Specify 0 to have the outline shown until mouse leaves the path."), false);
+
     //Tweak
-    this->AddPage(_page_tweak, _("Tweak"), iter_tools, PREFS_PAGE_TOOLS_NODE);
+    this->AddPage(_page_tweak, _("Tweak"), iter_tools, PREFS_PAGE_TOOLS_TWEAK);
+    this->AddNewObjectsStyle(_page_tweak, "tools.tweak", _("Paint objects with:"));
     AddSelcueCheckbox(_page_tweak, "tools.tweak", true);
     AddGradientCheckbox(_page_tweak, "tools.tweak", false);
+
     //Zoom
     this->AddPage(_page_zoom, _("Zoom"), iter_tools, PREFS_PAGE_TOOLS_ZOOM);
     AddSelcueCheckbox(_page_zoom, "tools.zoom", true);
     AddGradientCheckbox(_page_zoom, "tools.zoom", false);
+
     //Shapes
     Gtk::TreeModel::iterator iter_shapes = this->AddPage(_page_shapes, _("Shapes"), iter_tools, PREFS_PAGE_TOOLS_SHAPES);
     _path_shapes = _page_list.get_model()->get_path(iter_shapes);
     this->AddSelcueCheckbox(_page_shapes, "tools.shapes", true);
     this->AddGradientCheckbox(_page_shapes, "tools.shapes", true);
+
     //Rectangle
     this->AddPage(_page_rectangle, _("Rectangle"), iter_shapes, PREFS_PAGE_TOOLS_SHAPES_RECT);
     this->AddNewObjectsStyle(_page_rectangle, "tools.shapes.rect");
     this->AddConvertGuidesCheckbox(_page_rectangle, "tools.shapes.rect", true);
+
     //3D box
     this->AddPage(_page_3dbox, _("3D Box"), iter_shapes, PREFS_PAGE_TOOLS_SHAPES_3DBOX);
     this->AddNewObjectsStyle(_page_3dbox, "tools.shapes.3dbox");
     this->AddConvertGuidesCheckbox(_page_3dbox, "tools.shapes.3dbox", true);
+
     //ellipse
     this->AddPage(_page_ellipse, _("Ellipse"), iter_shapes, PREFS_PAGE_TOOLS_SHAPES_ELLIPSE);
     this->AddNewObjectsStyle(_page_ellipse, "tools.shapes.arc");
+
     //star
     this->AddPage(_page_star, _("Star"), iter_shapes, PREFS_PAGE_TOOLS_SHAPES_STAR);
     this->AddNewObjectsStyle(_page_star, "tools.shapes.star");
+
     //spiral
     this->AddPage(_page_spiral, _("Spiral"), iter_shapes, PREFS_PAGE_TOOLS_SHAPES_SPIRAL);
     this->AddNewObjectsStyle(_page_spiral, "tools.shapes.spiral");
+
     //Pencil
     this->AddPage(_page_pencil, _("Pencil"), iter_tools, PREFS_PAGE_TOOLS_PENCIL);
     this->AddSelcueCheckbox(_page_pencil, "tools.freehand.pencil", true);
-    _t_pencil_tolerance.init ( "tools.freehand.pencil", "tolerance", 0.0, 100.0, 0.5, 1.0, 10.0, false, false);
-    _page_pencil.add_line( false, _("Tolerance:"), _t_pencil_tolerance, "",
-                           _("This value affects the amount of smoothing applied to freehand lines; lower values produce more uneven paths with more nodes"),
-                           false );
     this->AddNewObjectsStyle(_page_pencil, "tools.freehand.pencil");
     this->AddDotSizeSpinbutton(_page_pencil, "tools.freehand.pencil", 3.0);
+
     //Pen
     this->AddPage(_page_pen, _("Pen"), iter_tools, PREFS_PAGE_TOOLS_PEN);
     this->AddSelcueCheckbox(_page_pen, "tools.freehand.pen", true);
     this->AddNewObjectsStyle(_page_pen, "tools.freehand.pen");
     this->AddDotSizeSpinbutton(_page_pen, "tools.freehand.pen", 3.0);
+
     //Calligraphy
     this->AddPage(_page_calligraphy, _("Calligraphy"), iter_tools, PREFS_PAGE_TOOLS_CALLIGRAPHY);
     this->AddSelcueCheckbox(_page_calligraphy, "tools.calligraphic", false);
@@ -435,14 +466,25 @@ void InkscapePreferences::initPageTools()
     this->AddPage(_page_paintbucket, _("Paint Bucket"), iter_tools, PREFS_PAGE_TOOLS_PAINTBUCKET);
     this->AddSelcueCheckbox(_page_paintbucket, "tools.paintbucket", false);
     this->AddNewObjectsStyle(_page_paintbucket, "tools.paintbucket");
+
+    //Eraser
+    this->AddPage(_page_eraser, _("Eraser"), iter_tools, PREFS_PAGE_TOOLS_ERASER);
+    this->AddNewObjectsStyle(_page_eraser, "tools.eraser");
+
+    //LPETool
+    this->AddPage(_page_lpetool, _("LPE Tool"), iter_tools, PREFS_PAGE_TOOLS_LPETOOL);
+    this->AddNewObjectsStyle(_page_lpetool, "tools.lpetool");
+
     //Text
     this->AddPage(_page_text, _("Text"), iter_tools, PREFS_PAGE_TOOLS_TEXT);
     this->AddSelcueCheckbox(_page_text, "tools.text", true);
     this->AddGradientCheckbox(_page_text, "tools.text", true);
     this->AddNewObjectsStyle(_page_text, "tools.text");
+
     //Gradient
     this->AddPage(_page_gradient, _("Gradient"), iter_tools, PREFS_PAGE_TOOLS_GRADIENT);
     this->AddSelcueCheckbox(_page_gradient, "tools.gradient", true);
+
     //Connector
     this->AddPage(_page_connector, _("Connector"), iter_tools, PREFS_PAGE_TOOLS_CONNECTOR);
     this->AddSelcueCheckbox(_page_connector, "tools.connector", true);
@@ -470,11 +512,6 @@ void InkscapePreferences::initPageWindows()
     _win_ontop_normal.init ( _("Normal"), "options.transientpolicy", "value", 1, true, &_win_ontop_none);
     _win_ontop_agressive.init ( _("Aggressive"), "options.transientpolicy", "value", 2, false, &_win_ontop_none);
 
-// FIXME: Temporary Win32 special code to enable transient dialogs
-#ifdef WIN32
-    _win_ontop_win32.init ( _("Dialogs stay on top (experimental!)"), "options.dialogsontopwin32", "value", false);
-#endif
-
     _page_windows.add_group_header( _("Saving window geometry (size and position):"));
     _page_windows.add_line( false, "", _win_save_geom_off, "",
                             _("Let the window manager determine placement of all windows"));
@@ -489,17 +526,15 @@ void InkscapePreferences::initPageWindows()
     _page_windows.add_line( true, "", _win_floating, "",
                             _("Floating"));
 
+#ifndef WIN32 // non-Win32 special code to enable transient dialogs
     _page_windows.add_group_header( _("Dialogs on top:"));
-#ifndef WIN32 // FIXME: Temporary Win32 special code to enable transient dialogs
+
     _page_windows.add_line( true, "", _win_ontop_none, "",
                             _("Dialogs are treated as regular windows"));
     _page_windows.add_line( true, "", _win_ontop_normal, "",
                             _("Dialogs stay on top of document windows"));
     _page_windows.add_line( true, "", _win_ontop_agressive, "",
                             _("Same as Normal but may work better with some window managers"));
-#else
-    _page_windows.add_line( false, "", _win_ontop_win32, "",
-                            _("Whether dialogs should stay on top of document windows. Read the ReleaseNotes on this issue! (Rightclick the taskbar button and press 'Restore' to bring back a minimized document window)"));
 #endif
 
     _page_windows.add_group_header( _("Miscellaneous:"));
@@ -540,6 +575,13 @@ void InkscapePreferences::initPageClones()
     _page_clones.add_line( true, "", _clone_option_delete, "",
                            _("Orphaned clones are deleted along with their original."));
 
+    _page_clones.add_group_header( _("When duplicating original+clones:"));
+
+    _clone_relink_on_duplicate.init ( _("Relink duplicated clones"), "options.relinkclonesonduplicate", "value", false);
+    _page_clones.add_line(true, "", _clone_relink_on_duplicate, "",
+                        _("When duplicating a selection containing both a clone and its original (possibly in groups), relink the duplicated clone to the duplicated original instead of the old original"));
+
+    //TRANSLATORS: Heading for the Inkscape Preferences "Clones" Page
     this->AddPage(_page_clones, _("Clones"), PREFS_PAGE_CLONES);
 }
 
@@ -605,6 +647,10 @@ void InkscapePreferences::initPageFilters()
     _page_filters.add_line( true, "", _blur_quality_worst, "",
                            _("Lowest quality (considerable artifacts), but display is fastest"));
 
+    _show_filters_info_box.init( _("Show filter primitives infobox"), "options.showfiltersinfobox", "value", true);
+    _page_filters.add_line(true, "", _show_filters_info_box, "",
+                        _("Show icons and descriptions for the filter primitives available at the filter effects dialog."));
+
     this->AddPage(_page_filters, _("Filters"), PREFS_PAGE_FILTERS);
 }
 
@@ -844,13 +890,13 @@ void InkscapePreferences::initPageGrids()
         _grids_xy.add_line( false, _("Spacing Y"), _grids_xy_spacing_y, "", _("Distance between horizontal grid lines"), false);
 
         _grids_xy_color.init(_("Grid line color"), "options.grids.xy", "color", 0x0000ff20);
-        _grids_xy.add_line( false, _("Grid line color"), _grids_xy_color, "", _("Selects the color used for normal grid lines."), false);
+        _grids_xy.add_line( false, _("Grid line color"), _grids_xy_color, "", _("Color used for normal grid lines"), false);
         _grids_xy_empcolor.init(_("Major grid line color"), "options.grids.xy", "empcolor", 0x0000ff40);
-        _grids_xy.add_line( false, _("Major grid line color"), _grids_xy_empcolor, "", _("Selects the color used for major (highlighted) grid lines."), false);
+        _grids_xy.add_line( false, _("Major grid line color"), _grids_xy_empcolor, "", _("Color used for major (highlighted) grid lines"), false);
         _grids_xy_empspacing.init("options.grids.xy", "empspacing", 1.0, 1000.0, 1.0, 5.0, 5.0, true, false);
         _grids_xy.add_line( false, _("Major grid line every"), _grids_xy_empspacing, "", "", false);
         _grids_xy_dotted.init( _("Show dots instead of lines"), "options.grids.xy", "dotted", false);
-        _grids_xy.add_line( false, "", _grids_xy_dotted, "", _("If set, displays dots at gridpoints instead of gridlines"), false);
+        _grids_xy.add_line( false, "", _grids_xy_dotted, "", _("If set, display dots at gridpoints instead of gridlines"), false);
 
     // CanvasAxonomGrid properties:
         _grids_axonom_units.init("options.grids.axonom", "units");
@@ -866,15 +912,141 @@ void InkscapePreferences::initPageGrids()
         _grids_axonom.add_line( false, _("Angle X"), _grids_axonom_angle_x, "", _("Angle of x-axis"), false);
         _grids_axonom.add_line( false, _("Angle Z"), _grids_axonom_angle_z, "", _("Angle of z-axis"), false);
         _grids_axonom_color.init(_("Grid line color"), "options.grids.axonom", "color", 0x0000ff20);
-        _grids_axonom.add_line( false, _("Grid line color"), _grids_axonom_color, "", _("Selects the color used for normal grid lines."), false);
+        _grids_axonom.add_line( false, _("Grid line color"), _grids_axonom_color, "", _("Color used for normal grid lines"), false);
         _grids_axonom_empcolor.init(_("Major grid line color"), "options.grids.axonom", "empcolor", 0x0000ff40);
-        _grids_axonom.add_line( false, _("Major grid line color"), _grids_axonom_empcolor, "", _("Selects the color used for major (highlighted) grid lines."), false);
+        _grids_axonom.add_line( false, _("Major grid line color"), _grids_axonom_empcolor, "", _("Color used for major (highlighted) grid lines"), false);
         _grids_axonom_empspacing.init("options.grids.axonom", "empspacing", 1.0, 1000.0, 1.0, 5.0, 5.0, true, false);
         _grids_axonom.add_line( false, _("Major grid line every"), _grids_axonom_empspacing, "", "", false);
 
     this->AddPage(_page_grids, _("Grids"), PREFS_PAGE_GRIDS);
 }
 
+void InkscapePreferences::initPageSVGOutput()
+{
+    _svgoutput_usenamedcolors.init( _("Use named colors"), "options.svgoutput", "usenamedcolors", false);
+    _page_svgoutput.add_line( false, "", _svgoutput_usenamedcolors, "", _("If set, write the CSS name of the color when available (e.g. 'red' or 'magenta') instead of the numeric value"), false);
+
+    _page_svgoutput.add_group_header( _("XML formatting"));
+
+    _svgoutput_inlineattrs.init( _("Inline attributes"), "options.svgoutput", "inlineattrs", false);
+    _page_svgoutput.add_line( false, "", _svgoutput_inlineattrs, "", _("Put attributes on the same line as the element tag"), false);
+
+    _svgoutput_indent.init("options.svgoutput", "indent", 0.0, 1000.0, 1.0, 2.0, 2.0, true, false);
+    _page_svgoutput.add_line( false, _("Indent, spaces"), _svgoutput_indent, "", _("The number of spaces to use for indenting nested elements; set to 0 for no indentation"), false);
+
+    _page_svgoutput.add_group_header( _("Path data"));
+
+    _svgoutput_allowrelativecoordinates.init( _("Allow relative coordinates"), "options.svgoutput", "allowrelativecoordinates", true);
+    _page_svgoutput.add_line( false, "", _svgoutput_allowrelativecoordinates, "", _("If set, relative coordinates may be used in path data"), false);
+
+    _svgoutput_forcerepeatcommands.init( _("Force repeat commands"), "options.svgoutput", "forcerepeatcommands", false);
+    _page_svgoutput.add_line( false, "", _svgoutput_forcerepeatcommands, "", _("Force repeating of the same path command (for example, 'L 1,2 L 3,4' instead of 'L 1,2 3,4')"), false);
+
+    _page_svgoutput.add_group_header( _("Numbers"));
+
+    _svgoutput_numericprecision.init("options.svgoutput", "numericprecision", 1.0, 16.0, 1.0, 2.0, 8.0, true, false);
+    _page_svgoutput.add_line( false, _("Numeric precision"), _svgoutput_numericprecision, "", _("How many digits to write after the decimal dot"), false);
+
+    _svgoutput_minimumexponent.init("options.svgoutput", "minimumexponent", -32.0, -1, 1.0, 2.0, -8.0, true, false);
+    _page_svgoutput.add_line( false, _("Minimum exponent"), _svgoutput_minimumexponent, "", _("The smallest number written to SVG is 10 to the power of this exponent; anything smaller is written as zero."), false);
+
+    this->AddPage(_page_svgoutput, _("SVG output"), PREFS_PAGE_SVGOUTPUT);
+}
+
+void InkscapePreferences::initPageUI()
+{
+     Glib::ustring sizeLabels[] = {_("Normal"), _("Medium"), _("Small")};
+    int sizeValues[] = {0, 1, 2};
+
+    _misc_small_toolbar.init( "toolbox", "small", sizeLabels, sizeValues, G_N_ELEMENTS(sizeLabels), 0 );
+    _page_ui.add_line( false, _("Commands bar icon size"), _misc_small_toolbar, "",
+                           _("Set the size for the commands toolbar to use (requires restart)"), false);
+
+    _misc_small_secondary.init( "toolbox", "secondary", sizeLabels, sizeValues, G_N_ELEMENTS(sizeLabels), 1 );
+    _page_ui.add_line( false, _("Tool controls bar icon size"), _misc_small_secondary, "",
+                           _("Set the size for the secondary toolbar to use (requires restart)"), false);
+
+    _misc_small_tools.init( "toolbox.tools", "small", sizeLabels, sizeValues, G_N_ELEMENTS(sizeLabels), 0 );
+    _page_ui.add_line( false, _("Main toolbar icon size"), _misc_small_tools, "",
+                           _("Set the size for the main tools to use (requires restart)"), false);
+
+    _misc_recent.init("options.maxrecentdocuments", "value", 0.0, 1000.0, 1.0, 1.0, 1.0, true, false);
+    _page_ui.add_line( false, _("Maximum documents in Open Recent:"), _misc_recent, "",
+                           _("The maximum length of the Open Recent list in the File menu"), false);
+
+    this->AddPage(_page_ui, _("Interface"), PREFS_PAGE_UI);
+}
+
+
+void InkscapePreferences::initPageAutosave()
+{
+    // Autosave options 
+    _autosave_autosave_enable.init( _("Enable autosave (requires restart)"), "options.autosave", "enable", false);
+    _page_autosave.add_line(false, "", _autosave_autosave_enable, "", _("Automatically save the current document(s) at a given interval, thus minimizing loss in case of a crash"), false);
+    _autosave_autosave_interval.init("options.autosave", "interval", 1.0, 10800.0, 1.0, 10.0, 10.0, true, false);
+    _page_autosave.add_line(true, _("Interval (in minutes)"), _autosave_autosave_interval, "", _("Interval (in minutes) at which document will be autosaved"), false);
+    _autosave_autosave_path.init("options.autosave", "path", true);
+    _page_autosave.add_line(true, _("Path"), _autosave_autosave_path, "", _("The directory where autosaves will be written"), false);
+    _autosave_autosave_max.init("options.autosave", "max", 1.0, 100.0, 1.0, 10.0, 10.0, true, false);
+    _page_autosave.add_line(true, _("Maximum number of autosaves"), _autosave_autosave_max, "", _("Maximum number of autosaved files; use this to limit the storage space used"), false);
+
+    /* When changing the interval or enabling/disabling the autosave function,
+     * update our running configuration
+     *
+     * FIXME!
+     * the inkscape_autosave_init should be called AFTER the values have been changed
+     * (which cannot be guaranteed from here)
+     *
+     * For now, autosave-settings will not change until restart
+     */
+    /*
+    _autosave_autosave_enable.signal_toggled().connect( sigc::ptr_fun(inkscape_autosave_init), TRUE );
+    _autosave_autosave_interval.signal_changed().connect( sigc::ptr_fun(inkscape_autosave_init), TRUE );
+    */
+
+    // -----------
+
+    this->AddPage(_page_autosave, _("Autosave"), PREFS_PAGE_AUTOSAVE);
+}
+
+void InkscapePreferences::initPageBitmaps()
+{
+    {
+        Glib::ustring labels[] = {_("None"), _("2x2"), _("4x4"), _("8x8"), _("16x16")};
+        int values[] = {0, 1, 2, 3, 4};
+        _misc_overs_bitmap.set_size_request(_sb_width);
+        _misc_overs_bitmap.init("options.bitmapoversample", "value", labels, values, G_N_ELEMENTS(values), 1);
+        _page_bitmaps.add_line( false, _("Oversample bitmaps:"), _misc_overs_bitmap, "", "", false);
+    }
+
+    _misc_bitmap_autoreload.init(_("Automatically reload bitmaps"), "options.bitmapautoreload", "value", true);
+    _page_bitmaps.add_line( false, "", _misc_bitmap_autoreload, "",
+                           _("Automatically reload linked images when file is changed on disk"));
+    gchar const *choices = prefs_get_string_attribute("options.bitmapeditor", "choices");
+    if ( choices && choices[0] ) {
+        gchar** splits = g_strsplit(choices, ",", 0);
+        gint numIems = g_strv_length(splits);
+
+        Glib::ustring labels[numIems];
+        int values[numIems];
+        for ( gint i = 0; i < numIems; i++) {
+            values[i] = i;
+            labels[i] = splits[i];
+        }
+        _misc_bitmap_editor.init("options.bitmapeditor", "value", labels, values, numIems, 0);
+        _page_bitmaps.add_line( false, _("Bitmap editor:"), _misc_bitmap_editor, "", "", false);
+
+        g_strfreev(splits);
+    }
+
+    _bitmap_copy_res.init("options.createbitmap", "resolution", 1.0, 6000.0, 1.0, 1.0, PX_PER_IN, true, false);
+    _page_bitmaps.add_line( false, _("Resolution for Create Bitmap Copy:"), _bitmap_copy_res, _("dpi"),
+                            _("Resolution used by the Create Bitmap Copy command"), false);
+
+    this->AddPage(_page_bitmaps, _("Bitmaps"), PREFS_PAGE_BITMAPS);
+}
+
+
 void InkscapePreferences::initPageMisc()
 {
     _misc_comment.init( _("Add label comments to printing output"), "printing.debug", "show-label-comments", false);
@@ -885,29 +1057,17 @@ void InkscapePreferences::initPageMisc()
     _page_misc.add_line( false, "", _misc_forkvectors, "",
                            _("When on, shared gradient definitions are automatically forked on change; uncheck to allow sharing of gradient definitions so that editing one object may affect other objects using the same gradient"), true);
 
+    _misc_simpl.init("options.simplifythreshold", "value", 0.0001, 1.0, 0.0001, 0.0010, 0.0010, false, false);
     _page_misc.add_line( false, _("Simplification threshold:"), _misc_simpl, "",
                            _("How strong is the Simplify command by default. If you invoke this command several times in quick succession, it will act more and more aggressively; invoking it again after a pause restores the default threshold."), false);
-    int const num_items = 5;
-    Glib::ustring labels[num_items] = {_("None"), _("2x2"), _("4x4"), _("8x8"), _("16x16")};
-    int values[num_items] = {0, 1, 2, 3, 4};
-    _misc_overs_bitmap.set_size_request(_sb_width);
-    _misc_overs_bitmap.init("options.bitmapoversample", "value", labels, values, num_items, 1);
-    _page_misc.add_line( false, _("Oversample bitmaps:"), _misc_overs_bitmap, "", "", false);
 
+    _misc_latency_skew.init("debug.latency", "skew", 0.5, 2.0, 0.01, 0.10, 1.0, false, false);
+    _page_misc.add_line( false, _("Latency skew:"), _misc_latency_skew, _("(requires restart)"),
+                           _("Factor by which the event clock is skewed from the actual time (0.9766 on some systems)."), false);
 
-    // consider moving this to an UI tab:
-    _misc_small_toolbar.init( _("Make the commands toolbar icons smaller"), "toolbox", "small", true);
-    _page_misc.add_line( false, "", _misc_small_toolbar, "",
-                           _("Make the commands toolbar use the 'secondary' toolbar size (requires restart)"), true);
-
-    _misc_small_tools.init( _("Make the main toolbar icons smaller"), "toolbox.tools", "small", true);
-    _page_misc.add_line( false, "", _misc_small_tools, "",
-                           _("Make the main tools use the 'secondary' toolbar size (requires restart)"), true);
-
-    _misc_recent.init("options.maxrecentdocuments", "value", 0.0, 1000.0, 1.0, 1.0, 1.0, true, false);
-    _page_misc.add_line( false, _("Maximum number of recent documents:"), _misc_recent, "",
-                           _("The maximum length of the Open Recent list in the File menu"), false);
-    _misc_simpl.init("options.simplifythreshold", "value", 0.0001, 1.0, 0.0001, 0.0010, 0.0010, false, false);
+    _misc_namedicon_delay.init( _("Pre-render named icons"), "options.iconrender", "named_nodelay", false);
+    _page_misc.add_line( false, "", _misc_namedicon_delay, "",
+                           _("When on, named icons will be rendered before displaying the ui. This is for working around bugs in GTK+ named icon notification"), true);
 
     this->AddPage(_page_misc, _("Misc"), PREFS_PAGE_MISC);
 }