commit a476cc483945bdb3126602443ab9a1068bbb8397
Author: Stephan Witt <sw...@lyx.org>
Date:   Sun Feb 14 18:56:25 2021 +0100

    #8055 add support for system-wide find buffer on Mac
    
    Command-E is standard for paste to find buffer on Mac. That's why the key 
binding is changed appropriately.
---
 lib/bind/mac.bind                 |    5 ++-
 src/BufferView.cpp                |   40 +++++++++++++++++++++++-------------
 src/BufferView.h                  |    3 ++
 src/frontends/Clipboard.h         |    7 ++++++
 src/frontends/qt/GuiClipboard.cpp |   21 +++++++++++++++++++
 src/frontends/qt/GuiClipboard.h   |    3 ++
 src/frontends/qt/GuiSearch.cpp    |   19 +++++++++++++++++
 src/frontends/qt/GuiSearch.h      |    1 +
 8 files changed, 82 insertions(+), 17 deletions(-)

diff --git a/lib/bind/mac.bind b/lib/bind/mac.bind
index f65895f..8d54e4c 100644
--- a/lib/bind/mac.bind
+++ b/lib/bind/mac.bind
@@ -139,8 +139,9 @@ Format 5
 \bind "C-d"                          "buffer-view dvi" # 'd' for dvi
 \bind "C-M-d"                        "command-alternatives master-buffer-view 
dvi; buffer.view dvi"
 \bind "C-S-D"                        "buffer-update dvi"       # 'd' for dvi
-#  -: "Command-E"                    # Use the selection for a find
-\bind "C-e"                          "font-emph"
+#  +: "Command-E"                    # Use the selection for a find
+\bind "C-e"                          "search-string-set"
+\bind "C-M-e"                        "font-emph"
 #  +: "Command-F"                    # Open a Find window
 \bind "C-f"                          "dialog-toggle findreplace"
 \bind "C-S-f"                        "dialog-toggle findreplaceadv"
diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index b67775e..7087973 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -61,6 +61,7 @@
 #include "frontends/NullPainter.h"
 #include "frontends/Painter.h"
 #include "frontends/Selection.h"
+#include "frontends/Clipboard.h"
 
 #include "support/convert.h"
 #include "support/debug.h"
@@ -274,9 +275,6 @@ struct BufferView::Private
          */
        frontend::GuiBufferViewDelegate * gui_;
 
-       /// cache search string for simple search
-       docstring search_request_cache_;
-
        ///
        map<string, Inset *> edited_insets_;
 
@@ -449,6 +447,22 @@ Buffer const & BufferView::buffer() const
 }
 
 
+docstring const & BufferView::searchRequestCache() const
+{
+       return theClipboard().getFindBuffer();
+}
+
+
+void BufferView::setSearchRequestCache(docstring const & text)
+{
+       bool casesensitive;
+       bool matchword;
+       bool forward;
+       docstring const search = string2find(text, casesensitive, matchword, 
forward);
+       theClipboard().setFindBuffer(search);
+}
+
+
 bool BufferView::needsFitCursor() const
 {
        if (cursorStatus(d->cursor_) == CUR_INSIDE) {
@@ -1620,21 +1634,17 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                docstring searched_string;
 
                if (!cmd.argument().empty()) {
-                       d->search_request_cache_ = cmd.argument();
+                       setSearchRequestCache(cmd.argument());
                        searched_string = cmd.argument();
                } else {
-                       searched_string = d->search_request_cache_;
+                       searched_string = searchRequestCache();
                }
 
                if (searched_string.empty())
                        break;
 
-               bool casesensitive;
-               bool matchword;
-               bool forward;
-               docstring const search = string2find(searched_string, 
casesensitive, matchword, forward);
                docstring const data =
-                       find2string(search, casesensitive, matchword, act == 
LFUN_WORD_FIND_FORWARD);
+                       find2string(searched_string, false, false, act == 
LFUN_WORD_FIND_FORWARD);
                bool found = lyxfind(this, FuncRequest(LFUN_WORD_FIND, data));
                if (found)
                        dr.screenUpdate(Update::Force | Update::FitCursor);
@@ -1645,8 +1655,8 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
 
        case LFUN_WORD_FIND: {
                docstring arg = cmd.argument();
-               if (arg.empty() && !d->search_request_cache_.empty())
-                       arg = d->search_request_cache_;
+               if (arg.empty())
+                       arg = searchRequestCache();
                if (arg.empty()) {
                        lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, 
"findreplace"));
                        break;
@@ -1656,14 +1666,14 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                else
                        dr.setMessage(_("Search string not found!"));
 
-               d->search_request_cache_ = arg;
+               setSearchRequestCache(arg);
                break;
        }
 
        case LFUN_SEARCH_STRING_SET: {
                docstring pattern = cmd.argument();
                if (!pattern.empty()) {
-                       d->search_request_cache_ = pattern;
+                       setSearchRequestCache(pattern);
                        break;
                }
                if (cur.selection())
@@ -1675,7 +1685,7 @@ void BufferView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                        cur.selection(false);
                        cur.pos() = spos;
                }
-               d->search_request_cache_ = pattern;
+               setSearchRequestCache(pattern);
                break;
        }
 
diff --git a/src/BufferView.h b/src/BufferView.h
index 1b76da2..830c2d7 100644
--- a/src/BufferView.h
+++ b/src/BufferView.h
@@ -109,6 +109,9 @@ public:
        /// bottom margin
        int bottomMargin() const;
 
+       docstring const & searchRequestCache() const;
+       void setSearchRequestCache(docstring const & text);
+
        /// return the on-screen size of this length
        /*
         *  This is a wrapper around Length::inPixels that uses the
diff --git a/src/frontends/Clipboard.h b/src/frontends/Clipboard.h
index c06a17f..5e16a26 100644
--- a/src/frontends/Clipboard.h
+++ b/src/frontends/Clipboard.h
@@ -65,6 +65,8 @@ public:
        /// Get the contents of the window system clipboard as graphics file.
        virtual support::FileName getAsGraphics(Cursor const & cur, 
GraphicsType type) const = 0;
 
+       virtual docstring const & getFindBuffer() { return find_buffer_; }
+
        /**
         * Fill the system clipboard. The format of \p lyx is as written in
         * .lyx files, the format of \p text is plain text.
@@ -79,6 +81,8 @@ public:
        /// Put a general string on the system clipboard (not LyX text)
        virtual void put(std::string const & text) const = 0;
 
+       virtual void setFindBuffer(docstring const & text) { find_buffer_ = 
text;}
+
        /// Does the clipboard contain text contents?
        virtual bool hasTextContents(TextType type = AnyTextType) const = 0;
        /// Does the clipboard contain graphics contents of a certain type?
@@ -94,6 +98,9 @@ public:
        /// \returns true if both the LyX and the plaintext versions of the
        /// clipboard are empty, and no supported graphics format is available.
        virtual bool empty() const = 0;
+
+private:
+       docstring find_buffer_;
 };
 
 } // namespace frontend
diff --git a/src/frontends/qt/GuiClipboard.cpp 
b/src/frontends/qt/GuiClipboard.cpp
index f78ab1c..697977d 100644
--- a/src/frontends/qt/GuiClipboard.cpp
+++ b/src/frontends/qt/GuiClipboard.cpp
@@ -12,6 +12,7 @@
 
 #include <config.h>
 
+#include "GuiApplication.h"
 #include "GuiClipboard.h"
 
 #include "Buffer.h"
@@ -111,6 +112,11 @@ GuiClipboard::GuiClipboard()
 {
        connect(qApp->clipboard(), SIGNAL(dataChanged()),
                this, SLOT(on_dataChanged()));
+       if(qApp->clipboard()->supportsFindBuffer()) {
+               connect(qApp->clipboard(), SIGNAL(findBufferChanged()),
+                       this, SLOT(on_findChanged()));
+               on_findChanged();
+       }
        // initialize clipboard status.
        update();
 }
@@ -544,6 +550,21 @@ bool GuiClipboard::hasInternal() const
 }
 
 
+void GuiClipboard::setFindBuffer(docstring const & text)
+{
+       LYXERR(Debug::CLIPBOARD, "new findbuffer: " << text);
+       Clipboard::setFindBuffer(text);
+       qApp->clipboard()->setText(toqstr(text), QClipboard::FindBuffer);
+}
+
+
+void GuiClipboard::on_findChanged()
+{
+       Clipboard::setFindBuffer(from_utf8(fromqstr(
+               qApp->clipboard()->text(QClipboard::FindBuffer))));
+}
+
+
 void GuiClipboard::on_dataChanged()
 {
        update();
diff --git a/src/frontends/qt/GuiClipboard.h b/src/frontends/qt/GuiClipboard.h
index 278adb8..cdd4e85 100644
--- a/src/frontends/qt/GuiClipboard.h
+++ b/src/frontends/qt/GuiClipboard.h
@@ -82,8 +82,11 @@ public:
        support::FileName getPastedGraphicsFileName(Cursor const & cur,
                Clipboard::GraphicsType & type) const;
 
+       void setFindBuffer(docstring const & text) override;
+
 private Q_SLOTS:
        void on_dataChanged();
+       void on_findChanged();
        void update();
 
 private:
diff --git a/src/frontends/qt/GuiSearch.cpp b/src/frontends/qt/GuiSearch.cpp
index d6ec3f8..5aec60b 100644
--- a/src/frontends/qt/GuiSearch.cpp
+++ b/src/frontends/qt/GuiSearch.cpp
@@ -12,6 +12,7 @@
 
 #include <config.h>
 
+#include "GuiApplication.h"
 #include "GuiSearch.h"
 
 #include "lyxfind.h"
@@ -28,8 +29,11 @@
 
 #include "support/debug.h"
 #include "support/gettext.h"
+#include "support/debug.h"
 #include "frontends/alert.h"
+#include "frontends/Clipboard.h"
 
+#include <QClipboard>
 #include <QLineEdit>
 #include <QSettings>
 #include <QShowEvent>
@@ -71,6 +75,11 @@ GuiSearchWidget::GuiSearchWidget(QWidget * parent)
        connect(replaceallPB, SIGNAL(clicked()), this, 
SLOT(replaceallClicked()));
        connect(findCO, SIGNAL(editTextChanged(QString)),
                this, SLOT(findChanged()));
+       if(qApp->clipboard()->supportsFindBuffer()) {
+               connect(qApp->clipboard(), SIGNAL(findBufferChanged()),
+                       this, SLOT(findBufferChanged()));
+               findBufferChanged();
+       }
 
        setFocusProxy(findCO);
 
@@ -149,6 +158,16 @@ void GuiSearchWidget::showEvent(QShowEvent * e)
 }
 
 
+void GuiSearchWidget::findBufferChanged()
+{
+       docstring search = theClipboard().getFindBuffer();
+       if (!search.empty()) {
+               LYXERR(Debug::CLIPBOARD, "from findbuffer: " << search);
+               findCO->setCurrentText(toqstr(search));
+       }
+}
+
+
 void GuiSearchWidget::findChanged()
 {
        findPB->setEnabled(!findCO->currentText().isEmpty());
diff --git a/src/frontends/qt/GuiSearch.h b/src/frontends/qt/GuiSearch.h
index b74f9f0..92324df 100644
--- a/src/frontends/qt/GuiSearch.h
+++ b/src/frontends/qt/GuiSearch.h
@@ -42,6 +42,7 @@ public:
 
 private Q_SLOTS:
        void findChanged();
+       void findBufferChanged();
        void findClicked(bool const backwards = false);
        void findPrevClicked();
        void replaceClicked(bool const backwards = false);
-- 
lyx-cvs mailing list
lyx-cvs@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to