Code

Tentative fix for LP bug #168922: don't save prefs n crash handler
authortweenk <tweenk@users.sourceforge.net>
Thu, 26 Feb 2009 13:40:18 +0000 (13:40 +0000)
committertweenk <tweenk@users.sourceforge.net>
Thu, 26 Feb 2009 13:40:18 +0000 (13:40 +0000)
src/inkscape.cpp
src/preferences.cpp
src/preferences.h

index ae52589046ec1c34b5dbc2db3b156f4665fdc5a6..b497367cc999714f4283782aa93782a4bb57c3b7 100644 (file)
@@ -460,11 +460,8 @@ inkscape_init (SPObject * object)
     new (&inkscape->document_set) std::map<SPDocument *, int>();
 
     inkscape->menus = sp_repr_read_mem (_(menus_skeleton), MENUS_SKELETON_SIZE, NULL);
-
     inkscape->desktops = NULL;
-
     inkscape->dialogs_toggle = TRUE;
-
     inkscape->mapalt=GDK_MOD1_MASK;
 }
 
@@ -658,7 +655,8 @@ inkscape_crash_handler (int /*signum*/)
         }
     }
 
-    Inkscape::Preferences::unload();
+    // do not save the preferences since they can be in a corrupted state
+    Inkscape::Preferences::unload(false);
 
     fprintf (stderr, "Emergency save completed. Inkscape will close now.\n");
     fprintf (stderr, "If you can reproduce this crash, please file a bug at www.inkscape.org\n");
@@ -749,7 +747,7 @@ inkscape_application_init (const gchar *argv0, gboolean use_gui)
     inkscape->use_gui = use_gui;
     inkscape->argv0 = g_strdup(argv0);
 
-    /* Load the preferences and menus; Later menu layout should be merged into prefs */
+    /* Load the preferences and menus */
     Inkscape::Preferences *prefs = Inkscape::Preferences::get();
     prefs->load(use_gui, false);
     inkscape_load_menus(inkscape);
@@ -1414,8 +1412,6 @@ inkscape_get_all_desktops(std::list< SPDesktop* >& listbuf)
     }
 }
 
-
-
 /*
   Local Variables:
   mode:c++
index ea3c015efe380acd69fef666c5e1fdc3de27816b..16b775b345243e21d1691ce0e76404dceb93354e 100644 (file)
@@ -73,10 +73,7 @@ Preferences::Preferences() :
 }
 
 Preferences::~Preferences()
-{
-    // when the preferences are unloaded, save them
-    save();
-    
+{   
     // delete all PrefNodeObservers
     for (_ObsMap::iterator i = _observer_map.begin(); i != _observer_map.end(); ) {
         delete (*i++).second; // avoids reference to a deleted key
@@ -637,6 +634,16 @@ Preferences::Entry const Preferences::_create_pref_value(Glib::ustring const &pa
     return Entry(path, ptr);
 }
 
+void Preferences::unload(bool save)
+{
+    if(_instance)
+    {
+        if (save) _instance->save();
+        delete _instance;
+        _instance = NULL;
+    }
+}
+
 Preferences *Preferences::_instance = NULL;
 
 
index a87a2771813816d9ef0722559522784868949ea4..7335ab39a89022b081541d41f71bda9f4d21e375 100644 (file)
@@ -399,17 +399,14 @@ public:
         return _instance;
     }
     /**
-     * @brief Unload all preferences and store them on the hard disk.
+     * @brief Unload all preferences
+     * @param save Whether to save the preferences; defaults to true
      *
-     * This deletes the singleton object. Calling get() after this function is
-     */
-    static void unload() {
-        if(_instance)
-        {
-            delete _instance;
-            _instance = NULL;
-        }
-    }
+     * This deletes the singleton object. Calling get() after this function
+     * will reinstate it, so you shouldn't. Pass false as the parameter
+     * to suppress automatic saving.
+     */
+    static void unload(bool save=true);
     /*@}*/
     
 protected: