Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qxcbdrag.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#pragma once
6
7#include <qpa/qplatformdrag.h>
8#include <private/qsimpledrag_p.h>
9#include <xcb/xcb.h>
10#include <qbackingstore.h>
11#include <qdatetime.h>
12#include <qlist.h>
13#include <qpixmap.h>
14#include <qpoint.h>
15#include <qpointer.h>
16#include <qrect.h>
17#include <qxcbobject.h>
18
20
21QT_BEGIN_NAMESPACE
22
23class QWindow;
24class QPlatformWindow;
25class QXcbConnection;
26class QXcbWindow;
27class QXcbDropData;
28class QXcbScreen;
29class QDrag;
30class QShapedPixmapWindow;
31
33{
34public:
35 QXcbDrag(QXcbConnection *c);
36 ~QXcbDrag();
37
38 bool eventFilter(QObject *o, QEvent *e) override;
39
40 void startDrag() override;
41 void cancel() override;
42 void move(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods) override;
43 void drop(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods) override;
44 void endDrag() override;
45
46 Qt::DropAction defaultAction(Qt::DropActions possibleActions, Qt::KeyboardModifiers modifiers) const override;
47
48 void handlePropertyNotifyEvent(const xcb_property_notify_event_t *event) override;
49
50 void handleEnter(QPlatformWindow *window, const xcb_client_message_event_t *event, xcb_window_t proxy = 0);
51 void handlePosition(QPlatformWindow *w, const xcb_client_message_event_t *event);
52 void handleLeave(QPlatformWindow *w, const xcb_client_message_event_t *event);
53 void handleDrop(QPlatformWindow *, const xcb_client_message_event_t *event,
54 Qt::MouseButtons b = { }, Qt::KeyboardModifiers mods = { });
55
56 void handleStatus(const xcb_client_message_event_t *event);
57 void handleSelectionRequest(const xcb_selection_request_event_t *event);
58 void handleFinished(const xcb_client_message_event_t *event);
59
60 bool dndEnable(QXcbWindow *win, bool on);
61 bool ownsDragObject() const override;
62
64 xcb_timestamp_t targetTime() { return target_time; }
65
66protected:
67 void timerEvent(QTimerEvent* e) override;
68
69 bool findXdndAwareTarget(const QPoint &globalPos, xcb_window_t *target_out);
70
71private:
72 friend class QXcbDropData;
73
74 void init();
75
76 void handle_xdnd_position(QPlatformWindow *w, const xcb_client_message_event_t *event,
77 Qt::MouseButtons b = { }, Qt::KeyboardModifiers mods = { });
78 void handle_xdnd_status(const xcb_client_message_event_t *event);
79 void send_leave();
80
81 Qt::DropAction toDropAction(xcb_atom_t atom) const;
82 Qt::DropActions toDropActions(const QList<xcb_atom_t> &atoms) const;
83 xcb_atom_t toXdndAction(Qt::DropAction a) const;
84
85 void readActionList();
86 void setActionList(Qt::DropAction requestedAction, Qt::DropActions supportedActions);
87 void startListeningForActionListChanges();
88 void stopListeningForActionListChanges();
89
90 QPointer<QWindow> initiatorWindow;
91 QPointer<QWindow> currentWindow;
92 QPoint currentPosition;
93
94 QXcbDropData *m_dropData;
95 Qt::DropAction accepted_drop_action;
96
97 QWindow *desktop_proxy;
98
99 xcb_atom_t xdnd_dragsource;
100
101 // the types in this drop. 100 is no good, but at least it's big.
102 enum { xdnd_max_type = 100 };
103 QList<xcb_atom_t> xdnd_types;
104
105 // timestamp from XdndPosition and XdndDroptime for retrieving the data
106 xcb_timestamp_t target_time;
107 xcb_timestamp_t source_time;
108
109 // rectangle in which the answer will be the same
110 QRect source_sameanswer;
111 bool waiting_for_status;
112
113 // helpers for setting executed drop action outside application
114 bool dropped;
115 bool canceled;
116
117 // A window from Unity DnD Manager, which does not respect the XDnD spec
118 xcb_window_t xdndCollectionWindow = XCB_NONE;
119
120 // top-level window we sent position to last.
121 xcb_window_t current_target;
122 // window to send events to (always valid if current_target)
123 xcb_window_t current_proxy_target;
124
125 QXcbVirtualDesktop *current_virtual_desktop;
126
127 // 10 minute timer used to discard old XdndDrop transactions
128 static constexpr std::chrono::minutes XdndDropTransactionTimeout{10};
129 QBasicTimer cleanup_timer;
130
131 QList<xcb_atom_t> drag_types;
132
133 QList<xcb_atom_t> current_actions;
134 QList<xcb_atom_t> drop_actions;
135
136 struct Transaction
137 {
138 xcb_timestamp_t timestamp;
139 xcb_window_t target;
140 xcb_window_t proxy_target;
141 QPlatformWindow *targetWindow;
142// QWidget *embedding_widget;
143 QPointer<QDrag> drag;
144 QTime time;
145 };
146 friend class QTypeInfo<Transaction>;
147 QList<Transaction> transactions;
148
149 int transaction_expiry_timer;
150 void restartDropExpiryTimer();
151 int findTransactionByWindow(xcb_window_t window);
152 int findTransactionByTime(xcb_timestamp_t timestamp);
153 xcb_window_t findRealWindow(const QPoint & pos, xcb_window_t w, int md, bool ignoreNonXdndAwareWindows);
154};
156
157QT_END_NAMESPACE
Definition qlist.h:80
\inmodule QtCore\reentrant
Definition qpoint.h:29
constexpr QPoint(int xpos, int ypos) noexcept
Constructs a point with the given coordinates (xpos, ypos).
Definition qpoint.h:136
\inmodule QtCore \reentrant
Definition qdatetime.h:250
@ AtomXdndDrop
Definition qxcbatom.h:142
@ AtomXdndActionMove
Definition qxcbatom.h:154
@ AtomXdndStatus
Definition qxcbatom.h:140
@ AtomXdndActionLink
Definition qxcbatom.h:153
@ AtomXdndFinished
Definition qxcbatom.h:143
@ AtomXdndSelection
Definition qxcbatom.h:147
@ AtomXdndLeave
Definition qxcbatom.h:141
@ AtomXdndEnter
Definition qxcbatom.h:138
@ AtomXdndProxy
Definition qxcbatom.h:150
@ AtomXdndActionCopy
Definition qxcbatom.h:152
@ AtomXdndAware
Definition qxcbatom.h:149
@ AtomXdndTypelist
Definition qxcbatom.h:144
@ AtomXdndPosition
Definition qxcbatom.h:139
@ AtomXdndActionList
Definition qxcbatom.h:145
void move(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods) override
Definition qxcbdrag.cpp:334
Qt::DropAction defaultAction(Qt::DropActions possibleActions, Qt::KeyboardModifiers modifiers) const override
Definition qxcbdrag.cpp:182
void timerEvent(QTimerEvent *e) override
This event handler can be reimplemented in a subclass to receive timer events for the object.
bool findXdndAwareTarget(const QPoint &globalPos, xcb_window_t *target_out)
Definition qxcbdrag.cpp:282
void updatePixmap()
xcb_timestamp_t targetTime()
Definition qxcbdrag.h:64
void handleEnter(QPlatformWindow *window, const xcb_client_message_event_t *event, xcb_window_t proxy=0)
Definition qxcbdrag.cpp:681
void drop(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods) override
Definition qxcbdrag.cpp:471
void handleStatus(const xcb_client_message_event_t *event)
Definition qxcbdrag.cpp:878
void handleDrop(QPlatformWindow *, const xcb_client_message_event_t *event, Qt::MouseButtons b={ }, Qt::KeyboardModifiers mods={ })
Definition qxcbdrag.cpp:954
void cancel() override
void handleFinished(const xcb_client_message_event_t *event)
bool eventFilter(QObject *o, QEvent *e) override
Filters events if this object has been installed as an event filter for the watched object.
Definition qxcbdrag.cpp:128
void handlePosition(QPlatformWindow *w, const xcb_client_message_event_t *event)
Definition qxcbdrag.cpp:834
void startDrag() override
Definition qxcbdrag.cpp:139
bool ownsDragObject() const override
Returns bool indicating whether QPlatformDrag takes ownership and therefore responsibility of deletin...
void handleLeave(QPlatformWindow *w, const xcb_client_message_event_t *event)
Definition qxcbdrag.cpp:897
QXcbDrag(QXcbConnection *c)
Definition qxcbdrag.cpp:90
void endDrag() override
Definition qxcbdrag.cpp:172
void handleSelectionRequest(const xcb_selection_request_event_t *event)
bool dndEnable(QXcbWindow *win, bool on)
void handlePropertyNotifyEvent(const xcb_property_notify_event_t *event) override
Definition qxcbdrag.cpp:190
QVariant retrieveData_sys(const QString &mimeType, QMetaType type) const override
QXcbDrag * drag
Definition qxcbdrag.cpp:86
bool hasFormat_sys(const QString &mimeType) const override
QVariant xdndObtainData(const QByteArray &format, QMetaType requestedType) const
QXcbDropData(QXcbDrag *d)
QStringList formats_sys() const override
QXcbConnection * connection() const
Definition qxcbobject.h:17
xcb_connection_t * xcb_connection() const
Definition qxcbobject.h:20
xcb_atom_t atom(QXcbAtom::Atom atom) const
Definition qxcbobject.h:19
QXcbObject(QXcbConnection *connection=nullptr)
Definition qxcbobject.h:14
bool compositingActive() const
QT_REQUIRE_CONFIG(thread)
#define Q_XCB_REPLY(call,...)
#define Q_XCB_REPLY_UNCHECKED(call,...)
static xcb_window_t xdndProxy(QXcbConnection *c, xcb_window_t w)
Definition qxcbdrag.cpp:45
const int xdnd_version
Definition qxcbdrag.cpp:33
static xcb_window_t xcb_window(QWindow *w)
Definition qxcbdrag.cpp:40
static xcb_window_t findXdndAwareParent(QXcbConnection *c, xcb_window_t window)
static xcb_window_t xcb_window(QPlatformWindow *w)
Definition qxcbdrag.cpp:35
static bool windowInteractsWithPosition(xcb_connection_t *connection, const QPoint &pos, xcb_window_t w, xcb_shape_sk_t shapeType)
Definition qxcbdrag.cpp:199
Q_DECLARE_TYPEINFO(QXcbDrag::Transaction, Q_RELOCATABLE_TYPE)