[packages/qt4] - rel 7; upstream fix for bugs visible in kate and okteta

arekm arekm at pld-linux.org
Sat Jul 28 09:21:01 CEST 2012


commit 192f85ce7fa99ac781b9684bd10b546a76cc286c
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Sat Jul 28 09:20:55 2012 +0200

    - rel 7; upstream fix for bugs visible in kate and okteta

 qt4-git.patch | 413 +++-------------------------------------------------------
 qt4.spec      |   4 +-
 2 files changed, 23 insertions(+), 394 deletions(-)
---
diff --git a/qt4-git.patch b/qt4-git.patch
index 3548e4c..15aafe8 100644
--- a/qt4-git.patch
+++ b/qt4-git.patch
@@ -1,398 +1,27 @@
-commit 1095252559a937efcaaf012d8dfbb4e13c4fd6b5
-Author: John Stanley <jpsinthemix at verizon.net>
-Date:   Tue Jan 17 20:04:59 2012 -0500
+commit ca89c49fa2c5cbb3945897046f33eed9f7da846c
+Author: Jiang Jiang <jiang.jiang at nokia.com>
+Date:   Tue Jul 3 10:17:49 2012 +0200
 
-    Pass events to installed event dispatcher event filters before passing them to x11ProcessEvent()
+    Fix cursor truncate to include line position
     
-    Change-Id: If551c732b520b0105a3d4578db1b039c1b5d49fd
+    Since we could have moved the line position (QTextLine::setPosition),
+    the truncating position should be adjusted with that.
     
-    Pass events to eventFilter first
-    
-    Change-Id: If551c732b520b0105a3d4578db1b039c1b5d49fd
-    Reviewed-by: Bradley T. Hughes <bradley.hughes at nokia.com>
-
-diff --git a/src/gui/kernel/qclipboard_x11.cpp b/src/gui/kernel/qclipboard_x11.cpp
-index 803b1ba..72110ed 100644
---- a/src/gui/kernel/qclipboard_x11.cpp
-+++ b/src/gui/kernel/qclipboard_x11.cpp
-@@ -579,7 +579,10 @@ bool QX11Data::clipboardWaitForEvent(Window win, int type, XEvent *event, int ti
- 
-             // process other clipboard events, since someone is probably requesting data from us
-             XEvent e;
--            if (XCheckIfEvent(X11->display, &e, checkForClipboardEvents, 0))
-+            // Pass the event through the event dispatcher filter so that applications
-+            // which install an event filter on the dispatcher get to handle it first.
-+            if (XCheckIfEvent(X11->display, &e, checkForClipboardEvents, 0) &&
-+                !QAbstractEventDispatcher::instance()->filterEvent(&e))
-                 qApp->x11ProcessEvent(&e);
- 
-             now.start();
-diff --git a/src/gui/kernel/qdnd_x11.cpp b/src/gui/kernel/qdnd_x11.cpp
-index 2b14743..d2050d1 100644
---- a/src/gui/kernel/qdnd_x11.cpp
-+++ b/src/gui/kernel/qdnd_x11.cpp
-@@ -42,6 +42,7 @@
- #include "qplatformdefs.h"
- 
- #include "qapplication.h"
-+#include "qabstracteventdispatcher.h"
- 
- #ifndef QT_NO_DRAGANDDROP
- 
-@@ -1967,7 +1968,10 @@ Qt::DropAction QDragManager::drag(QDrag * o)
-         timer.start();
-         do {
-             XEvent event;
--            if (XCheckTypedEvent(X11->display, ClientMessage, &event))
-+            // Pass the event through the event dispatcher filter so that applications
-+            // which install an event filter on the dispatcher get to handle it first.
-+            if (XCheckTypedEvent(X11->display, ClientMessage, &event) &&
-+                !QAbstractEventDispatcher::instance()->filterEvent(&event))
-                 qApp->x11ProcessEvent(&event);
- 
-             // sleep 50 ms, so we don't use up CPU cycles all the time.
-diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp
-index 4cdd6e7..3cff3ee 100644
---- a/src/gui/kernel/qwidget_x11.cpp
-+++ b/src/gui/kernel/qwidget_x11.cpp
-@@ -44,6 +44,7 @@
- #include "qdesktopwidget.h"
- #include "qapplication.h"
- #include "qapplication_p.h"
-+#include "qabstracteventdispatcher.h"
- #include "qnamespace.h"
- #include "qpainter.h"
- #include "qbitmap.h"
-@@ -376,17 +377,21 @@ void qt_x11_wait_for_window_manager(QWidget *w, bool sendPostedEvents)
-     do {
-         if (XEventsQueued(X11->display, QueuedAlready)) {
-             XNextEvent(X11->display, &ev);
--            qApp->x11ProcessEvent(&ev);
--
--            switch (state) {
--            case Initial:
--                if (ev.type == MapNotify && ev.xany.window == winid)
--                    state = Mapped;
--                break;
--            case Mapped:
--                if (ev.type == Expose && ev.xany.window == winid)
--                    return;
--                break;
-+            // Pass the event through the event dispatcher filter so that applications
-+            // which install an event filter on the dispatcher get to handle it first.
-+            if (!QAbstractEventDispatcher::instance()->filterEvent(&ev)) {
-+                qApp->x11ProcessEvent(&ev);
-+
-+                switch (state) {
-+                case Initial:
-+                    if (ev.type == MapNotify && ev.xany.window == winid)
-+                        state = Mapped;
-+                    break;
-+                case Mapped:
-+                    if (ev.type == Expose && ev.xany.window == winid)
-+                        return;
-+                    break;
-+                }
-             }
-         } else {
-             if (!XEventsQueued(X11->display, QueuedAfterFlush))
-commit 69ada23a75bb51b4efc90c6128cce22d5ee6a779
-Author: John Stanley <jpsinthemix at verizon.net>
-Date:   Tue Jan 17 20:04:55 2012 -0500
-
-    When doing mouse move compression, pass non-MotionNotify events to installed event dispatcher event filters
-    
-    Change-Id: Ia71f23458b9a6bc728f3e05592f530e317ae453c
-    Reviewed-by: Bradley T. Hughes <bradley.hughes at nokia.com>
-
-diff --git a/src/gui/kernel/qapplication_x11.cpp b/src/gui/kernel/qapplication_x11.cpp
-index 256db7d..4d642a9 100644
---- a/src/gui/kernel/qapplication_x11.cpp
-+++ b/src/gui/kernel/qapplication_x11.cpp
-@@ -4234,7 +4234,10 @@ bool QETWidget::translateMouseEvent(const XEvent *event)
-                     && (nextEvent.xclient.message_type == ATOM(_QT_SCROLL_DONE) ||
-                     (nextEvent.xclient.message_type == ATOM(WM_PROTOCOLS) &&
-                      (Atom)nextEvent.xclient.data.l[0] == ATOM(_NET_WM_SYNC_REQUEST))))) {
--                qApp->x11ProcessEvent(&nextEvent);
-+                // Pass the event through the event dispatcher filter so that applications
-+                // which install an event filter on the dispatcher get to handle it first.
-+                if (!QAbstractEventDispatcher::instance()->filterEvent(&nextEvent))
-+                    qApp->x11ProcessEvent(&nextEvent);
-                 continue;
-             } else if (nextEvent.type != MotionNotify ||
-                        nextEvent.xmotion.window != event->xmotion.window ||
-commit 6bab6fccd2d8ee8e83e968864d729c1bbee39a66
-Author: John Stanley <jpsinthemix at verizon.net>
-Date:   Mon Jan 30 07:27:49 2012 -0500
-
-    Raise loopLevel for deleteLater in event filters
-    
-    Change-Id: I163f510f6e99d86a35cc78965fa383e7f4618f42
-    Reviewed-by: Bradley T. Hughes <bradley.hughes at nokia.com>
-
-diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
-index 3f73e61..3b0a258 100644
---- a/src/corelib/kernel/qabstracteventdispatcher.cpp
-+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
-@@ -532,8 +532,12 @@ QAbstractEventDispatcher::EventFilter QAbstractEventDispatcher::setEventFilter(E
- bool QAbstractEventDispatcher::filterEvent(void *message)
- {
-     Q_D(QAbstractEventDispatcher);
--    if (d->event_filter)
-+    if (d->event_filter) {
-+        // Raise the loopLevel so that deleteLater() calls in or triggered
-+        // by event_filter() will be processed from the main event loop.
-+        QScopedLoopLevelCounter loopLevelCounter(d->threadData);
-         return d->event_filter(message);
-+    }
-     return false;
- }
- 
-diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
-index 9b71d02..bb90de7 100644
---- a/src/corelib/thread/qthread_p.h
-+++ b/src/corelib/thread/qthread_p.h
-@@ -238,6 +238,17 @@ public:
- # endif
- };
- 
-+class QScopedLoopLevelCounter
-+{
-+    QThreadData *threadData;
-+public:
-+    inline QScopedLoopLevelCounter(QThreadData *threadData)
-+        : threadData(threadData)
-+    { ++threadData->loopLevel; }
-+    inline ~QScopedLoopLevelCounter()
-+    { --threadData->loopLevel; }
-+};
-+
- // thread wrapper for the main() thread
- class QAdoptedThread : public QThread
- {
-diff --git a/src/gui/kernel/qapplication_p.h b/src/gui/kernel/qapplication_p.h
-index 9acf2c8..31d0b75 100644
---- a/src/gui/kernel/qapplication_p.h
-+++ b/src/gui/kernel/qapplication_p.h
-@@ -277,17 +277,6 @@ typedef struct tagGESTURECONFIG
- 
- #endif // Q_WS_WIN
- 
--class QScopedLoopLevelCounter
--{
--    QThreadData *threadData;
--public:
--    QScopedLoopLevelCounter(QThreadData *threadData)
--        : threadData(threadData)
--    { ++threadData->loopLevel; }
--    ~QScopedLoopLevelCounter()
--    { --threadData->loopLevel; }
--};
--
- typedef QHash<QByteArray, QFont> FontHash;
- FontHash *qt_app_fonts_hash();
- 
-commit 26f1ca8681db995e82c0f4c0fa9363c842520700
-Author: Shane Kearns <shane.kearns at accenture.com>
-Date:   Mon Dec 19 15:10:45 2011 +0000
-
-    Handle plain socket write errors in SSL
-    
-    When an ssl socket is closed during connecting, and it is using a proxy
-    then it is possible for the plain socket to be in pending close state
-    when transmit() is called.
-    As errors were not handled, this caused the socket (and https request)
-    to "hang".
-    It now propagates the error from plain socket.
-    
-    Change-Id: I6fb86815a2a63e197cea582f4b153e487543477c
-    Reviewed-by: Peter Hartmann <peter.hartmann at nokia.com>
-    Reviewed-by: Richard J. Moore <rich at kde.org>
-    Reviewed-by: Thiago Macieira <thiago.macieira at intel.com>
-    (cherry picked from commit 2cc78885b0b7d08f965998d156945a077e56c1d8)
-
-diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
-index 872b19c..900bfdb 100644
---- a/src/network/ssl/qsslsocket_openssl.cpp
-+++ b/src/network/ssl/qsslsocket_openssl.cpp
-@@ -1044,10 +1044,17 @@ void QSslSocketBackendPrivate::transmit()
-             int encryptedBytesRead = q_BIO_read(writeBio, data.data(), pendingBytes);
- 
-             // Write encrypted data from the buffer to the socket.
--            plainSocket->write(data.constData(), encryptedBytesRead);
-+            qint64 actualWritten = plainSocket->write(data.constData(), encryptedBytesRead);
- #ifdef QSSLSOCKET_DEBUG
--            qDebug() << "QSslSocketBackendPrivate::transmit: wrote" << encryptedBytesRead << "encrypted bytes to the socket";
-+            qDebug() << "QSslSocketBackendPrivate::transmit: wrote" << encryptedBytesRead << "encrypted bytes to the socket" << actualWritten << "actual.";
- #endif
-+            if (actualWritten < 0) {
-+                //plain socket write fails if it was in the pending close state.
-+                q->setErrorString(plainSocket->errorString());
-+                q->setSocketError(plainSocket->error());
-+                emit q->error(plainSocket->error());
-+                return;
-+            }
-             transmitting = true;
-         }
- 
-commit 33179842341fcf7d42e74f62a600470aed6b08a1
-Author: Shane Kearns <ext-shane.2.kearns at nokia.com>
-Date:   Mon Jan 30 15:52:27 2012 +0000
+    Change-Id: Ie1acd4a1b6a4adfbeeb9ce8ee2dfa19d992470e8
+    Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt at nokia.com>
 
-    Prevent data loss when an ssl socket is closed by remote
-    
-    SSL context was destroyed on disconnect. This makes it impossible to
-    decrypt buffered encrypted data. So if there is encrypted data in the
-    receive buffers, then don't destroy the ssl context until the socket is
-    destroyed.
-    
-    Task-Number: QTBUG-23607
-    Change-Id: I16a7b4fa006647ec73049c90cdbc72686696850f
-    Reviewed-by: Jonas Gastal <jgastal at profusion.mobi>
-    Reviewed-by: Richard J. Moore <rich at kde.org>
-    (cherry picked from commit c5aba0ac17ae6ed8f3847bd30325acdbd1ecaa80)
-
-diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp
-index 25d1d9e..5b1cd1b 100644
---- a/src/network/ssl/qsslsocket_openssl.cpp
-+++ b/src/network/ssl/qsslsocket_openssl.cpp
-@@ -183,6 +183,7 @@ QSslSocketBackendPrivate::QSslSocketBackendPrivate()
- 
- QSslSocketBackendPrivate::~QSslSocketBackendPrivate()
- {
-+    destroySslContext();
- }
- 
- QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSL_CIPHER(SSL_CIPHER *cipher)
-@@ -483,6 +484,22 @@ init_context:
-     return true;
- }
- 
-+void QSslSocketBackendPrivate::destroySslContext()
-+{
-+    if (ssl) {
-+        q_SSL_free(ssl);
-+        ssl = 0;
-+    }
-+    if (ctx) {
-+        q_SSL_CTX_free(ctx);
-+        ctx = 0;
-+    }
-+    if (pkey) {
-+        q_EVP_PKEY_free(pkey);
-+        pkey = 0;
-+    }
-+}
-+
- /*!
-     \internal
- */
-@@ -1403,19 +1420,10 @@ void QSslSocketBackendPrivate::disconnectFromHost()
- 
- void QSslSocketBackendPrivate::disconnected()
- {
--    if (ssl) {
--        q_SSL_free(ssl);
--        ssl = 0;
--    }
--    if (ctx) {
--        q_SSL_CTX_free(ctx);
--        ctx = 0;
--    }
--    if (pkey) {
--        q_EVP_PKEY_free(pkey);
--        pkey = 0;
--    }
--
-+    if (plainSocket->bytesAvailable() <= 0)
-+        destroySslContext();
-+    //if there is still buffered data in the plain socket, don't destroy the ssl context yet.
-+    //it will be destroyed when the socket is deleted.
- }
- 
- QSslCipher QSslSocketBackendPrivate::sessionCipher() const
-diff --git a/src/network/ssl/qsslsocket_openssl_p.h b/src/network/ssl/qsslsocket_openssl_p.h
-index bad2c9c..2940480 100644
---- a/src/network/ssl/qsslsocket_openssl_p.h
-+++ b/src/network/ssl/qsslsocket_openssl_p.h
-@@ -99,6 +99,7 @@ public:
- 
-     // SSL context
-     bool initSslContext();
-+    void destroySslContext();
-     SSL *ssl;
-     SSL_CTX *ctx;
-     EVP_PKEY *pkey;
-commit 6a91b3bcdf1b5e491aa8531579c4e62fcc794d6e
-Author: Albert Astals Cid <aacid at kde.org>
-Date:   Tue Jan 10 16:00:48 2012 +0100
-
-    Check for the clipboard manager when looping due to app quiting
-    
-    One can be extremely unlucky and on session logout get this:
-     * All apps are going down
-     * A Qt app checks if the clipboard manager is there to yield its clipboard contents
-     * The clipboard manager is still there
-     * Then just after that check, the clipboard manager finishes because of the session end
-     * This means the Qt app will loop for 5 seconds trying to yield its clipboard contents
-       to a clipboard manager that is not there anymore
-    This is a backport of 689c4009fb9be348f9137a9092b068e056a3d8b3 in the qtbase (Qt 5.0) repo
-    
-    Change-Id: I8ab1f460aa5936c03f1afc1b6ff18824f1d6cbc1
-    Reviewed-by: Lars Knoll <lars.knoll at nokia.com>
-
-diff --git a/src/gui/kernel/qclipboard_x11.cpp b/src/gui/kernel/qclipboard_x11.cpp
-index 7990f5d..803b1ba 100644
---- a/src/gui/kernel/qclipboard_x11.cpp
-+++ b/src/gui/kernel/qclipboard_x11.cpp
-@@ -515,7 +515,7 @@ static Bool checkForClipboardEvents(Display *, XEvent *e, XPointer)
-                                               || e->xselectionclear.selection == ATOM(CLIPBOARD))));
- }
- 
--bool QX11Data::clipboardWaitForEvent(Window win, int type, XEvent *event, int timeout)
-+bool QX11Data::clipboardWaitForEvent(Window win, int type, XEvent *event, int timeout, bool checkManager)
- {
-     QElapsedTimer started;
-     started.start();
-@@ -544,6 +544,9 @@ bool QX11Data::clipboardWaitForEvent(Window win, int type, XEvent *event, int ti
-                 return true;
-             }
- 
-+            if (checkManager && XGetSelectionOwner(X11->display, ATOM(CLIPBOARD_MANAGER)) == XNone)
-+                return false;
-+
-             XSync(X11->display, false);
-             usleep(50000);
- 
-@@ -571,6 +574,9 @@ bool QX11Data::clipboardWaitForEvent(Window win, int type, XEvent *event, int ti
-             if (XCheckTypedWindowEvent(X11->display,win,type,event))
-                 return true;
- 
-+            if (checkManager && XGetSelectionOwner(X11->display, ATOM(CLIPBOARD_MANAGER)) == XNone)
-+                return false;
-+
-             // process other clipboard events, since someone is probably requesting data from us
-             XEvent e;
-             if (XCheckIfEvent(X11->display, &e, checkForClipboardEvents, 0))
-@@ -933,7 +939,7 @@ bool QClipboard::event(QEvent *e)
+diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp
+index 16f7150..52f2793 100644
+--- a/src/gui/text/qtextlayout.cpp
++++ b/src/gui/text/qtextlayout.cpp
+@@ -2616,8 +2616,8 @@ qreal QTextLine::cursorToX(int *cursorPos, Edge edge) const
+         x += eng->offsetInLigature(si, pos, end, glyph_pos);
+     }
  
-         XEvent event;
-         // waiting until the clipboard manager fetches the content.
--        if (!X11->clipboardWaitForEvent(ownerId, SelectionNotify, &event, 10000)) {
-+        if (!X11->clipboardWaitForEvent(ownerId, SelectionNotify, &event, 10000, true)) {
-             qWarning("QClipboard: Unable to receive an event from the "
-                      "clipboard manager in a reasonable time");
-         }
-diff --git a/src/gui/kernel/qt_x11_p.h b/src/gui/kernel/qt_x11_p.h
-index bdca019..ed7c146 100644
---- a/src/gui/kernel/qt_x11_p.h
-+++ b/src/gui/kernel/qt_x11_p.h
-@@ -350,7 +350,7 @@ struct QX11Data
-     Window findClientWindow(Window, Atom, bool);
+-    if (eng->option.wrapMode() != QTextOption::NoWrap && x > line.width)
+-        x = line.width;
++    if (eng->option.wrapMode() != QTextOption::NoWrap && x > line.x + line.width)
++        x = line.x + line.width;
  
-     // from qclipboard_x11.cpp
--    bool clipboardWaitForEvent(Window win, int type, XEvent *event, int timeout);
-+    bool clipboardWaitForEvent(Window win, int type, XEvent *event, int timeout, bool checkManager = false);
-     bool clipboardReadProperty(Window win, Atom property, bool deleteProperty,
-                             QByteArray *buffer, int *size, Atom *type, int *format);
-     QByteArray clipboardReadIncrementalProperty(Window win, Atom property, int nbytes, bool nullterm);
+     *cursorPos = pos + si->position;
+     return x.toReal();
diff --git a/qt4.spec b/qt4.spec
index af0005a..f063921 100644
--- a/qt4.spec
+++ b/qt4.spec
@@ -55,7 +55,7 @@ Summary(pl.UTF-8):	Biblioteka Qt do tworzenia GUI
 Summary(pt_BR.UTF-8):	Estrutura para rodar aplicações GUI Qt
 Name:		qt4
 Version:	4.8.2
-Release:	6
+Release:	7
 License:	LGPL v2.1 or GPL v3.0
 Group:		X11/Libraries
 Source0:	http://releases.qt-project.org/qt4/source/qt-everywhere-opensource-src-%{version}.tar.gz
@@ -1413,7 +1413,7 @@ Programas exemplo para o Qt versão.
 %patch7 -p1
 %patch8 -p1
 %patch9 -p1
-#%patch10 -p1
+%patch10 -p1
 %patch11 -p1
 %patch12 -p1
 %patch13 -p1


More information about the pld-cvs-commit mailing list