OSDN Git Service

partially revert 71ffb62f310b99d13bfa1c256af10bdb3ed3848e
authorIvailo Monev <xakepa10@laimg.moc>
Fri, 7 Jun 2019 13:36:48 +0000 (13:36 +0000)
committerIvailo Monev <xakepa10@laimg.moc>
Fri, 7 Jun 2019 13:36:48 +0000 (13:36 +0000)
Signed-off-by: Ivailo Monev <xakepa10@laimg.moc>
src/core/global/qnamespace.h
src/core/global/qnamespace.qdoc
src/gui/kernel/qapplication_x11.cpp
src/gui/kernel/qwidget.cpp
src/gui/kernel/qwidget_p.h

index 2096714..9c0cb98 100644 (file)
@@ -371,6 +371,7 @@ public:
         WA_AutoOrientation = 91,
 
         WA_X11DoNotAcceptFocus = 92,
+        WA_NoX11EventCompression = 93,
 
         // Add new attributes before this line
         WA_AttributeCount
index 204468e..baeb7c8 100644 (file)
     \omitvalue WA_SetWindowModality
     \omitvalue WA_WState_WindowOpacitySet
     \omitvalue WA_WState_AcceptedTouchBeginEvent
+    \omitvalue WA_NoX11EventCompression
 */
 
 /*! \typedef Qt::HANDLE
index a112122..cd69461 100644 (file)
@@ -620,6 +620,47 @@ static int qt_xio_errhandler(Display *)
 }
 #endif
 
+
+#ifndef QT_NO_XSYNC
+struct qt_sync_request_event_data
+{
+    WId window;
+};
+
+#if defined(Q_C_CALLBACKS)
+extern "C" {
+#endif
+
+static Bool qt_sync_request_scanner(Display*, XEvent *event, XPointer arg)
+{
+    qt_sync_request_event_data *data =
+        reinterpret_cast<qt_sync_request_event_data*>(arg);
+    if (event->type == ClientMessage &&
+        event->xany.window == data->window &&
+        event->xclient.message_type == ATOM(WM_PROTOCOLS) &&
+        (Atom)event->xclient.data.l[0] == ATOM(_NET_WM_SYNC_REQUEST)) {
+        QWidget *w = QWidget::find(event->xany.window);
+        if (QTLWExtra *tlw = ((QETWidget*)w)->d_func()->maybeTopData()) {
+            const ulong timestamp = (const ulong) event->xclient.data.l[1];
+            if (timestamp > qt_x11Data->time)
+                qt_x11Data->time = timestamp;
+            if (timestamp == CurrentTime || timestamp > tlw->syncRequestTimestamp) {
+                tlw->syncRequestTimestamp = timestamp;
+                tlw->newCounterValueLo = event->xclient.data.l[2];
+                tlw->newCounterValueHi = event->xclient.data.l[3];
+            }
+        }
+        return true;
+    }
+    return false;
+}
+
+#if defined(Q_C_CALLBACKS)
+}
+#endif
+
+#endif // QT_NO_XSYNC
+
 static void qt_x11_create_intern_atoms()
 {
     const char *names[QX11Data::NAtoms];
@@ -3686,6 +3727,41 @@ bool QETWidget::translateConfigEvent(const XEvent *event)
         if (isVisible())
             QApplication::syncX();
 
+        if (d->extra->compress_events) {
+            // ConfigureNotify compression for faster opaque resizing
+            XEvent otherEvent;
+            while (XCheckTypedWindowEvent(qt_x11Data->display, internalWinId(), ConfigureNotify,
+                                          &otherEvent)) {
+                if (qt_x11EventFilter(&otherEvent))
+                    continue;
+
+                if (x11Event(&otherEvent))
+                    continue;
+
+                if (otherEvent.xconfigure.event != otherEvent.xconfigure.window)
+                    continue;
+
+                newSize.setWidth(otherEvent.xconfigure.width);
+                newSize.setHeight(otherEvent.xconfigure.height);
+
+                if (otherEvent.xconfigure.send_event || trust) {
+                    newCPos.rx() = otherEvent.xconfigure.x +
+                                   otherEvent.xconfigure.border_width;
+                    newCPos.ry() = otherEvent.xconfigure.y +
+                                   otherEvent.xconfigure.border_width;
+                    isCPos = true;
+                }
+            }
+#ifndef QT_NO_XSYNC
+            qt_sync_request_event_data sync_event;
+            sync_event.window = internalWinId();
+            for (XEvent ev;;) {
+                if (!XCheckIfEvent(qt_x11Data->display, &ev, &qt_sync_request_scanner, (XPointer)&sync_event))
+                    break;
+            }
+#endif // QT_NO_XSYNC
+        }
+
         if (!isCPos) {
             // we didn't get an updated position of the toplevel.
             // either we haven't moved or there is a bug in the window manager.
index b08bed7..c1c9ee7 100644 (file)
@@ -9398,6 +9398,12 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on)
         break;
     }
 #ifdef Q_WS_X11
+    case Qt::WA_NoX11EventCompression: {
+        if (!d->extra)
+            d->createExtra();
+        d->extra->compress_events = on;
+        break;
+    }
     case Qt::WA_X11DoNotAcceptFocus: {
         if (testAttribute(Qt::WA_WState_Created))
             d->updateX11AcceptFocus();
index 3d1f7f3..b10dc53 100644 (file)
@@ -205,6 +205,7 @@ struct QWExtra {
 
     // *************************** Platform specific values (bit fields first) **********
 #if defined(Q_WS_X11) // <--------------------------------------------------------- X11
+    bool compress_events;
     WId xDndProxy; // XDND forwarding to embedded windows
 #endif
 };