qxcbdrag.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/plugins/platforms/xcb/qxcbdrag.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2015 The Qt Company Ltd.-
4** Contact: http://www.qt.io/licensing/-
5**-
6** This file is part of the QtGui module of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL21$-
9** Commercial License Usage-
10** Licensees holding valid commercial Qt licenses may use this file in-
11** accordance with the commercial license agreement provided with the-
12** Software or, alternatively, in accordance with the terms contained in-
13** a written agreement between you and The Qt Company. For licensing terms-
14** and conditions see http://www.qt.io/terms-conditions. For further-
15** information use the contact form at http://www.qt.io/contact-us.-
16**-
17** GNU Lesser General Public License Usage-
18** Alternatively, this file may be used under the terms of the GNU Lesser-
19** General Public License version 2.1 or version 3 as published by the Free-
20** Software Foundation and appearing in the file LICENSE.LGPLv21 and-
21** LICENSE.LGPLv3 included in the packaging of this file. Please review the-
22** following information to ensure the GNU Lesser General Public License-
23** requirements will be met: https://www.gnu.org/licenses/lgpl.html and-
24** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.-
25**-
26** As a special exception, The Qt Company gives you certain additional-
27** rights. These rights are described in The Qt Company LGPL Exception-
28** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.-
29**-
30** $QT_END_LICENSE$-
31**-
32****************************************************************************/-
33-
34#include "qxcbdrag.h"-
35#include <xcb/xcb.h>-
36#include "qxcbconnection.h"-
37#include "qxcbclipboard.h"-
38#include "qxcbmime.h"-
39#include "qxcbwindow.h"-
40#include "qxcbscreen.h"-
41#include "qwindow.h"-
42#include "qxcbcursor.h"-
43#include <private/qdnd_p.h>-
44#include <qdebug.h>-
45#include <qevent.h>-
46#include <qguiapplication.h>-
47#include <qrect.h>-
48#include <qpainter.h>-
49#include <qtimer.h>-
50-
51#include <qpa/qwindowsysteminterface.h>-
52-
53#include <private/qguiapplication_p.h>-
54#include <private/qshapedpixmapdndwindow_p.h>-
55#include <private/qsimpledrag_p.h>-
56#include <private/qhighdpiscaling_p.h>-
57-
58QT_BEGIN_NAMESPACE-
59-
60#ifndef QT_NO_DRAGANDDROP-
61-
62//#define DND_DEBUG-
63#ifdef DND_DEBUG-
64#define DEBUG qDebug-
65#else-
66#define DEBUG if(0) qDebug-
67#endif-
68-
69#ifdef DND_DEBUG-
70#define DNDDEBUG qDebug()-
71#else-
72#define DNDDEBUG if(0) qDebug()-
73#endif-
74-
75const int xdnd_version = 5;-
76-
77static inline xcb_window_t xcb_window(QPlatformWindow *w)-
78{-
79 return static_cast<QXcbWindow *>(w)->xcb_window();
never executed: return static_cast<QXcbWindow *>(w)->xcb_window();
0
80}-
81-
82static inline xcb_window_t xcb_window(QWindow *w)-
83{-
84 return static_cast<QXcbWindow *>(w->handle())->xcb_window();
never executed: return static_cast<QXcbWindow *>(w->handle())->xcb_window();
0
85}-
86-
87static xcb_window_t xdndProxy(QXcbConnection *c, xcb_window_t w)-
88{-
89 xcb_window_t proxy = XCB_NONE;-
90-
91 xcb_get_property_cookie_t cookie = Q_XCB_CALL2(xcb_get_property(c->xcb_connection(), false, w, c->atom(QXcbAtom::XdndProxy),-
92 XCB_ATOM_WINDOW, 0, 1), c);-
93 xcb_get_property_reply_t *reply = xcb_get_property_reply(c->xcb_connection(), cookie, 0);-
94-
95 if (reply && reply->type == XCB_ATOM_WINDOW)
replyDescription
TRUEnever evaluated
FALSEnever evaluated
reply->type == XCB_ATOM_WINDOWDescription
TRUEnever evaluated
FALSEnever evaluated
0
96 proxy = *((xcb_window_t *)xcb_get_property_value(reply));
never executed: proxy = *((xcb_window_t *)xcb_get_property_value(reply));
0
97 free(reply);-
98-
99 if (proxy == XCB_NONE)
proxy == 0LDescription
TRUEnever evaluated
FALSEnever evaluated
0
100 return proxy;
never executed: return proxy;
0
101-
102 // exists and is real?-
103 cookie = Q_XCB_CALL2(xcb_get_property(c->xcb_connection(), false, proxy, c->atom(QXcbAtom::XdndProxy),-
104 XCB_ATOM_WINDOW, 0, 1), c);-
105 reply = xcb_get_property_reply(c->xcb_connection(), cookie, 0);-
106-
107 if (reply && reply->type == XCB_ATOM_WINDOW) {
replyDescription
TRUEnever evaluated
FALSEnever evaluated
reply->type == XCB_ATOM_WINDOWDescription
TRUEnever evaluated
FALSEnever evaluated
0
108 xcb_window_t p = *((xcb_window_t *)xcb_get_property_value(reply));-
109 if (proxy != p)
proxy != pDescription
TRUEnever evaluated
FALSEnever evaluated
0
110 proxy = 0;
never executed: proxy = 0;
0
111 } else {
never executed: end of block
0
112 proxy = 0;-
113 }
never executed: end of block
0
114-
115 free(reply);-
116-
117 return proxy;
never executed: return proxy;
0
118}-
119-
120class QXcbDropData : public QXcbMime-
121{-
122public:-
123 QXcbDropData(QXcbDrag *d);-
124 ~QXcbDropData();-
125-
126protected:-
127 bool hasFormat_sys(const QString &mimeType) const Q_DECL_OVERRIDE;-
128 QStringList formats_sys() const Q_DECL_OVERRIDE;-
129 QVariant retrieveData_sys(const QString &mimeType, QVariant::Type type) const Q_DECL_OVERRIDE;-
130-
131 QVariant xdndObtainData(const QByteArray &format, QVariant::Type requestedType) const;-
132-
133 QXcbDrag *drag;-
134};-
135-
136-
137QXcbDrag::QXcbDrag(QXcbConnection *c) : QXcbObject(c)-
138{-
139 dropData = new QXcbDropData(this);-
140-
141 init();-
142 cleanup_timer = -1;-
143}
executed 129 times by 5 tests: end of block
Executed by:
  • tst_QApplication
  • tst_QGuiApplication
  • tst_qapplication - unknown status
  • tst_qprocess - unknown status
  • tst_selftests - unknown status
129
144-
145QXcbDrag::~QXcbDrag()-
146{-
147 delete dropData;-
148}
executed 341 times by 220 tests: end of block
Executed by:
  • tst_QApplication
  • tst_QGuiApplication
  • tst_gestures - unknown status
  • tst_lancelot - unknown status
  • tst_languagechange - unknown status
  • tst_modeltest - unknown status
  • tst_qabstractbutton - unknown status
  • tst_qabstractitemview - unknown status
  • tst_qabstractprintdialog - unknown status
  • tst_qabstractproxymodel - unknown status
  • tst_qabstractscrollarea - unknown status
  • tst_qabstractslider - unknown status
  • tst_qabstractspinbox - unknown status
  • tst_qabstracttextdocumentlayout - unknown status
  • tst_qaccessibility - unknown status
  • tst_qaction - unknown status
  • tst_qactiongroup - unknown status
  • tst_qapplication - unknown status
  • tst_qbackingstore - unknown status
  • tst_qboxlayout - unknown status
  • tst_qbrush - unknown status
  • tst_qbuttongroup - unknown status
  • tst_qcalendarwidget - unknown status
  • tst_qcheckbox - unknown status
  • tst_qclipboard - unknown status
  • ...
341
149-
150void QXcbDrag::init()-
151{-
152 currentWindow.clear();-
153-
154 accepted_drop_action = Qt::IgnoreAction;-
155-
156 xdnd_dragsource = XCB_NONE;-
157-
158 waiting_for_status = false;-
159 current_target = XCB_NONE;-
160 current_proxy_target = XCB_NONE;-
161-
162 source_time = XCB_CURRENT_TIME;-
163 target_time = XCB_CURRENT_TIME;-
164-
165 QXcbCursor::queryPointer(connection(), &current_virtual_desktop, 0);-
166 drag_types.clear();-
167}
executed 129 times by 5 tests: end of block
Executed by:
  • tst_QApplication
  • tst_QGuiApplication
  • tst_qapplication - unknown status
  • tst_qprocess - unknown status
  • tst_selftests - unknown status
129
168-
169QMimeData *QXcbDrag::platformDropData()-
170{-
171 return dropData;
executed 9 times by 9 tests: return dropData;
Executed by:
  • tst_QAbstractItemView
  • tst_QDataWidgetMapper
  • tst_QGraphicsProxyWidget
  • tst_QGraphicsScene
  • tst_QItemDelegate
  • tst_QItemView
  • tst_QListWidget
  • tst_QTreeView
  • tst_QWidget_window
9
172}-
173-
174bool QXcbDrag::eventFilter(QObject *o, QEvent *e)-
175{-
176 /* We are setting a mouse grab on the QShapedPixmapWindow in order not to-
177 * lose the grab when the virtual desktop changes, but-
178 * QBasicDrag::eventFilter() expects the events to be coming from the-
179 * window where the drag was started. */-
180 if (initiatorWindow && o == shapedPixmapWindow())
initiatorWindowDescription
TRUEnever evaluated
FALSEnever evaluated
o == shapedPixmapWindow()Description
TRUEnever evaluated
FALSEnever evaluated
0
181 o = initiatorWindow.data();
never executed: o = initiatorWindow.data();
0
182 return QBasicDrag::eventFilter(o, e);
never executed: return QBasicDrag::eventFilter(o, e);
0
183}-
184-
185void QXcbDrag::startDrag()-
186{-
187 // #fixme enableEventFilter();-
188-
189 init();-
190-
191 xcb_set_selection_owner(xcb_connection(), connection()->clipboard()->owner(),-
192 atom(QXcbAtom::XdndSelection), connection()->time());-
193-
194 QStringList fmts = QXcbMime::formatsHelper(drag()->mimeData());-
195 for (int i = 0; i < fmts.size(); ++i) {
i < fmts.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
196 QVector<xcb_atom_t> atoms = QXcbMime::mimeAtomsForFormat(connection(), fmts.at(i));-
197 for (int j = 0; j < atoms.size(); ++j) {
j < atoms.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
198 if (!drag_types.contains(atoms.at(j)))
!drag_types.co...s(atoms.at(j))Description
TRUEnever evaluated
FALSEnever evaluated
0
199 drag_types.append(atoms.at(j));
never executed: drag_types.append(atoms.at(j));
0
200 }
never executed: end of block
0
201 }
never executed: end of block
0
202 if (drag_types.size() > 3)
drag_types.size() > 3Description
TRUEnever evaluated
FALSEnever evaluated
0
203 xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, connection()->clipboard()->owner(),
never executed: xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, connection()->clipboard()->owner(), atom(QXcbAtom::XdndTypelist), XCB_ATOM_ATOM, 32, drag_types.size(), (const void *)drag_types.constData());
0
204 atom(QXcbAtom::XdndTypelist),
never executed: xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, connection()->clipboard()->owner(), atom(QXcbAtom::XdndTypelist), XCB_ATOM_ATOM, 32, drag_types.size(), (const void *)drag_types.constData());
0
205 XCB_ATOM_ATOM, 32, drag_types.size(), (const void *)drag_types.constData());
never executed: xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, connection()->clipboard()->owner(), atom(QXcbAtom::XdndTypelist), XCB_ATOM_ATOM, 32, drag_types.size(), (const void *)drag_types.constData());
0
206-
207 setUseCompositing(current_virtual_desktop->compositingActive());-
208 setScreen(current_virtual_desktop->screens().constFirst()->screen());-
209 initiatorWindow = QGuiApplicationPrivate::currentMouseWindow;-
210 QBasicDrag::startDrag();-
211 if (connection()->mouseGrabber() == Q_NULLPTR)
connection()->...r() == nullptrDescription
TRUEnever evaluated
FALSEnever evaluated
0
212 shapedPixmapWindow()->setMouseGrabEnabled(true);
never executed: shapedPixmapWindow()->setMouseGrabEnabled(true);
0
213}
never executed: end of block
0
214-
215void QXcbDrag::endDrag()-
216{-
217 QBasicDrag::endDrag();-
218 initiatorWindow.clear();-
219}
never executed: end of block
0
220-
221static xcb_translate_coordinates_reply_t *-
222translateCoordinates(QXcbConnection *c, xcb_window_t from, xcb_window_t to, int x, int y)-
223{-
224 xcb_translate_coordinates_cookie_t cookie =-
225 xcb_translate_coordinates(c->xcb_connection(), from, to, x, y);-
226 return xcb_translate_coordinates_reply(c->xcb_connection(), cookie, 0);
never executed: return xcb_translate_coordinates_reply(c->xcb_connection(), cookie, 0);
0
227}-
228-
229static-
230bool windowInteractsWithPosition(xcb_connection_t *connection, const QPoint & pos, xcb_window_t w, xcb_shape_sk_t shapeType)-
231{-
232 bool interacts = false;-
233 xcb_shape_get_rectangles_reply_t *reply = xcb_shape_get_rectangles_reply(connection, xcb_shape_get_rectangles(connection, w, shapeType), NULL);-
234 if (reply) {
replyDescription
TRUEnever evaluated
FALSEnever evaluated
0
235 xcb_rectangle_t *rectangles = xcb_shape_get_rectangles_rectangles(reply);-
236 if (rectangles) {
rectanglesDescription
TRUEnever evaluated
FALSEnever evaluated
0
237 const int nRectangles = xcb_shape_get_rectangles_rectangles_length(reply);-
238 for (int i = 0; !interacts && i < nRectangles; ++i) {
!interactsDescription
TRUEnever evaluated
FALSEnever evaluated
i < nRectanglesDescription
TRUEnever evaluated
FALSEnever evaluated
0
239 interacts = QRect(rectangles[i].x, rectangles[i].y, rectangles[i].width, rectangles[i].height).contains(pos);-
240 }
never executed: end of block
0
241 }
never executed: end of block
0
242 free(reply);-
243 }
never executed: end of block
0
244-
245 return interacts;
never executed: return interacts;
0
246}-
247-
248xcb_window_t QXcbDrag::findRealWindow(const QPoint & pos, xcb_window_t w, int md, bool ignoreNonXdndAwareWindows)-
249{-
250 if (w == shapedPixmapWindow()->handle()->winId())
w == shapedPix...dle()->winId()Description
TRUEnever evaluated
FALSEnever evaluated
0
251 return 0;
never executed: return 0;
0
252-
253 if (md) {
mdDescription
TRUEnever evaluated
FALSEnever evaluated
0
254 xcb_get_window_attributes_cookie_t cookie = xcb_get_window_attributes(xcb_connection(), w);-
255 xcb_get_window_attributes_reply_t *reply = xcb_get_window_attributes_reply(xcb_connection(), cookie, 0);-
256 if (!reply)
!replyDescription
TRUEnever evaluated
FALSEnever evaluated
0
257 return 0;
never executed: return 0;
0
258-
259 if (reply->map_state != XCB_MAP_STATE_VIEWABLE)
reply->map_sta...STATE_VIEWABLEDescription
TRUEnever evaluated
FALSEnever evaluated
0
260 return 0;
never executed: return 0;
0
261-
262 free(reply);-
263-
264 xcb_get_geometry_cookie_t gcookie = xcb_get_geometry(xcb_connection(), w);-
265 xcb_get_geometry_reply_t *greply = xcb_get_geometry_reply(xcb_connection(), gcookie, 0);-
266 if (!greply)
!greplyDescription
TRUEnever evaluated
FALSEnever evaluated
0
267 return 0;
never executed: return 0;
0
268-
269 QRect windowRect(greply->x, greply->y, greply->width, greply->height);-
270 free(greply);-
271 if (windowRect.contains(pos)) {
windowRect.contains(pos)Description
TRUEnever evaluated
FALSEnever evaluated
0
272 bool windowContainsMouse = !ignoreNonXdndAwareWindows;-
273 {-
274 xcb_get_property_cookie_t cookie =-
275 Q_XCB_CALL(xcb_get_property(xcb_connection(), false, w, connection()->atom(QXcbAtom::XdndAware),-
276 XCB_GET_PROPERTY_TYPE_ANY, 0, 0));-
277 xcb_get_property_reply_t *reply = xcb_get_property_reply(xcb_connection(), cookie, 0);-
278-
279 bool isAware = reply && reply->type != XCB_NONE;
replyDescription
TRUEnever evaluated
FALSEnever evaluated
reply->type != 0LDescription
TRUEnever evaluated
FALSEnever evaluated
0
280 free(reply);-
281 if (isAware) {
isAwareDescription
TRUEnever evaluated
FALSEnever evaluated
0
282 const QPoint relPos = pos - windowRect.topLeft();-
283 // When ShapeInput and ShapeBounding are not set they return a single rectangle with the geometry of the window, this is why we-
284 // need to check both here so that in the case one is set and the other is not we still get the correct result.-
285 if (connection()->hasInputShape())
connection()->hasInputShape()Description
TRUEnever evaluated
FALSEnever evaluated
0
286 windowContainsMouse = windowInteractsWithPosition(xcb_connection(), relPos, w, XCB_SHAPE_SK_INPUT);
never executed: windowContainsMouse = windowInteractsWithPosition(xcb_connection(), relPos, w, XCB_SHAPE_SK_INPUT);
0
287 if (windowContainsMouse && connection()->hasXShape())
windowContainsMouseDescription
TRUEnever evaluated
FALSEnever evaluated
connection()->hasXShape()Description
TRUEnever evaluated
FALSEnever evaluated
0
288 windowContainsMouse = windowInteractsWithPosition(xcb_connection(), relPos, w, XCB_SHAPE_SK_BOUNDING);
never executed: windowContainsMouse = windowInteractsWithPosition(xcb_connection(), relPos, w, XCB_SHAPE_SK_BOUNDING);
0
289 if (!connection()->hasInputShape() && !connection()->hasXShape())
!connection()->hasInputShape()Description
TRUEnever evaluated
FALSEnever evaluated
!connection()->hasXShape()Description
TRUEnever evaluated
FALSEnever evaluated
0
290 windowContainsMouse = true;
never executed: windowContainsMouse = true;
0
291 if (windowContainsMouse)
windowContainsMouseDescription
TRUEnever evaluated
FALSEnever evaluated
0
292 return w;
never executed: return w;
0
293 }
never executed: end of block
0
294 }-
295-
296 xcb_query_tree_cookie_t cookie = xcb_query_tree (xcb_connection(), w);-
297 xcb_query_tree_reply_t *reply = xcb_query_tree_reply(xcb_connection(), cookie, 0);-
298-
299 if (!reply)
!replyDescription
TRUEnever evaluated
FALSEnever evaluated
0
300 return 0;
never executed: return 0;
0
301 int nc = xcb_query_tree_children_length(reply);-
302 xcb_window_t *c = xcb_query_tree_children(reply);-
303-
304 xcb_window_t r = 0;-
305 for (uint i = nc; !r && i--;)
!rDescription
TRUEnever evaluated
FALSEnever evaluated
i--Description
TRUEnever evaluated
FALSEnever evaluated
0
306 r = findRealWindow(pos - windowRect.topLeft(), c[i], md-1, ignoreNonXdndAwareWindows);
never executed: r = findRealWindow(pos - windowRect.topLeft(), c[i], md-1, ignoreNonXdndAwareWindows);
0
307-
308 free(reply);-
309 if (r)
rDescription
TRUEnever evaluated
FALSEnever evaluated
0
310 return r;
never executed: return r;
0
311-
312 // We didn't find a client window! Just use the-
313 // innermost window.-
314-
315 // No children!-
316 if (!windowContainsMouse)
!windowContainsMouseDescription
TRUEnever evaluated
FALSEnever evaluated
0
317 return 0;
never executed: return 0;
0
318 else-
319 return w;
never executed: return w;
0
320 }-
321 }
never executed: end of block
0
322 return 0;
never executed: return 0;
0
323}-
324-
325void QXcbDrag::move(const QPoint &globalPos)-
326{-
327-
328 if (source_sameanswer.contains(globalPos) && source_sameanswer.isValid())
source_sameans...ins(globalPos)Description
TRUEnever evaluated
FALSEnever evaluated
source_sameanswer.isValid()Description
TRUEnever evaluated
FALSEnever evaluated
0
329 return;
never executed: return;
0
330-
331 QXcbVirtualDesktop *virtualDesktop = Q_NULLPTR;-
332 QPoint cursorPos;-
333 QXcbCursor::queryPointer(connection(), &virtualDesktop, &cursorPos);-
334 QXcbScreen *screen = virtualDesktop->screenAt(cursorPos);-
335 QPoint deviceIndependentPos = QHighDpiScaling::mapPositionFromNative(globalPos, screen);-
336-
337 if (virtualDesktop != current_virtual_desktop) {
virtualDesktop...irtual_desktopDescription
TRUEnever evaluated
FALSEnever evaluated
0
338 setUseCompositing(virtualDesktop->compositingActive());-
339 recreateShapedPixmapWindow(static_cast<QPlatformScreen*>(screen)->screen(), deviceIndependentPos);-
340 if (connection()->mouseGrabber() == Q_NULLPTR)
connection()->...r() == nullptrDescription
TRUEnever evaluated
FALSEnever evaluated
0
341 shapedPixmapWindow()->setMouseGrabEnabled(true);
never executed: shapedPixmapWindow()->setMouseGrabEnabled(true);
0
342-
343 current_virtual_desktop = virtualDesktop;-
344 } else {
never executed: end of block
0
345 QBasicDrag::moveShapedPixmapWindow(deviceIndependentPos);-
346 }
never executed: end of block
0
347-
348 xcb_window_t rootwin = current_virtual_desktop->root();-
349 xcb_translate_coordinates_reply_t *translate =-
350 ::translateCoordinates(connection(), rootwin, rootwin, globalPos.x(), globalPos.y());-
351 if (!translate)
!translateDescription
TRUEnever evaluated
FALSEnever evaluated
0
352 return;
never executed: return;
0
353-
354 xcb_window_t target = translate->child;-
355 int lx = translate->dst_x;-
356 int ly = translate->dst_y;-
357 free (translate);-
358-
359 if (target && target != rootwin) {
targetDescription
TRUEnever evaluated
FALSEnever evaluated
target != rootwinDescription
TRUEnever evaluated
FALSEnever evaluated
0
360 xcb_window_t src = rootwin;-
361 while (target != 0) {
target != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
362 DNDDEBUG << "checking target for XdndAware" << target << lx << ly;
dead code: QMessageLogger(__FILE__, 362, __PRETTY_FUNCTION__).debug() << "checking target for XdndAware" << target << lx << ly;
-
363-
364 // translate coordinates-
365 translate = ::translateCoordinates(connection(), src, target, lx, ly);-
366 if (!translate) {
!translateDescription
TRUEnever evaluated
FALSEnever evaluated
0
367 target = 0;-
368 break;
never executed: break;
0
369 }-
370 lx = translate->dst_x;-
371 ly = translate->dst_y;-
372 src = target;-
373 xcb_window_t child = translate->child;-
374 free(translate);-
375-
376 // check if it has XdndAware-
377 xcb_get_property_cookie_t cookie = Q_XCB_CALL(xcb_get_property(xcb_connection(), false, target,-
378 atom(QXcbAtom::XdndAware), XCB_GET_PROPERTY_TYPE_ANY, 0, 0));-
379 xcb_get_property_reply_t *reply = xcb_get_property_reply(xcb_connection(), cookie, 0);-
380 bool aware = reply && reply->type != XCB_NONE;
replyDescription
TRUEnever evaluated
FALSEnever evaluated
reply->type != 0LDescription
TRUEnever evaluated
FALSEnever evaluated
0
381 free(reply);-
382 if (aware) {
awareDescription
TRUEnever evaluated
FALSEnever evaluated
0
383 DNDDEBUG << "Found XdndAware on " << target;
dead code: QMessageLogger(__FILE__, 383, __PRETTY_FUNCTION__).debug() << "Found XdndAware on " << target;
-
384 break;
never executed: break;
0
385 }-
386-
387 target = child;-
388 }
never executed: end of block
0
389-
390 if (!target || target == shapedPixmapWindow()->handle()->winId()) {
!targetDescription
TRUEnever evaluated
FALSEnever evaluated
target == shap...dle()->winId()Description
TRUEnever evaluated
FALSEnever evaluated
0
391 DNDDEBUG << "need to find real window";
dead code: QMessageLogger(__FILE__, 391, __PRETTY_FUNCTION__).debug() << "need to find real window";
-
392 target = findRealWindow(globalPos, rootwin, 6, true);-
393 if (target == 0)
target == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
394 target = findRealWindow(globalPos, rootwin, 6, false);
never executed: target = findRealWindow(globalPos, rootwin, 6, false);
0
395 DNDDEBUG << "real window found" << target;
dead code: QMessageLogger(__FILE__, 395, __PRETTY_FUNCTION__).debug() << "real window found" << target;
-
396 }
never executed: end of block
0
397 }
never executed: end of block
0
398-
399 QXcbWindow *w = 0;-
400 if (target) {
targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
401 w = connection()->platformWindowFromId(target);-
402 if (w && (w->window()->type() == Qt::Desktop) /*&& !w->acceptDrops()*/)
wDescription
TRUEnever evaluated
FALSEnever evaluated
(w->window()->...= Qt::Desktop)Description
TRUEnever evaluated
FALSEnever evaluated
0
403 w = 0;
never executed: w = 0;
0
404 } else {
never executed: end of block
0
405 w = 0;-
406 target = rootwin;-
407 }
never executed: end of block
0
408-
409 xcb_window_t proxy_target = xdndProxy(connection(), target);-
410 if (!proxy_target)
!proxy_targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
411 proxy_target = target;
never executed: proxy_target = target;
0
412 int target_version = 1;-
413-
414 if (proxy_target) {
proxy_targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
415 xcb_get_property_cookie_t cookie = xcb_get_property(xcb_connection(), false, proxy_target,-
416 atom(QXcbAtom::XdndAware), XCB_GET_PROPERTY_TYPE_ANY, 0, 1);-
417 xcb_get_property_reply_t *reply = xcb_get_property_reply(xcb_connection(), cookie, 0);-
418 if (!reply || reply->type == XCB_NONE)
!replyDescription
TRUEnever evaluated
FALSEnever evaluated
reply->type == 0LDescription
TRUEnever evaluated
FALSEnever evaluated
0
419 target = 0;
never executed: target = 0;
0
420-
421 target_version = *(uint32_t *)xcb_get_property_value(reply);-
422 target_version = qMin(xdnd_version, target_version ? target_version : 1);-
423-
424 free(reply);-
425 }
never executed: end of block
0
426-
427 if (target != current_target) {
target != current_targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
428 if (current_target)
current_targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
429 send_leave();
never executed: send_leave();
0
430-
431 current_target = target;-
432 current_proxy_target = proxy_target;-
433 if (target) {
targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
434 int flags = target_version << 24;-
435 if (drag_types.size() > 3)
drag_types.size() > 3Description
TRUEnever evaluated
FALSEnever evaluated
0
436 flags |= 0x0001;
never executed: flags |= 0x0001;
0
437-
438 xcb_client_message_event_t enter;-
439 enter.response_type = XCB_CLIENT_MESSAGE;-
440 enter.sequence = 0;-
441 enter.window = target;-
442 enter.format = 32;-
443 enter.type = atom(QXcbAtom::XdndEnter);-
444 enter.data.data32[0] = connection()->clipboard()->owner();-
445 enter.data.data32[1] = flags;-
446 enter.data.data32[2] = drag_types.size()>0 ? drag_types.at(0) : 0;
drag_types.size()>0Description
TRUEnever evaluated
FALSEnever evaluated
0
447 enter.data.data32[3] = drag_types.size()>1 ? drag_types.at(1) : 0;
drag_types.size()>1Description
TRUEnever evaluated
FALSEnever evaluated
0
448 enter.data.data32[4] = drag_types.size()>2 ? drag_types.at(2) : 0;
drag_types.size()>2Description
TRUEnever evaluated
FALSEnever evaluated
0
449 // provisionally set the rectangle to 5x5 pixels...-
450 source_sameanswer = QRect(globalPos.x() - 2, globalPos.y() -2 , 5, 5);-
451-
452 DEBUG() << "sending Xdnd enter source=" << enter.data.data32[0];
dead code: QMessageLogger(__FILE__, 452, __PRETTY_FUNCTION__).debug() << "sending Xdnd enter source=" << enter.data.data32[0];
-
453 if (w)
wDescription
TRUEnever evaluated
FALSEnever evaluated
0
454 handleEnter(w, &enter, current_proxy_target);
never executed: handleEnter(w, &enter, current_proxy_target);
0
455 else if (target)
targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
456 xcb_send_event(xcb_connection(), false, proxy_target, XCB_EVENT_MASK_NO_EVENT, (const char *)&enter);
never executed: xcb_send_event(xcb_connection(), false, proxy_target, XCB_EVENT_MASK_NO_EVENT, (const char *)&enter);
0
457 waiting_for_status = false;-
458 }
never executed: end of block
0
459 }
never executed: end of block
0
460-
461 if (waiting_for_status)
waiting_for_statusDescription
TRUEnever evaluated
FALSEnever evaluated
0
462 return;
never executed: return;
0
463-
464 if (target) {
targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
465 waiting_for_status = true;-
466-
467 xcb_client_message_event_t move;-
468 move.response_type = XCB_CLIENT_MESSAGE;-
469 move.sequence = 0;-
470 move.window = target;-
471 move.format = 32;-
472 move.type = atom(QXcbAtom::XdndPosition);-
473 move.data.data32[0] = connection()->clipboard()->owner();-
474 move.data.data32[1] = 0; // flags-
475 move.data.data32[2] = (globalPos.x() << 16) + globalPos.y();-
476 move.data.data32[3] = connection()->time();-
477 move.data.data32[4] = toXdndAction(defaultAction(currentDrag()->supportedActions(), QGuiApplication::keyboardModifiers()));-
478 DEBUG() << "sending Xdnd position source=" << move.data.data32[0] << "target=" << move.window;
dead code: QMessageLogger(__FILE__, 478, __PRETTY_FUNCTION__).debug() << "sending Xdnd position source=" << move.data.data32[0] << "target=" << move.window;
-
479-
480 source_time = connection()->time();-
481-
482 if (w)
wDescription
TRUEnever evaluated
FALSEnever evaluated
0
483 handle_xdnd_position(w, &move);
never executed: handle_xdnd_position(w, &move);
0
484 else-
485 xcb_send_event(xcb_connection(), false, proxy_target, XCB_EVENT_MASK_NO_EVENT, (const char *)&move);
never executed: xcb_send_event(xcb_connection(), false, proxy_target, XCB_EVENT_MASK_NO_EVENT, (const char *)&move);
0
486 }-
487}
never executed: end of block
0
488-
489void QXcbDrag::drop(const QPoint &globalPos)-
490{-
491 QBasicDrag::drop(globalPos);-
492-
493 if (!current_target)
!current_targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
494 return;
never executed: return;
0
495-
496 xcb_client_message_event_t drop;-
497 drop.response_type = XCB_CLIENT_MESSAGE;-
498 drop.sequence = 0;-
499 drop.window = current_target;-
500 drop.format = 32;-
501 drop.type = atom(QXcbAtom::XdndDrop);-
502 drop.data.data32[0] = connection()->clipboard()->owner();-
503 drop.data.data32[1] = 0; // flags-
504 drop.data.data32[2] = connection()->time();-
505-
506 drop.data.data32[3] = 0;-
507 drop.data.data32[4] = currentDrag()->supportedActions();-
508-
509 QXcbWindow *w = connection()->platformWindowFromId(current_proxy_target);-
510-
511 if (w && (w->window()->type() == Qt::Desktop) /*&& !w->acceptDrops()*/)
wDescription
TRUEnever evaluated
FALSEnever evaluated
(w->window()->...= Qt::Desktop)Description
TRUEnever evaluated
FALSEnever evaluated
0
512 w = 0;
never executed: w = 0;
0
513-
514 Transaction t = {-
515 connection()->time(),-
516 current_target,-
517 current_proxy_target,-
518 w,-
519// current_embeddig_widget,-
520 currentDrag(),-
521 QTime::currentTime()-
522 };-
523 transactions.append(t);-
524-
525 // timer is needed only for drops that came from other processes.-
526 if (!t.targetWindow && cleanup_timer == -1) {
!t.targetWindowDescription
TRUEnever evaluated
FALSEnever evaluated
cleanup_timer == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
527 cleanup_timer = startTimer(XdndDropTransactionTimeout);-
528 }
never executed: end of block
0
529-
530 if (w) {
wDescription
TRUEnever evaluated
FALSEnever evaluated
0
531 handleDrop(w, &drop);-
532 } else {
never executed: end of block
0
533 xcb_send_event(xcb_connection(), false, current_proxy_target, XCB_EVENT_MASK_NO_EVENT, (const char *)&drop);-
534 }
never executed: end of block
0
535-
536 current_target = 0;-
537 current_proxy_target = 0;-
538 source_time = 0;-
539// current_embedding_widget = 0;-
540}
never executed: end of block
0
541-
542Qt::DropAction QXcbDrag::toDropAction(xcb_atom_t a) const-
543{-
544 if (a == atom(QXcbAtom::XdndActionCopy) || a == 0)
a == atom(QXcb...dndActionCopy)Description
TRUEnever evaluated
FALSEnever evaluated
a == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
545 return Qt::CopyAction;
never executed: return Qt::CopyAction;
0
546 if (a == atom(QXcbAtom::XdndActionLink))
a == atom(QXcb...dndActionLink)Description
TRUEnever evaluated
FALSEnever evaluated
0
547 return Qt::LinkAction;
never executed: return Qt::LinkAction;
0
548 if (a == atom(QXcbAtom::XdndActionMove))
a == atom(QXcb...dndActionMove)Description
TRUEnever evaluated
FALSEnever evaluated
0
549 return Qt::MoveAction;
never executed: return Qt::MoveAction;
0
550 return Qt::CopyAction;
never executed: return Qt::CopyAction;
0
551}-
552-
553xcb_atom_t QXcbDrag::toXdndAction(Qt::DropAction a) const-
554{-
555 switch (a) {-
556 case Qt::CopyAction:
never executed: case Qt::CopyAction:
0
557 return atom(QXcbAtom::XdndActionCopy);
never executed: return atom(QXcbAtom::XdndActionCopy);
0
558 case Qt::LinkAction:
never executed: case Qt::LinkAction:
0
559 return atom(QXcbAtom::XdndActionLink);
never executed: return atom(QXcbAtom::XdndActionLink);
0
560 case Qt::MoveAction:
never executed: case Qt::MoveAction:
0
561 case Qt::TargetMoveAction:
never executed: case Qt::TargetMoveAction:
0
562 return atom(QXcbAtom::XdndActionMove);
never executed: return atom(QXcbAtom::XdndActionMove);
0
563 case Qt::IgnoreAction:
never executed: case Qt::IgnoreAction:
0
564 return XCB_NONE;
never executed: return 0L;
0
565 default:
never executed: default:
0
566 return atom(QXcbAtom::XdndActionCopy);
never executed: return atom(QXcbAtom::XdndActionCopy);
0
567 }-
568}-
569-
570int QXcbDrag::findTransactionByWindow(xcb_window_t window)-
571{-
572 int at = -1;-
573 for (int i = 0; i < transactions.count(); ++i) {
i < transactions.count()Description
TRUEnever evaluated
FALSEnever evaluated
0
574 const Transaction &t = transactions.at(i);-
575 if (t.target == window || t.proxy_target == window) {
t.target == windowDescription
TRUEnever evaluated
FALSEnever evaluated
t.proxy_target == windowDescription
TRUEnever evaluated
FALSEnever evaluated
0
576 at = i;-
577 break;
never executed: break;
0
578 }-
579 }
never executed: end of block
0
580 return at;
never executed: return at;
0
581}-
582-
583int QXcbDrag::findTransactionByTime(xcb_timestamp_t timestamp)-
584{-
585 int at = -1;-
586 for (int i = 0; i < transactions.count(); ++i) {
i < transactions.count()Description
TRUEnever evaluated
FALSEnever evaluated
0
587 const Transaction &t = transactions.at(i);-
588 if (t.timestamp == timestamp) {
t.timestamp == timestampDescription
TRUEnever evaluated
FALSEnever evaluated
0
589 at = i;-
590 break;
never executed: break;
0
591 }-
592 }
never executed: end of block
0
593 return at;
never executed: return at;
0
594}-
595-
596#if 0-
597-
598// find an ancestor with XdndAware on it-
599static Window findXdndAwareParent(Window window)-
600{-
601 Window target = 0;-
602 forever {-
603 // check if window has XdndAware-
604 Atom type = 0;-
605 int f;-
606 unsigned long n, a;-
607 unsigned char *data = 0;-
608 if (XGetWindowProperty(X11->display, window, ATOM(XdndAware), 0, 0, False,-
609 AnyPropertyType, &type, &f,&n,&a,&data) == Success) {-
610 if (data)-
611 XFree(data);-
612 if (type) {-
613 target = window;-
614 break;-
615 }-
616 }-
617-
618 // try window's parent-
619 Window root;-
620 Window parent;-
621 Window *children;-
622 uint unused;-
623 if (!XQueryTree(X11->display, window, &root, &parent, &children, &unused))-
624 break;-
625 if (children)-
626 XFree(children);-
627 if (window == root)-
628 break;-
629 window = parent;-
630 }-
631 return target;-
632}-
633-
634-
635// for embedding only-
636static QWidget* current_embedding_widget = 0;-
637static xcb_client_message_event_t last_enter_event;-
638-
639-
640static bool checkEmbedded(QWidget* w, const XEvent* xe)-
641{-
642 if (!w)-
643 return false;-
644-
645 if (current_embedding_widget != 0 && current_embedding_widget != w) {-
646 current_target = ((QExtraWidget*)current_embedding_widget)->extraData()->xDndProxy;-
647 current_proxy_target = current_target;-
648 qt_xdnd_send_leave();-
649 current_target = 0;-
650 current_proxy_target = 0;-
651 current_embedding_widget = 0;-
652 }-
653-
654 QWExtra* extra = ((QExtraWidget*)w)->extraData();-
655 if (extra && extra->xDndProxy != 0) {-
656-
657 if (current_embedding_widget != w) {-
658-
659 last_enter_event.xany.window = extra->xDndProxy;-
660 XSendEvent(X11->display, extra->xDndProxy, False, NoEventMask, &last_enter_event);-
661 current_embedding_widget = w;-
662 }-
663-
664 ((XEvent*)xe)->xany.window = extra->xDndProxy;-
665 XSendEvent(X11->display, extra->xDndProxy, False, NoEventMask, (XEvent*)xe);-
666 if (currentWindow != w) {-
667 currentWindow = w;-
668 }-
669 return true;-
670 }-
671 current_embedding_widget = 0;-
672 return false;-
673}-
674#endif-
675-
676-
677void QXcbDrag::handleEnter(QPlatformWindow *window, const xcb_client_message_event_t *event, xcb_window_t proxy)-
678{-
679 Q_UNUSED(window);-
680 DEBUG() << "handleEnter" << window;
dead code: QMessageLogger(__FILE__, 680, __PRETTY_FUNCTION__).debug() << "handleEnter" << window;
-
681-
682 xdnd_types.clear();-
683-
684 int version = (int)(event->data.data32[1] >> 24);-
685 if (version > xdnd_version)
version > xdnd_versionDescription
TRUEnever evaluated
FALSEnever evaluated
0
686 return;
never executed: return;
0
687-
688 xdnd_dragsource = event->data.data32[0];-
689 if (!proxy)
!proxyDescription
TRUEnever evaluated
FALSEnever evaluated
0
690 proxy = xdndProxy(connection(), xdnd_dragsource);
never executed: proxy = xdndProxy(connection(), xdnd_dragsource);
0
691 current_proxy_target = proxy ? proxy : xdnd_dragsource;
proxyDescription
TRUEnever evaluated
FALSEnever evaluated
0
692-
693 if (event->data.data32[1] & 1) {
event->data.data32[1] & 1Description
TRUEnever evaluated
FALSEnever evaluated
0
694 // get the types from XdndTypeList-
695 xcb_get_property_cookie_t cookie = xcb_get_property(xcb_connection(), false, xdnd_dragsource,-
696 atom(QXcbAtom::XdndTypelist), XCB_ATOM_ATOM,-
697 0, xdnd_max_type);-
698 xcb_get_property_reply_t *reply = xcb_get_property_reply(xcb_connection(), cookie, 0);-
699 if (reply && reply->type != XCB_NONE && reply->format == 32) {
replyDescription
TRUEnever evaluated
FALSEnever evaluated
reply->type != 0LDescription
TRUEnever evaluated
FALSEnever evaluated
reply->format == 32Description
TRUEnever evaluated
FALSEnever evaluated
0
700 int length = xcb_get_property_value_length(reply) / 4;-
701 if (length > xdnd_max_type)
length > xdnd_max_typeDescription
TRUEnever evaluated
FALSEnever evaluated
0
702 length = xdnd_max_type;
never executed: length = xdnd_max_type;
0
703-
704 xcb_atom_t *atoms = (xcb_atom_t *)xcb_get_property_value(reply);-
705 xdnd_types.reserve(length);-
706 for (int i = 0; i < length; ++i)
i < lengthDescription
TRUEnever evaluated
FALSEnever evaluated
0
707 xdnd_types.append(atoms[i]);
never executed: xdnd_types.append(atoms[i]);
0
708 }
never executed: end of block
0
709 free(reply);-
710 } else {
never executed: end of block
0
711 // get the types from the message-
712 for(int i = 2; i < 5; i++) {
i < 5Description
TRUEnever evaluated
FALSEnever evaluated
0
713 if (event->data.data32[i])
event->data.data32[i]Description
TRUEnever evaluated
FALSEnever evaluated
0
714 xdnd_types.append(event->data.data32[i]);
never executed: xdnd_types.append(event->data.data32[i]);
0
715 }
never executed: end of block
0
716 }
never executed: end of block
0
717 for(int i = 0; i < xdnd_types.length(); ++i)
i < xdnd_types.length()Description
TRUEnever evaluated
FALSEnever evaluated
0
718 DEBUG() << " " << connection()->atomName(xdnd_types.at(i));
dead code: QMessageLogger(__FILE__, 718, __PRETTY_FUNCTION__).debug() << " " << connection()->atomName(xdnd_types.at(i));
-
719}
never executed: end of block
0
720-
721void QXcbDrag::handle_xdnd_position(QPlatformWindow *w, const xcb_client_message_event_t *e)-
722{-
723 QPoint p((e->data.data32[2] & 0xffff0000) >> 16, e->data.data32[2] & 0x0000ffff);-
724 Q_ASSERT(w);-
725 QRect geometry = w->geometry();-
726 p -= geometry.topLeft();-
727-
728 if (!w || !w->window() || (w->window()->type() == Qt::Desktop))
!wDescription
TRUEnever evaluated
FALSEnever evaluated
!w->window()Description
TRUEnever evaluated
FALSEnever evaluated
(w->window()->...= Qt::Desktop)Description
TRUEnever evaluated
FALSEnever evaluated
0
729 return;
never executed: return;
0
730-
731 if (e->data.data32[0] != xdnd_dragsource) {
e->data.data32...dnd_dragsourceDescription
TRUEnever evaluated
FALSEnever evaluated
0
732 DEBUG("xdnd drag position from unexpected source (%x not %x)", e->data.data32[0], xdnd_dragsource);
dead code: QMessageLogger(__FILE__, 732, __PRETTY_FUNCTION__).debug("xdnd drag position from unexpected source (%x not %x)", e->data.data32[0], xdnd_dragsource);
-
733 return;
never executed: return;
0
734 }-
735-
736 currentPosition = p;-
737 currentWindow = w->window();-
738-
739 // timestamp from the source-
740 if (e->data.data32[3] != XCB_NONE) {
e->data.data32[3] != 0LDescription
TRUEnever evaluated
FALSEnever evaluated
0
741 target_time = e->data.data32[3];-
742 }
never executed: end of block
0
743-
744 QMimeData *dropData = 0;-
745 Qt::DropActions supported_actions = Qt::IgnoreAction;-
746 if (currentDrag()) {
currentDrag()Description
TRUEnever evaluated
FALSEnever evaluated
0
747 dropData = currentDrag()->mimeData();-
748 supported_actions = currentDrag()->supportedActions();-
749 } else {
never executed: end of block
0
750 dropData = platformDropData();-
751 supported_actions = Qt::DropActions(toDropAction(e->data.data32[4]));-
752 }
never executed: end of block
0
753-
754 QPlatformDragQtResponse qt_response = QWindowSystemInterface::handleDrag(w->window(),dropData,p,supported_actions);-
755 QRect answerRect(p + geometry.topLeft(), QSize(1,1));-
756 answerRect = qt_response.answerRect().translated(geometry.topLeft()).intersected(geometry);-
757-
758 xcb_client_message_event_t response;-
759 response.response_type = XCB_CLIENT_MESSAGE;-
760 response.sequence = 0;-
761 response.window = xdnd_dragsource;-
762 response.format = 32;-
763 response.type = atom(QXcbAtom::XdndStatus);-
764 response.data.data32[0] = xcb_window(w);-
765 response.data.data32[1] = qt_response.isAccepted(); // flags-
766 response.data.data32[2] = 0; // x, y-
767 response.data.data32[3] = 0; // w, h-
768 response.data.data32[4] = toXdndAction(qt_response.acceptedAction()); // action-
769-
770 accepted_drop_action = qt_response.acceptedAction();-
771-
772 if (answerRect.left() < 0)
answerRect.left() < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
773 answerRect.setLeft(0);
never executed: answerRect.setLeft(0);
0
774 if (answerRect.right() > 4096)
answerRect.right() > 4096Description
TRUEnever evaluated
FALSEnever evaluated
0
775 answerRect.setRight(4096);
never executed: answerRect.setRight(4096);
0
776 if (answerRect.top() < 0)
answerRect.top() < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
777 answerRect.setTop(0);
never executed: answerRect.setTop(0);
0
778 if (answerRect.bottom() > 4096)
answerRect.bottom() > 4096Description
TRUEnever evaluated
FALSEnever evaluated
0
779 answerRect.setBottom(4096);
never executed: answerRect.setBottom(4096);
0
780 if (answerRect.width() < 0)
answerRect.width() < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
781 answerRect.setWidth(0);
never executed: answerRect.setWidth(0);
0
782 if (answerRect.height() < 0)
answerRect.height() < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
783 answerRect.setHeight(0);
never executed: answerRect.setHeight(0);
0
784-
785 // reset-
786 target_time = XCB_CURRENT_TIME;-
787-
788 if (xdnd_dragsource == connection()->clipboard()->owner())
xdnd_dragsourc...ard()->owner()Description
TRUEnever evaluated
FALSEnever evaluated
0
789 handle_xdnd_status(&response);
never executed: handle_xdnd_status(&response);
0
790 else-
791 Q_XCB_CALL(xcb_send_event(xcb_connection(), false, current_proxy_target,
never executed: xcb_send_event(xcb_connection(), false, current_proxy_target, XCB_EVENT_MASK_NO_EVENT, (const char *)&response) ;
0
792 XCB_EVENT_MASK_NO_EVENT, (const char *)&response));
never executed: xcb_send_event(xcb_connection(), false, current_proxy_target, XCB_EVENT_MASK_NO_EVENT, (const char *)&response) ;
0
793}-
794-
795namespace-
796{-
797 class ClientMessageScanner {-
798 public:-
799 ClientMessageScanner(xcb_atom_t a) : atom(a) {}
never executed: end of block
0
800 xcb_atom_t atom;-
801 bool checkEvent(xcb_generic_event_t *event) const {-
802 if (!event)
!eventDescription
TRUEnever evaluated
FALSEnever evaluated
0
803 return false;
never executed: return false;
0
804 if ((event->response_type & 0x7f) != XCB_CLIENT_MESSAGE)
(event->respon... & 0x7f) != 33Description
TRUEnever evaluated
FALSEnever evaluated
0
805 return false;
never executed: return false;
0
806 return ((xcb_client_message_event_t *)event)->type == atom;
never executed: return ((xcb_client_message_event_t *)event)->type == atom;
0
807 }-
808 };-
809}-
810-
811void QXcbDrag::handlePosition(QPlatformWindow * w, const xcb_client_message_event_t *event)-
812{-
813 xcb_client_message_event_t *lastEvent = const_cast<xcb_client_message_event_t *>(event);-
814 xcb_generic_event_t *nextEvent;-
815 ClientMessageScanner scanner(atom(QXcbAtom::XdndPosition));-
816 while ((nextEvent = connection()->checkEvent(scanner))) {
(nextEvent = c...vent(scanner))Description
TRUEnever evaluated
FALSEnever evaluated
0
817 if (lastEvent != event)
lastEvent != eventDescription
TRUEnever evaluated
FALSEnever evaluated
0
818 free(lastEvent);
never executed: free(lastEvent);
0
819 lastEvent = (xcb_client_message_event_t *)nextEvent;-
820 }
never executed: end of block
0
821-
822 handle_xdnd_position(w, lastEvent);-
823 if (lastEvent != event)
lastEvent != eventDescription
TRUEnever evaluated
FALSEnever evaluated
0
824 free(lastEvent);
never executed: free(lastEvent);
0
825}
never executed: end of block
0
826-
827void QXcbDrag::handle_xdnd_status(const xcb_client_message_event_t *event)-
828{-
829 DEBUG("xdndHandleStatus");
dead code: QMessageLogger(__FILE__, 829, __PRETTY_FUNCTION__).debug("xdndHandleStatus");
-
830 waiting_for_status = false;-
831 // ignore late status messages-
832 if (event->data.data32[0] && event->data.data32[0] != current_target)
event->data.data32[0]Description
TRUEnever evaluated
FALSEnever evaluated
event->data.da...current_targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
833 return;
never executed: return;
0
834-
835 const bool dropPossible = event->data.data32[1];-
836 setCanDrop(dropPossible);-
837-
838 if (dropPossible) {
dropPossibleDescription
TRUEnever evaluated
FALSEnever evaluated
0
839 accepted_drop_action = toDropAction(event->data.data32[4]);-
840 updateCursor(accepted_drop_action);-
841 } else {
never executed: end of block
0
842 updateCursor(Qt::IgnoreAction);-
843 }
never executed: end of block
0
844-
845 if ((event->data.data32[1] & 2) == 0) {
(event->data.d...2[1] & 2) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
846 QPoint p((event->data.data32[2] & 0xffff0000) >> 16, event->data.data32[2] & 0x0000ffff);-
847 QSize s((event->data.data32[3] & 0xffff0000) >> 16, event->data.data32[3] & 0x0000ffff);-
848 source_sameanswer = QRect(p, s);-
849 } else {
never executed: end of block
0
850 source_sameanswer = QRect();-
851 }
never executed: end of block
0
852}-
853-
854void QXcbDrag::handleStatus(const xcb_client_message_event_t *event)-
855{-
856 if (event->window != connection()->clipboard()->owner() || !drag())
event->window ...ard()->owner()Description
TRUEnever evaluated
FALSEnever evaluated
!drag()Description
TRUEnever evaluated
FALSEnever evaluated
0
857 return;
never executed: return;
0
858-
859 xcb_client_message_event_t *lastEvent = const_cast<xcb_client_message_event_t *>(event);-
860 xcb_generic_event_t *nextEvent;-
861 ClientMessageScanner scanner(atom(QXcbAtom::XdndStatus));-
862 while ((nextEvent = connection()->checkEvent(scanner))) {
(nextEvent = c...vent(scanner))Description
TRUEnever evaluated
FALSEnever evaluated
0
863 if (lastEvent != event)
lastEvent != eventDescription
TRUEnever evaluated
FALSEnever evaluated
0
864 free(lastEvent);
never executed: free(lastEvent);
0
865 lastEvent = (xcb_client_message_event_t *)nextEvent;-
866 }
never executed: end of block
0
867-
868 handle_xdnd_status(lastEvent);-
869 if (lastEvent != event)
lastEvent != eventDescription
TRUEnever evaluated
FALSEnever evaluated
0
870 free(lastEvent);
never executed: free(lastEvent);
0
871 DEBUG("xdndHandleStatus end");
dead code: QMessageLogger(__FILE__, 871, __PRETTY_FUNCTION__).debug("xdndHandleStatus end");
-
872}
never executed: end of block
0
873-
874void QXcbDrag::handleLeave(QPlatformWindow *w, const xcb_client_message_event_t *event)-
875{-
876 DEBUG("xdnd leave");
dead code: QMessageLogger(__FILE__, 876, __PRETTY_FUNCTION__).debug("xdnd leave");
-
877 if (!currentWindow || w != currentWindow.data()->handle())
!currentWindowDescription
TRUEnever evaluated
FALSEnever evaluated
w != currentWi...ta()->handle()Description
TRUEnever evaluated
FALSEnever evaluated
0
878 return; // sanity
never executed: return;
0
879-
880 // ###-
881// if (checkEmbedded(current_embedding_widget, event)) {-
882// current_embedding_widget = 0;-
883// currentWindow.clear();-
884// return;-
885// }-
886-
887 if (event->data.data32[0] != xdnd_dragsource) {
event->data.da...dnd_dragsourceDescription
TRUEnever evaluated
FALSEnever evaluated
0
888 // This often happens - leave other-process window quickly-
889 DEBUG("xdnd drag leave from unexpected source (%x not %x", event->data.data32[0], xdnd_dragsource);
dead code: QMessageLogger(__FILE__, 889, __PRETTY_FUNCTION__).debug("xdnd drag leave from unexpected source (%x not %x", event->data.data32[0], xdnd_dragsource);
-
890 }
never executed: end of block
0
891-
892 QWindowSystemInterface::handleDrag(w->window(),0,QPoint(),Qt::IgnoreAction);-
893-
894 xdnd_dragsource = 0;-
895 xdnd_types.clear();-
896 currentWindow.clear();-
897}
never executed: end of block
0
898-
899void QXcbDrag::send_leave()-
900{-
901 if (!current_target)
!current_targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
902 return;
never executed: return;
0
903-
904-
905 xcb_client_message_event_t leave;-
906 leave.response_type = XCB_CLIENT_MESSAGE;-
907 leave.sequence = 0;-
908 leave.window = current_target;-
909 leave.format = 32;-
910 leave.type = atom(QXcbAtom::XdndLeave);-
911 leave.data.data32[0] = connection()->clipboard()->owner();-
912 leave.data.data32[1] = 0; // flags-
913 leave.data.data32[2] = 0; // x, y-
914 leave.data.data32[3] = 0; // w, h-
915 leave.data.data32[4] = 0; // just null-
916-
917 QXcbWindow *w = connection()->platformWindowFromId(current_proxy_target);-
918-
919 if (w && (w->window()->type() == Qt::Desktop) /*&& !w->acceptDrops()*/)
wDescription
TRUEnever evaluated
FALSEnever evaluated
(w->window()->...= Qt::Desktop)Description
TRUEnever evaluated
FALSEnever evaluated
0
920 w = 0;
never executed: w = 0;
0
921-
922 if (w)
wDescription
TRUEnever evaluated
FALSEnever evaluated
0
923 handleLeave(w, (const xcb_client_message_event_t *)&leave);
never executed: handleLeave(w, (const xcb_client_message_event_t *)&leave);
0
924 else-
925 xcb_send_event(xcb_connection(), false,current_proxy_target,
never executed: xcb_send_event(xcb_connection(), false,current_proxy_target, XCB_EVENT_MASK_NO_EVENT, (const char *)&leave);
0
926 XCB_EVENT_MASK_NO_EVENT, (const char *)&leave);
never executed: xcb_send_event(xcb_connection(), false,current_proxy_target, XCB_EVENT_MASK_NO_EVENT, (const char *)&leave);
0
927-
928 current_target = 0;-
929 current_proxy_target = 0;-
930 source_time = XCB_CURRENT_TIME;-
931 waiting_for_status = false;-
932}
never executed: end of block
0
933-
934void QXcbDrag::handleDrop(QPlatformWindow *, const xcb_client_message_event_t *event)-
935{-
936 DEBUG("xdndHandleDrop");
dead code: QMessageLogger(__FILE__, 936, __PRETTY_FUNCTION__).debug("xdndHandleDrop");
-
937 if (!currentWindow) {
!currentWindowDescription
TRUEnever evaluated
FALSEnever evaluated
0
938 xdnd_dragsource = 0;-
939 return; // sanity
never executed: return;
0
940 }-
941-
942 const uint32_t *l = event->data.data32;-
943-
944 DEBUG("xdnd drop");
dead code: QMessageLogger(__FILE__, 944, __PRETTY_FUNCTION__).debug("xdnd drop");
-
945-
946 if (l[0] != xdnd_dragsource) {
l[0] != xdnd_dragsourceDescription
TRUEnever evaluated
FALSEnever evaluated
0
947 DEBUG("xdnd drop from unexpected source (%x not %x", l[0], xdnd_dragsource);
dead code: QMessageLogger(__FILE__, 947, __PRETTY_FUNCTION__).debug("xdnd drop from unexpected source (%x not %x", l[0], xdnd_dragsource);
-
948 return;
never executed: return;
0
949 }-
950-
951 // update the "user time" from the timestamp in the event.-
952 if (l[2] != 0)
l[2] != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
953 target_time = /*X11->userTime =*/ l[2];
never executed: target_time = l[2];
0
954-
955 Qt::DropActions supported_drop_actions;-
956 QMimeData *dropData = 0;-
957 if (currentDrag()) {
currentDrag()Description
TRUEnever evaluated
FALSEnever evaluated
0
958 dropData = currentDrag()->mimeData();-
959 supported_drop_actions = Qt::DropActions(l[4]);-
960 } else {
never executed: end of block
0
961 dropData = platformDropData();-
962 supported_drop_actions = accepted_drop_action;-
963-
964 // Drop coming from another app? Update keyboard modifiers.-
965 QGuiApplicationPrivate::modifier_buttons = QGuiApplication::queryKeyboardModifiers();-
966 }
never executed: end of block
0
967-
968 if (!dropData)
!dropDataDescription
TRUEnever evaluated
FALSEnever evaluated
0
969 return;
never executed: return;
0
970 // ###-
971 // int at = findXdndDropTransactionByTime(target_time);-
972 // if (at != -1)-
973 // dropData = QDragManager::dragPrivate(X11->dndDropTransactions.at(at).object)->data;-
974 // if we can't find it, then use the data in the drag manager-
975-
976 QPlatformDropQtResponse response = QWindowSystemInterface::handleDrop(currentWindow.data(),dropData,currentPosition,supported_drop_actions);-
977 setExecutedDropAction(response.acceptedAction());-
978-
979 xcb_client_message_event_t finished;-
980 finished.response_type = XCB_CLIENT_MESSAGE;-
981 finished.sequence = 0;-
982 finished.window = xdnd_dragsource;-
983 finished.format = 32;-
984 finished.type = atom(QXcbAtom::XdndFinished);-
985 finished.data.data32[0] = currentWindow ? xcb_window(currentWindow.data()) : XCB_NONE;
currentWindowDescription
TRUEnever evaluated
FALSEnever evaluated
0
986 finished.data.data32[1] = response.isAccepted(); // flags-
987 finished.data.data32[2] = toXdndAction(response.acceptedAction());-
988 Q_XCB_CALL(xcb_send_event(xcb_connection(), false, current_proxy_target,-
989 XCB_EVENT_MASK_NO_EVENT, (char *)&finished));-
990-
991 xdnd_dragsource = 0;-
992 currentWindow.clear();-
993 waiting_for_status = false;-
994-
995 // reset-
996 target_time = XCB_CURRENT_TIME;-
997}
never executed: end of block
0
998-
999-
1000void QXcbDrag::handleFinished(const xcb_client_message_event_t *event)-
1001{-
1002 DEBUG("xdndHandleFinished");
dead code: QMessageLogger(__FILE__, 1002, __PRETTY_FUNCTION__).debug("xdndHandleFinished");
-
1003 if (event->window != connection()->clipboard()->owner())
event->window ...ard()->owner()Description
TRUEnever evaluated
FALSEnever evaluated
0
1004 return;
never executed: return;
0
1005-
1006 const unsigned long *l = (const unsigned long *)event->data.data32;-
1007-
1008 DNDDEBUG << "xdndHandleFinished, l[0]" << l[0]
dead code: QMessageLogger(__FILE__, 1008, __PRETTY_FUNCTION__).debug() << "xdndHandleFinished, l[0]" << l[0] << "current_target" << current_target << "qt_xdnd_current_proxy_targe" << current_proxy_target;
-
1009 << "current_target" << current_target
dead code: QMessageLogger(__FILE__, 1008, __PRETTY_FUNCTION__).debug() << "xdndHandleFinished, l[0]" << l[0] << "current_target" << current_target << "qt_xdnd_current_proxy_targe" << current_proxy_target;
-
1010 << "qt_xdnd_current_proxy_targe" << current_proxy_target;
dead code: QMessageLogger(__FILE__, 1008, __PRETTY_FUNCTION__).debug() << "xdndHandleFinished, l[0]" << l[0] << "current_target" << current_target << "qt_xdnd_current_proxy_targe" << current_proxy_target;
-
1011-
1012 if (l[0]) {
l[0]Description
TRUEnever evaluated
FALSEnever evaluated
0
1013 int at = findTransactionByWindow(l[0]);-
1014 if (at != -1) {
at != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
1015-
1016 Transaction t = transactions.takeAt(at);-
1017 if (t.drag)
t.dragDescription
TRUEnever evaluated
FALSEnever evaluated
0
1018 t.drag->deleteLater();
never executed: t.drag->deleteLater();
0
1019// QDragManager *manager = QDragManager::self();-
1020-
1021// Window target = current_target;-
1022// Window proxy_target = current_proxy_target;-
1023// QWidget *embedding_widget = current_embedding_widget;-
1024// QDrag *currentObject = manager->object;-
1025-
1026// current_target = t.target;-
1027// current_proxy_target = t.proxy_target;-
1028// current_embedding_widget = t.embedding_widget;-
1029// manager->object = t.object;-
1030-
1031// if (!passive)-
1032// (void) checkEmbedded(currentWindow, xe);-
1033-
1034// current_embedding_widget = 0;-
1035// current_target = 0;-
1036// current_proxy_target = 0;-
1037-
1038// current_target = target;-
1039// current_proxy_target = proxy_target;-
1040// current_embedding_widget = embedding_widget;-
1041// manager->object = currentObject;-
1042 } else {
never executed: end of block
0
1043 qWarning("QXcbDrag::handleFinished - drop data has expired");-
1044 }
never executed: end of block
0
1045 }-
1046 waiting_for_status = false;-
1047}
never executed: end of block
0
1048-
1049void QXcbDrag::timerEvent(QTimerEvent* e)-
1050{-
1051 if (e->timerId() == cleanup_timer) {
e->timerId() == cleanup_timerDescription
TRUEnever evaluated
FALSEnever evaluated
0
1052 bool stopTimer = true;-
1053 for (int i = 0; i < transactions.count(); ++i) {
i < transactions.count()Description
TRUEnever evaluated
FALSEnever evaluated
0
1054 const Transaction &t = transactions.at(i);-
1055 if (t.targetWindow) {
t.targetWindowDescription
TRUEnever evaluated
FALSEnever evaluated
0
1056 // dnd within the same process, don't delete, these are taken care of-
1057 // in handleFinished()-
1058 continue;
never executed: continue;
0
1059 }-
1060 QTime currentTime = QTime::currentTime();-
1061 int delta = t.time.msecsTo(currentTime);-
1062 if (delta > XdndDropTransactionTimeout) {
delta > XdndDr...sactionTimeoutDescription
TRUEnever evaluated
FALSEnever evaluated
0
1063 /* delete transactions which are older than XdndDropTransactionTimeout. It could mean-
1064 one of these:-
1065 - client has crashed and as a result we have never received XdndFinished-
1066 - showing dialog box on drop event where user's response takes more time than XdndDropTransactionTimeout (QTBUG-14493)-
1067 - dnd takes unusually long time to process data-
1068 */-
1069 if (t.drag)
t.dragDescription
TRUEnever evaluated
FALSEnever evaluated
0
1070 t.drag->deleteLater();
never executed: t.drag->deleteLater();
0
1071 transactions.removeAt(i--);-
1072 } else {
never executed: end of block
0
1073 stopTimer = false;-
1074 }
never executed: end of block
0
1075-
1076 }-
1077 if (stopTimer && cleanup_timer != -1) {
stopTimerDescription
TRUEnever evaluated
FALSEnever evaluated
cleanup_timer != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
1078 killTimer(cleanup_timer);-
1079 cleanup_timer = -1;-
1080 }
never executed: end of block
0
1081 }
never executed: end of block
0
1082}
never executed: end of block
0
1083-
1084void QXcbDrag::cancel()-
1085{-
1086 DEBUG("QXcbDrag::cancel");
dead code: QMessageLogger(__FILE__, 1086, __PRETTY_FUNCTION__).debug("QXcbDrag::cancel");
-
1087 QBasicDrag::cancel();-
1088 if (current_target)
current_targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
1089 send_leave();
never executed: send_leave();
0
1090}
never executed: end of block
0
1091-
1092// find an ancestor with XdndAware on it-
1093static xcb_window_t findXdndAwareParent(QXcbConnection *c, xcb_window_t window)-
1094{-
1095 xcb_window_t target = 0;-
1096 forever {-
1097 // check if window has XdndAware-
1098 xcb_get_property_cookie_t gpCookie = Q_XCB_CALL(-
1099 xcb_get_property(c->xcb_connection(), false, window,-
1100 c->atom(QXcbAtom::XdndAware), XCB_GET_PROPERTY_TYPE_ANY, 0, 0));-
1101 xcb_get_property_reply_t *gpReply = xcb_get_property_reply(-
1102 c->xcb_connection(), gpCookie, 0);-
1103 bool aware = gpReply && gpReply->type != XCB_NONE;
gpReplyDescription
TRUEnever evaluated
FALSEnever evaluated
gpReply->type != 0LDescription
TRUEnever evaluated
FALSEnever evaluated
0
1104 free(gpReply);-
1105 if (aware) {
awareDescription
TRUEnever evaluated
FALSEnever evaluated
0
1106 target = window;-
1107 break;
never executed: break;
0
1108 }-
1109-
1110 // try window's parent-
1111 xcb_query_tree_cookie_t qtCookie = Q_XCB_CALL(-
1112 xcb_query_tree_unchecked(c->xcb_connection(), window));-
1113 xcb_query_tree_reply_t *qtReply = xcb_query_tree_reply(-
1114 c->xcb_connection(), qtCookie, NULL);-
1115 if (!qtReply)
!qtReplyDescription
TRUEnever evaluated
FALSEnever evaluated
0
1116 break;
never executed: break;
0
1117 xcb_window_t root = qtReply->root;-
1118 xcb_window_t parent = qtReply->parent;-
1119 free(qtReply);-
1120 if (window == root)
window == rootDescription
TRUEnever evaluated
FALSEnever evaluated
0
1121 break;
never executed: break;
0
1122 window = parent;-
1123 }
never executed: end of block
0
1124 return target;
never executed: return target;
0
1125}-
1126-
1127void QXcbDrag::handleSelectionRequest(const xcb_selection_request_event_t *event)-
1128{-
1129 Q_DECLARE_XCB_EVENT(notify, xcb_selection_notify_event_t);-
1130 notify.response_type = XCB_SELECTION_NOTIFY;-
1131 notify.requestor = event->requestor;-
1132 notify.selection = event->selection;-
1133 notify.target = XCB_NONE;-
1134 notify.property = XCB_NONE;-
1135 notify.time = event->time;-
1136-
1137 // which transaction do we use? (note: -2 means use current currentDrag())-
1138 int at = -1;-
1139-
1140 // figure out which data the requestor is really interested in-
1141 if (currentDrag() && event->time == source_time) {
currentDrag()Description
TRUEnever evaluated
FALSEnever evaluated
event->time == source_timeDescription
TRUEnever evaluated
FALSEnever evaluated
0
1142 // requestor wants the current drag data-
1143 at = -2;-
1144 } else {
never executed: end of block
0
1145 // if someone has requested data in response to XdndDrop, find the corresponding transaction. the-
1146 // spec says to call xcb_convert_selection() using the timestamp from the XdndDrop-
1147 at = findTransactionByTime(event->time);-
1148 if (at == -1) {
at == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
1149 // no dice, perhaps the client was nice enough to use the same window id in-
1150 // xcb_convert_selection() that we sent the XdndDrop event to.-
1151 at = findTransactionByWindow(event->requestor);-
1152 }
never executed: end of block
0
1153-
1154 if (at == -1) {
at == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
1155 xcb_window_t target = findXdndAwareParent(connection(), event->requestor);-
1156 if (target) {
targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
1157 if (event->time == XCB_CURRENT_TIME && current_target == target)
event->time == 0LDescription
TRUEnever evaluated
FALSEnever evaluated
current_target == targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
1158 at = -2;
never executed: at = -2;
0
1159 else-
1160 at = findTransactionByWindow(target);
never executed: at = findTransactionByWindow(target);
0
1161 }-
1162 }
never executed: end of block
0
1163 }
never executed: end of block
0
1164-
1165 QDrag *transactionDrag = 0;-
1166 if (at >= 0) {
at >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1167 transactionDrag = transactions.at(at).drag;-
1168 } else if (at == -2) {
never executed: end of block
at == -2Description
TRUEnever evaluated
FALSEnever evaluated
0
1169 transactionDrag = currentDrag();-
1170 }
never executed: end of block
0
1171-
1172 if (transactionDrag) {
transactionDragDescription
TRUEnever evaluated
FALSEnever evaluated
0
1173 xcb_atom_t atomFormat = event->target;-
1174 int dataFormat = 0;-
1175 QByteArray data;-
1176 if (QXcbMime::mimeDataForAtom(connection(), event->target, transactionDrag->mimeData(),
QXcbMime::mime..., &dataFormat)Description
TRUEnever evaluated
FALSEnever evaluated
0
1177 &data, &atomFormat, &dataFormat)) {
QXcbMime::mime..., &dataFormat)Description
TRUEnever evaluated
FALSEnever evaluated
0
1178 int dataSize = data.size() / (dataFormat / 8);-
1179 xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, event->requestor, event->property,-
1180 atomFormat, dataFormat, dataSize, (const void *)data.constData());-
1181 notify.property = event->property;-
1182 notify.target = atomFormat;-
1183 }
never executed: end of block
0
1184 }
never executed: end of block
0
1185-
1186 xcb_window_t proxy_target = xdndProxy(connection(), event->requestor);-
1187 if (!proxy_target)
!proxy_targetDescription
TRUEnever evaluated
FALSEnever evaluated
0
1188 proxy_target = event->requestor;
never executed: proxy_target = event->requestor;
0
1189-
1190 xcb_send_event(xcb_connection(), false, proxy_target, XCB_EVENT_MASK_NO_EVENT, (const char *)&notify);-
1191}
never executed: end of block
0
1192-
1193-
1194bool QXcbDrag::dndEnable(QXcbWindow *w, bool on)-
1195{-
1196 DNDDEBUG << "xdndEnable" << w << on;
dead code: QMessageLogger(__FILE__, 1196, __PRETTY_FUNCTION__).debug() << "xdndEnable" << w << on;
-
1197 if (on) {
onDescription
TRUEevaluated 4166 times by 125 tests
Evaluated by:
  • tst_Gestures
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractScrollArea
  • tst_QAbstractSlider
  • tst_QAbstractSpinBox
  • tst_QAccessibility
  • tst_QAction
  • tst_QActionGroup
  • tst_QApplication
  • tst_QBackingStore
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDesktopWidget
  • tst_QDial
  • tst_QDialog
  • ...
FALSEnever evaluated
0-4166
1198 QXcbWindow *xdnd_widget = 0;-
1199 if ((w->window()->type() == Qt::Desktop)) {
(w->window()->...= Qt::Desktop)Description
TRUEnever evaluated
FALSEevaluated 4166 times by 125 tests
Evaluated by:
  • tst_Gestures
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractScrollArea
  • tst_QAbstractSlider
  • tst_QAbstractSpinBox
  • tst_QAccessibility
  • tst_QAction
  • tst_QActionGroup
  • tst_QApplication
  • tst_QBackingStore
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDesktopWidget
  • tst_QDial
  • tst_QDialog
  • ...
0-4166
1200 if (desktop_proxy) // *WE* already have one.
desktop_proxyDescription
TRUEnever evaluated
FALSEnever evaluated
0
1201 return false;
never executed: return false;
0
1202-
1203 QXcbConnectionGrabber grabber(connection());-
1204-
1205 // As per Xdnd4, use XdndProxy-
1206 xcb_window_t proxy_id = xdndProxy(connection(), w->xcb_window());-
1207-
1208 if (!proxy_id) {
!proxy_idDescription
TRUEnever evaluated
FALSEnever evaluated
0
1209 desktop_proxy = new QWindow;-
1210 xdnd_widget = static_cast<QXcbWindow *>(desktop_proxy->handle());-
1211 proxy_id = xdnd_widget->xcb_window();-
1212 xcb_atom_t xdnd_proxy = atom(QXcbAtom::XdndProxy);-
1213 xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, w->xcb_window(), xdnd_proxy,-
1214 XCB_ATOM_WINDOW, 32, 1, &proxy_id);-
1215 xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, proxy_id, xdnd_proxy,-
1216 XCB_ATOM_WINDOW, 32, 1, &proxy_id);-
1217 }
never executed: end of block
0
1218-
1219 } else {
never executed: end of block
0
1220 xdnd_widget = w;-
1221 }
executed 4166 times by 125 tests: end of block
Executed by:
  • tst_Gestures
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractScrollArea
  • tst_QAbstractSlider
  • tst_QAbstractSpinBox
  • tst_QAccessibility
  • tst_QAction
  • tst_QActionGroup
  • tst_QApplication
  • tst_QBackingStore
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDesktopWidget
  • tst_QDial
  • tst_QDialog
  • ...
4166
1222 if (xdnd_widget) {
xdnd_widgetDescription
TRUEevaluated 4166 times by 125 tests
Evaluated by:
  • tst_Gestures
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractScrollArea
  • tst_QAbstractSlider
  • tst_QAbstractSpinBox
  • tst_QAccessibility
  • tst_QAction
  • tst_QActionGroup
  • tst_QApplication
  • tst_QBackingStore
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDesktopWidget
  • tst_QDial
  • tst_QDialog
  • ...
FALSEnever evaluated
0-4166
1223 DNDDEBUG << "setting XdndAware for" << xdnd_widget << xdnd_widget->xcb_window();
dead code: QMessageLogger(__FILE__, 1223, __PRETTY_FUNCTION__).debug() << "setting XdndAware for" << xdnd_widget << xdnd_widget->xcb_window();
-
1224 xcb_atom_t atm = xdnd_version;-
1225 xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, xdnd_widget->xcb_window(),-
1226 atom(QXcbAtom::XdndAware), XCB_ATOM_ATOM, 32, 1, &atm);-
1227 return true;
executed 4166 times by 125 tests: return true;
Executed by:
  • tst_Gestures
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractScrollArea
  • tst_QAbstractSlider
  • tst_QAbstractSpinBox
  • tst_QAccessibility
  • tst_QAction
  • tst_QActionGroup
  • tst_QApplication
  • tst_QBackingStore
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDesktopWidget
  • tst_QDial
  • tst_QDialog
  • ...
4166
1228 } else {-
1229 return false;
never executed: return false;
0
1230 }-
1231 } else {-
1232 if ((w->window()->type() == Qt::Desktop)) {
(w->window()->...= Qt::Desktop)Description
TRUEnever evaluated
FALSEnever evaluated
0
1233 xcb_delete_property(xcb_connection(), w->xcb_window(), atom(QXcbAtom::XdndProxy));-
1234 delete desktop_proxy;-
1235 desktop_proxy = 0;-
1236 } else {
never executed: end of block
0
1237 DNDDEBUG << "not deleting XDndAware";
dead code: QMessageLogger(__FILE__, 1237, __PRETTY_FUNCTION__).debug() << "not deleting XDndAware";
-
1238 }
never executed: end of block
0
1239 return true;
never executed: return true;
0
1240 }-
1241}-
1242-
1243bool QXcbDrag::ownsDragObject() const-
1244{-
1245 return true;
never executed: return true;
0
1246}-
1247-
1248QXcbDropData::QXcbDropData(QXcbDrag *d)-
1249 : QXcbMime(),-
1250 drag(d)-
1251{-
1252}
executed 129 times by 5 tests: end of block
Executed by:
  • tst_QApplication
  • tst_QGuiApplication
  • tst_qapplication - unknown status
  • tst_qprocess - unknown status
  • tst_selftests - unknown status
129
1253-
1254QXcbDropData::~QXcbDropData()-
1255{-
1256}-
1257-
1258QVariant QXcbDropData::retrieveData_sys(const QString &mimetype, QVariant::Type requestedType) const-
1259{-
1260 QByteArray mime = mimetype.toLatin1();-
1261 QVariant data = xdndObtainData(mime, requestedType);-
1262 return data;
never executed: return data;
0
1263}-
1264-
1265QVariant QXcbDropData::xdndObtainData(const QByteArray &format, QVariant::Type requestedType) const-
1266{-
1267 QByteArray result;-
1268-
1269 QXcbConnection *c = drag->connection();-
1270 QXcbWindow *xcb_window = c->platformWindowFromId(drag->xdnd_dragsource);-
1271 if (xcb_window && drag->currentDrag() && xcb_window->window()->type() != Qt::Desktop) {
xcb_windowDescription
TRUEnever evaluated
FALSEnever evaluated
drag->currentDrag()Description
TRUEnever evaluated
FALSEnever evaluated
xcb_window->wi...!= Qt::DesktopDescription
TRUEnever evaluated
FALSEnever evaluated
0
1272 QMimeData *data = drag->currentDrag()->mimeData();-
1273 if (data->hasFormat(QLatin1String(format)))
data->hasForma...tring(format))Description
TRUEnever evaluated
FALSEnever evaluated
0
1274 result = data->data(QLatin1String(format));
never executed: result = data->data(QLatin1String(format));
0
1275 return result;
never executed: return result;
0
1276 }-
1277-
1278 QVector<xcb_atom_t> atoms = drag->xdnd_types;-
1279 QByteArray encoding;-
1280 xcb_atom_t a = mimeAtomForFormat(c, QLatin1String(format), requestedType, atoms, &encoding);-
1281 if (a == XCB_NONE)
a == 0LDescription
TRUEnever evaluated
FALSEnever evaluated
0
1282 return result;
never executed: return result;
0
1283-
1284 if (c->clipboard()->getSelectionOwner(drag->atom(QXcbAtom::XdndSelection)) == XCB_NONE)
c->clipboard()...ection)) == 0LDescription
TRUEnever evaluated
FALSEnever evaluated
0
1285 return result; // should never happen?
never executed: return result;
0
1286-
1287 xcb_atom_t xdnd_selection = c->atom(QXcbAtom::XdndSelection);-
1288 result = c->clipboard()->getSelection(xdnd_selection, a, xdnd_selection, drag->targetTime());-
1289-
1290 return mimeConvertToFormat(c, a, result, QLatin1String(format), requestedType, encoding);
never executed: return mimeConvertToFormat(c, a, result, QLatin1String(format), requestedType, encoding);
0
1291}-
1292-
1293-
1294bool QXcbDropData::hasFormat_sys(const QString &format) const-
1295{-
1296 return formats().contains(format);
never executed: return formats().contains(format);
0
1297}-
1298-
1299QStringList QXcbDropData::formats_sys() const-
1300{-
1301 QStringList formats;-
1302 for (int i = 0; i < drag->xdnd_types.size(); ++i) {
i < drag->xdnd_types.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
1303 QString f = mimeAtomToString(drag->connection(), drag->xdnd_types.at(i));-
1304 if (!formats.contains(f))
!formats.contains(f)Description
TRUEnever evaluated
FALSEnever evaluated
0
1305 formats.append(f);
never executed: formats.append(f);
0
1306 }
never executed: end of block
0
1307 return formats;
never executed: return formats;
0
1308}-
1309-
1310#endif // QT_NO_DRAGANDDROP-
1311-
1312QT_END_NAMESPACE-
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9