> > >> reasons why
> > >> we dont ask directly 
> > >> qApp->clipboard()->text(QClipboard::Selection).isEmpty() ?
> > >
> > > The only reason was speed issue.
> > 
> > what about to call this whenever middle button is clicked ?
> 
> Might work. Otoh we get the signal delivered anyway...

i really dont understand what 'speed issues' were the reason.
i was not able to get a single call of empty() function while
editing. i get its call only when i go to the edit menu (ok,
here 4 calls for menu items).

anyway i made the patch which preserves the caching and adds 
recalculating of cache in case LFUN_PRIMARY_SELECTION_PASTE
is called (eg middle button shot).

this solves the bug 4403 for me (Helge, can you confirm it ?)
it would also solve the bug 4394 if you want to backport it
to 1.5.

i will commit this to trunk later INO (if no objections;)
pavel
diff --git a/src/Text3.cpp b/src/Text3.cpp
index fa9fa8d..775bec0 100644
--- a/src/Text3.cpp
+++ b/src/Text3.cpp
@@ -2027,7 +2027,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & 
cmd,
                break;
 
        case LFUN_PRIMARY_SELECTION_PASTE:
-               enable = cur.selection() || !theSelection().empty();
+               enable = cur.selection() || !theSelection().empty(false);
                break;
 
        case LFUN_PARAGRAPH_MOVE_UP:
diff --git a/src/frontends/Selection.h b/src/frontends/Selection.h
index ac902ff..4144ddb 100644
--- a/src/frontends/Selection.h
+++ b/src/frontends/Selection.h
@@ -61,8 +61,11 @@ public:
         * Is the X selection empty?
         * This does always return true on systems that don't have a real
         * selection.
+        * For performance reasons cache is used under the hood, which produced
+        * problems of middle-button pasting on some systems. Thats where
+        * useCache=false helps.
         */
-       virtual bool empty() const = 0;
+       virtual bool empty(bool useCache=true) = 0;
 };
 
 } // namespace frontend
diff --git a/src/frontends/qt4/GuiSelection.cpp 
b/src/frontends/qt4/GuiSelection.cpp
index d12ee00..fa440b2 100644
--- a/src/frontends/qt4/GuiSelection.cpp
+++ b/src/frontends/qt4/GuiSelection.cpp
@@ -95,11 +95,13 @@ void GuiSelection::on_dataChanged()
 }
 
 
-bool GuiSelection::empty() const
+bool GuiSelection::empty(bool useCache)
 {
        if (!selection_supported_)
                return true;
 
+       if (!useCache) on_dataChanged();
+
        LYXERR(Debug::ACTION, "GuiSelection::empty: " << text_selection_empty_);
 
        return text_selection_empty_;
diff --git a/src/frontends/qt4/GuiSelection.h b/src/frontends/qt4/GuiSelection.h
index c7f2096..fa32d6d 100644
--- a/src/frontends/qt4/GuiSelection.h
+++ b/src/frontends/qt4/GuiSelection.h
@@ -37,7 +37,7 @@ public:
        void haveSelection(bool own);
        docstring const get() const;
        void put(docstring const & str);
-       bool empty() const;
+       bool empty(bool useCache=true);
        //@}
 
 private Q_SLOTS:

Reply via email to