From 5a798ba4813fc6d5d2e867872ac4072f7b0c669d Mon Sep 17 00:00:00 2001 From: Lukas Holecek Date: Tue, 12 Dec 2023 17:54:02 +0100 Subject: [PATCH] Use overridden paste() when activating items hluk/copyq-commands#83 --- src/gui/mainwindow.cpp | 44 +++++++++++++++++++++++------- src/gui/mainwindow.h | 6 ++++ src/scriptable/scriptable.cpp | 26 +++++++++++++++--- src/scriptable/scriptable.h | 2 ++ src/scriptable/scriptableproxy.cpp | 6 ++++ src/scriptable/scriptableproxy.h | 2 ++ src/scriptable/scriptoverrides.h | 8 ++++++ 7 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 src/scriptable/scriptoverrides.h diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 7d8ea4d796..ac0b8e0f88 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -49,6 +49,7 @@ #include "platform/platformclipboard.h" #include "platform/platformnativeinterface.h" #include "platform/platformwindow.h" +#include "scriptable/scriptoverrides.h" #ifdef Q_OS_MAC # include "platform/mac/foregroundbackgroundfilter.h" @@ -1064,6 +1065,17 @@ bool MainWindow::isItemPreviewVisible() const return m_showItemPreview; } +void MainWindow::setScriptOverrides(const QVector &overrides) +{ + m_overrides = overrides; + std::sort(m_overrides.begin(), m_overrides.end()); +} + +bool MainWindow::isScriptOverridden(int id) const +{ + return std::binary_search(m_overrides.begin(), m_overrides.end(), id); +} + void MainWindow::onAboutToQuit() { if (cm) @@ -1869,10 +1881,15 @@ void MainWindow::activateMenuItem(ClipboardBrowserPlaceholder *placeholder, cons PlatformWindowPtr lastWindow = m_windowForMenuPaste; - if ( m_options.trayItemPaste && lastWindow && !omitPaste && canPaste() ) { - COPYQ_LOG( QString("Pasting item from tray menu to \"%1\".") - .arg(lastWindow->getTitle()) ); - lastWindow->pasteClipboard(); + if ( m_options.trayItemPaste && !omitPaste && canPaste() ) { + if (isScriptOverridden(ScriptOverrides::Paste)) { + COPYQ_LOG("Pasting item with paste()"); + runScript("paste()"); + } else if (lastWindow) { + COPYQ_LOG( QStringLiteral("Pasting item from tray menu to: %1") + .arg(lastWindow->getTitle()) ); + lastWindow->pasteClipboard(); + } } } @@ -2331,6 +2348,8 @@ void MainWindow::updateCommands(QVector allCommands, bool forceSave) reloadBrowsers(); } + runScript("collectOverrides()"); + updateContextMenu(contextMenuUpdateIntervalMsec); updateTrayMenuCommands(); emit commandsSaved(commands); @@ -3295,8 +3314,8 @@ void MainWindow::activateCurrentItemHelper() // Perform custom actions on item activation. PlatformWindowPtr lastWindow = m_windowForMainPaste; - const bool paste = lastWindow && m_options.activatePastes() && canPaste(); - const bool activateWindow = paste || (lastWindow && m_options.activateFocuses()); + const bool paste = m_options.activatePastes() && canPaste(); + const bool activateWindow = m_options.activateFocuses(); // Copy current item or selection to clipboard. // While clipboard is being set (in separate process) @@ -3306,15 +3325,20 @@ void MainWindow::activateCurrentItemHelper() if ( m_options.activateCloses() ) hideWindow(); - if (activateWindow) + if (lastWindow && activateWindow) lastWindow->raise(); enterBrowseMode(); if (paste) { - COPYQ_LOG( QString("Pasting item from main window to \"%1\".") - .arg(lastWindow->getTitle()) ); - lastWindow->pasteClipboard(); + if (isScriptOverridden(ScriptOverrides::Paste)) { + COPYQ_LOG("Pasting item with paste()"); + runScript("paste()"); + } else if (lastWindow) { + COPYQ_LOG( QStringLiteral("Pasting item from main window to: %1") + .arg(lastWindow->getTitle()) ); + lastWindow->pasteClipboard(); + } } } diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index abc9384f8d..7bf762f473 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -411,6 +412,9 @@ class MainWindow final : public QMainWindow void setItemPreviewVisible(bool visible); bool isItemPreviewVisible() const; + void setScriptOverrides(const QVector &overrides); + bool isScriptOverridden(int id) const; + signals: /** Request clipboard change. */ void changeClipboard(const QVariantMap &data, ClipboardMode mode); @@ -693,6 +697,8 @@ class MainWindow final : public QMainWindow bool m_isActiveWindow = false; bool m_singleClickActivate = 0; bool m_enteringSearchMode = false; + + QVector m_overrides; }; #endif // MAINWINDOW_H diff --git a/src/scriptable/scriptable.cpp b/src/scriptable/scriptable.cpp index e0c78369d7..356d696579 100644 --- a/src/scriptable/scriptable.cpp +++ b/src/scriptable/scriptable.cpp @@ -26,6 +26,7 @@ #include "scriptable/scriptableproxy.h" #include "scriptable/scriptablesettings.h" #include "scriptable/scriptabletemporaryfile.h" +#include "scriptable/scriptoverrides.h" #include #include @@ -690,24 +691,28 @@ Scriptable::Scriptable( m_createFn = evaluateStrict(m_engine, QStringLiteral( "(function(from, name) {" - "return function() {" + "var f = function() {" "_copyqArguments = arguments;" "var v = from[name]();" "_copyqArguments = null;" "if (_copyqHasUncaughtException) throw _copyqUncaughtException;" "return v;" - "}" + "};" + "f._copyq = 1;" + "return f;" "})" )); m_createFnB = evaluateStrict(m_engine, QStringLiteral( "(function(from, name) {" - "return function() {" + "var f = function() {" "_copyqArguments = arguments;" "var v = from[name]();" "_copyqArguments = null;" "if (_copyqHasUncaughtException) throw _copyqUncaughtException;" "return ByteArray(v);" - "}" + "};" + "f._copyq = 1;" + "return f;" "})" )); @@ -2942,6 +2947,19 @@ QJSValue Scriptable::styles() return toScriptValue( m_proxy->styles(), this ); } +void Scriptable::collectOverrides() +{ + m_skipArguments = 1; + auto globalObject = engine()->globalObject(); + + QVector overrides; + const auto pasteFn = globalObject.property("paste"); + if (pasteFn.property("_copyq").toInt() != 1) + overrides.append(ScriptOverrides::Paste); + + m_proxy->setScriptOverrides(overrides); +} + void Scriptable::onExecuteOutput(const QByteArray &output) { m_executeStdoutData.append(output); diff --git a/src/scriptable/scriptable.h b/src/scriptable/scriptable.h index c976223a70..dd21f48180 100644 --- a/src/scriptable/scriptable.h +++ b/src/scriptable/scriptable.h @@ -389,6 +389,8 @@ public slots: QJSValue styles(); + void collectOverrides(); + signals: void finished(); void dataReceived(const QByteArray &data); diff --git a/src/scriptable/scriptableproxy.cpp b/src/scriptable/scriptableproxy.cpp index b5f27a26f9..cf7b368d12 100644 --- a/src/scriptable/scriptableproxy.cpp +++ b/src/scriptable/scriptableproxy.cpp @@ -2601,6 +2601,12 @@ QStringList ScriptableProxy::styles() return QStyleFactory::keys(); } +void ScriptableProxy::setScriptOverrides(const QVector &overrides) +{ + INVOKE2(setScriptOverrides, (overrides)); + m_wnd->setScriptOverrides(overrides); +} + ClipboardBrowser *ScriptableProxy::fetchBrowser(const QString &tabName) { if (tabName.isEmpty()) { diff --git a/src/scriptable/scriptableproxy.h b/src/scriptable/scriptableproxy.h index 3a94366eda..146c6df1c0 100644 --- a/src/scriptable/scriptableproxy.h +++ b/src/scriptable/scriptableproxy.h @@ -285,6 +285,8 @@ public slots: QStringList styles(); + void setScriptOverrides(const QVector &overrides); + signals: void functionCallFinished(int functionCallId, const QVariant &returnValue); void inputDialogFinished(int dialogId, const NamedValueList &result); diff --git a/src/scriptable/scriptoverrides.h b/src/scriptable/scriptoverrides.h new file mode 100644 index 0000000000..4197f630d0 --- /dev/null +++ b/src/scriptable/scriptoverrides.h @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +#pragma once + +namespace ScriptOverrides { +enum ScriptOverrides { + Paste = 0, +}; +}