19#include <xcb/xcb_event.h>
20#include <xcb/xfixes.h>
22#include <xwayland_logging.h>
32 xcb_connection_t *xcbConn = kwinApp()->x11Connection();
34 const uint32_t clipboardValues[] = {XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_PROPERTY_CHANGE};
35 xcb_create_window(xcbConn,
38 kwinApp()->x11RootWindow(),
42 XCB_WINDOW_CLASS_INPUT_OUTPUT,
50 this, &Clipboard::wlSelectionChanged);
55 if (m_waitingForTargets) {
59 if (!ownsSelection(dsi)) {
61 if (!m_checkConnection) {
63 this, &Clipboard::checkWlSource);
71bool Clipboard::ownsSelection(AbstractDataSource *dsi)
const
73 return dsi && dsi == m_selectionSource.get();
76void Clipboard::checkWlSource()
78 if (m_waitingForTargets) {
83 auto removeSource = [
this] {
99 if (!dsi || ownsSelection(dsi)) {
101 disconnect(m_checkConnection);
102 m_checkConnection = QMetaObject::Connection();
106 if (!qobject_cast<KWin::X11Window *>(
workspace()->activeWindow())) {
116 auto *wls =
new WlSource(
this);
119 wls->setDataSourceIface(dsi);
124void Clipboard::doHandleXfixesNotify(xcb_xfixes_selection_notify_event_t *event)
127 if (!qobject_cast<const X11Window *>(
window)) {
137 source->getTargets();
138 m_waitingForTargets =
true;
140 qCWarning(KWIN_XWL) <<
"Could not create a source from" <<
event << Qt::hex << (
event ?
event->owner : -1);
144void Clipboard::x11OfferLost()
146 m_selectionSource.reset();
149void Clipboard::x11OffersChanged(
const QStringList &added,
const QStringList &removed)
151 m_waitingForTargets =
false;
154 qCWarning(KWIN_XWL) <<
"offers changed when not having an X11Source!?";
158 const Mimes offers = source->offers();
160 if (!offers.isEmpty()) {
161 QStringList mimeTypes;
162 mimeTypes.reserve(offers.size());
163 std::transform(offers.begin(), offers.end(), std::back_inserter(mimeTypes), [](
const Mimes::value_type &pair) {
166 auto newSelection = std::make_unique<XwlDataSource>();
167 newSelection->setMimeTypes(mimeTypes);
170 std::swap(m_selectionSource, newSelection);
174 if (!ownsSelection(currentSelection)) {
176 m_selectionSource.reset();
184#include "moc_clipboard.cpp"
The AbstractDataSource class abstracts the data that can be transferred to another client.
void setSelection(AbstractDataSource *selection)
void selectionChanged(KWin::AbstractDataSource *)
AbstractDataSource * selection() const
SeatInterface * seat() const
Window * activeWindow() const
void windowActivated(KWin::Window *)
Clipboard(xcb_atom_t atom, QObject *parent)
void createX11Source(xcb_xfixes_selection_notify_event_t *event)
void setWlSource(WlSource *source)
void ownSelection(bool own)
xcb_window_t window() const
WlSource * wlSource() const
X11Source * x11Source() const
void startTransfer(const QString &mimeName, qint32 fd)
void dataRequested(const QString &mimeType, qint32 fd)
QList< QPair< QString, xcb_atom_t > > Mimes
WaylandServer * waylandServer()