Author: craig
Date: Fri Apr 10 19:54:28 2015
New Revision: 19986

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=19986
Log:
Fix PictureBrowser crash when closing Scribus without closing PictureBrowser. 
Adds cleanupPlugin to ScActionPlugin to achieve this

Modified:
    trunk/Scribus/scribus/pluginmanager.cpp
    trunk/Scribus/scribus/pluginmanager.h
    trunk/Scribus/scribus/plugins/picbrowser/picturebrowserplugin.cpp
    trunk/Scribus/scribus/plugins/picbrowser/picturebrowserplugin.h
    trunk/Scribus/scribus/scplugin.h

Modified: trunk/Scribus/scribus/pluginmanager.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=19986&path=/trunk/Scribus/scribus/pluginmanager.cpp
==============================================================================
--- trunk/Scribus/scribus/pluginmanager.cpp (original)
+++ trunk/Scribus/scribus/pluginmanager.cpp Fri Apr 10 19:54:28 2015
@@ -550,29 +550,29 @@
 void PluginManager::cleanupPlugins()
 {
        for (PluginMap::Iterator it = pluginMap.begin(); it != pluginMap.end(); 
++it)
-               if (it.value().enabled == true)
+               if (it.value().enabled)
                        finalizePlug(it.value());
 }
 
-void PluginManager::finalizePlug(PluginData & pda)
+void PluginManager::finalizePlug(PluginData & pluginData)
 {
        typedef void (*freePluginPtr)(ScPlugin* plugin);
-       if (pda.plugin)
-       {
-               if (pda.enabled)
-                       disablePlugin(pda);
-               Q_ASSERT(!pda.enabled);
+       if (pluginData.plugin)
+       {
+               if (pluginData.enabled)
+                       disablePlugin(pluginData);
+               Q_ASSERT(!pluginData.enabled);
                freePluginPtr freePlugin =
-                       (freePluginPtr) resolveSym(pda.pluginDLL, 
QString(pda.pluginName + "_freePlugin").toLocal8Bit().data());
+                       (freePluginPtr) resolveSym(pluginData.pluginDLL, 
QString(pluginData.pluginName + "_freePlugin").toLocal8Bit().data());
                if ( freePlugin )
-                       (*freePlugin)( pda.plugin );
-               pda.plugin = 0;
-       }
-       Q_ASSERT(!pda.enabled);
-       if (pda.pluginDLL)
-       {
-               unloadDLL(pda.pluginDLL);
-               pda.pluginDLL = 0;
+                       (*freePlugin)( pluginData.plugin );
+               pluginData.plugin = 0;
+       }
+       Q_ASSERT(!pluginData.enabled);
+       if (pluginData.pluginDLL)
+       {
+               unloadDLL(pluginData.pluginDLL);
+               pluginData.pluginDLL = 0;
        }
 }
 
@@ -584,6 +584,7 @@
        {
                ScActionPlugin* plugin = 
dynamic_cast<ScActionPlugin*>(pda.plugin);
                assert(plugin);
+               plugin->cleanupPlugin();
                // FIXME: Correct way to delete action?
                delete 
ScCore->primaryMainWindow()->scrActions[plugin->actionInfo().name];
        }
@@ -702,8 +703,7 @@
        return pluginMap[pluginName].enabled;
 }
 
-QStringList PluginManager::pluginNames(
-               bool includeDisabled, const char* inherits) const
+QStringList PluginManager::pluginNames( bool includeDisabled, const char* 
inherits) const
 {
        // Scan the plugin map for plugins...
        QStringList names;

Modified: trunk/Scribus/scribus/pluginmanager.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=19986&path=/trunk/Scribus/scribus/pluginmanager.h
==============================================================================
--- trunk/Scribus/scribus/pluginmanager.h (original)
+++ trunk/Scribus/scribus/pluginmanager.h Fri Apr 10 19:54:28 2015
@@ -208,7 +208,7 @@
         *         The plug-in is marked unloaded in the map.
         *  \param pda plugin data
         */
-       void finalizePlug(PluginData & pda);
+       void finalizePlug(PluginData & pluginData);
 
        /** \brief Configuration structure */
        PrefsContext* prefs;

Modified: trunk/Scribus/scribus/plugins/picbrowser/picturebrowserplugin.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=19986&path=/trunk/Scribus/scribus/plugins/picbrowser/picturebrowserplugin.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/picbrowser/picturebrowserplugin.cpp (original)
+++ trunk/Scribus/scribus/plugins/picbrowser/picturebrowserplugin.cpp Fri Apr 
10 19:54:28 2015
@@ -5,7 +5,6 @@
 for which a new license (GPL+exception) is in place.
 */
 #include "picturebrowserplugin.h"
-//#include "picturebrowser.h"
 
 // See scplugin.h and pluginmanager.{cpp,h} for detail on what these methods
 // do. That documentatation is not duplicated here.
@@ -22,6 +21,12 @@
 
 PictureBrowserPlugin::~PictureBrowserPlugin()
 {
+}
+
+bool PictureBrowserPlugin::cleanupPlugin()
+{
+       closePictureBrowser();
+       return true;
 }
 
 void PictureBrowserPlugin::languageChange()
@@ -66,7 +71,7 @@
        //picturebrowser isn't running yet, so create it
        if ( !pictureBrowser )
        {
-               pictureBrowser = new PictureBrowser ( doc, doc->scMW() );
+               pictureBrowser = new PictureBrowser ( doc, 0 );
 
                if ( !pictureBrowser )
                {
@@ -110,13 +115,21 @@
 //             pictureBrowser->changedDocument ( doc );
 }
 
+void PictureBrowserPlugin::closePictureBrowser()
+{
+       if (pictureBrowser)
+       {
+               if (pictureBrowser->isVisible())
+                       pictureBrowser->close();
+               delete pictureBrowser;
+               pictureBrowser = NULL;
+       }
+}
+
 void PictureBrowserPlugin::pictureBrowserClosed()
 {
-       if(pictureBrowser)
-               pictureBrowser->close();
-       pictureBrowser = 0;
+       pictureBrowser = NULL;
 }
-
 
 // Low level plugin API
 int picturebrowser_getPluginAPIVersion()

Modified: trunk/Scribus/scribus/plugins/picbrowser/picturebrowserplugin.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=19986&path=/trunk/Scribus/scribus/plugins/picbrowser/picturebrowserplugin.h
==============================================================================
--- trunk/Scribus/scribus/plugins/picbrowser/picturebrowserplugin.h (original)
+++ trunk/Scribus/scribus/plugins/picbrowser/picturebrowserplugin.h Fri Apr 10 
19:54:28 2015
@@ -23,6 +23,7 @@
                //! \brief Standard plugin implementation
                PictureBrowserPlugin();
                virtual ~PictureBrowserPlugin();
+               virtual bool cleanupPlugin();
                //! \brief main method to run the plug
                virtual bool run ( ScribusDoc* doc, QString target = 
QString::null );
                virtual const QString fullTrName() const;
@@ -34,10 +35,14 @@
                virtual void unsetDoc();
                virtual void changedDoc ( ScribusDoc* doc );
 
+       public slots:
+               void closePictureBrowser();
+
        private:
                PictureBrowser *pictureBrowser;
 
        private slots:
+               //only called on auto delete on close, resets ptr
                void pictureBrowserClosed();
 };
 

Modified: trunk/Scribus/scribus/scplugin.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=19986&path=/trunk/Scribus/scribus/scplugin.h
==============================================================================
--- trunk/Scribus/scribus/scplugin.h (original)
+++ trunk/Scribus/scribus/scplugin.h Fri Apr 10 19:54:28 2015
@@ -305,6 +305,19 @@
 
        public slots:
                /**
+                * @brief Deactivates the plugin for unloading / program quit
+                *
+                * This method will be called when the plug-in is about to be 
unloaded,
+                * or if the plug-in manager has been asked to disable the 
plug-in.
+                * This method will never be called unless initPlugin has been 
called
+                * first, but there is no guarantee the plugin will actually be
+                * unloaded after this is called, or before initPlugin is 
called again.
+                *
+                * @returns bool True for success.
+                */
+               virtual bool cleanupPlugin() { return false; }
+
+               /**
                 * @brief Run the plug-in's main action.
                 *
                 * Run the plug-in's default action synchronously, blocking the 
rest of
@@ -503,7 +516,7 @@
 //
 // The API version is currently simply incremented with each incompatible
 // change. Future versions may introduce a minor/major scheme if necessary.
-#define PLUGIN_API_VERSION 0x00000105
+#define PLUGIN_API_VERSION 0x00000106
 
 
 #endif


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to