diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2011-06-02 23:20:47 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@nokia.com> | 2011-06-07 15:50:53 +0200 |
commit | 30b7c6512cde501e0e5da6e2a6dd2d8113092269 (patch) | |
tree | 057a44051a0c34a6b2e72c4a2a006d0609a9d31e /src/plugins/platforms/xcb/qxcbwindow.cpp | |
parent | 92edbd20603dfe2c6b68e0023b76aa9bbab89688 (diff) |
X11 DnD implementation
Initial code for DnD on X11. Only Xdnd based,
Motif DnD is being ignored.
The code is currently limited to dropping
stuff onto the application. Starting drags
is not yet implemented.
Reviewed-by: Samuel
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbwindow.cpp')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index ca86cbdb56..b254fd5f13 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -45,6 +45,9 @@ #include "qxcbconnection.h" #include "qxcbscreen.h" +#include "qxcbdrag.h" + + #ifdef XCB_USE_DRI2 #include "qdri2context.h" #endif @@ -268,6 +271,8 @@ void QXcbWindow::create() if (wasCreated) setWindowFlags(window()->windowFlags()); + + connection()->drag()->dndEnable(this, true); } QXcbWindow::~QXcbWindow() @@ -933,7 +938,10 @@ void QXcbWindow::handleExposeEvent(const xcb_expose_event_t *event) void QXcbWindow::handleClientMessageEvent(const xcb_client_message_event_t *event) { - if (event->format == 32 && event->type == atom(QXcbAtom::WM_PROTOCOLS)) { + if (event->format != 32) + return; + + if (event->type == atom(QXcbAtom::WM_PROTOCOLS)) { if (event->data.data32[0] == atom(QXcbAtom::WM_DELETE_WINDOW)) { QWindowSystemInterface::handleCloseEvent(window()); } else if (event->data.data32[0] == atom(QXcbAtom::_NET_WM_PING)) { @@ -952,6 +960,14 @@ void QXcbWindow::handleClientMessageEvent(const xcb_client_message_event_t *even m_syncValue.lo = event->data.data32[2]; m_syncValue.hi = event->data.data32[3]; } + } else if (event->type == atom(QXcbAtom::XdndEnter)) { + connection()->drag()->handleEnter(window(), event); + } else if (event->type == atom(QXcbAtom::XdndPosition)) { + connection()->drag()->handlePosition(window(), event, false); + } else if (event->type == atom(QXcbAtom::XdndLeave)) { + connection()->drag()->handleLeave(window(), event, false); + } else if (event->type == atom(QXcbAtom::XdndDrop)) { + connection()->drag()->handleDrop(window(), event, false); } } |