20#include <xcb/xcb_event.h>
21#include <xcb/xfixes.h>
23#include <xwayland_logging.h>
33 xcb_connection_t *xcbConn = kwinApp()->x11Connection();
35 const uint32_t clipboardValues[] = {XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_PROPERTY_CHANGE};
36 xcb_create_window(xcbConn,
39 kwinApp()->x11RootWindow(),
43 XCB_WINDOW_CLASS_INPUT_OUTPUT,
51 this, &Primary::wlPrimarySelectionChanged);
58 if (m_waitingForTargets) {
62 if (!ownsSelection(dsi)) {
64 if (!m_checkConnection) {
66 this, &Primary::checkWlSource);
74bool Primary::ownsSelection(AbstractDataSource *dsi)
const
76 return dsi && dsi == m_primarySelectionSource.get();
79void Primary::checkWlSource()
81 if (m_waitingForTargets) {
86 auto removeSource = [
this] {
102 if (!dsi || ownsSelection(dsi)) {
104 disconnect(m_checkConnection);
105 m_checkConnection = QMetaObject::Connection();
109 if (!qobject_cast<X11Window *>(
workspace()->activeWindow())) {
119 auto *wls =
new WlSource(
this);
122 wls->setDataSourceIface(dsi);
127void Primary::doHandleXfixesNotify(xcb_xfixes_selection_notify_event_t *event)
130 if (!qobject_cast<const X11Window *>(
window)) {
140 source->getTargets();
141 m_waitingForTargets =
true;
143 qCWarning(KWIN_XWL) <<
"Could not create a source from" <<
event << Qt::hex << (
event ?
event->owner : -1);
147void Primary::x11OfferLost()
149 m_primarySelectionSource.reset();
152void Primary::x11OffersChanged(
const QStringList &added,
const QStringList &removed)
154 m_waitingForTargets =
false;
157 qCWarning(KWIN_XWL) <<
"offers changed when not having an X11Source!?";
161 const Mimes offers = source->offers();
163 if (!offers.isEmpty()) {
164 QStringList mimeTypes;
165 mimeTypes.reserve(offers.size());
166 std::transform(offers.begin(), offers.end(), std::back_inserter(mimeTypes), [](
const Mimes::value_type &pair) {
169 auto newSelection = std::make_unique<XwlDataSource>();
170 newSelection->setMimeTypes(mimeTypes);
173 std::swap(m_primarySelectionSource, newSelection);
177 if (!ownsSelection(currentSelection)) {
179 m_primarySelectionSource.reset();
187#include "moc_primary.cpp"
The AbstractDataSource class abstracts the data that can be transferred to another client.
void setPrimarySelection(AbstractDataSource *selection)
void primarySelectionChanged(KWin::AbstractDataSource *)
AbstractDataSource * primarySelection() const
SeatInterface * seat() const
Window * activeWindow() const
void windowActivated(KWin::Window *)
Primary(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()