src/gui/kernel/qdnd_x11.cpp
changeset 33 3e2da88830cd
parent 30 5dc02b23752f
--- a/src/gui/kernel/qdnd_x11.cpp	Tue Jul 06 15:10:48 2010 +0300
+++ b/src/gui/kernel/qdnd_x11.cpp	Wed Aug 18 10:37:55 2010 +0300
@@ -64,6 +64,7 @@
 #include "qtextcodec.h"
 
 #include "qdnd_p.h"
+#include "qapplication_p.h"
 #include "qt_x11_p.h"
 #include "qx11info_x11.h"
 
@@ -1111,7 +1112,20 @@
     waiting_for_status = false;
 }
 
-
+// TODO: remove and use QApplication::currentKeyboardModifiers() in Qt 4.8.
+static Qt::KeyboardModifiers currentKeyboardModifiers()
+{
+    Window root;
+    Window child;
+    int root_x, root_y, win_x, win_y;
+    uint keybstate;
+    for (int i = 0; i < ScreenCount(X11->display); ++i) {
+        if (XQueryPointer(X11->display, QX11Info::appRootWindow(i), &root, &child,
+                          &root_x, &root_y, &win_x, &win_y, &keybstate))
+            return X11->translateModifiers(keybstate & 0x00ff);
+    }
+    return 0;
+}
 
 void QX11Data::xdndHandleDrop(QWidget *, const XEvent * xe, bool passive)
 {
@@ -1159,6 +1173,11 @@
         if (!dropData)
             dropData = (manager->object) ? manager->dragPrivate()->data : manager->dropData;
 
+        // Drop coming from another app? Update keyboard modifiers.
+        if (!qt_xdnd_dragging) {
+            QApplicationPrivate::modifier_buttons = currentKeyboardModifiers();
+        }
+
         QDropEvent de(qt_xdnd_current_position, possible_actions, dropData,
                       QApplication::mouseButtons(), QApplication::keyboardModifiers());
         QApplication::sendEvent(qt_xdnd_current_widget, &de);