]> git.lyx.org Git - features.git/commitdiff
* proper mechanism to dispatch FuncRequests delayed, i.e. when the event loop is...
authorStefan Schimanski <sts@lyx.org>
Sat, 15 Nov 2008 16:29:58 +0000 (16:29 +0000)
committerStefan Schimanski <sts@lyx.org>
Sat, 15 Nov 2008 16:29:58 +0000 (16:29 +0000)
* fixes http://bugzilla.lyx.org/show_bug.cgi?id=5447

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@27459 a592a061-630c-0410-9148-cb99ea01b6c8

src/frontends/qt4/GuiApplication.cpp
src/frontends/qt4/GuiApplication.h
src/frontends/qt4/GuiView.cpp

index 89fce62a1e076c425fd62c5963e9ece6e010aee5..f2efabdcc5b7e47a683c2190576a4777b98b019f 100644 (file)
@@ -62,6 +62,8 @@
 #include "support/linkback/LinkBackProxy.h"
 #endif
 
+#include <queue>
+
 #include <QByteArray>
 #include <QClipboard>
 #include <QDateTime>
@@ -178,16 +180,6 @@ vector<string> loadableImageFormats()
 }
 
 
-class FuncRequestEvent : public QEvent
-{
-public:
-       FuncRequestEvent(FuncRequest const & req) 
-       : QEvent(QEvent::User), request(req) {}
-
-       FuncRequest const request;
-};
-
-
 ////////////////////////////////////////////////////////////////////////
 // Icon loading support code.
 ////////////////////////////////////////////////////////////////////////
@@ -631,6 +623,9 @@ struct GuiApplication::Private
        /// are done.
        QTimer general_timer_;
 
+       /// delayed FuncRequests
+       std::queue<FuncRequest> func_request_queue_;
+
        /// Multiple views container.
        /**
        * Warning: This must not be a smart pointer as the destruction of the
@@ -907,6 +902,13 @@ bool GuiApplication::dispatch(FuncRequest const & cmd)
 }
 
 
+void GuiApplication::dispatchDelayed(FuncRequest const & func)
+{
+       d->func_request_queue_.push(func);
+       QTimer::singleShot(0, this, SLOT(processFuncRequestQueue()));
+}
+
+
 void GuiApplication::resetGui()
 {
        // Set the language defined by the user.
@@ -1088,6 +1090,15 @@ void GuiApplication::setGuiLanguage()
 }
 
 
+void GuiApplication::processFuncRequestQueue()
+{
+       while (!d->func_request_queue_.empty()) {
+               lyx::dispatch(d->func_request_queue_.back());
+               d->func_request_queue_.pop();
+       }
+}
+
+
 void GuiApplication::execBatchCommands()
 {
        setGuiLanguage();
@@ -1192,13 +1203,6 @@ void GuiApplication::handleRegularEvents()
 }
 
 
-void GuiApplication::customEvent(QEvent * event)
-{
-       FuncRequestEvent * reqEv = static_cast<FuncRequestEvent *>(event);
-       lyx::dispatch(reqEv->request);
-}
-
-
 bool GuiApplication::event(QEvent * e)
 {
        switch(e->type()) {
@@ -1209,8 +1213,7 @@ bool GuiApplication::event(QEvent * e)
                // commands are not executed here yet and the gui is not ready
                // therefore.
                QFileOpenEvent * foe = static_cast<QFileOpenEvent *>(e);
-               postEvent(this, new FuncRequestEvent(FuncRequest(LFUN_FILE_OPEN,
-                       qstring_to_ucs4(foe->file()))));
+               dispatchDelayed(FuncRequest(LFUN_FILE_OPEN, qstring_to_ucs4(foe->file())));
                e->accept();
                return true;
        }
index 63bc179f602d936f96bbe0fdc2641e57b2da529f..8de92f06ad0026dfaae4b5d36b30458f031943c8 100644 (file)
@@ -59,6 +59,7 @@ public:
        //@{
        bool getStatus(FuncRequest const & cmd, FuncStatus & flag) const;
        bool dispatch(FuncRequest const &);
+       void dispatchDelayed(FuncRequest const &);
        void resetGui();
        void restoreGuiSession();
        Clipboard & clipboard();
@@ -66,7 +67,6 @@ public:
        FontLoader & fontLoader();
        int exec();
        void exit(int status);
-       void customEvent(QEvent * event);
        bool event(QEvent * e);
        bool getRgbColor(ColorCode col, RGBColor & rgbcol);
        std::string const hexName(ColorCode col);
@@ -135,6 +135,9 @@ private Q_SLOTS:
        ///
        void onLastWindowClosed();
 
+       ///
+       void processFuncRequestQueue();
+
 private:
        ///
        bool closeAllViews();
index fd9c338f5bfe9cce0eeb608ff282dffa2e637758..a5c1c7a49024655ce8ca6c310b99c28bd2cab9d0 100644 (file)
@@ -142,6 +142,7 @@ private:
        QPixmap splash_;
 };
 
+
 /// Toolbar store providing access to individual toolbars by name.
 typedef std::map<std::string, GuiToolbar *> ToolbarMap;
 
@@ -597,7 +598,7 @@ void GuiView::dragEnterEvent(QDragEnterEvent * event)
 }
 
 
-void GuiView::dropEvent(QDropEvent* event)
+void GuiView::dropEvent(QDropEvent * event)
 {
        QList<QUrl> files = event->mimeData()->urls();
        if (files.isEmpty())
@@ -607,8 +608,13 @@ void GuiView::dropEvent(QDropEvent* event)
        for (int i = 0; i != files.size(); ++i) {
                string const file = os::internal_path(fromqstr(
                        files.at(i).toLocalFile()));
-               if (!file.empty())
-                       lyx::dispatch(FuncRequest(LFUN_FILE_OPEN, file));
+               if (!file.empty()) {
+                       // Asynchronously post the event. DropEvent usually come
+                       // from the BufferView. But reloading a file might close
+                       // the BufferView from within its own event handler.
+                       guiApp->dispatchDelayed(FuncRequest(LFUN_FILE_OPEN, file));
+                       event->accept();
+               }
        }
 }