13#include <private/qdnd_p.h>
21#include <qpa/qwindowsysteminterface.h>
23#include <private/qguiapplication_p.h>
24#include <private/qshapedpixmapdndwindow_p.h>
25#include <private/qsimpledrag_p.h>
26#include <private/qhighdpiscaling_p.h>
44 xcb_window_t
proxy = XCB_NONE;
50 proxy = *((xcb_window_t *)xcb_get_property_value(
reply.get()));
52 if (
proxy == XCB_NONE)
60 xcb_window_t
p = *((xcb_window_t *)xcb_get_property_value(
reply.get()));
102 currentWindow.
clear();
106 xdnd_dragsource = XCB_NONE;
108 waiting_for_status =
false;
109 current_target = XCB_NONE;
110 current_proxy_target = XCB_NONE;
112 source_time = XCB_CURRENT_TIME;
113 target_time = XCB_CURRENT_TIME;
123 source_sameanswer =
QRect();
133 o = initiatorWindow.
data();
146 for (
int i = 0;
i < fmts.size(); ++
i) {
148 for (
int j = 0;
j < atoms.
size(); ++
j) {
154 if (drag_types.
size() > 3)
157 XCB_ATOM_ATOM, 32, drag_types.
size(), (
const void *)drag_types.
constData());
173 if (!dropped && !canceled &&
canDrop()) {
177 initiatorWindow.
clear();
185 return toDropAction(drop_actions.
first());
199 bool interacts =
false;
202 xcb_rectangle_t *rectangles = xcb_shape_get_rectangles_rectangles(
reply.get());
204 const int nRectangles = xcb_shape_get_rectangles_rectangles_length(
reply.get());
205 for (
int i = 0; !interacts &&
i < nRectangles; ++
i) {
214xcb_window_t QXcbDrag::findRealWindow(
const QPoint &
pos, xcb_window_t
w,
int md,
bool ignoreNonXdndAwareWindows)
224 if (
reply->map_state != XCB_MAP_STATE_VIEWABLE)
231 QRect windowRect(greply->x, greply->y, greply->width, greply->height);
232 if (windowRect.contains(
pos)) {
233 bool windowContainsMouse = !ignoreNonXdndAwareWindows;
237 XCB_GET_PROPERTY_TYPE_ANY, 0, 0);
238 bool isAware =
reply &&
reply->type != XCB_NONE;
240 const QPoint relPos =
pos - windowRect.topLeft();
245 if (windowContainsMouse &&
connection()->hasXShape())
248 windowContainsMouse =
true;
249 if (windowContainsMouse)
257 int nc = xcb_query_tree_children_length(
reply.get());
258 xcb_window_t *
c = xcb_query_tree_children(
reply.get());
262 r = findRealWindow(
pos - windowRect.topLeft(),
c[
i], md-1, ignoreNonXdndAwareWindows);
271 if (!windowContainsMouse)
282 xcb_window_t rootwin = current_virtual_desktop->
root();
284 rootwin, rootwin, globalPos.
x(), globalPos.
y());
293 xcb_window_t
src = rootwin;
295 qCDebug(lcQpaXDnd) <<
"checking target for XdndAware" <<
target;
310 bool aware =
reply &&
reply->type != XCB_NONE;
320 qCDebug(lcQpaXDnd) <<
"need to find real window";
321 target = findRealWindow(globalPos, rootwin, 6,
true);
323 target = findRealWindow(globalPos, rootwin, 6,
false);
340 if (source_sameanswer.
contains(globalPos) && source_sameanswer.
isValid())
349 if (virtualDesktop != current_virtual_desktop) {
355 current_virtual_desktop = virtualDesktop;
377 int target_version = 1;
386 target_version = *(uint32_t *)xcb_get_property_value(
reply.get());
391 if (
target != current_target) {
396 current_proxy_target = proxy_target;
398 int flags = target_version << 24;
399 if (drag_types.
size() > 3)
402 xcb_client_message_event_t enter;
403 enter.response_type = XCB_CLIENT_MESSAGE;
409 enter.data.data32[1] =
flags;
410 enter.data.data32[2] = drag_types.
size() > 0 ? drag_types.
at(0) : 0;
411 enter.data.data32[3] = drag_types.
size() > 1 ? drag_types.
at(1) : 0;
412 enter.data.data32[4] = drag_types.
size() > 2 ? drag_types.
at(2) : 0;
414 source_sameanswer =
QRect(globalPos.
x() - 2, globalPos.
y() - 2 , 5, 5);
416 qCDebug(lcQpaXDnd) <<
"sending XdndEnter to target:" <<
target;
421 xcb_send_event(
xcb_connection(),
false, proxy_target, XCB_EVENT_MASK_NO_EVENT, (
const char *)&enter);
422 waiting_for_status =
false;
426 if (waiting_for_status)
430 waiting_for_status =
true;
433 xcb_client_message_event_t
move;
434 move.response_type = XCB_CLIENT_MESSAGE;
440 move.data.data32[1] = 0;
441 move.data.data32[2] = (globalPos.
x() << 16) + globalPos.
y();
444 const auto requestedAction =
defaultAction(supportedActions, mods);
445 move.data.data32[4] = toXdndAction(requestedAction);
447 qCDebug(lcQpaXDnd) <<
"sending XdndPosition to target:" <<
target;
452 handle_xdnd_position(
w, &
move,
b, mods);
454 setActionList(requestedAction, supportedActions);
455 xcb_send_event(
xcb_connection(),
false, proxy_target, XCB_EVENT_MASK_NO_EVENT, (
const char *)&
move);
459 static const bool isUnity =
qgetenv(
"XDG_CURRENT_DESKTOP").
toLower() ==
"unity";
460 if (isUnity && xdndCollectionWindow == XCB_NONE) {
463 xdndCollectionWindow =
target;
465 if (
target == xdndCollectionWindow) {
479 xcb_client_message_event_t
drop;
480 drop.response_type = XCB_CLIENT_MESSAGE;
482 drop.window = current_target;
486 drop.data.data32[1] = 0;
489 drop.data.data32[3] = 0;
500 current_proxy_target,
509 if (!
t.targetWindow && cleanup_timer == -1) {
510 cleanup_timer =
startTimer(XdndDropTransactionTimeout);
513 qCDebug(lcQpaXDnd) <<
"sending drop to target:" << current_target;
518 xcb_send_event(
xcb_connection(),
false, current_proxy_target, XCB_EVENT_MASK_NO_EVENT, (
const char *)&
drop);
535 Qt::DropActions actions;
536 for (
const auto actionAtom : atoms) {
538 actions |= toDropAction(actionAtom);
560void QXcbDrag::readActionList()
562 drop_actions.
clear();
567 int length = xcb_get_property_value_length(
reply.get()) / 4;
569 xcb_atom_t *atoms = (xcb_atom_t *)xcb_get_property_value(
reply.get());
575void QXcbDrag::setActionList(
Qt::DropAction requestedAction, Qt::DropActions supportedActions)
577#ifndef QT_NO_CLIPBOARD
580 actions.
append(toXdndAction(requestedAction));
582 auto checkAppend = [
this, requestedAction, supportedActions, &actions](
Qt::DropAction action) {
583 if (requestedAction != action && supportedActions & action)
584 actions.
append(toXdndAction(action));
591 if (current_actions != actions) {
595 current_actions = actions;
600void QXcbDrag::startListeningForActionListChanges()
603 const uint32_t event_mask[] = { XCB_EVENT_MASK_PROPERTY_CHANGE };
604 xcb_change_window_attributes(
xcb_connection(), xdnd_dragsource, XCB_CW_EVENT_MASK, event_mask);
607void QXcbDrag::stopListeningForActionListChanges()
609 const uint32_t event_mask[] = { XCB_EVENT_MASK_NO_EVENT };
610 xcb_change_window_attributes(
xcb_connection(), xdnd_dragsource, XCB_CW_EVENT_MASK, event_mask);
614int QXcbDrag::findTransactionByWindow(xcb_window_t
window)
617 for (
int i = 0;
i < transactions.
size(); ++
i) {
618 const Transaction &
t = transactions.
at(
i);
627int QXcbDrag::findTransactionByTime(xcb_timestamp_t timestamp)
630 for (
int i = 0;
i < transactions.
size(); ++
i) {
631 const Transaction &
t = transactions.
at(
i);
632 if (
t.timestamp == timestamp) {
642static QWidget* current_embedding_widget =
nullptr;
643static xcb_client_message_event_t last_enter_event;
646static bool checkEmbedded(
QWidget*
w,
const XEvent* xe)
651 if (current_embedding_widget != 0 && current_embedding_widget !=
w) {
652 current_target = ((QExtraWidget*)current_embedding_widget)->extraData()->xDndProxy;
653 current_proxy_target = current_target;
654 qt_xdnd_send_leave();
656 current_proxy_target = 0;
657 current_embedding_widget = 0;
660 QWExtra* extra = ((QExtraWidget*)
w)->extraData();
661 if (extra && extra->xDndProxy != 0) {
663 if (current_embedding_widget !=
w) {
665 last_enter_event.xany.window = extra->xDndProxy;
666 XSendEvent(
X11->display, extra->xDndProxy,
False, NoEventMask, &last_enter_event);
667 current_embedding_widget =
w;
670 ((XEvent*)xe)->xany.window = extra->xDndProxy;
671 XSendEvent(
X11->display, extra->xDndProxy,
False, NoEventMask, (XEvent*)xe);
672 if (currentWindow !=
w) {
677 current_embedding_widget = 0;
685 qCDebug(lcQpaXDnd) <<
"target:" <<
event->window <<
"received XdndEnter";
689 int version = (int)(
event->data.data32[1] >> 24);
693 xdnd_dragsource =
event->data.data32[0];
694 startListeningForActionListChanges();
699 current_proxy_target =
proxy ?
proxy : xdnd_dragsource;
701 if (
event->data.data32[1] & 1) {
707 int length = xcb_get_property_value_length(
reply.get()) / 4;
708 if (
length > xdnd_max_type)
711 xcb_atom_t *atoms = (xcb_atom_t *)xcb_get_property_value(
reply.get());
718 for(
int i = 2;
i < 5;
i++) {
719 if (
event->data.data32[
i])
723 for(
int i = 0;
i < xdnd_types.
size(); ++
i)
727void QXcbDrag::handle_xdnd_position(
QPlatformWindow *
w,
const xcb_client_message_event_t *
e,
728 Qt::MouseButtons
b, Qt::KeyboardModifiers mods)
732 qCDebug(lcQpaXDnd) <<
"target:" <<
e->window <<
"received XdndPosition";
734 QPoint p((
e->data.data32[2] & 0xffff0000) >> 16,
e->data.data32[2] & 0x0000ffff);
736 QRect geometry =
w->geometry();
742 if (
Q_UNLIKELY(
e->data.data32[0] != xdnd_dragsource)) {
743 qCDebug(lcQpaXDnd,
"xdnd drag position from unexpected source (%x not %x)",
744 e->data.data32[0], xdnd_dragsource);
749 currentWindow =
w->window();
752 if (
e->data.data32[3] != XCB_NONE) {
753 target_time =
e->data.data32[3];
762 dropData = m_dropData;
763 supported_actions = toDropActions(drop_actions);
765 supported_actions |= Qt::DropActions(toDropAction(
e->data.data32[4]));
772 w->window(), dropData,
p, supported_actions, buttons,
modifiers);
781 xcb_client_message_event_t response;
782 response.response_type = XCB_CLIENT_MESSAGE;
783 response.sequence = 0;
784 response.window = xdnd_dragsource;
785 response.format = 32;
788 response.data.data32[1] = qt_response.
isAccepted();
789 response.data.data32[2] = 0;
790 response.data.data32[3] = 0;
791 response.data.data32[4] = toXdndAction(qt_response.
acceptedAction());
795 if (answerRect.left() < 0)
796 answerRect.setLeft(0);
797 if (answerRect.right() > 4096)
798 answerRect.setRight(4096);
799 if (answerRect.top() < 0)
800 answerRect.setTop(0);
801 if (answerRect.bottom() > 4096)
802 answerRect.setBottom(4096);
803 if (answerRect.width() < 0)
804 answerRect.setWidth(0);
805 if (answerRect.height() < 0)
806 answerRect.setHeight(0);
809 target_time = XCB_CURRENT_TIME;
811 qCDebug(lcQpaXDnd) <<
"sending XdndStatus to source:" << xdnd_dragsource;
813 if (xdnd_dragsource ==
connection()->qtSelectionOwner())
814 handle_xdnd_status(&response);
817 XCB_EVENT_MASK_NO_EVENT, (
const char *)&response);
822 class ClientMessageScanner {
824 ClientMessageScanner(xcb_atom_t
a) : atom(
a) {}
826 bool operator() (xcb_generic_event_t *
event,
int type)
const {
827 if (
type != XCB_CLIENT_MESSAGE)
829 auto clientMessage =
reinterpret_cast<xcb_client_message_event_t *
>(
event);
830 return clientMessage->type == atom;
837 xcb_client_message_event_t *lastEvent =
const_cast<xcb_client_message_event_t *
>(
event);
839 while (
auto nextEvent =
connection()->eventQueue()->peek(scanner)) {
840 if (lastEvent !=
event)
842 lastEvent =
reinterpret_cast<xcb_client_message_event_t *
>(nextEvent);
845 handle_xdnd_position(
w, lastEvent);
846 if (lastEvent !=
event)
850void QXcbDrag::handle_xdnd_status(
const xcb_client_message_event_t *
event)
854 qCDebug(lcQpaXDnd) <<
"source:" <<
event->window <<
"received XdndStatus";
855 waiting_for_status =
false;
857 if (
event->data.data32[0] &&
event->data.data32[0] != current_target)
860 const bool dropPossible =
event->data.data32[1];
864 accepted_drop_action = toDropAction(
event->data.data32[4]);
870 if ((
event->data.data32[1] & 2) == 0) {
871 QPoint p((
event->data.data32[2] & 0xffff0000) >> 16,
event->data.data32[2] & 0x0000ffff);
872 QSize s((
event->data.data32[3] & 0xffff0000) >> 16,
event->data.data32[3] & 0x0000ffff);
873 source_sameanswer =
QRect(
p,
s);
875 source_sameanswer =
QRect();
884 xcb_client_message_event_t *lastEvent =
const_cast<xcb_client_message_event_t *
>(
event);
885 xcb_generic_event_t *nextEvent;
887 while ((nextEvent =
connection()->eventQueue()->peek(scanner))) {
888 if (lastEvent !=
event)
890 lastEvent = (xcb_client_message_event_t *)nextEvent;
893 handle_xdnd_status(lastEvent);
894 if (lastEvent !=
event)
901 qCDebug(lcQpaXDnd) <<
"target:" <<
event->window <<
"received XdndLeave";
903 if (!currentWindow ||
w != currentWindow.
data()->handle()) {
904 stopListeningForActionListChanges();
915 if (
event->data.data32[0] != xdnd_dragsource) {
917 qCDebug(lcQpaXDnd,
"xdnd drag leave from unexpected source (%x not %x",
918 event->data.data32[0], xdnd_dragsource);
921 stopListeningForActionListChanges();
926void QXcbDrag::send_leave()
932 xcb_client_message_event_t
leave;
933 leave.response_type = XCB_CLIENT_MESSAGE;
935 leave.window = current_target;
939 leave.data.data32[1] = 0;
940 leave.data.data32[2] = 0;
941 leave.data.data32[3] = 0;
942 leave.data.data32[4] = 0;
949 qCDebug(lcQpaXDnd) <<
"sending XdndLeave to target:" << current_target;
955 XCB_EVENT_MASK_NO_EVENT, (
const char *)&
leave);
959 Qt::MouseButtons
b, Qt::KeyboardModifiers mods)
962 qCDebug(lcQpaXDnd) <<
"target:" <<
event->window <<
"received XdndDrop";
964 if (!currentWindow) {
965 stopListeningForActionListChanges();
970 const uint32_t *l =
event->data.data32;
972 if (l[0] != xdnd_dragsource) {
973 qCDebug(lcQpaXDnd,
"xdnd drop from unexpected source (%x not %x", l[0], xdnd_dragsource);
981 Qt::DropActions supported_drop_actions;
986 int at = findTransactionByTime(target_time);
988 qCDebug(lcQpaXDnd) <<
"found one transaction via findTransactionByTime()";
989 dropData = transactions.
at(
at).drag->mimeData();
991 if (dropData && dropData->
hasImage())
998 supported_drop_actions = Qt::DropActions(l[4]);
1001 dropData = m_dropData;
1002 supported_drop_actions = accepted_drop_action | toDropActions(drop_actions);
1012 currentWindow.
data(), dropData, currentPosition, supported_drop_actions,
1022 xcb_client_message_event_t finished = {};
1023 finished.response_type = XCB_CLIENT_MESSAGE;
1024 finished.sequence = 0;
1025 finished.window = xdnd_dragsource;
1026 finished.format = 32;
1028 finished.data.data32[0] = currentWindow ?
xcb_window(currentWindow.
data()) : XCB_NONE;
1029 finished.data.data32[1] = response.
isAccepted();
1030 finished.data.data32[2] = toXdndAction(acceptedAaction);
1032 qCDebug(lcQpaXDnd) <<
"sending XdndFinished to source:" << xdnd_dragsource;
1035 XCB_EVENT_MASK_NO_EVENT, (
char *)&finished);
1037 stopListeningForActionListChanges();
1045 qCDebug(lcQpaXDnd) <<
"source:" <<
event->window <<
"received XdndFinished";
1050 const unsigned long *l = (
const unsigned long *)
event->data.data32;
1052 int at = findTransactionByWindow(l[0]);
1055 Transaction
t = transactions.
takeAt(
at);
1057 t.drag->deleteLater();
1082 qWarning(
"QXcbDrag::handleFinished - drop data has expired");
1085 waiting_for_status =
false;
1090 if (
e->timerId() == cleanup_timer) {
1091 bool stopTimer =
true;
1092 for (
int i = 0;
i < transactions.
size(); ++
i) {
1093 const Transaction &
t = transactions.
at(
i);
1094 if (
t.targetWindow) {
1100 std::chrono::milliseconds delta{
t.time.msecsTo(
currentTime)};
1101 if (delta > XdndDropTransactionTimeout) {
1109 t.drag->deleteLater();
1116 if (stopTimer && cleanup_timer != -1) {
1125 qCDebug(lcQpaXDnd) <<
"dnd was canceled";
1145 bool aware = gpReply && gpReply->type != XCB_NONE;
1155 xcb_window_t root = qtReply->root;
1156 xcb_window_t
parent = qtReply->parent;
1166 qCDebug(lcQpaXDnd) <<
"handle selection request from target:" <<
event->requestor;
1168 notify.response_type = XCB_SELECTION_NOTIFY;
1169 notify.requestor =
event->requestor;
1170 notify.selection =
event->selection;
1171 notify.target = XCB_NONE;
1172 notify.property = XCB_NONE;
1173 notify.time =
event->time;
1185 at = findTransactionByTime(
event->time);
1189 at = findTransactionByWindow(
event->requestor);
1195 if (
event->time == XCB_CURRENT_TIME && current_target ==
target)
1198 at = findTransactionByWindow(
target);
1203 QDrag *transactionDrag =
nullptr;
1205 transactionDrag = transactions.
at(
at).drag;
1206 }
else if (
at == -2) {
1210 if (transactionDrag) {
1211 xcb_atom_t atomFormat =
event->target;
1215 &
data, &atomFormat, &dataFormat)) {
1218 atomFormat, dataFormat,
dataSize, (
const void *)
data.constData());
1219 notify.property =
event->property;
1220 notify.target = atomFormat;
1226 proxy_target =
event->requestor;
1228 xcb_send_event(
xcb_connection(),
false, proxy_target, XCB_EVENT_MASK_NO_EVENT, (
const char *)¬ify);
1234 qCDebug(lcQpaXDnd) <<
"dndEnable" <<
w << on;
1250 proxy_id =
window->xcb_window();
1252 xcb_change_property(
xcb_connection(), XCB_PROP_MODE_REPLACE,
w->xcb_window(), xdnd_proxy,
1253 XCB_ATOM_WINDOW, 32, 1, &proxy_id);
1254 xcb_change_property(
xcb_connection(), XCB_PROP_MODE_REPLACE, proxy_id, xdnd_proxy,
1255 XCB_ATOM_WINDOW, 32, 1, &proxy_id);
1262 qCDebug(lcQpaXDnd) <<
"setting XdndAware for" <<
window->xcb_window();
1273 delete desktop_proxy;
1274 desktop_proxy =
nullptr;
1276 qCDebug(lcQpaXDnd) <<
"not deleting XDndAware";
1318 bool hasUtf8 =
false;
1323#ifndef QT_NO_CLIPBOARD
1342 for (
int i = 0;
i <
drag->xdnd_types.
size(); ++
i) {
void updateCursor(Qt::DropAction action)
void moveShapedPixmapWindow(const QPoint &deviceIndependentPosition)
Move the drag label to globalPos, which is interpreted in device independent coordinates.
void setUseCompositing(bool on)
QShapedPixmapWindow * shapedPixmapWindow() const
virtual bool eventFilter(QObject *o, QEvent *e) override
Filters events if this object has been installed as an event filter for the watched object.
virtual void drop(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods)=0
void recreateShapedPixmapWindow(QScreen *screen, const QPoint &pos)
void setExecutedDropAction(Qt::DropAction da)
void setScreen(QScreen *screen)
QByteArray toLower() const &
static QPoint pos()
Returns the position of the cursor (hot spot) of the primary screen in global screen coordinates.
QMimeData * mimeData() const
Returns the MIME data that is encapsulated by the drag object.
Qt::DropActions supportedActions() const
Returns the set of possible drop actions for this drag operation.
static QWindow * currentMouseWindow
static Qt::KeyboardModifiers keyboardModifiers()
Returns the current state of the modifier keys on the keyboard.
static Qt::MouseButtons mouseButtons()
Returns the current state of the buttons on the mouse.
static QPoint mapPositionFromNative(const QPoint &pos, const QPlatformScreen *platformScreen)
QStringList formats() const override
Returns a list of formats supported by the object.
static QStringList formatsHelper(const QMimeData *data)
qsizetype size() const noexcept
const_pointer constData() const noexcept
bool isEmpty() const noexcept
void removeAt(qsizetype i)
const_reference at(qsizetype i) const noexcept
const T & constFirst() const noexcept
void reserve(qsizetype size)
void append(parameter_type t)
bool hasImage() const
Returns true if the object can return an image; otherwise returns false.
QByteArray data(const QString &mimetype) const
Returns the data stored in the object in the format described by the MIME type specified by mimeType.
int startTimer(int interval, Qt::TimerType timerType=Qt::CoarseTimer)
This is an overloaded function that will start a timer of type timerType and a timeout of interval mi...
void killTimer(int id)
Kills the timer with timer identifier, id.
void deleteLater()
\threadsafe
\inmodule QtCore\reentrant
constexpr int x() const noexcept
Returns the x coordinate of this point.
constexpr int y() const noexcept
Returns the y coordinate of this point.
\inmodule QtCore\reentrant
constexpr bool isValid() const noexcept
Returns true if the rectangle is valid, otherwise returns false.
QRect intersected(const QRect &other) const noexcept
constexpr QPoint topLeft() const noexcept
Returns the position of the rectangle's top-left corner.
bool contains(const QRect &r, bool proper=false) const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
constexpr QRect translated(int dx, int dy) const noexcept
Returns a copy of the rectangle that is translated dx along the x axis and dy along the y axis,...
\macro QT_RESTRICTED_CAST_FROM_ASCII
QByteArray toLatin1() const &
\inmodule QtCore \reentrant
static QTime currentTime()
Returns the current time as reported by the system clock.
QByteArray atomName(xcb_atom_t atom)
xcb_timestamp_t time() const
xcb_window_t qtSelectionOwner()
Qt::MouseButtons queryMouseButtons() const
QXcbWindow * platformWindowFromId(xcb_window_t id)
Qt::KeyboardModifiers queryKeyboardModifiers() const
void addWindowEventListener(xcb_window_t id, QXcbWindowEventListener *eventListener)
void removeWindowEventListener(xcb_window_t id)
static void queryPointer(QXcbConnection *c, QXcbVirtualDesktop **virtualDesktop, QPoint *pos, int *keybMask=nullptr)
void move(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods) override
Qt::DropAction defaultAction(Qt::DropActions possibleActions, Qt::KeyboardModifiers modifiers) const override
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)
xcb_timestamp_t targetTime()
void handleEnter(QPlatformWindow *window, const xcb_client_message_event_t *event, xcb_window_t proxy=0)
void drop(const QPoint &globalPos, Qt::MouseButtons b, Qt::KeyboardModifiers mods) override
void handleStatus(const xcb_client_message_event_t *event)
void handleDrop(QPlatformWindow *, const xcb_client_message_event_t *event, Qt::MouseButtons b={ }, Qt::KeyboardModifiers mods={ })
friend class QXcbDropData
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.
void handlePosition(QPlatformWindow *w, const xcb_client_message_event_t *event)
void startDrag() override
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)
QXcbDrag(QXcbConnection *c)
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
QVariant retrieveData_sys(const QString &mimeType, QMetaType type) const override
bool hasFormat_sys(const QString &mimeType) const override
QVariant xdndObtainData(const QByteArray &format, QMetaType requestedType) const
QXcbDropData(QXcbDrag *d)
QStringList formats_sys() const override
static QVariant mimeConvertToFormat(QXcbConnection *connection, xcb_atom_t a, const QByteArray &data, const QString &format, QMetaType requestedType, bool hasUtf8)
static QList< xcb_atom_t > mimeAtomsForFormat(QXcbConnection *connection, const QString &format)
static xcb_atom_t mimeAtomForFormat(QXcbConnection *connection, const QString &format, QMetaType requestedType, const QList< xcb_atom_t > &atoms, bool *hasUtf8)
static bool mimeDataForAtom(QXcbConnection *connection, xcb_atom_t a, QMimeData *mimeData, QByteArray *data, xcb_atom_t *atomFormat, int *dataFormat)
static QString mimeAtomToString(QXcbConnection *connection, xcb_atom_t a)
QXcbConnection * connection() const
xcb_connection_t * xcb_connection() const
xcb_atom_t atom(QXcbAtom::Atom atom) const
bool compositingActive() const
xcb_window_t root() const
QList< QPlatformScreen * > screens() const
QXcbScreen * screenAt(const QPoint &pos) const
static QString windowTitle(const QXcbConnection *conn, xcb_window_t window)
EGLImageKHR int int EGLuint64KHR * modifiers
T toNativePixels(const T &value, const C *context)
Combined button and popup list for selecting options.
DBusConnection * connection
#define qCDebug(category,...)
constexpr const T & qMin(const T &a, const T &b)
GLboolean GLboolean GLboolean b
GLuint64 GLenum void * handle
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLint GLsizei GLsizei height
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLenum GLsizei length
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLsizei GLsizei GLenum format
#define QStringLiteral(str)
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
static double currentTime()
#define Q_XCB_REPLY(call,...)
#define Q_XCB_REPLY_UNCHECKED(call,...)
static xcb_window_t xdndProxy(QXcbConnection *c, xcb_window_t w)
QT_BEGIN_NAMESPACE const int xdnd_version
static xcb_window_t findXdndAwareParent(QXcbConnection *c, xcb_window_t window)
static xcb_window_t xcb_window(QPlatformWindow *w)
static bool windowInteractsWithPosition(xcb_connection_t *connection, const QPoint &pos, xcb_window_t w, xcb_shape_sk_t shapeType)
static bool translate(xcb_connection_t *connection, xcb_window_t child, xcb_window_t parent, int *x, int *y)
application x qt windows mime
[2]
bool contains(const AT &t) const noexcept
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent