forked from qt-creator/qt-creator
Terminal: Add support for copy (OSC52)
Allows terminal apps like vim to set the clipboard, even from inside an ssh/remote shell. Change-Id: I1d068737ef65bb4541c3fc9c43870986865f1b45 Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
@@ -14,6 +14,9 @@ public:
|
|||||||
|
|
||||||
virtual void onBell() {}
|
virtual void onBell() {}
|
||||||
virtual void onTitle(const QString &title) { Q_UNUSED(title); }
|
virtual void onTitle(const QString &title) { Q_UNUSED(title); }
|
||||||
|
|
||||||
|
virtual void onSetClipboard(const QByteArray &text) { Q_UNUSED(text); }
|
||||||
|
virtual void onGetClipboard() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace TerminalSolution
|
} // namespace TerminalSolution
|
||||||
|
|||||||
@@ -142,6 +142,41 @@ struct TerminalSurfacePrivate
|
|||||||
|
|
||||||
VTermState *vts = vterm_obtain_state(m_vterm.get());
|
VTermState *vts = vterm_obtain_state(m_vterm.get());
|
||||||
vterm_state_set_unrecognised_fallbacks(vts, &m_vtermStateFallbacks, this);
|
vterm_state_set_unrecognised_fallbacks(vts, &m_vtermStateFallbacks, this);
|
||||||
|
|
||||||
|
memset(&m_vtermSelectionCallbacks, 0, sizeof(m_vtermSelectionCallbacks));
|
||||||
|
|
||||||
|
m_vtermSelectionCallbacks.query = [](VTermSelectionMask mask, void *user) {
|
||||||
|
if (!(mask & 0xF))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
auto p = static_cast<TerminalSurfacePrivate *>(user);
|
||||||
|
if (p->m_surfaceIntegration)
|
||||||
|
p->m_surfaceIntegration->onGetClipboard();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
m_vtermSelectionCallbacks.set =
|
||||||
|
[](VTermSelectionMask mask, VTermStringFragment frag, void *user) {
|
||||||
|
if (!(mask & 0xF))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
auto p = static_cast<TerminalSurfacePrivate *>(user);
|
||||||
|
if (frag.initial)
|
||||||
|
p->m_selectionBuffer.clear();
|
||||||
|
|
||||||
|
p->m_selectionBuffer.append(frag.str, frag.len);
|
||||||
|
if (!frag.final)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (p->m_surfaceIntegration)
|
||||||
|
p->m_surfaceIntegration->onSetClipboard(p->m_selectionBuffer);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
vterm_state_set_selection_callbacks(vts, &m_vtermSelectionCallbacks, this, nullptr, 256);
|
||||||
|
|
||||||
vterm_state_set_bold_highbright(vts, true);
|
vterm_state_set_bold_highbright(vts, true);
|
||||||
|
|
||||||
VTermColor fg;
|
VTermColor fg;
|
||||||
@@ -363,6 +398,8 @@ struct TerminalSurfacePrivate
|
|||||||
VTermScreenCallbacks m_vtermScreenCallbacks;
|
VTermScreenCallbacks m_vtermScreenCallbacks;
|
||||||
VTermStateFallbacks m_vtermStateFallbacks;
|
VTermStateFallbacks m_vtermStateFallbacks;
|
||||||
|
|
||||||
|
VTermSelectionCallbacks m_vtermSelectionCallbacks;
|
||||||
|
|
||||||
Cursor m_cursor;
|
Cursor m_cursor;
|
||||||
QString m_currentCommand;
|
QString m_currentCommand;
|
||||||
|
|
||||||
@@ -375,6 +412,7 @@ struct TerminalSurfacePrivate
|
|||||||
TerminalSurface *q;
|
TerminalSurface *q;
|
||||||
QTimer m_delayWriteTimer;
|
QTimer m_delayWriteTimer;
|
||||||
QByteArray m_writeBuffer;
|
QByteArray m_writeBuffer;
|
||||||
|
QByteArray m_selectionBuffer;
|
||||||
|
|
||||||
TerminalSurface::WriteToPty m_writeToPty;
|
TerminalSurface::WriteToPty m_writeToPty;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -179,4 +179,9 @@ void ShellIntegration::prepareProcess(Utils::Process &process)
|
|||||||
process.setEnvironment(env);
|
process.setEnvironment(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ShellIntegration::onSetClipboard(const QByteArray &text)
|
||||||
|
{
|
||||||
|
setClipboardAndSelection(QString::fromLocal8Bit(text));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Terminal
|
} // namespace Terminal
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ public:
|
|||||||
void onBell() override;
|
void onBell() override;
|
||||||
void onTitle(const QString &title) override;
|
void onTitle(const QString &title) override;
|
||||||
|
|
||||||
|
void onSetClipboard(const QByteArray &text) override;
|
||||||
|
|
||||||
void prepareProcess(Utils::Process &process);
|
void prepareProcess(Utils::Process &process);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|||||||
45
src/plugins/terminal/tests/copy
Executable file
45
src/plugins/terminal/tests/copy
Executable file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user