src/gui/kernel/qdnd_x11.cpp
changeset 33 3e2da88830cd
parent 30 5dc02b23752f
equal deleted inserted replaced
30:5dc02b23752f 33:3e2da88830cd
    62 #include "qimagewriter.h"
    62 #include "qimagewriter.h"
    63 #include "qbuffer.h"
    63 #include "qbuffer.h"
    64 #include "qtextcodec.h"
    64 #include "qtextcodec.h"
    65 
    65 
    66 #include "qdnd_p.h"
    66 #include "qdnd_p.h"
       
    67 #include "qapplication_p.h"
    67 #include "qt_x11_p.h"
    68 #include "qt_x11_p.h"
    68 #include "qx11info_x11.h"
    69 #include "qx11info_x11.h"
    69 
    70 
    70 #include "qwidget_p.h"
    71 #include "qwidget_p.h"
    71 #include "qcursor_p.h"
    72 #include "qcursor_p.h"
  1109     qt_xdnd_current_proxy_target = 0;
  1110     qt_xdnd_current_proxy_target = 0;
  1110     qt_xdnd_source_current_time = 0;
  1111     qt_xdnd_source_current_time = 0;
  1111     waiting_for_status = false;
  1112     waiting_for_status = false;
  1112 }
  1113 }
  1113 
  1114 
  1114 
  1115 // TODO: remove and use QApplication::currentKeyboardModifiers() in Qt 4.8.
       
  1116 static Qt::KeyboardModifiers currentKeyboardModifiers()
       
  1117 {
       
  1118     Window root;
       
  1119     Window child;
       
  1120     int root_x, root_y, win_x, win_y;
       
  1121     uint keybstate;
       
  1122     for (int i = 0; i < ScreenCount(X11->display); ++i) {
       
  1123         if (XQueryPointer(X11->display, QX11Info::appRootWindow(i), &root, &child,
       
  1124                           &root_x, &root_y, &win_x, &win_y, &keybstate))
       
  1125             return X11->translateModifiers(keybstate & 0x00ff);
       
  1126     }
       
  1127     return 0;
       
  1128 }
  1115 
  1129 
  1116 void QX11Data::xdndHandleDrop(QWidget *, const XEvent * xe, bool passive)
  1130 void QX11Data::xdndHandleDrop(QWidget *, const XEvent * xe, bool passive)
  1117 {
  1131 {
  1118     DEBUG("xdndHandleDrop");
  1132     DEBUG("xdndHandleDrop");
  1119     if (!qt_xdnd_current_widget) {
  1133     if (!qt_xdnd_current_widget) {
  1156         if (at != -1)
  1170         if (at != -1)
  1157             dropData = QDragManager::dragPrivate(X11->dndDropTransactions.at(at).object)->data;
  1171             dropData = QDragManager::dragPrivate(X11->dndDropTransactions.at(at).object)->data;
  1158         // if we can't find it, then use the data in the drag manager
  1172         // if we can't find it, then use the data in the drag manager
  1159         if (!dropData)
  1173         if (!dropData)
  1160             dropData = (manager->object) ? manager->dragPrivate()->data : manager->dropData;
  1174             dropData = (manager->object) ? manager->dragPrivate()->data : manager->dropData;
       
  1175 
       
  1176         // Drop coming from another app? Update keyboard modifiers.
       
  1177         if (!qt_xdnd_dragging) {
       
  1178             QApplicationPrivate::modifier_buttons = currentKeyboardModifiers();
       
  1179         }
  1161 
  1180 
  1162         QDropEvent de(qt_xdnd_current_position, possible_actions, dropData,
  1181         QDropEvent de(qt_xdnd_current_position, possible_actions, dropData,
  1163                       QApplication::mouseButtons(), QApplication::keyboardModifiers());
  1182                       QApplication::mouseButtons(), QApplication::keyboardModifiers());
  1164         QApplication::sendEvent(qt_xdnd_current_widget, &de);
  1183         QApplication::sendEvent(qt_xdnd_current_widget, &de);
  1165         if (!de.isAccepted()) {
  1184         if (!de.isAccepted()) {