Skip to content

Commit

Permalink
Add scriptable functions onStart and onExit
Browse files Browse the repository at this point in the history
Function onStart is called after server application starts, onExit
before it exits.

This is part of issue #59.

Signed-off-by: Lukas Holecek <hluk@email.cz>
  • Loading branch information
hluk committed Feb 11, 2019
1 parent cb03fa7 commit 3903b7e
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 4 deletions.
19 changes: 19 additions & 0 deletions src/app/clipboardserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ ClipboardServer::ClipboardServer(QApplication *app, const QString &sessionName)
m_ignoreKeysTimer.setSingleShot(true);

startMonitoring();

callback("onStart");
}

ClipboardServer::~ClipboardServer()
Expand Down Expand Up @@ -227,6 +229,9 @@ void ClipboardServer::onAboutToQuit()
{
COPYQ_LOG("Closing server.");

callback("onExit");
waitForCallbackToFinish();

m_ignoreNewConnections = true;

terminateClients(10000);
Expand Down Expand Up @@ -353,6 +358,20 @@ void ClipboardServer::waitForClientsToFinish(int waitMs)
while ( !m_clients.isEmpty() && t.sleep() ) {}
}

void ClipboardServer::waitForCallbackToFinish()
{
if (m_callback)
m_callback->waitForFinished();
}

void ClipboardServer::callback(const QString &scriptFunction)
{
waitForCallbackToFinish();
m_callback = new Action();
m_callback->setCommand(QStringList() << "copyq" << scriptFunction);
m_wnd->runInternalAction(m_callback);
}

void ClipboardServer::onClientNewConnection(const ClientSocketPtr &client)
{
if (m_ignoreNewConnections) {
Expand Down
4 changes: 4 additions & 0 deletions src/app/clipboardserver.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,10 +120,14 @@ class ClipboardServer : public QObject, public App
void terminateClients(int waitMs);

void waitForClientsToFinish(int waitMs);
void waitForCallbackToFinish();

void callback(const QString &scriptFunction);

Server *m_server = nullptr;
MainWindow* m_wnd = nullptr;
QPointer<Action> m_monitor;
QPointer<Action> m_callback;
bool m_ignoreNewConnections = false;
QMap<QxtGlobalShortcut*, Command> m_shortcutActions;
QTimer m_ignoreKeysTimer;
Expand Down
15 changes: 12 additions & 3 deletions src/common/action.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,11 +307,20 @@ bool Action::waitForFinished(int msecs)
QPointer<QObject> self(this);
QEventLoop loop;
QTimer t;
connectProcessFinished(m_processes.back(), &loop, &QEventLoop::quit);
connect(&t, &QTimer::timeout, &loop, &QEventLoop::quit);
t.start(msecs);
connect(this, &Action::actionFinished, &loop, &QEventLoop::quit);
if (msecs >= 0) {
connect(&t, &QTimer::timeout, &loop, &QEventLoop::quit);
t.setSingleShot(true);
t.start(msecs);
}
loop.exec(QEventLoop::ExcludeUserInputEvents);

// Loop stopped because application is exiting?
while ( self && isRunning() && (msecs < 0 || t.isActive()) ) {
m_processes.back()->waitForFinished(50);
QCoreApplication::processEvents();
}

return !self || !isRunning();
}

Expand Down
2 changes: 1 addition & 1 deletion src/common/action.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class Action : public QObject

bool waitForStarted(int msecs);

bool waitForFinished(int msecs);
bool waitForFinished(int msecs = -1);

bool isRunning() const;

Expand Down
3 changes: 3 additions & 0 deletions src/scriptable/scriptable.h
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,9 @@ public slots:
void onOwnClipboardChanged();
void onHiddenClipboardChanged();

void onStart() {}
void onExit() {}

void synchronizeToSelection();
void synchronizeFromSelection();

Expand Down

0 comments on commit 3903b7e

Please sign in to comment.