kwin/src/xwl/drag_wl.h
David Edmundson 400dd31db6 Drop the internal connection for wayland to X drags
An AbstractDragTarget is introduced. This contains either the DataDevice we are
dragging to or an Xwl bridge.

We set this on Seat along with the active surface.

In future this also allows getting rid of the move filter.
2021-09-09 11:13:02 +00:00

128 lines
2.9 KiB
C++

/*
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2019 Roman Gilg <subdiff@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef KWIN_XWL_DRAG_WL
#define KWIN_XWL_DRAG_WL
#include "drag.h"
#include <KWaylandServer/datadevicemanager_interface.h>
#include <QPoint>
#include <QPointer>
#include <QVector>
namespace KWaylandServer
{
class DataDeviceInterface;
class DataSourceInterface;
class SurfaceInterface;
}
namespace KWin
{
class Toplevel;
class AbstractClient;
namespace Xwl
{
class X11Source;
enum class DragEventReply;
class Xvisit;
class WlToXDrag : public Drag
{
Q_OBJECT
using Drag::Drag;
public:
DragEventReply moveFilter(Toplevel *target, const QPoint &pos) override;
bool handleClientMessage(xcb_client_message_event_t *event) override;
bool end() override;
private:
Q_DISABLE_COPY(WlToXDrag)
};
// visit to an X window
class Xvisit : public QObject
{
Q_OBJECT
public:
// TODO: handle ask action
Xvisit(AbstractClient *target, KWaylandServer::AbstractDataSource *dataSource, QObject *parent);
bool handleClientMessage(xcb_client_message_event_t *event);
bool handleStatus(xcb_client_message_event_t *event);
bool handleFinished(xcb_client_message_event_t *event);
void sendPosition(const QPointF &globalPos);
void leave();
bool finished() const {
return m_state.finished;
}
AbstractClient *target() const {
return m_target;
}
void drop();
Q_SIGNALS:
void finish(Xvisit *self);
private:
void sendEnter();
void sendDrop(uint32_t time);
void sendLeave();
void receiveOffer();
void enter();
void retrieveSupportedActions();
void determineProposedAction();
void requestDragAndDropAction();
void setProposedAction();
void doFinish();
void stopConnections();
AbstractClient *m_target;
QPointer<KWaylandServer::AbstractDataSource> m_dataSource;
uint32_t m_version = 0;
QMetaObject::Connection m_motionConnection;
struct {
bool pending = false;
bool cached = false;
QPoint cache;
} m_pos;
// supported by the Wl source
KWaylandServer::DataDeviceManagerInterface::DnDActions m_supportedActions = KWaylandServer::DataDeviceManagerInterface::DnDAction::None;
// preferred by the X client
KWaylandServer::DataDeviceManagerInterface::DnDAction m_preferredAction = KWaylandServer::DataDeviceManagerInterface::DnDAction::None;
// decided upon by the compositor
KWaylandServer::DataDeviceManagerInterface::DnDAction m_proposedAction = KWaylandServer::DataDeviceManagerInterface::DnDAction::None;
struct {
bool entered = false;
bool dropped = false;
bool finished = false;
} m_state;
bool m_accepts = false;
Q_DISABLE_COPY(Xvisit)
};
} // namespace Xwl
} // namespace KWin
#endif