From f7338759ef86deba18b27ee72b3afcf40f3a5aaf Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Thu, 4 Jun 2009 09:07:38 -0700 Subject: Make sure to retain alpha information in copy We need to set alpha to the right value when copying pixmaps. Reviewed-by: Donald --- src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp index dba1b51..18754f5 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp @@ -202,11 +202,12 @@ void QDirectFBPixmapData::copy(const QPixmapData *data, const QRect &rect) } IDirectFBSurface *src = static_cast(data)->directFBSurface(); - const bool hasAlpha = data->hasAlphaChannel(); - format = (hasAlpha + alpha = data->hasAlphaChannel(); + format = (alpha ? QDirectFBScreen::instance()->alphaPixmapFormat() : QDirectFBScreen::instance()->pixelFormat()); + dfbSurface = screen->createDFBSurface(rect.size(), format, QDirectFBScreen::TrackSurface); if (!dfbSurface) { @@ -215,7 +216,7 @@ void QDirectFBPixmapData::copy(const QPixmapData *data, const QRect &rect) return; } - if (hasAlpha) { + if (alpha) { dfbSurface->Clear(dfbSurface, 0, 0, 0, 0); dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_BLEND_ALPHACHANNEL); } else { -- cgit v0.12 From e50916796adc0dee112505ed617f9b83e99526fb Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Fri, 5 Jun 2009 10:32:25 +0200 Subject: qdoc: Changed to use h2 for section headers instead of h3. --- tools/qdoc3/htmlgenerator.cpp | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/tools/qdoc3/htmlgenerator.cpp b/tools/qdoc3/htmlgenerator.cpp index 0c4aab3..90d3b04 100644 --- a/tools/qdoc3/htmlgenerator.cpp +++ b/tools/qdoc3/htmlgenerator.cpp @@ -1048,12 +1048,16 @@ void HtmlGenerator::generateClassLikeNode(const InnerNode *inner, out() << "
  • " << "List of all members, including inherited members
  • \n"; - QString obsoleteLink = generateLowStatusMemberFile(inner, marker, CodeMarker::Obsolete); + QString obsoleteLink = generateLowStatusMemberFile(inner, + marker, + CodeMarker::Obsolete); if (!obsoleteLink.isEmpty()) out() << "
  • " << "Obsolete members
  • \n"; - QString compatLink = generateLowStatusMemberFile(inner, marker, CodeMarker::Compat); + QString compatLink = generateLowStatusMemberFile(inner, + marker, + CodeMarker::Compat); if (!compatLink.isEmpty()) out() << "
  • " << "Qt 3 support members
  • \n"; @@ -1069,9 +1073,10 @@ void HtmlGenerator::generateClassLikeNode(const InnerNode *inner, if (!s->inherited.isEmpty()) needOtherSection = true; } else { - out() << "\n"; - out() << "

    " << protect((*s).name) << "

    \n"; - + out() << "\n"; + out() << "

    " << protect((*s).name) << "

    \n"; generateSectionList(*s, inner, marker, CodeMarker::Summary); } ++s; @@ -1224,12 +1229,16 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker) out() << "
  • " << "List of all members, including inherited members
  • \n"; - QString obsoleteLink = generateLowStatusMemberFile(fake, marker, CodeMarker::Obsolete); + QString obsoleteLink = generateLowStatusMemberFile(fake, + marker, + CodeMarker::Obsolete); if (!obsoleteLink.isEmpty()) out() << "
  • " << "Obsolete members
  • \n"; - QString compatLink = generateLowStatusMemberFile(fake, marker, CodeMarker::Compat); + QString compatLink = generateLowStatusMemberFile(fake, + marker, + CodeMarker::Compat); if (!compatLink.isEmpty()) out() << "
  • " << "Qt 3 support members
  • \n"; @@ -1260,7 +1269,7 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker) s = sections.begin(); while (s != sections.end()) { out() << "\n"; - out() << "

    " << protect((*s).name) << "

    \n"; + out() << "

    " << protect((*s).name) << "

    \n"; generateSectionList(*s, fake, marker, CodeMarker::Summary); ++s; } @@ -1656,7 +1665,9 @@ QString HtmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, CodeM QList
    sections; QList
    ::ConstIterator s; - sections = marker->sections(inner, CodeMarker::SeparateList, CodeMarker::Okay); + sections = marker->sections(inner, + CodeMarker::SeparateList, + CodeMarker::Okay); if (sections.isEmpty()) return QString(); @@ -1677,10 +1688,13 @@ QString HtmlGenerator::generateListOfAllMemberFile(const InnerNode *inner, CodeM return fileName; } -QString HtmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, CodeMarker *marker, +QString HtmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, + CodeMarker *marker, CodeMarker::Status status) { - QList
    sections = marker->sections(inner, CodeMarker::Summary, status); + QList
    sections = marker->sections(inner, + CodeMarker::Summary, + status); QMutableListIterator
    j(sections); while (j.hasNext()) { if (j.next().members.size() == 0) @@ -1717,12 +1731,13 @@ QString HtmlGenerator::generateLowStatusMemberFile(const InnerNode *inner, CodeM "code.

    \n"; } - out() << "

    • " << protect(inner->name()) + out() << "

      \n"; for (i = 0; i < sections.size(); ++i) { - out() << "

      " << protect(sections.at(i).name) << "

      \n"; - + out() << "

      " << protect(sections.at(i).name) << "

      \n"; generateSectionList(sections.at(i), inner, marker, CodeMarker::Summary); } -- cgit v0.12 From cdb0222129a139dfe1b7e4fb4b401556989901b4 Mon Sep 17 00:00:00 2001 From: Alexis Menard Date: Fri, 5 Jun 2009 10:45:26 +0200 Subject: My changelog for 4.5.2 --- dist/changes-4.5.2 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dist/changes-4.5.2 b/dist/changes-4.5.2 index 04a29ba..5de0dbe 100644 --- a/dist/changes-4.5.2 +++ b/dist/changes-4.5.2 @@ -67,6 +67,17 @@ Third party components - QDir * Fix reentrency (listing directories in different threads) +- QFileSystemModel + * [254701] QFileSystemModel doesn't sort subfolders when using it in a QTreeView + * [251295] Windows path names incorrectly constructed in calls to updateIcon() + +- QFileDialog + * [251341] It is not possible to remove a directory of the sidebar if the directory does not exist + * [251321] Hidden path in QFileDialog's sidebar cannot be opened + * [226483] setSidebarUrls() handles the urls case sensitive so that adding the same directory twice is possible - Windows + * [252068] QFileDialog with QSortFilterProxyModel crashes + * [254490] QFileDialog selectFile doesn't clear the selection if we call it several times. + - QMacStyle * [253339] Don't draw arrows on toolbuttons that have a menu and text only. * [252301] Ensure that small and mini spin boxes are drawn correctly. -- cgit v0.12 From 3e1bbbda44258005b20862effe495cfb664627ca Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Fri, 5 Jun 2009 10:52:01 +0200 Subject: link qmake without /DEBUG on Windows Reviewed-by: mariusSO --- qmake/Makefile.win32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32 index 39bac81..53130aa 100644 --- a/qmake/Makefile.win32 +++ b/qmake/Makefile.win32 @@ -41,7 +41,7 @@ CFLAGS = -c -Fo$@ \ CXXFLAGS = $(CFLAGS) LFLAGS = LIBS = ole32.lib advapi32.lib -LINKQMAKE = $(LINK) $(LFLAGS) -DEBUG -OUT:qmake.exe $(OBJS) $(QTOBJS) $(LIBS) +LINKQMAKE = $(LINK) $(LFLAGS) -OUT:qmake.exe $(OBJS) $(QTOBJS) $(LIBS) ADDCLEAN = vc60.pdb vc70.pdb qmake.pdb qmake.ilk !ELSE -- cgit v0.12 From 6fff92a31c4acd270d0ecb4cda336ba098801ffb Mon Sep 17 00:00:00 2001 From: Kavindra Devi Palaraja Date: Fri, 5 Jun 2009 12:12:21 +0200 Subject: Doc - cleaned up a sentence to improve clarity Reviewed-By: TrustMe --- doc/src/tutorials/addressbook.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/tutorials/addressbook.qdoc b/doc/src/tutorials/addressbook.qdoc index bf202b2..5a49901 100644 --- a/doc/src/tutorials/addressbook.qdoc +++ b/doc/src/tutorials/addressbook.qdoc @@ -454,7 +454,7 @@ \snippet tutorials/addressbook/part3/addressbook.cpp connecting navigation signals The image below is our expected graphical user interface. Notice that it - is getting closer to our expected final output. + is getting closer to our final application. \image addressbook-tutorial-part3-screenshot.png -- cgit v0.12 From 95ceabf52d79b922a87f7c023c9606e633ab1ea2 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 4 Jun 2009 15:03:31 +0200 Subject: Autotest: Fixed a race condition in the network self test. Some of the tests (including the httpsServer one) requested that the server close the connection (Connection: close). It could happen that, well, the server did close the connection and we noticed it while doing the waitForBytesWritten in the doSocketFlush function. Then we'd create an error in the next step because the socket wasn't connected. Reviewed-by: TrustMe --- tests/auto/_networkselftest/tst_networkselftest.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/auto/_networkselftest/tst_networkselftest.cpp b/tests/auto/_networkselftest/tst_networkselftest.cpp index 0fa001a..eac603f 100644 --- a/tests/auto/_networkselftest/tst_networkselftest.cpp +++ b/tests/auto/_networkselftest/tst_networkselftest.cpp @@ -190,12 +190,6 @@ static void netChat(int port, const QList &chat) // now start the chat QList::ConstIterator it = chat.constBegin(); for (int i = 1; it != chat.constEnd(); ++it, ++i) { - if (it->type != Chat::Reconnect - && socket.state() != QAbstractSocket::ConnectedState - && socket.state() != QAbstractSocket::ClosingState) - QFAIL(QString("Internal error: socket is in invalid state %1 in step %2") - .arg(socket.state()).arg(i).toLocal8Bit()); - switch (it->type) { case Chat::Expect: { qDebug() << i << "Expecting" << prettyByteArray(it->data); -- cgit v0.12 From 754f8968332e712d590a6ee984118536c0447348 Mon Sep 17 00:00:00 2001 From: jasplin Date: Fri, 5 Jun 2009 12:06:46 +0200 Subject: Compile with Sun CC 5.5. An alternative solution is to swap the order of -I../../include and -I../../include/QtOpenGL when compiling the opengl module. Reviewed-by: TrustMe --- src/opengl/gl2paintengineex/qglgradientcache_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengl/gl2paintengineex/qglgradientcache_p.h b/src/opengl/gl2paintengineex/qglgradientcache_p.h index 9bf58c7..f088359 100644 --- a/src/opengl/gl2paintengineex/qglgradientcache_p.h +++ b/src/opengl/gl2paintengineex/qglgradientcache_p.h @@ -52,7 +52,7 @@ #include #include -#include +#include QT_BEGIN_NAMESPACE -- cgit v0.12 From 799a9ddf0a53ecdd6e097b2efd7418fd6ab9b655 Mon Sep 17 00:00:00 2001 From: Kavindra Devi Palaraja Date: Fri, 5 Jun 2009 12:29:27 +0200 Subject: Doc - fixed a typo Reviewed-By: TrustMe --- doc/src/tutorials/addressbook.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/tutorials/addressbook.qdoc b/doc/src/tutorials/addressbook.qdoc index 5a49901..4ab549a 100644 --- a/doc/src/tutorials/addressbook.qdoc +++ b/doc/src/tutorials/addressbook.qdoc @@ -510,7 +510,7 @@ \list \o If the iterator is at the end of \c contacts, we clear the display and return. - \o If the iterator is the beginning of \c contacts, we move it to + \o If the iterator is at the beginning of \c contacts, we move it to the end. \o We then decrement the iterator by one. \endlist -- cgit v0.12 From 35bdd8942716c716113e5b795186ca76199e8d96 Mon Sep 17 00:00:00 2001 From: Trond Kjernaasen Date: Fri, 5 Jun 2009 12:32:51 +0200 Subject: Fixed text drawing on Windows in 16 bit mode. There were several problems with antialiased text in 16 bit mode under Windows. No gamma correction was done, yet we prepared the cached glyphs for gamma correction. The mask format we rendered the glyphs into was also set to the desktop depth, which implied that information was lost and the text looked rather odd. Reviewed-by: Samuel BT: yes --- src/gui/text/qfontengine_win.cpp | 26 ++++++++++++++------------ src/gui/text/qfontengine_win_p.h | 3 ++- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/gui/text/qfontengine_win.cpp b/src/gui/text/qfontengine_win.cpp index 7341665..dc2e1ff 100644 --- a/src/gui/text/qfontengine_win.cpp +++ b/src/gui/text/qfontengine_win.cpp @@ -1335,7 +1335,7 @@ bool QFontEngineWin::getSfntTableData(uint tag, uchar *buffer, uint *length) con QNativeImage *QFontEngineWin::drawGDIGlyph(HFONT font, glyph_t glyph, int margin, - const QTransform &t) + const QTransform &t, QImage::Format mask_format) { glyph_metrics_t gm = boundingBox(glyph); @@ -1408,7 +1408,7 @@ QNativeImage *QFontEngineWin::drawGDIGlyph(HFONT font, glyph_t glyph, int margin QNativeImage *ni = new QNativeImage(iw + 2 * margin + 4, ih + 2 * margin + 4, - QNativeImage::systemFormat(), true); + mask_format, true); ni->image.fill(0xffffffff); HDC hdc = ni->hdc; @@ -1448,8 +1448,12 @@ QImage QFontEngineWin::alphaMapForGlyph(glyph_t glyph, const QTransform &xform) lf.lfQuality = ANTIALIASED_QUALITY; font = CreateFontIndirectW(&lf); } + QImage::Format mask_format = QNativeImage::systemFormat(); +#ifndef Q_OS_WINCE + mask_format = QImage::Format_RGB32; +#endif - QNativeImage *mask = drawGDIGlyph(font, glyph, 0, xform); + QNativeImage *mask = drawGDIGlyph(font, glyph, 0, xform, mask_format); if (mask == 0) return QImage(); @@ -1466,22 +1470,20 @@ QImage QFontEngineWin::alphaMapForGlyph(glyph_t glyph, const QTransform &xform) // Alpha channel of the ni.image pixels... for (int y=0; yheight(); ++y) { uchar *dest = indexed.scanLine(y); - if (mask->systemFormat() == QImage::Format_RGB16) { + if (mask->image.format() == QImage::Format_RGB16) { const qint16 *src = (qint16 *) ((const QImage &) mask->image).scanLine(y); - for (int x=0; xwidth(); ++x) { -#ifdef Q_OS_WINCE + for (int x=0; xwidth(); ++x) dest[x] = 255 - qGray(src[x]); -#else - dest[x] = 255 - (qt_pow_gamma[qGray(src[x])] * 255. / 2047.); -#endif - } } else { const uint *src = (uint *) ((const QImage &) mask->image).scanLine(y); for (int x=0; xwidth(); ++x) { #ifdef Q_OS_WINCE dest[x] = 255 - qGray(src[x]); #else - dest[x] = 255 - (qt_pow_gamma[qGray(src[x])] * 255. / 2047.); + if (QNativeImage::systemFormat() == QImage::Format_RGB16) + dest[x] = 255 - qGray(src[x]); + else + dest[x] = 255 - (qt_pow_gamma[qGray(src[x])] * 255. / 2047.); #endif } } @@ -1507,7 +1509,7 @@ QImage QFontEngineWin::alphaRGBMapForGlyph(glyph_t glyph, int margin, const QTra SystemParametersInfo(SPI_GETFONTSMOOTHINGCONTRAST, 0, &contrast, 0); SystemParametersInfo(SPI_SETFONTSMOOTHINGCONTRAST, 0, (void *) 1000, 0); - QNativeImage *mask = drawGDIGlyph(font, glyph, margin, t); + QNativeImage *mask = drawGDIGlyph(font, glyph, margin, t, QImage::Format_RGB32); SystemParametersInfo(SPI_SETFONTSMOOTHINGCONTRAST, 0, (void *) contrast, 0); if (mask == 0) diff --git a/src/gui/text/qfontengine_win_p.h b/src/gui/text/qfontengine_win_p.h index 6f37e91..f78bc6a 100644 --- a/src/gui/text/qfontengine_win_p.h +++ b/src/gui/text/qfontengine_win_p.h @@ -138,7 +138,8 @@ public: mutable int designAdvancesSize; private: - QNativeImage *drawGDIGlyph(HFONT font, glyph_t, int margin, const QTransform &xform); + QNativeImage *drawGDIGlyph(HFONT font, glyph_t, int margin, const QTransform &xform, + QImage::Format mask_format); }; -- cgit v0.12 From f04af57ba71e8a4cd3c19f6e1a283290cc5280d4 Mon Sep 17 00:00:00 2001 From: miniak Date: Fri, 5 Jun 2009 12:50:31 +0200 Subject: Fix for Qt issue #218037 - Add support for the WM_MOUSEHWHEEL message on Windows Merge-request: 384 Reviewed-by: Marius Storm-Olsen --- src/corelib/global/qt_windows.h | 3 +++ src/corelib/kernel/qcoreapplication_win.cpp | 4 ++++ src/corelib/kernel/qeventdispatcher_win.cpp | 3 ++- src/gui/kernel/qapplication_win.cpp | 14 ++++++++++++-- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/corelib/global/qt_windows.h b/src/corelib/global/qt_windows.h index 2ce4059..7fc7f47 100644 --- a/src/corelib/global/qt_windows.h +++ b/src/corelib/global/qt_windows.h @@ -106,6 +106,9 @@ #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 0x020A #endif +#ifndef WM_MOUSEHWHEEL +#define WM_MOUSEHWHEEL 0x020E +#endif #ifndef ETO_PDY #define ETO_PDY 0x2000 #endif diff --git a/src/corelib/kernel/qcoreapplication_win.cpp b/src/corelib/kernel/qcoreapplication_win.cpp index 815a558..9c1c235 100644 --- a/src/corelib/kernel/qcoreapplication_win.cpp +++ b/src/corelib/kernel/qcoreapplication_win.cpp @@ -409,6 +409,7 @@ struct { { 0x020B, "WM_XBUTTONDOWN" }, { 0x020C, "WM_XBUTTONUP" }, { 0x020D, "WM_XBUTTONDBLCLK" }, + { 0x020E, "WM_MOUSEHWHEEL" }, { 0x0210, "WM_PARENTNOTIFY" }, { 0x0211, "WM_ENTERMENULOOP" }, { 0x0212, "WM_EXITMENULOOP" }, @@ -898,6 +899,9 @@ QString decodeMSG(const MSG& msg) #ifdef WM_MOUSEWHEEL case WM_MOUSEWHEEL: #endif +#ifdef WM_MOUSEHWHEEL + case WM_MOUSEHWHEEL: +#endif #ifdef WM_LBUTTONDBLCLK case WM_LBUTTONDBLCLK: #endif diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp index 2dd5534..7d3a13a 100644 --- a/src/corelib/kernel/qeventdispatcher_win.cpp +++ b/src/corelib/kernel/qeventdispatcher_win.cpp @@ -696,7 +696,8 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) && msg.message <= WM_KEYLAST) || (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST) - || msg.message == WM_MOUSEWHEEL)) { + || msg.message == WM_MOUSEWHEEL + || msg.message == WM_MOUSEHWHEEL)) { // queue user input events for later processing haveMessage = false; d->queuedUserInputEvents.append(msg); diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp index 7e97784..60f3edf 100644 --- a/src/gui/kernel/qapplication_win.cpp +++ b/src/gui/kernel/qapplication_win.cpp @@ -1408,6 +1408,7 @@ static bool qt_is_translatable_mouse_event(UINT message) return (message >= WM_MOUSEFIRST && message <= WM_MOUSELAST || message >= WM_XBUTTONDOWN && message <= WM_XBUTTONDBLCLK) && message != WM_MOUSEWHEEL + && message != WM_MOUSEHWHEEL #ifndef Q_WS_WINCE || message >= WM_NCMOUSEMOVE && message <= WM_NCMBUTTONDBLCLK @@ -1758,6 +1759,7 @@ LRESULT CALLBACK QtWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam break; case WM_MOUSEWHEEL: + case WM_MOUSEHWHEEL: result = widget->translateWheelEvent(msg); break; @@ -2657,6 +2659,7 @@ bool qt_try_modal(QWidget *widget, MSG *msg, int& ret) #endif if ((type >= WM_MOUSEFIRST && type <= WM_MOUSELAST) || type == WM_MOUSEWHEEL || type == (int)WM95_MOUSEWHEEL || + type == WM_MOUSEHWHEEL || type == WM_MOUSELEAVE || (type >= WM_KEYFIRST && type <= WM_KEYLAST) #ifndef Q_WS_WINCE @@ -3268,12 +3271,12 @@ bool QETWidget::translateWheelEvent(const MSG &msg) state = translateButtonState(GET_KEYSTATE_WPARAM(msg.wParam), 0, 0); int delta; - if (msg.message == WM_MOUSEWHEEL) + if (msg.message == WM_MOUSEWHEEL || msg.message == WM_MOUSEHWHEEL) delta = (short) HIWORD (msg.wParam); else delta = (int) msg.wParam; - Qt::Orientation orient = (state&Qt::AltModifier + Qt::Orientation orient = (msg.message == WM_MOUSEHWHEEL || state&Qt::AltModifier #if 0 // disabled for now - Trenton's one-wheel mouse makes trouble... // "delta" for usual wheels is +-120. +-240 seems to indicate @@ -3287,6 +3290,13 @@ bool QETWidget::translateWheelEvent(const MSG &msg) #endif ) ? Qt::Horizontal : Qt::Vertical; + // according to the MSDN documentation on WM_MOUSEHWHEEL: + // a positive value indicates that the wheel was rotated to the right; + // a negative value indicates that the wheel was rotated to the left. + // Qt defines this value as the exact opposite, so we have to flip the value! + if (msg.message == WM_MOUSEHWHEEL) + delta = -delta; + QPoint globalPos; globalPos.rx() = (short)LOWORD (msg.lParam); -- cgit v0.12 From 84f381b98a9a100007a9d40a26e30f0bf705037b Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Fri, 5 Jun 2009 13:06:06 +0200 Subject: Made qmake handle "no_default" config for sub targets Merge-request: 395 Reviewed-by: Marius Storm-Olsen --- qmake/generators/makefile.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index 67e5bfb..2d4658e 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -2463,7 +2463,12 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QListtarget + "-" + suffix; + SubTarget *subTarget = targets.at(target); + if((suffix == "make_first" || suffix == "make_default") + && project->values(subTarget->name + ".CONFIG").indexOf("no_default_target") != -1) { + continue; + } + QString targetRule = subTarget->target + "-" + suffix; if(flags & SubTargetOrdered) targetRule += "-ordered"; t << " " << targetRule; -- cgit v0.12 From e6b3c48159f479d82740988a6104b9f5aee16a59 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 5 Jun 2009 11:39:54 +0200 Subject: Make QStringBuilder work out-of-the-box if QT_NO_CAST_FROM_ASCII is defined So far, only operator% was working for concatenation in those circumnstances. Now, defining QT_USE_FAST_OPERATOR_PLUS and QT_USE_FAST_CONCATENATION is enough, so user code will work without any source changes. Reviewed-by: joao --- src/corelib/tools/qstringbuilder.h | 24 ++++++++++++++++ tests/auto/qstringbuilder/tst_qstringbuilder.cpp | 35 ------------------------ 2 files changed, 24 insertions(+), 35 deletions(-) diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h index 1e67b7d..7b16197 100644 --- a/src/corelib/tools/qstringbuilder.h +++ b/src/corelib/tools/qstringbuilder.h @@ -169,6 +169,30 @@ template <> struct QConcatenable } }; +#ifndef QT_NO_CAST_FROM_ASCII +template struct QConcatenable +{ + typedef char type[N]; + static int size(const char *) { return N - 1; } + static inline void appendTo(const char *a, QChar *&out) + { + for (int i = 0; i < N - 1; ++i) + *out++ = QLatin1Char(a[i]); + } +}; + +template <> struct QConcatenable +{ + typedef char const *type; + static int size(const char *a) { return qstrlen(a); } + static inline void appendTo(const char *a, QChar *&out) + { + while (*a) + *out++ = QLatin1Char(*a++); + } +}; +#endif + template struct QConcatenable< QStringBuilder > { diff --git a/tests/auto/qstringbuilder/tst_qstringbuilder.cpp b/tests/auto/qstringbuilder/tst_qstringbuilder.cpp index f5df79e..5501204 100644 --- a/tests/auto/qstringbuilder/tst_qstringbuilder.cpp +++ b/tests/auto/qstringbuilder/tst_qstringbuilder.cpp @@ -95,41 +95,6 @@ #define LITERAL "some literal" -#ifndef QT_NO_CAST_FROM_ASCII - -// Plan is to move the QConcatenable specialications below -// to qstringbuilder.h as soon as the QByteArray builder is -// implemented. - -QT_BEGIN_NAMESPACE - -template struct QConcatenable -{ - typedef char type[N]; - static int size(const char *) { return N - 1; } - static inline void appendTo(const type &a, QChar *&out) - { - memcpy(out, a, N - 1); - out += N - 1; - } -}; - -template struct QConcatenable -{ - typedef char type[N]; - static int size(const char *) { return N - 1; } - static inline void appendTo(const type &a, QChar *&out) - { - memcpy(out, a, N - 1); - out += N - 1; - } -}; - -QT_END_NAMESPACE - -#endif - - class tst_QStringBuilder : public QObject { Q_OBJECT -- cgit v0.12 From a8738d7a11f8eea0164977c4c478d04a1a337f3a Mon Sep 17 00:00:00 2001 From: jasplin Date: Fri, 5 Jun 2009 13:28:46 +0200 Subject: Fixed build issue with Sun CC 5.5. Reviewed-by: TrustMe --- tools/linguist/lupdate/cpp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/linguist/lupdate/cpp.cpp b/tools/linguist/lupdate/cpp.cpp index 42aa2f0..9f28d1d 100644 --- a/tools/linguist/lupdate/cpp.cpp +++ b/tools/linguist/lupdate/cpp.cpp @@ -145,7 +145,6 @@ public: const ParseResults *getResults() const { return results; } void deleteResults() { delete results; } -private: struct SavedState { QStringList namespaces; QStack namespaceDepths; @@ -154,6 +153,7 @@ private: QString pendingContext; }; +private: struct IfdefState { IfdefState() {} IfdefState(int _braceDepth, int _parenDepth) : -- cgit v0.12 From f101435831bb06f342bb0e2241e3011073341617 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Fri, 5 Jun 2009 13:35:49 +0200 Subject: Fix wrong sizing of toolbars when they have anough space What could happen starting with 4.4 is that you could move a toolbar. If you then added actions, the toolbar would grom and make the other toolbars move to the right although it had enough space already to show the newly created actions. Autotest will follow shortly. Task-number: 226060 --- src/gui/widgets/qmainwindowlayout_p.h | 30 ------------ src/gui/widgets/qtoolbararealayout.cpp | 86 ++++++++++++++++++++-------------- src/gui/widgets/qtoolbararealayout_p.h | 57 ++++++++++++++++++++-- 3 files changed, 104 insertions(+), 69 deletions(-) diff --git a/src/gui/widgets/qmainwindowlayout_p.h b/src/gui/widgets/qmainwindowlayout_p.h index 1159aac..24a58a6 100644 --- a/src/gui/widgets/qmainwindowlayout_p.h +++ b/src/gui/widgets/qmainwindowlayout_p.h @@ -341,34 +341,4 @@ QT_END_NAMESPACE #endif // QT_NO_MAINWINDOW -QT_BEGIN_NAMESPACE -static inline int pick(Qt::Orientation o, const QPoint &pos) -{ return o == Qt::Horizontal ? pos.x() : pos.y(); } - -static inline int pick(Qt::Orientation o, const QSize &size) -{ return o == Qt::Horizontal ? size.width() : size.height(); } - -static inline int &rpick(Qt::Orientation o, QPoint &pos) -{ return o == Qt::Horizontal ? pos.rx() : pos.ry(); } - -static inline int &rpick(Qt::Orientation o, QSize &size) -{ return o == Qt::Horizontal ? size.rwidth() : size.rheight(); } - -static inline QSizePolicy::Policy pick(Qt::Orientation o, const QSizePolicy &policy) -{ return o == Qt::Horizontal ? policy.horizontalPolicy() : policy.verticalPolicy(); } - -static inline int perp(Qt::Orientation o, const QPoint &pos) -{ return o == Qt::Vertical ? pos.x() : pos.y(); } - -static inline int perp(Qt::Orientation o, const QSize &size) -{ return o == Qt::Vertical ? size.width() : size.height(); } - -static inline int &rperp(Qt::Orientation o, QPoint &pos) -{ return o == Qt::Vertical ? pos.rx() : pos.ry(); } - -static inline int &rperp(Qt::Orientation o, QSize &size) -{ return o == Qt::Vertical ? size.rwidth() : size.rheight(); } - -QT_END_NAMESPACE - #endif // QDYNAMICMAINWINDOWLAYOUT_P_H diff --git a/src/gui/widgets/qtoolbararealayout.cpp b/src/gui/widgets/qtoolbararealayout.cpp index 49f4a9e..240d059 100644 --- a/src/gui/widgets/qtoolbararealayout.cpp +++ b/src/gui/widgets/qtoolbararealayout.cpp @@ -113,7 +113,7 @@ QSize QToolBarAreaLayoutLine::sizeHint() const continue; QSize sh = item.sizeHint(); - a += pick(o, sh) + item.extraSpace; + a += item.preferredSize > 0 ? item.preferredSize : pick(o, sh); b = qMax(b, perp(o, sh)); } @@ -163,12 +163,17 @@ void QToolBarAreaLayoutLine::fitLayout() int itemMin = pick(o, item.minimumSize()); int itemHint = pick(o, item.sizeHint()); //we ensure the extraspace is not too low - item.extraSpace = qMax(itemMin - itemHint, item.extraSpace); - itemHint += item.extraSpace; - int itemExtra = qMin(itemHint - itemMin, extra); + item.size = qMax(item.size, itemHint); + if (item.preferredSize > 0) { + //preferredSize would be the default size + item.size = item.preferredSize; + } + + //the extraspace is the space above the item minimum sizehint + int extraSpace = qMin(item.size - itemMin, extra); + item.size = itemMin + extraSpace; //that is the real size - item.size = itemMin + itemExtra; - extra -= itemExtra; + extra -= extraSpace; last = i; } @@ -395,17 +400,15 @@ void QToolBarAreaLayoutInfo::removeToolBarBreak(QToolBar *before) void QToolBarAreaLayoutInfo::moveToolBar(QToolBar *toolbar, int pos) { - if (dirty) { + if (dirty) fitLayout(); - } dirty = true; - if (o == Qt::Vertical) { + if (o == Qt::Vertical) pos -= rect.top(); - } - //here we actually update the extraSpace for the line containing the toolbar so that we move it + //here we actually update the preferredSize for the line containing the toolbar so that we move it for (int j = 0; j < lines.count(); ++j) { QToolBarAreaLayoutLine &line = lines[j]; @@ -432,22 +435,21 @@ void QToolBarAreaLayoutInfo::moveToolBar(QToolBar *toolbar, int pos) newPos = qMin(pos, maxPos); } - //let's update the previous extra space + //extra is the number of pixels to add to the previous toolbar int extra = newPos - current.pos; - if (qAbs(previous.extraSpace + extra) < QApplication::startDragDistance()) { + //we check if the previous is near its size hint + //in which case we try to stick to it + if (qAbs(pick(o, previous.sizeHint()) - (previous.size + extra)) < QApplication::startDragDistance()) { //we stick to the default space extra = 0; } //update for the current item - current.extraSpace -= extra; - //this ensures the toolbars to be pushed to the right when necessary - current.extraSpace = qMax(pick(o,current.minimumSize())- pick(o,current.sizeHint()), current.extraSpace); - - if (extra >= 0) { - previous.extraSpace += extra; + current.extendSize(line.o, -extra); + if (extra >= 0) { + previous.extendSize(line.o, extra); } else { //we need to push the toolbars on the left starting with previous extra = -extra; // we just need to know the number of pixels @@ -455,13 +457,13 @@ void QToolBarAreaLayoutInfo::moveToolBar(QToolBar *toolbar, int pos) for(int l = previousIndex; l >=0; --l) { QToolBarAreaLayoutItem &item = line.toolBarItems[l]; if (!item.skip()) { - const int minExtraSpace = pick(o, item.minimumSize()) - pick(o, item.sizeHint()); - const int margin = item.extraSpace - minExtraSpace; + const int minPreferredSize = pick(o, item.minimumSize()); + const int margin = item.size - minPreferredSize; if (margin < extra) { - item.extraSpace = minExtraSpace; + item.resize(line.o, minPreferredSize); extra -= margin; } else { - item.extraSpace -= extra; + item.extendSize(line.o, -extra); extra = 0; } } @@ -536,13 +538,22 @@ bool QToolBarAreaLayoutInfo::insertGap(QList path, QLayoutItem *item) gap_item.gap = true; gap_item.widgetItem = item; - //update the previous item's extra space + //update the previous item's preferred size for(int p = k - 1 ; p >= 0; --p) { QToolBarAreaLayoutItem &previous = line.toolBarItems[p]; if (!previous.skip()) { //we found the previous one - gap_item.extraSpace = qMax(0, previous.extraSpace - pick(o, gap_item.sizeHint())); - previous.extraSpace = qMin(previous.extraSpace, 0); + int previousSizeHint = pick(line.o, previous.sizeHint()); + int previousExtraSpace = previous.size - previousSizeHint; + + if (previousExtraSpace > 0) { + //in this case we reset the space + previous.preferredSize = -1; + previous.size = previousSizeHint; + + gap_item.resize(o, previousExtraSpace); + } + break; } } @@ -1132,15 +1143,22 @@ QLayoutItem *QToolBarAreaLayout::unplug(QList path, QToolBarAreaLayout *oth //update the leading space here QToolBarAreaLayoutInfo &info = docks[path.at(0)]; QToolBarAreaLayoutLine &line = info.lines[path.at(1)]; - if (item.extraSpace != 0) { + if (item.size != pick(line.o, item.realSizeHint())) { + //the item doesn't have its default size + //so we'll give this to the next item int newExtraSpace = 0; + //let's iterate over the siblings of the current item that pare placed before it + //we need to find just the one before for (int i = path.at(2) - 1; i >= 0; --i) { QToolBarAreaLayoutItem &previous = line.toolBarItems[i]; if (!previous.skip()) { + //we need to check if it has a previous element and a next one + //the previous will get its size changed for (int j = path.at(2) + 1; j < line.toolBarItems.count(); ++j) { const QToolBarAreaLayoutItem &next = line.toolBarItems.at(j); if (!next.skip()) { - newExtraSpace = previous.extraSpace = next.pos - previous.pos - pick(line.o, previous.sizeHint()); + newExtraSpace = next.pos - previous.pos - pick(line.o, previous.sizeHint()); + previous.resize(line.o, next.pos - previous.pos); } break; } @@ -1154,7 +1172,7 @@ QLayoutItem *QToolBarAreaLayout::unplug(QList path, QToolBarAreaLayout *oth for (int i = path.at(2) - 1; i >= 0; --i) { QToolBarAreaLayoutItem &previous = line.toolBarItems[i]; if (!previous.skip()) { - previous.extraSpace = newExtraSpace; + previous.resize(line.o, pick(line.o, previous.sizeHint()) + newExtraSpace); break; } } @@ -1162,7 +1180,6 @@ QLayoutItem *QToolBarAreaLayout::unplug(QList path, QToolBarAreaLayout *oth } } - Q_ASSERT(!item.gap); item.gap = true; return item.widgetItem; @@ -1253,8 +1270,8 @@ void QToolBarAreaLayout::saveState(QDataStream &stream) const } stream << shownOrientation; stream << item.pos; - //if extraSpace is 0 the item has its "normal" size, so no need to store the size (we store -1) - stream << (item.extraSpace == 0 ? -1 : (pick(line.o, item.realSizeHint()) + item.extraSpace)); + //we store the preferred size. If the use rdidn't resize the toolbars it will be -1 + stream << item.preferredSize; uint geom0, geom1; packRect(&geom0, &geom1, widget->geometry(), widget->isWindow()); @@ -1339,10 +1356,7 @@ bool QToolBarAreaLayout::restoreState(QDataStream &stream, const QListsetVisible(shown & 1); toolBar->d_func()->setWindowState(floating, true, rect); - //if it is -1, it means we should use the default size - item.extraSpace = (item.size == -1) ? 0 : item.size - pick(line.o, item.realSizeHint()); - - + item.preferredSize = item.size; line.toolBarItems.append(item); } } diff --git a/src/gui/widgets/qtoolbararealayout_p.h b/src/gui/widgets/qtoolbararealayout_p.h index 574e366..5662ffc 100644 --- a/src/gui/widgets/qtoolbararealayout_p.h +++ b/src/gui/widgets/qtoolbararealayout_p.h @@ -59,6 +59,33 @@ QT_BEGIN_NAMESPACE +static inline int pick(Qt::Orientation o, const QPoint &pos) +{ return o == Qt::Horizontal ? pos.x() : pos.y(); } + +static inline int pick(Qt::Orientation o, const QSize &size) +{ return o == Qt::Horizontal ? size.width() : size.height(); } + +static inline int &rpick(Qt::Orientation o, QPoint &pos) +{ return o == Qt::Horizontal ? pos.rx() : pos.ry(); } + +static inline int &rpick(Qt::Orientation o, QSize &size) +{ return o == Qt::Horizontal ? size.rwidth() : size.rheight(); } + +static inline QSizePolicy::Policy pick(Qt::Orientation o, const QSizePolicy &policy) +{ return o == Qt::Horizontal ? policy.horizontalPolicy() : policy.verticalPolicy(); } + +static inline int perp(Qt::Orientation o, const QPoint &pos) +{ return o == Qt::Vertical ? pos.x() : pos.y(); } + +static inline int perp(Qt::Orientation o, const QSize &size) +{ return o == Qt::Vertical ? size.width() : size.height(); } + +static inline int &rperp(Qt::Orientation o, QPoint &pos) +{ return o == Qt::Vertical ? pos.rx() : pos.ry(); } + +static inline int &rperp(Qt::Orientation o, QSize &size) +{ return o == Qt::Vertical ? size.rwidth() : size.rheight(); } + #ifndef QT_NO_TOOLBAR class QToolBar; @@ -70,17 +97,41 @@ class QToolBarAreaLayoutItem { public: QToolBarAreaLayoutItem(QLayoutItem *item = 0) - : widgetItem(item), pos(0), size(-1), extraSpace(0), gap(false) {} + : widgetItem(item), pos(0), size(-1), preferredSize(-1), gap(false) {} bool skip() const; QSize minimumSize() const; QSize sizeHint() const; - QSize realSizeHint() const; + QSize realSizeHint() const; + + void resize(Qt::Orientation o, int newSize) + { + newSize = qMax(pick(o, minimumSize()), newSize); + int sizeh = pick(o, sizeHint()); + if (newSize == sizeh) { + preferredSize = -1; + size = sizeh; + } else { + preferredSize = newSize; + } + } + + void extendSize(Qt::Orientation o, int extent) + { + int newSize = qMax(pick(o, minimumSize()), (preferredSize > 0 ? preferredSize : size) + extent); + int sizeh = pick(o, sizeHint()); + if (newSize == sizeh) { + preferredSize = -1; + size = sizeh; + } else { + preferredSize = newSize; + } + } QLayoutItem *widgetItem; int pos; int size; - int extraSpace; + int preferredSize; bool gap; }; -- cgit v0.12 From 5740b034811794e0c33496cf0eeb81ba471cc018 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Fri, 5 Jun 2009 13:30:03 +0200 Subject: Example MDI: keybord focus not working correctly! The reason is that cocoa looses the first responder when we raise the fake window inside the MDA area. So we need to re-set the first responder again Task-number: 255040 Reviewed-by: Trenton Schulz --- src/gui/kernel/qwidget_mac.mm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index c82b87d..68eaf6f 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -3603,11 +3603,15 @@ void QWidgetPrivate::raise_sys() } } else { // Cocoa doesn't really have an idea of Z-ordering, but you can - // fake it by changing the order of it. + // fake it by changing the order of it. But beware, removing an + // NSView will also remove it as the first responder. So we re-set + // the first responder just in case: NSView *view = qt_mac_nativeview_for(q); NSView *parentView = [view superview]; + NSResponder *firstResponder = [[view window] firstResponder]; [view removeFromSuperview]; [parentView addSubview:view]; + [[view window] makeFirstResponder:firstResponder]; } #else if(q->isWindow()) { @@ -3645,6 +3649,7 @@ void QWidgetPrivate::lower_sys() NSArray *tmpViews = [parentView subviews]; NSMutableArray *subviews = [[NSMutableArray alloc] initWithCapacity:[tmpViews count]]; [subviews addObjectsFromArray:tmpViews]; + NSResponder *firstResponder = [[myview window] firstResponder]; // Implicit assumption that myViewIndex is included in subviews, that's why I'm not checking // myViewIndex. NSUInteger index = 0; @@ -3664,6 +3669,7 @@ void QWidgetPrivate::lower_sys() for (NSView *subview in subviews) [parentView addSubview:subview]; [subviews release]; + [[myview window] makeFirstResponder:firstResponder]; } #else if(q->isWindow()) { -- cgit v0.12 From a45ba34ead80d7e19e62eff571d094c9417fd876 Mon Sep 17 00:00:00 2001 From: jasplin Date: Fri, 5 Jun 2009 13:46:14 +0200 Subject: Revert "BT: Fixed crash on Mac caused by erroneous handling of native focus events." This reverts commit 7314c07a3e443b1d5349b419a03db8d41ca43f7e. As reported by Eike, this patch caused several problems for Qt Creator. Potentially it may cause problems for other (external) applications as well. An alternative fix (scheduled for 4.5.x) needs to be found for tasks 254456 and 254460. Reviewed-by: Richard Moe Gustavsen --- src/gui/kernel/qwidget_mac.mm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 68eaf6f..b2256cd 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -1296,11 +1296,8 @@ OSStatus QWidgetPrivate::qt_widget_event(EventHandlerCallRef er, EventRef event, if(part == kControlFocusNoPart){ if (widget->hasFocus()) QApplicationPrivate::setFocusWidget(0, Qt::OtherFocusReason); - } else if (widget->focusPolicy() != Qt::NoFocus) { + } else widget->setFocus(); - } else { - handled_event = false; - } } if(!HIObjectIsOfClass((HIObjectRef)hiview, kObjectQWidget)) CallNextEventHandler(er, event); -- cgit v0.12 From 4acabb3abd0ff109b9abeedb6832f5b1c3e0cc4e Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Fri, 5 Jun 2009 13:05:24 +0200 Subject: handle qreal properties correctly in the meta-object system When cross-compiling, it's possible that the size of qreal for moc itself (host platform) is different from the size of qreal on the target platform. Thus, we should not encode the metatype-id of qreal at moc time. Instead, use QMetaType::QReal in the generated code so that the the property flags are only derived at compile time. We also need to support the pesky QT_COORD_TYPE. In this case, qreal can be _any_ type (not just float or double), so we encode the property type as 0 and have a special check in QMetaProperty::type() that resolves the correct type at runtime. Reviewed-by: Simon Hausmann --- src/corelib/global/qglobal.h | 1 + src/corelib/kernel/qmetaobject.cpp | 5 +++++ src/corelib/kernel/qmetatype.cpp | 1 + src/corelib/kernel/qmetatype.h | 9 +++++++++ src/corelib/kernel/qobjectdefs.h | 2 +- src/tools/moc/generator.cpp | 20 +++++++++++++++----- src/tools/moc/outputrevision.h | 2 +- tests/auto/qobject/tst_qobject.cpp | 27 +++++++++++++++++++++++++++ 8 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 3990c7d..a10b6d6 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -1004,6 +1004,7 @@ typedef int QNoImplicitBoolCast; #define QT_NO_FPU #endif +// This logic must match the one in qmetatype.h #if defined(QT_COORD_TYPE) typedef QT_COORD_TYPE qreal; #elif defined(QT_NO_FPU) || defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE) diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index b65f956..6f3316c 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -2003,6 +2003,11 @@ QVariant::Type QMetaProperty::type() const if (enumMetaTypeId == 0) return QVariant::Int; } +#ifdef QT_COORD_TYPE + // qreal metatype must be resolved at runtime. + if (strcmp(typeName(), "qreal") == 0) + return QVariant::Type(qMetaTypeId()); +#endif return QVariant::UserType; } diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index ce10bae..a0b954f 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -179,6 +179,7 @@ QT_BEGIN_NAMESPACE \omitvalue LastCoreExtType \omitvalue LastCoreType \omitvalue LastGuiType + \omitvalue QReal Additional types can be registered using Q_DECLARE_METATYPE(). diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 648f933..be8a667 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -86,6 +86,15 @@ public: UShort = 133, UChar = 134, Float = 135, QObjectStar = 136, QWidgetStar = 137, LastCoreExtType = 137 /* QWidgetStar */, +// This logic must match the one in qglobal.h +#if defined(QT_COORD_TYPE) + QReal = 0, +#elif defined(QT_NO_FPU) || defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE) + QReal = Float, +#else + QReal = Double, +#endif + User = 256 }; diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h index 3a22323..f5d08ce 100644 --- a/src/corelib/kernel/qobjectdefs.h +++ b/src/corelib/kernel/qobjectdefs.h @@ -55,7 +55,7 @@ class QByteArray; class QString; #ifndef Q_MOC_OUTPUT_REVISION -#define Q_MOC_OUTPUT_REVISION 61 +#define Q_MOC_OUTPUT_REVISION 62 #endif // The following macros are our "extensions" to C++ diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index e94bb77..e4ad068 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -109,6 +109,14 @@ bool isVariantType(const char* type) return qvariant_nameToType(type) != 0; } +/*! + Returns true if the type is qreal. +*/ +static bool isQRealType(const char *type) +{ + return strcmp(type, "qreal") == 0; +} + Generator::Generator(ClassDef *classDef, const QList &metaTypes, FILE *outfile) : out(outfile), cdef(classDef), metaTypes(metaTypes) { @@ -545,7 +553,7 @@ void Generator::generateProperties() uint flags = Invalid; if (!isVariantType(p.type)) { flags |= EnumOrFlag; - } else { + } else if (!isQRealType(p.type)) { flags |= qvariant_nameToType(p.type) << 24; } if (!p.read.isEmpty()) @@ -589,10 +597,12 @@ void Generator::generateProperties() if (p.notifyId != -1) flags |= Notify; - fprintf(out, " %4d, %4d, 0x%.8x,\n", - strreg(p.name), - strreg(p.type), - flags); + fprintf(out, " %4d, %4d, ", + strreg(p.name), + strreg(p.type)); + if (!(flags >> 24) && isQRealType(p.type)) + fprintf(out, "(QMetaType::QReal << 24) | "); + fprintf(out, "0x%.8x,\n", flags); } if(cdef->notifyableProperties) { diff --git a/src/tools/moc/outputrevision.h b/src/tools/moc/outputrevision.h index 1e1d640..f577f6c 100644 --- a/src/tools/moc/outputrevision.h +++ b/src/tools/moc/outputrevision.h @@ -43,6 +43,6 @@ #define OUTPUTREVISION_H // if the output revision changes, you MUST change it in qobjectdefs.h too -enum { mocOutputRevision = 61 }; // moc format output revision +enum { mocOutputRevision = 62 }; // moc format output revision #endif // OUTPUTREVISION_H diff --git a/tests/auto/qobject/tst_qobject.cpp b/tests/auto/qobject/tst_qobject.cpp index 399d021..d76c7d4 100644 --- a/tests/auto/qobject/tst_qobject.cpp +++ b/tests/auto/qobject/tst_qobject.cpp @@ -106,6 +106,7 @@ private slots: void childDeletesItsSibling(); void dynamicProperties(); void floatProperty(); + void qrealProperty(); void property(); void recursiveSignalEmission(); void blockingQueuedConnection(); @@ -1113,6 +1114,7 @@ class PropertyObject : public QObject Q_PROPERTY(QVariant variant READ variant WRITE setVariant) Q_PROPERTY(CustomType* custom READ custom WRITE setCustom) Q_PROPERTY(float myFloat READ myFloat WRITE setMyFloat) + Q_PROPERTY(qreal myQReal READ myQReal WRITE setMyQReal) public: enum Alpha { @@ -1148,6 +1150,9 @@ public: void setMyFloat(float value) { m_float = value; } inline float myFloat() const { return m_float; } + void setMyQReal(qreal value) { m_qreal = value; } + qreal myQReal() const { return m_qreal; } + private: Alpha m_alpha; Priority m_priority; @@ -1156,6 +1161,7 @@ private: QVariant m_variant; CustomType *m_custom; float m_float; + qreal m_qreal; }; Q_DECLARE_METATYPE(PropertyObject::Priority) @@ -2348,6 +2354,27 @@ void tst_QObject::floatProperty() QVERIFY(qVariantValue(v) == 128.0f); } +void tst_QObject::qrealProperty() +{ + PropertyObject obj; + const int idx = obj.metaObject()->indexOfProperty("myQReal"); + QVERIFY(idx > 0); + QMetaProperty prop = obj.metaObject()->property(idx); + QVERIFY(prop.isValid()); + QVERIFY(prop.type() == uint(QMetaType::type("qreal"))); + QVERIFY(!prop.write(&obj, QVariant("Hello"))); + + QVERIFY(prop.write(&obj, qVariantFromValue(128.0f))); + QVariant v = prop.read(&obj); + QCOMPARE(v.userType(), qMetaTypeId()); + QVERIFY(qVariantValue(v) == 128.0); + + QVERIFY(prop.write(&obj, qVariantFromValue(double(127)))); + v = prop.read(&obj); + QCOMPARE(v.userType(), qMetaTypeId()); + QVERIFY(qVariantValue(v) == 127.0); +} + class DynamicPropertyObject : public PropertyObject { public: -- cgit v0.12 From 5455f9c7a3ec8ed591666a2f4384c10de31f6a60 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 5 Jun 2009 14:06:03 +0200 Subject: My changes for 4.5.2 --- dist/changes-4.5.2 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dist/changes-4.5.2 b/dist/changes-4.5.2 index 5de0dbe..84460e3 100644 --- a/dist/changes-4.5.2 +++ b/dist/changes-4.5.2 @@ -210,7 +210,9 @@ Qt for Embedded Linux Qt for Windows CE ----------------- -[248846] handle the back soft key on Windows mobile. +[248846] Handle the back soft key on Windows mobile. +[252319] Fix regression in native menu integration. +[242484] Fixed crash if Qt::WindowCancelButtonHint is used for a QDialog **************************************************************************** -- cgit v0.12 From a468e2f12536600abff582e8770ec42e1782bdab Mon Sep 17 00:00:00 2001 From: Norwegian Rock Cat Date: Fri, 5 Jun 2009 10:13:16 +0200 Subject: Add a callback so Qt updates its color stuff when the profile changes. We've had a problem with a stale cache for color profiles this should make things work well. We get the callback for each display whether it needs it or not, but honesly I would rather that we update this a few times too many when people change their display profile than not at all. FWIW, this code is inspired from Apple's Tech Note TN2035. --- src/gui/kernel/qapplication_mac.mm | 28 ++++++++++++++++++++++++++++ src/gui/painting/qpaintengine_mac_p.h | 2 ++ 2 files changed, 30 insertions(+) diff --git a/src/gui/kernel/qapplication_mac.mm b/src/gui/kernel/qapplication_mac.mm index d5fa9ea..6a592e4 100644 --- a/src/gui/kernel/qapplication_mac.mm +++ b/src/gui/kernel/qapplication_mac.mm @@ -154,6 +154,10 @@ #define kThemeBrushAlternatePrimaryHighlightColor -5 #endif +#define kCMDeviceUnregisteredNotification CFSTR("CMDeviceUnregisteredNotification") +#define kCMDefaultDeviceNotification CFSTR("CMDefaultDeviceNotification") +#define kCMDeviceProfilesNotification CFSTR("CMDeviceProfilesNotification") +#define kCMDefaultDeviceProfileNotification CFSTR("CMDefaultDeviceProfileNotification") QT_BEGIN_NAMESPACE @@ -1040,11 +1044,29 @@ void qt_release_app_proc_handler() #endif } +void qt_color_profile_changed(CFNotificationCenterRef, void *, CFStringRef, const void *, + CFDictionaryRef) +{ + QCoreGraphicsPaintEngine::cleanUpMacColorSpaces(); +} /* platform specific implementations */ void qt_init(QApplicationPrivate *priv, int) { if (qt_is_gui_used) { CGDisplayRegisterReconfigurationCallback(qt_mac_display_change_callbk, 0); + CFNotificationCenterRef center = CFNotificationCenterGetDistributedCenter(); + CFNotificationCenterAddObserver(center, qApp, qt_color_profile_changed, + kCMDeviceUnregisteredNotification, 0, + CFNotificationSuspensionBehaviorDeliverImmediately); + CFNotificationCenterAddObserver(center, qApp, qt_color_profile_changed, + kCMDefaultDeviceNotification, 0, + CFNotificationSuspensionBehaviorDeliverImmediately); + CFNotificationCenterAddObserver(center, qApp, qt_color_profile_changed, + kCMDeviceProfilesNotification, 0, + CFNotificationSuspensionBehaviorDeliverImmediately); + CFNotificationCenterAddObserver(center, qApp, qt_color_profile_changed, + kCMDefaultDeviceProfileNotification, 0, + CFNotificationSuspensionBehaviorDeliverImmediately); ProcessSerialNumber psn; if (GetCurrentProcess(&psn) == noErr) { // Jambi needs to transform itself since most people aren't "used" @@ -1224,6 +1246,12 @@ void qt_release_apple_event_handler() void qt_cleanup() { CGDisplayRemoveReconfigurationCallback(qt_mac_display_change_callbk, 0); + CFNotificationCenterRef center = CFNotificationCenterGetDistributedCenter(); + CFNotificationCenterRemoveObserver(center, qApp, kCMDeviceUnregisteredNotification, 0); + CFNotificationCenterRemoveObserver(center, qApp, kCMDefaultDeviceNotification, 0); + CFNotificationCenterRemoveObserver(center, qApp, kCMDeviceProfilesNotification, 0); + CFNotificationCenterRemoveObserver(center, qApp, kCMDefaultDeviceProfileNotification, 0); + #ifndef QT_MAC_USE_COCOA qt_release_app_proc_handler(); if (app_proc_handlerUPP) { diff --git a/src/gui/painting/qpaintengine_mac_p.h b/src/gui/painting/qpaintengine_mac_p.h index 298c145..9b85800 100644 --- a/src/gui/painting/qpaintengine_mac_p.h +++ b/src/gui/painting/qpaintengine_mac_p.h @@ -233,6 +233,8 @@ protected: friend class QMacPrintEngine; friend class QMacPrintEnginePrivate; friend void qt_mac_display_change_callbk(CGDirectDisplayID, CGDisplayChangeSummaryFlags, void *); + friend void qt_color_profile_changed(CFNotificationCenterRef center, void *, + CFStringRef , const void *, CFDictionaryRef); QCoreGraphicsPaintEngine(QPaintEnginePrivate &dptr); private: -- cgit v0.12 From 2ddf5be9627b7c93729838522bb37f47f41a6435 Mon Sep 17 00:00:00 2001 From: jasplin Date: Fri, 5 Jun 2009 14:31:39 +0200 Subject: Fixed compile error with Sun CC 5.5. Reviewed-by: TrustMe --- examples/animation/stickman/node.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/animation/stickman/node.h b/examples/animation/stickman/node.h index 72eae87..8654144 100644 --- a/examples/animation/stickman/node.h +++ b/examples/animation/stickman/node.h @@ -47,7 +47,7 @@ class Node: public QObject, public QGraphicsItem { Q_OBJECT - Q_PROPERTY(QPointF position READ pos WRITE setPos); + Q_PROPERTY(QPointF position READ pos WRITE setPos) public: Node(const QPointF &pos, QGraphicsItem *parent = 0); ~Node(); -- cgit v0.12 From 2734d8fa8c26c8498091348305b2616ecacfad85 Mon Sep 17 00:00:00 2001 From: jasplin Date: Fri, 5 Jun 2009 15:01:16 +0200 Subject: My changes for 4.5.2. --- dist/changes-4.5.2 | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/dist/changes-4.5.2 b/dist/changes-4.5.2 index 84460e3..1984881 100644 --- a/dist/changes-4.5.2 +++ b/dist/changes-4.5.2 @@ -59,6 +59,10 @@ Third party components - QAbstractNetworkCache * Only cache responses to HTTP GET by default, not HTTP PUT or POST +- QApplication + * [249589] Fixed bug that prevented any part of the application to receive + focus when Graphics View was disabled using QT_NO_GRAPHICSVIEW. + - QComboBox * [253944] Changing the style doesn't reset custom item delegate anymore. * [254589] Fixed the frame appearing if setting a stylesheet with a border @@ -88,6 +92,9 @@ Third party components - QFontDialog * [252000] Ensure that QFontDialog::getFont() works on Mac OS X. +- QGraphicsWidget + * Fixed a bug with Qt::WidgetWithChildren shortcut context. + - QLocalSocket * [247144] correctly handle remote disconnects @@ -107,6 +114,10 @@ Third party components * [253448] Prevent a crash when using the Qt::WA_MacBrushedMetal attribute in conjunction with style sheets. +- QWizard + * [252662] Fixed crash that could happen when compiling on Windows XP and + running on older Windows versions like 98 and 2000. + - QObject * Fixed possible race condition if two QObject connected together with signals and slot are destroyed in different threads @@ -121,6 +132,9 @@ Third party components * [251534] Fixed issue where text with non-opaque color from widget palette would be blitted instead of blended. +- QProgressBar + * [252283] Fixed busy indicator for a QProgressBar with a style sheet applied to it. + - QSelectionModel * [252069] fix QSelectionModel::rowIntersectsSelection or QSelectionModel::columnsIntersectsSelection not reporting right result if some items are disabled. @@ -135,6 +149,10 @@ Third party components - QString * Fixed reentrency of QString::squeeze() +- QTabBar + * [252472] Fixed problem with the current tab not being visible after calling + setTabButton() on a scrolled tab bar. + - QTransform * Fixed issue in QTransform::type() causing a projective transform to be treated as a scaling transform. -- cgit v0.12 From 65f6422401f7dfeb5f3a7fcc3791528b4cf2cee4 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Fri, 5 Jun 2009 15:34:32 +0200 Subject: kill dead code --- src/script/qscriptextqobject.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/script/qscriptextqobject.cpp b/src/script/qscriptextqobject.cpp index 4522807..0a346f0 100644 --- a/src/script/qscriptextqobject.cpp +++ b/src/script/qscriptextqobject.cpp @@ -1883,8 +1883,6 @@ void QScript::QtFunction::execute(QScriptContextPrivate *context) return; } - QScriptValueImpl result = eng_p->undefinedValue(); - const QMetaObject *meta = qobj->metaObject(); QObject *thisQObject = context->thisObject().toQObject(); -- cgit v0.12 From f6fc34ea5b247d1b56e113663958176b095a58a6 Mon Sep 17 00:00:00 2001 From: Kavindra Devi Palaraja Date: Fri, 5 Jun 2009 15:44:24 +0200 Subject: Doc - fixed a typo Reviewed-By: TrustMe --- doc/src/tutorials/addressbook.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/tutorials/addressbook.qdoc b/doc/src/tutorials/addressbook.qdoc index 4ab549a..e5657e7 100644 --- a/doc/src/tutorials/addressbook.qdoc +++ b/doc/src/tutorials/addressbook.qdoc @@ -529,7 +529,7 @@ \example tutorials/addressbook/part4 \title Address Book 4 - Editing and Removing Addresses - In this chapter, we look at ways to modify the contents of contact stored + In this chapter, we look at ways to modify the contents of contacts stored in the address book application. \image addressbook-tutorial-screenshot.png -- cgit v0.12 From 407a77cb2660cf122b08a388216f3a2da8cfd1c3 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 5 Jun 2009 15:40:17 +0200 Subject: Fixes anti-aliased text rendering on smartphones (Windows Mobile) The check for cleartype in qt_win_read_cleartype_settings() was not correct for Windows Mobile For anti-aliased text rendering we also have to use another pixel format for the native image. Task-number: 249642 Reviewed-by: mauricek --- src/gui/kernel/qapplication_win.cpp | 8 ++++++++ src/gui/text/qfontengine_win.cpp | 8 ++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp index 60f3edf..b21eb36 100644 --- a/src/gui/kernel/qapplication_win.cpp +++ b/src/gui/kernel/qapplication_win.cpp @@ -625,6 +625,13 @@ static void qt_set_windows_font_resources() static void qt_win_read_cleartype_settings() { +#ifdef Q_OS_WINCE + UINT result; + BOOL ok; + ok = SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &result, 0); + if (ok) + qt_cleartype_enabled = result; +#else QT_WA({ UINT result; BOOL ok; @@ -638,6 +645,7 @@ static void qt_win_read_cleartype_settings() if (ok) qt_cleartype_enabled = (result == FE_FONTSMOOTHINGCLEARTYPE); }); +#endif } diff --git a/src/gui/text/qfontengine_win.cpp b/src/gui/text/qfontengine_win.cpp index 002e670..d172a81 100644 --- a/src/gui/text/qfontengine_win.cpp +++ b/src/gui/text/qfontengine_win.cpp @@ -1333,6 +1333,7 @@ bool QFontEngineWin::getSfntTableData(uint tag, uchar *buffer, uint *length) con # define CLEARTYPE_QUALITY 5 #endif +extern bool qt_cleartype_enabled; QNativeImage *QFontEngineWin::drawGDIGlyph(HFONT font, glyph_t glyph, int margin, const QTransform &t) @@ -1408,7 +1409,11 @@ QNativeImage *QFontEngineWin::drawGDIGlyph(HFONT font, glyph_t glyph, int margin QNativeImage *ni = new QNativeImage(iw + 2 * margin + 4, ih + 2 * margin + 4, - QNativeImage::systemFormat(), true); + QNativeImage::systemFormat(), !qt_cleartype_enabled); + + /*If cleartype is enabled we use the standard system format even on Windows CE + and not the special textbuffer format we have to use if cleartype is disabled*/ + ni->image.fill(0xffffffff); HDC hdc = ni->hdc; @@ -1437,7 +1442,6 @@ QNativeImage *QFontEngineWin::drawGDIGlyph(HFONT font, glyph_t glyph, int margin } -extern bool qt_cleartype_enabled; extern uint qt_pow_gamma[256]; QImage QFontEngineWin::alphaMapForGlyph(glyph_t glyph, const QTransform &xform) -- cgit v0.12 From 1ad2cba32bc34786cdfd92ad16e3212b8830be3d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 5 Jun 2009 15:43:31 +0200 Subject: Compilefix for QT_NO_CURSOR in qgraphicsscene.cpp Reviewed-by: Joerg --- src/gui/graphicsview/qgraphicsscene.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 1fc4567..49c2329 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -2924,11 +2924,13 @@ void QGraphicsScene::addItem(QGraphicsItem *item) d->allItemsIgnoreHoverEvents = false; d->enableMouseTrackingOnViews(); } +#ifndef QT_NO_CURSOR if (d->allItemsUseDefaultCursor && item->hasCursor()) { d->allItemsUseDefaultCursor = false; if (d->allItemsIgnoreHoverEvents) // already enabled otherwise d->enableMouseTrackingOnViews(); } +#endif //QT_NO_CURSOR // Update selection lists if (item->isSelected()) -- cgit v0.12 From 4515b690829a639283a9b660893ff3f0f7ff598b Mon Sep 17 00:00:00 2001 From: Kavindra Devi Palaraja Date: Fri, 5 Jun 2009 15:59:59 +0200 Subject: Doc - fixed another typo Reviewed-By: TrustMe --- doc/src/tutorials/addressbook.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/tutorials/addressbook.qdoc b/doc/src/tutorials/addressbook.qdoc index e5657e7..4de334d 100644 --- a/doc/src/tutorials/addressbook.qdoc +++ b/doc/src/tutorials/addressbook.qdoc @@ -539,7 +539,7 @@ edit and remove functions so that a contact's details can be changed when needed. However, this requires a little improvement, in the form of enums. In our previous chapters, we had two modes: \c{AddingMode} and - \c{NavigationMode} - but they weren't defined as enums. Instead, we + \c{NavigationMode} - but they were not defined as enums. Instead, we enabled and disabled the corresponding buttons manually, resulting in multiple lines of repeated code. -- cgit v0.12 From b59d84fe67caedeb8c11d2530ddee2017a376920 Mon Sep 17 00:00:00 2001 From: Kavindra Devi Palaraja Date: Fri, 5 Jun 2009 16:31:24 +0200 Subject: Doc - fixed a typo Reviewed-By: TrustMe --- doc/src/tutorials/addressbook.qdoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/src/tutorials/addressbook.qdoc b/doc/src/tutorials/addressbook.qdoc index 4de334d..9a1af85 100644 --- a/doc/src/tutorials/addressbook.qdoc +++ b/doc/src/tutorials/addressbook.qdoc @@ -573,8 +573,7 @@ \dots \snippet tutorials/addressbook/part4/addressbook.h mode declaration - Lastly, we declare \c currentMode to keep track of the current mode of the - enum. + Lastly, we declare \c currentMode to keep track of the enum's current mode. \section1 Implementing the AddressBook Class -- cgit v0.12 From 100b55e4ddc9e4846ab877ea670473e2a9ed641e Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Tue, 10 Mar 2009 17:35:17 +0100 Subject: add HTTP DELETE support to Network Access API added new method QNetworkAccessManager::deleteResource (naming the method "delete" was not possible since it is a reserverd word in C++) and adjusted all the internals necessary. Task-number: 242916 Reviewed-by: Thiago --- src/network/access/qnetworkaccesshttpbackend.cpp | 10 +++ src/network/access/qnetworkaccessmanager.cpp | 19 ++++- src/network/access/qnetworkaccessmanager.h | 2 + tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 99 ++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 2 deletions(-) diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp index bd364cb..7517000 100644 --- a/src/network/access/qnetworkaccesshttpbackend.cpp +++ b/src/network/access/qnetworkaccesshttpbackend.cpp @@ -212,6 +212,7 @@ QNetworkAccessHttpBackendFactory::create(QNetworkAccessManager::Operation op, case QNetworkAccessManager::PostOperation: case QNetworkAccessManager::HeadOperation: case QNetworkAccessManager::PutOperation: + case QNetworkAccessManager::DeleteOperation: break; default: @@ -244,6 +245,10 @@ static QNetworkReply::NetworkError statusCodeFromHttp(int httpStatusCode, const code = QNetworkReply::ContentNotFoundError; break; + case 405: // Method Not Allowed + code = QNetworkReply::ContentOperationNotPermittedError; + break; + case 407: code = QNetworkReply::ProxyAuthenticationRequiredError; break; @@ -485,6 +490,11 @@ void QNetworkAccessHttpBackend::postRequest() httpRequest.setUploadByteDevice(createUploadByteDevice()); break; + case QNetworkAccessManager::DeleteOperation: + invalidateCache(); + httpRequest.setOperation(QHttpNetworkRequest::Delete); + break; + default: break; // can't happen } diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index bf06ede..7ca5f78 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -148,6 +148,9 @@ static void ensureInitialized() \value PostOperation send the contents of an HTML form for processing via HTTP POST (created with post()) + \value DeleteOperation delete contents operation (created with + deleteResource()) + \omitvalue UnknownOperation \sa QNetworkReply::operation() @@ -555,7 +558,7 @@ QNetworkReply *QNetworkAccessManager::head(const QNetworkRequest &request) a new QNetworkReply object opened for reading which emits its QIODevice::readyRead() signal whenever new data arrives. - \sa post(), put() + \sa post(), put(), deleteResource() */ QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request) { @@ -577,7 +580,7 @@ QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request) Note: sending a POST request on protocols other than HTTP and HTTPS is undefined and will probably fail. - \sa get(), put() + \sa get(), put(), deleteResource() */ QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, QIODevice *data) { @@ -642,6 +645,18 @@ QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, const } /*! + This function is used to send a request to delete the resource + identified by the URL of \a request. + This feature is currently available for HTTP only, performing an HTTP DELETE request. + + \sa get(), post(), put() +*/ +QNetworkReply *QNetworkAccessManager::deleteResource(const QNetworkRequest &request) +{ + return d_func()->postProcess(createRequest(QNetworkAccessManager::DeleteOperation, request)); +} + +/*! Returns a new QNetworkReply object to handle the operation \a op and request \a req. The device \a outgoingData is always 0 for Get and Head requests, but is the value passed to post() and put() in diff --git a/src/network/access/qnetworkaccessmanager.h b/src/network/access/qnetworkaccessmanager.h index 4fe218e..79f512c 100644 --- a/src/network/access/qnetworkaccessmanager.h +++ b/src/network/access/qnetworkaccessmanager.h @@ -74,6 +74,7 @@ public: GetOperation, PutOperation, PostOperation, + DeleteOperation, UnknownOperation = 0 }; @@ -100,6 +101,7 @@ public: QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data); QNetworkReply *put(const QNetworkRequest &request, QIODevice *data); QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data); + QNetworkReply *deleteResource(const QNetworkRequest &request); Q_SIGNALS: #ifndef QT_NO_NETWORKPROXY diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp index b76a4e6..43b4ea9 100644 --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp @@ -161,6 +161,10 @@ private Q_SLOTS: void putToHttp(); void postToHttp_data(); void postToHttp(); + void deleteFromHttp_data(); + void deleteFromHttp(); + void putGetDeleteGetFromHttp_data(); + void putGetDeleteGetFromHttp(); void ioGetFromData_data(); void ioGetFromData(); @@ -903,6 +907,10 @@ QString tst_QNetworkReply::runSimpleRequest(QNetworkAccessManager::Operation op, reply = manager.post(request, data); break; + case QNetworkAccessManager::DeleteOperation: + reply = manager.deleteResource(request); + break; + default: Q_ASSERT_X(false, "tst_QNetworkReply", "Invalid/unknown operation requested"); } @@ -1478,6 +1486,97 @@ void tst_QNetworkReply::postToHttp() QCOMPARE(uploadedData, md5sum.toHex()); } +void tst_QNetworkReply::deleteFromHttp_data() +{ + QTest::addColumn("url"); + QTest::addColumn("resultCode"); + QTest::addColumn("error"); + + // for status codes to expect, see http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + + QTest::newRow("405-method-not-allowed") << QUrl("http://" + QtNetworkSettings::serverName() + "/index.html") << 405 << QNetworkReply::ContentOperationNotPermittedError; + QTest::newRow("200-ok") << QUrl("http://" + QtNetworkSettings::serverName() + "/cgi-bin/http-delete.cgi?200-ok") << 200 << QNetworkReply::NoError; + QTest::newRow("202-accepted") << QUrl("http://" + QtNetworkSettings::serverName() + "/cgi-bin/http-delete.cgi?202-accepted") << 202 << QNetworkReply::NoError; + QTest::newRow("204-no-content") << QUrl("http://" + QtNetworkSettings::serverName() + "/cgi-bin/http-delete.cgi?204-no-content") << 204 << QNetworkReply::NoError; + QTest::newRow("404-not-found") << QUrl("http://" + QtNetworkSettings::serverName() + "/cgi-bin/http-delete.cgi?404-not-found") << 404 << QNetworkReply::ContentNotFoundError; +} + +void tst_QNetworkReply::deleteFromHttp() +{ + QFETCH(QUrl, url); + QFETCH(int, resultCode); + QFETCH(QNetworkReply::NetworkError, error); + QNetworkRequest request(url); + QNetworkReplyPtr reply; + runSimpleRequest(QNetworkAccessManager::DeleteOperation, request, reply, 0); + QCOMPARE(reply->url(), url); + QCOMPARE(reply->error(), error); + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), resultCode); +} + +void tst_QNetworkReply::putGetDeleteGetFromHttp_data() +{ + QTest::addColumn("putUrl"); + QTest::addColumn("putResultCode"); + QTest::addColumn("putError"); + QTest::addColumn("deleteUrl"); + QTest::addColumn("deleteResultCode"); + QTest::addColumn("deleteError"); + QTest::addColumn("get2Url"); + QTest::addColumn("get2ResultCode"); + QTest::addColumn("get2Error"); + + QUrl url("http://" + QtNetworkSettings::serverName()); + url.setPath(QString("/dav/qnetworkaccess-putToHttp-%1-%2") + .arg(QTest::currentDataTag()) + .arg(uniqueExtension)); + + // first use case: put, get (to check it is there), delete, get (to check it is not there anymore) + QTest::newRow("success") << url << 201 << QNetworkReply::NoError << url << 204 << QNetworkReply::NoError << url << 404 << QNetworkReply::ContentNotFoundError; + + QUrl wrongUrl("http://" + QtNetworkSettings::serverName()); + wrongUrl.setPath(QString("/dav/qnetworkaccess-thisURLisNotAvailable")); + + // second use case: put, get (to check it is there), delete wrong URL, get (to check it is still there) + QTest::newRow("delete-error") << url << 201 << QNetworkReply::NoError << wrongUrl << 404 << QNetworkReply::ContentNotFoundError << url << 200 << QNetworkReply::NoError; + +} + +void tst_QNetworkReply::putGetDeleteGetFromHttp() +{ + QFETCH(QUrl, putUrl); + QFETCH(int, putResultCode); + QFETCH(QNetworkReply::NetworkError, putError); + QFETCH(QUrl, deleteUrl); + QFETCH(int, deleteResultCode); + QFETCH(QNetworkReply::NetworkError, deleteError); + QFETCH(QUrl, get2Url); + QFETCH(int, get2ResultCode); + QFETCH(QNetworkReply::NetworkError, get2Error); + + QNetworkRequest putRequest(putUrl); + QNetworkRequest deleteRequest(deleteUrl); + QNetworkRequest get2Request(get2Url); + QNetworkReplyPtr reply; + + RUN_REQUEST(runSimpleRequest(QNetworkAccessManager::PutOperation, putRequest, reply, 0)); + QCOMPARE(reply->error(), putError); + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), putResultCode); + + runSimpleRequest(QNetworkAccessManager::GetOperation, putRequest, reply, 0); + QCOMPARE(reply->error(), QNetworkReply::NoError); + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); + + runSimpleRequest(QNetworkAccessManager::DeleteOperation, deleteRequest, reply, 0); + QCOMPARE(reply->error(), deleteError); + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), deleteResultCode); + + runSimpleRequest(QNetworkAccessManager::GetOperation, get2Request, reply, 0); + QCOMPARE(reply->error(), get2Error); + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), get2ResultCode); + +} + void tst_QNetworkReply::ioGetFromData_data() { QTest::addColumn("urlStr"); -- cgit v0.12 From 0302c0103da731b7af8d749b1643c50e39d81c00 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Fri, 5 Jun 2009 16:35:37 +0200 Subject: QNetworkAccessManager: forgot the "since" tag in my previous commit Reviewed-by: trustMe --- src/network/access/qnetworkaccessmanager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 7ca5f78..024f191 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -645,6 +645,8 @@ QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, const } /*! + \since 4.6 + This function is used to send a request to delete the resource identified by the URL of \a request. This feature is currently available for HTTP only, performing an HTTP DELETE request. -- cgit v0.12 From ff9497f82d605688453e2f027bab7c719048f0d2 Mon Sep 17 00:00:00 2001 From: Denis Dzyubenko Date: Fri, 5 Jun 2009 15:38:44 +0200 Subject: Revert two of my commits, restoring the original fix for focus handling. The fix that was introduced adds regressions, and I don't see a way we can fix it without breaking someone elses code. So restoring the original fix that just avoid a crash (autotest by Thierry is included). Revert "Revert Avoid a crash when setting a focus in a widget hierarchy containing" Revert "Setting a focus on a widget hierarchy which contains both visible and invisible widgets could cause a crash." This reverts commit be833a4f25a8ec8c3dd7a8ac4fa4b0507c93e7ee. This partially reverts commit 1a7da7096bbda17197738061902f4489af234bc0 Reviewed-by: Thierry Bastian Reviewed-by: Prasanth Ullattil --- src/gui/kernel/qwidget.cpp | 16 ++++------------ tests/auto/qwidget/tst_qwidget.cpp | 18 ------------------ 2 files changed, 4 insertions(+), 30 deletions(-) diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index d436ffb..6026821 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -5674,15 +5674,10 @@ void QWidget::setFocus(Qt::FocusReason reason) w = w->isWindow() ? 0 : w->parentWidget(); } } else { - while (w && w->isVisible()) { + while (w) { w->d_func()->focus_child = f; w = w->isWindow() ? 0 : w->parentWidget(); } - // a special case, if there is an invisible parent, notify him - // about the focus_child widget, so that if it becomes - // visible, the focus widget will be respected. - if (w) - w->d_func()->focus_child = f; } #ifndef QT_NO_GRAPHICSVIEW @@ -5757,8 +5752,9 @@ void QWidget::setFocus(Qt::FocusReason reason) void QWidget::clearFocus() { QWidget *w = this; - while (w && w->d_func()->focus_child == this) { - w->d_func()->focus_child = 0; + while (w) { + if (w->d_func()->focus_child == this) + w->d_func()->focus_child = 0; w = w->parentWidget(); } #ifndef QT_NO_GRAPHICSVIEW @@ -6734,10 +6730,6 @@ void QWidgetPrivate::show_helper() if (QApplicationPrivate::hidden_focus_widget == q) { QApplicationPrivate::hidden_focus_widget = 0; q->setFocus(Qt::OtherFocusReason); - } else if (focus_child) { - // if we are shown and there is an explicit focus child widget - // set, respect it by giving him focus. - focus_child->setFocus(Qt::OtherFocusReason); } // Process events when showing a Qt::SplashScreen widget before the event loop diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp index 3fad366..041aa7a 100644 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ b/tests/auto/qwidget/tst_qwidget.cpp @@ -351,7 +351,6 @@ private slots: void toplevelLineEditFocus(); void focusWidget_task254563(); - void focusWidget_mixed_widget_hierarchy(); private: bool ensureScreenSize(int width, int height); @@ -8995,22 +8994,5 @@ void tst_QWidget::focusWidget_task254563() QVERIFY(top.focusWidget() != widget); //dangling pointer } -void tst_QWidget::focusWidget_mixed_widget_hierarchy() -{ - QWidget top; - top.show(); - QWidget notvisible(&top); - QWidget *visible = new QWidget(¬visible); - visible->show(); - - visible->setFocus(); - notvisible.setFocus(); - notvisible.show(); - QCOMPARE(top.focusWidget(), visible); - QCOMPARE(notvisible.focusWidget(), visible); - QCOMPARE(visible->focusWidget(), visible); -} - - QTEST_MAIN(tst_QWidget) #include "tst_qwidget.moc" -- cgit v0.12 From d29da4699a2887cdf0836ff39652524d015431c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Fri, 5 Jun 2009 16:41:23 +0200 Subject: Fixed an issue with graphicssystem raster on 8 and 16 bit X servers. We didn't actually check the depth of the target window before calling the qt_x11_drawImage() fu, that will only work with depths >= 24. Task-number: 255311 Reviewed-by: Samuel BT: yes --- src/gui/painting/qwindowsurface_raster.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/painting/qwindowsurface_raster.cpp b/src/gui/painting/qwindowsurface_raster.cpp index 110ba2f..0a6a04e 100644 --- a/src/gui/painting/qwindowsurface_raster.cpp +++ b/src/gui/painting/qwindowsurface_raster.cpp @@ -229,7 +229,7 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi { const QImage &src = d->image->image; br = br.intersected(src.rect()); - if (src.format() != QImage::Format_RGB32) { + if (src.format() != QImage::Format_RGB32 || widget->x11Info().depth() < 24) { QX11PixmapData *data = new QX11PixmapData(QPixmapData::PixmapType); data->xinfo = widget->x11Info(); data->fromImage(src, Qt::AutoColor); -- cgit v0.12 From 9691523b796c6acc6a837a5f5a34fef16aa74c48 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Fri, 5 Jun 2009 16:48:52 +0200 Subject: have QScriptValue::toVariant() convert Array objects to QVariantLists Converting the array to its string representation is not very useful. Now round-trip conversion will work as well. Reviewed-by: Ariya Hidayat --- src/script/qscriptvalue.cpp | 1 + src/script/qscriptvalueimpl.cpp | 2 ++ tests/auto/qscriptvalue/tst_qscriptvalue.cpp | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/script/qscriptvalue.cpp b/src/script/qscriptvalue.cpp index a253985..f72d1db 100644 --- a/src/script/qscriptvalue.cpp +++ b/src/script/qscriptvalue.cpp @@ -904,6 +904,7 @@ qsreal QScriptValue::toInteger() const \row \o QObject Object \o A QVariant containing a pointer to the QObject. \row \o Date Object \o A QVariant containing the date value (toDateTime()). \row \o RegExp Object \o A QVariant containing the regular expression value (toRegExp()). + \row \o Array Object \o The array is converted to a QVariantList. \row \o Object \o If the value is primitive, then the result is converted to a QVariant according to the above rules; otherwise, an invalid QVariant is returned. \endtable diff --git a/src/script/qscriptvalueimpl.cpp b/src/script/qscriptvalueimpl.cpp index a890839..7c7b711 100644 --- a/src/script/qscriptvalueimpl.cpp +++ b/src/script/qscriptvalueimpl.cpp @@ -339,6 +339,8 @@ QVariant QScriptValueImpl::toVariant() const if (isQObject()) return qVariantFromValue(toQObject()); #endif + if (isArray()) + return QScriptEnginePrivate::variantListFromArray(*this); QScriptValueImpl v = engine()->toPrimitive(*this); if (!v.isObject()) diff --git a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp index bf91001..ad1080a 100644 --- a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp +++ b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp @@ -1301,6 +1301,27 @@ void tst_QScriptValue::toVariant() QCOMPARE(str.toVariant(), QVariant(QString("ciao"))); QCOMPARE(qscriptvalue_cast(str), QVariant(QString("ciao"))); } + + // array + { + QVariantList listIn; + listIn << 123 << "hello"; + QScriptValue array = qScriptValueFromValue(&eng, listIn); + QVERIFY(array.isArray()); + QCOMPARE(array.property("length").toInt32(), 2); + QVariant ret = array.toVariant(); + QCOMPARE(ret.type(), QVariant::List); + QVariantList listOut = ret.toList(); + QCOMPARE(listOut.size(), listIn.size()); + for (int i = 0; i < listIn.size(); ++i) + QVERIFY(listOut.at(i) == listIn.at(i)); + // round-trip conversion + QScriptValue array2 = qScriptValueFromValue(&eng, ret); + QVERIFY(array2.isArray()); + QCOMPARE(array2.property("length").toInt32(), array.property("length").toInt32()); + for (int i = 0; i < array.property("length").toInt32(); ++i) + QVERIFY(array2.property(i).strictlyEquals(array.property(i))); + } } // unfortunately, this is necessary in order to do qscriptvalue_cast(...) -- cgit v0.12 From 7f21512826689df38678c4cb954e9c347c01df8b Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 5 Jun 2009 17:13:17 +0200 Subject: explicitly handle windows and mac9 line endings in practice, this matters only for backslashed line continuations Task-number: 255336 --- tools/linguist/shared/cpp.cpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/tools/linguist/shared/cpp.cpp b/tools/linguist/shared/cpp.cpp index 2e137cf..0aab661 100644 --- a/tools/linguist/shared/cpp.cpp +++ b/tools/linguist/shared/cpp.cpp @@ -134,13 +134,28 @@ static uint getChar() if (yyInPos >= yyInStr.size()) return EOF; uint c = yyInStr[yyInPos++].unicode(); - if (c == '\\' && yyInPos < yyInStr.size() && yyInStr[yyInPos].unicode() == '\n') { - ++yyCurLineNo; - ++yyInPos; - continue; + if (c == '\\' && yyInPos < yyInStr.size()) { + if (yyInStr[yyInPos].unicode() == '\n') { + ++yyCurLineNo; + ++yyInPos; + continue; + } + if (yyInStr[yyInPos].unicode() == '\r') { + ++yyCurLineNo; + ++yyInPos; + if (yyInPos < yyInStr.size() && yyInStr[yyInPos].unicode() == '\n') + ++yyInPos; + continue; + } } - if (c == '\n') + if (c == '\r') { + if (yyInPos < yyInStr.size() && yyInStr[yyInPos].unicode() == '\n') + ++yyInPos; + c = '\n'; ++yyCurLineNo; + } else if (c == '\n') { + ++yyCurLineNo; + } return c; } } -- cgit v0.12 From 508c9cd681244a5ad566c12733aa70f5bd522b57 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Fri, 5 Jun 2009 17:38:39 +0200 Subject: make signal handlers understand QVariant again Also, issue a warning if a type is not known to the meta-type system. Task-number: 248129 --- src/script/qscriptextqobject.cpp | 21 ++++++++++++++--- tests/auto/qscriptqobject/tst_qscriptqobject.cpp | 29 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/script/qscriptextqobject.cpp b/src/script/qscriptextqobject.cpp index 0a346f0..47c04d4 100644 --- a/src/script/qscriptextqobject.cpp +++ b/src/script/qscriptextqobject.cpp @@ -1667,12 +1667,27 @@ void QScript::QObjectConnectionManager::execute(int slotIndex, void **argv) activation_data->m_members[i].object(nameId, i, QScriptValue::Undeletable | QScriptValue::SkipInEnumeration); + QScriptValueImpl actual; if (i < argc) { - int argType = QMetaType::type(parameterTypes.at(i)); - activation_data->m_values[i] = eng->create(argType, argv[i + 1]); + void *arg = argv[i + 1]; + QByteArray typeName = parameterTypes.at(i); + int argType = QMetaType::type(typeName); + if (!argType) { + if (typeName == "QVariant") { + actual = eng->valueFromVariant(*reinterpret_cast(arg)); + } else { + qWarning("QScriptEngine: Unable to handle unregistered datatype '%s' " + "when invoking handler of signal %s::%s", + typeName.constData(), meta->className(), method.signature()); + actual = eng->undefinedValue(); + } + } else { + actual = eng->create(argType, arg); + } } else { - activation_data->m_values[i] = eng->undefinedValue(); + actual = eng->undefinedValue(); } + activation_data->m_values[i] = actual; } QScriptValueImpl senderObject; diff --git a/tests/auto/qscriptqobject/tst_qscriptqobject.cpp b/tests/auto/qscriptqobject/tst_qscriptqobject.cpp index 1025d2a..2c47c49 100644 --- a/tests/auto/qscriptqobject/tst_qscriptqobject.cpp +++ b/tests/auto/qscriptqobject/tst_qscriptqobject.cpp @@ -333,6 +333,10 @@ public: { emit mySignalWithDefaultArg(arg); } void emitMySignalWithDefaultArg() { emit mySignalWithDefaultArg(); } + void emitMySignalWithVariantArg(const QVariant &arg) + { emit mySignalWithVariantArg(arg); } + void emitMySignalWithScriptEngineArg(QScriptEngine *arg) + { emit mySignalWithScriptEngineArg(arg); } public Q_SLOTS: void mySlot() @@ -395,6 +399,8 @@ Q_SIGNALS: void myOtherOverloadedSignal(const QString &arg); void myOtherOverloadedSignal(int arg); void mySignalWithDefaultArg(int arg = 123); + void mySignalWithVariantArg(const QVariant &arg); + void mySignalWithScriptEngineArg(QScriptEngine *arg); protected: void connectNotify(const char *signal) { @@ -1553,6 +1559,29 @@ void tst_QScriptExtQObject::connectAndDisconnect() m_myObject->emitMyOtherOverloadedSignal(123); QVERIFY(!m_engine->evaluate("gotSignal").toBoolean()); + // signal with QVariant arg: argument conversion should work + m_myObject->clearConnectedSignal(); + QVERIFY(m_engine->evaluate("myObject.mySignalWithVariantArg.connect(myHandler)").isUndefined()); + QCOMPARE(m_myObject->connectedSignal().constData(), SIGNAL(mySignalWithVariantArg(QVariant))); + m_engine->evaluate("gotSignal = false"); + m_myObject->emitMySignalWithVariantArg(123); + QCOMPARE(m_engine->evaluate("gotSignal").toBoolean(), true); + QCOMPARE(m_engine->evaluate("signalArgs.length").toNumber(), 1.0); + QCOMPARE(m_engine->evaluate("signalArgs[0]").toNumber(), 123.0); + QVERIFY(m_engine->evaluate("myObject.mySignalWithVariantArg.disconnect(myHandler)").isUndefined()); + + // signal with argument type that's unknown to the meta-type system + m_myObject->clearConnectedSignal(); + QVERIFY(m_engine->evaluate("myObject.mySignalWithScriptEngineArg.connect(myHandler)").isUndefined()); + QCOMPARE(m_myObject->connectedSignal().constData(), SIGNAL(mySignalWithScriptEngineArg(QScriptEngine*))); + m_engine->evaluate("gotSignal = false"); + QTest::ignoreMessage(QtWarningMsg, "QScriptEngine: Unable to handle unregistered datatype 'QScriptEngine*' when invoking handler of signal MyQObject::mySignalWithScriptEngineArg(QScriptEngine*)"); + m_myObject->emitMySignalWithScriptEngineArg(m_engine); + QCOMPARE(m_engine->evaluate("gotSignal").toBoolean(), true); + QCOMPARE(m_engine->evaluate("signalArgs.length").toNumber(), 1.0); + QVERIFY(m_engine->evaluate("signalArgs[0]").isUndefined()); + QVERIFY(m_engine->evaluate("myObject.mySignalWithScriptEngineArg.disconnect(myHandler)").isUndefined()); + // connect(object, function) m_engine->evaluate("otherObject = { name:'foo' }"); QVERIFY(m_engine->evaluate("myObject.mySignal.connect(otherObject, myHandler)").isUndefined()); -- cgit v0.12 From dabeec5e1d3f43b54a58b2f8667ac552a7c24685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Fri, 5 Jun 2009 17:46:48 +0200 Subject: My 4.5.2 changes. --- dist/changes-4.5.2 | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/dist/changes-4.5.2 b/dist/changes-4.5.2 index 1984881..810c022 100644 --- a/dist/changes-4.5.2 +++ b/dist/changes-4.5.2 @@ -131,6 +131,8 @@ Third party components * Fixed crash when drawing on a null pixmap. * [251534] Fixed issue where text with non-opaque color from widget palette would be blitted instead of blended. + * [253663] Fixed an issue with implicitly closed poly lines when using + perspective transforms. - QProgressBar * [252283] Fixed busy indicator for a QProgressBar with a style sheet applied to it. @@ -165,6 +167,8 @@ Third party components engine. * [251485] Fixed crash that could occur with projective transforms and high quality antialiasing. + * [253468] Fixed a crash in the GL 2 paint engine that could occur + when drawing text. - QCssParser * [252311] "font-family:" now handle fallback font specified with a comas @@ -186,6 +190,28 @@ Third party components - QPrintDialog * [253135] Crash in QPrintDialog when editing output filename + * [252873] Fixed an issue that could cause QPrintDialog to invalidate + a valid QPrinter object. + * [224728] Fixed an issue under X11 where QPrintDialog didn't update + the print-to-file state, if it was passed a QPrinter set up to + print PDF or PostScript. + +- QPrinter + * [252873] Fixed an issue with QPrinter::NativeFormat printers not + being valid. + * [248881] Fixed an issue under Windows where QPrinter::pageRect() returned + the wrong rect when QPrinter::fullPage() was set. + * [199271] Fixed an issue with QPrinter::setPrinterName()/printerName() + on Mac. + +- QSvg + * [253614] Fixed an issue with parsing the 'stroke-dasharray' SVG attribute. + +- QSvgIconEngine + * [251106] Fixed an issue that would cause QIcon::actualSize() to reparse + the SVG file for each acutalSize() call, until QIcon::pixmap() was called. + * [248848] Fixed an issue that would cause QIcon::pixmap() to reparse the + SVG file, even though there was a cached pixmap for that size available. **************************************************************************** * Database Drivers * @@ -202,17 +228,30 @@ Qt for Linux/X11 legacy freetype headers. [241361] Prevented asynchronous access to non-thread safe libfontconfig API. [244362] Worked around X server crash when calling XFillPolygon with more than -200000 points by falling back to raster paint engine. + 200000 points by falling back to raster paint engine. [250326] Titlebar wasn't shown on X11 with Qt::CustomizeWindowHint for fixed-size windows. [251925] Improved showing QMessageBox on small screens. [252042] Fixed the loading of the OpenSSL libraries on OpenBSD. +[255311] Fixed an issue with '-graphicssystem raster' on 8 and 16 bit X servers. +[252328] Fixed an issue when rendering old XLFD fonts on X11 with Xrender and + fontconfig enabled. +[248720] Fixed and issue with using '-graphicssystem raster' on X servers with + BGR color layout. +[196152] Fixed a problem with QPixmap::toImage() on big endian systems that + would cause the R and B channels to be swapped for 32 bit pixmaps. Qt for Windows -------------- +Fixed and issue with text rendering in 16 bit mode. + +[246196] Fixed an issue with clipped glyphs when rendering text with + certain fonts. [251259] Switching to another app left text cursor in line edits with QtMfc framework. +[253367] Fixed a memory leak when loading system icons on Windows. + Qt for Mac OS X --------------- @@ -220,6 +259,9 @@ Qt for Mac OS X [252176] Fix regression in drawing parts of pixmaps on Panther. [253402] Fix a crash when a Cocoa window that used to be a QWidget would get events after the QWidget was destroyed. +[249178] Fixed an issue with drawing text to QImages on Mac/Cocoa. +[250066] Fixed an issue that caused reparenting of QGLWidgets to output warnings + on Mac/Cocoa. Qt for Embedded Linux -- cgit v0.12 From f2b307342a0effed58436dd199a0d80c5e651755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Fri, 5 Jun 2009 17:48:37 +0200 Subject: Fixed typos. --- dist/changes-4.5.2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/changes-4.5.2 b/dist/changes-4.5.2 index 810c022..39082f6 100644 --- a/dist/changes-4.5.2 +++ b/dist/changes-4.5.2 @@ -236,7 +236,7 @@ legacy freetype headers. [255311] Fixed an issue with '-graphicssystem raster' on 8 and 16 bit X servers. [252328] Fixed an issue when rendering old XLFD fonts on X11 with Xrender and fontconfig enabled. -[248720] Fixed and issue with using '-graphicssystem raster' on X servers with +[248720] Fixed an issue with using '-graphicssystem raster' on X servers with BGR color layout. [196152] Fixed a problem with QPixmap::toImage() on big endian systems that would cause the R and B channels to be swapped for 32 bit pixmaps. @@ -244,7 +244,7 @@ legacy freetype headers. Qt for Windows -------------- -Fixed and issue with text rendering in 16 bit mode. +Fixed an issue with text rendering in 16 bit mode. [246196] Fixed an issue with clipped glyphs when rendering text with certain fonts. -- cgit v0.12 From 8411fe233021f8609250b7cf47353e3128521406 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Sat, 6 Jun 2009 23:17:29 +0200 Subject: Add a comment for the translator so the placeholders are described Reviewed-by: TrustMe --- tools/assistant/lib/qhelpdbreader.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/assistant/lib/qhelpdbreader.cpp b/tools/assistant/lib/qhelpdbreader.cpp index 76994a7..27bc4d7 100644 --- a/tools/assistant/lib/qhelpdbreader.cpp +++ b/tools/assistant/lib/qhelpdbreader.cpp @@ -92,6 +92,9 @@ bool QHelpDBReader::init() QSqlDatabase db = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), m_uniqueId); db.setDatabaseName(m_dbName); if (!db.open()) { + /*: The placeholders are: %1 - The name of the database which cannot be opened + %2 - The unique id for the connection + %3 - The actual error string */ m_error = tr("Cannot open database '%1' '%2': %3").arg(m_dbName, m_uniqueId, db.lastError().text()); QSqlDatabase::removeDatabase(m_uniqueId); return false; -- cgit v0.12 From 0fafad31feb518453c7c25b2e29a8b26d7018978 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Mon, 8 Jun 2009 07:53:58 +0200 Subject: Ensure that the manifest files are placed correctly If OBJECTS_DIR was empty then it would create a directory for the manifest files in the root directory. This is not desired as it should create a directory in the build directory instead. Reviewed-by: Marius Storm-Olsen --- mkspecs/features/win32/embed_manifest_dll.prf | 8 +++++--- mkspecs/features/win32/embed_manifest_exe.prf | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mkspecs/features/win32/embed_manifest_dll.prf b/mkspecs/features/win32/embed_manifest_dll.prf index 90d9a2b..76a8ed1 100644 --- a/mkspecs/features/win32/embed_manifest_dll.prf +++ b/mkspecs/features/win32/embed_manifest_dll.prf @@ -1,11 +1,13 @@ +MANIFEST_DIR = $$OBJECTS_DIR +isEmpty(MANIFEST_DIR):MANIFEST_DIR = . !if(plugin:no_plugin_manifest):if(win32-msvc2005|win32-msvc2008):!static:!equals(TEMPLATE_PREFIX, "vc"):equals(TEMPLATE, "lib") { NOPATH_TARGET = $$TARGET NOPATH_TARGET ~= s,\\ , ,q # Remove space escaping (NOPATH_TARGET is quoted) NOPATH_TARGET ~= s,\\,/,g # Change to single type separators NOPATH_TARGET ~= s,^(.*/)+,, # Remove all paths - QMAKE_LFLAGS += /MANIFEST $$quote(/MANIFESTFILE:\"$${OBJECTS_DIR}\\$${NOPATH_TARGET}.intermediate.manifest\") + QMAKE_LFLAGS += /MANIFEST $$quote(/MANIFESTFILE:\"$${MANIFEST_DIR}\\$${NOPATH_TARGET}.intermediate.manifest\") QMAKE_PREV_POST_LINK = $$QMAKE_POST_LINK - QMAKE_POST_LINK = $$quote(mt.exe -nologo -manifest \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" -outputresource:$(DESTDIR_TARGET);2$$escape_expand(\n\t)) + QMAKE_POST_LINK = $$quote(mt.exe -nologo -manifest \"$$replace(MANIFEST_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" -outputresource:$(DESTDIR_TARGET);2$$escape_expand(\n\t)) QMAKE_POST_LINK += $$QMAKE_PREV_POST_LINK - QMAKE_CLEAN += \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" + QMAKE_CLEAN += \"$$replace(MANIFEST_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" } diff --git a/mkspecs/features/win32/embed_manifest_exe.prf b/mkspecs/features/win32/embed_manifest_exe.prf index e1747f1..d2800a1 100644 --- a/mkspecs/features/win32/embed_manifest_exe.prf +++ b/mkspecs/features/win32/embed_manifest_exe.prf @@ -1,11 +1,13 @@ +MANIFEST_DIR = $$OBJECTS_DIR +isEmpty(MANIFEST_DIR):MANIFEST_DIR = . if(win32-msvc2005|win32-msvc2008):!equals(TEMPLATE_PREFIX, "vc"):equals(TEMPLATE, "app") { NOPATH_TARGET = $$TARGET NOPATH_TARGET ~= s,\\ , ,q # Remove space escaping (NOPATH_TARGET is quoted) NOPATH_TARGET ~= s,\\,/,g # Change to single type separators NOPATH_TARGET ~= s,^(.*/)+,, # Remove all paths - QMAKE_LFLAGS += /MANIFEST $$quote(/MANIFESTFILE:\"$${OBJECTS_DIR}\\$${NOPATH_TARGET}.intermediate.manifest\") + QMAKE_LFLAGS += /MANIFEST $$quote(/MANIFESTFILE:\"$${MANIFEST_DIR}\\$${NOPATH_TARGET}.intermediate.manifest\") QMAKE_PREV_POST_LINK = $$QMAKE_POST_LINK - QMAKE_POST_LINK = $$quote(mt.exe -nologo -manifest \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" -outputresource:$(DESTDIR_TARGET);1$$escape_expand(\n\t)) + QMAKE_POST_LINK = $$quote(mt.exe -nologo -manifest \"$$replace(MANIFEST_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" -outputresource:$(DESTDIR_TARGET);1$$escape_expand(\n\t)) QMAKE_POST_LINK += $$QMAKE_PREV_POST_LINK - QMAKE_CLEAN += \"$$replace(OBJECTS_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" + QMAKE_CLEAN += \"$$replace(MANIFEST_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" } -- cgit v0.12 From 3b2b9d727f0fadf607968c73003e7550c8bd0296 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Mon, 8 Jun 2009 08:03:17 +0200 Subject: Set the error to be HostUnreacheable if WSAEHOSTUNREACH is recieved This was a contribution sent via the public bugs channel. Task-number: 255161 Reviewed-by: Marius Storm-Olsen --- src/network/socket/qnativesocketengine_win.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp index b08d7b0..8c6cd31 100644 --- a/src/network/socket/qnativesocketengine_win.cpp +++ b/src/network/socket/qnativesocketengine_win.cpp @@ -570,6 +570,11 @@ bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &address, quin socketState = QAbstractSocket::UnconnectedState; break; } + if (value == WSAEHOSTUNREACH) { + setError(QAbstractSocket::NetworkError, HostUnreachableErrorString); + socketState = QAbstractSocket::UnconnectedState; + break; + } } // fall through } -- cgit v0.12 From 779bd72aaad2cd8cd5af23214cd812bf2e5528a7 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Mon, 8 Jun 2009 08:47:22 +0200 Subject: make moc-generated code compile again Needed due to commit 4acabb3abd0ff109b9abeedb6832f5b1c3e0cc4e --- src/tools/moc/moc.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 8ca2823..4629ac5 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -767,6 +767,8 @@ void Moc::generate(FILE *out) if (classList.size() && classList.first().classname == "Qt") fprintf(out, "#include \n"); + fprintf(out, "#include \n"); + fprintf(out, "#if !defined(Q_MOC_OUTPUT_REVISION)\n" "#error \"The header file '%s' doesn't include .\"\n", (const char *)fn); fprintf(out, "#elif Q_MOC_OUTPUT_REVISION != %d\n", mocOutputRevision); -- cgit v0.12 From 38a5b31a8ae87f5e833d7f4383af9dc4592bf122 Mon Sep 17 00:00:00 2001 From: Marius Storm-Olsen Date: Mon, 8 Jun 2009 09:12:10 +0200 Subject: New binary Fixes the no qconfig.h output issue in main Reviewed by: trustme --- configure.exe | Bin 856064 -> 847872 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/configure.exe b/configure.exe index 9da5c60..cfad2dd 100644 Binary files a/configure.exe and b/configure.exe differ -- cgit v0.12 From d3bda146c4076dce3e260b4ef47f6bbc2d191b25 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 8 Jun 2009 08:46:32 +0200 Subject: Use QT_USE_FAST_OPERATOR_PLUS and QT_USE_FAST_CONCATENATION in qdoc3. Reduces the number of qmalloc calls by 9% and reduces the instruction count as reported by valgrind by 2% in a release build. --- tools/qdoc3/qdoc3.pro | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/qdoc3/qdoc3.pro b/tools/qdoc3/qdoc3.pro index ead7b88..5438e5f 100644 --- a/tools/qdoc3/qdoc3.pro +++ b/tools/qdoc3/qdoc3.pro @@ -1,6 +1,8 @@ DEFINES += QDOC2_COMPAT DEFINES += QT_NO_CAST_TO_ASCII #DEFINES += QT_NO_CAST_FROM_ASCII +DEFINES += QT_USE_FAST_OPERATOR_PLUS +DEFINES += QT_USE_FAST_CONCATENATION QT = core xml CONFIG += console -- cgit v0.12 From ac30cbdceac428fa206a939e5d820b2bd77227fc Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 8 Jun 2009 09:14:19 +0200 Subject: Make QCharRef known to QStringBuilder. --- src/corelib/tools/qstringbuilder.cpp | 4 ++-- src/corelib/tools/qstringbuilder.h | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/corelib/tools/qstringbuilder.cpp b/src/corelib/tools/qstringbuilder.cpp index 4f24f76..03d8160 100644 --- a/src/corelib/tools/qstringbuilder.cpp +++ b/src/corelib/tools/qstringbuilder.cpp @@ -111,7 +111,7 @@ The QStringBuilder class is not to be used explicitly in user code. Instances of the class are created as return values of the operator%() function, acting on objects of type \c QString, \c QLatin1String, - \c QLatin1Literal, \c \QStringRef, \c QChar, + \c QLatin1Literal, \c \QStringRef, \c QChar, \c QCharRef, \c QLatin1Char, and \c char. Concatenating strings with operator%() generally yields better @@ -130,6 +130,6 @@ This function is usable with arguments of type \c QString, \c QLatin1String, \c QLatin1Literal, \c QStringRef, - \c QChar, \c QLatin1Char, and \c char. + \c QChar, \c QCharRef, \c QLatin1Char, and \c char. */ diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h index 7b16197..2c31476 100644 --- a/src/corelib/tools/qstringbuilder.h +++ b/src/corelib/tools/qstringbuilder.h @@ -122,6 +122,16 @@ template <> struct QConcatenable } }; +template <> struct QConcatenable +{ + typedef QCharRef type; + static int size(const QCharRef &) { return 1; } + static inline void appendTo(const QCharRef &c, QChar *&out) + { + *out++ = QChar(c); + } +}; + template <> struct QConcatenable { typedef QLatin1String type; @@ -173,8 +183,8 @@ template <> struct QConcatenable template struct QConcatenable { typedef char type[N]; - static int size(const char *) { return N - 1; } - static inline void appendTo(const char *a, QChar *&out) + static int size(const char[N]) { return N - 1; } + static inline void appendTo(const char a[N], QChar *&out) { for (int i = 0; i < N - 1; ++i) *out++ = QLatin1Char(a[i]); -- cgit v0.12 From eb8789ba06949974eb4108b115a30f96e1500a81 Mon Sep 17 00:00:00 2001 From: Ritt Konstantin Date: Mon, 8 Jun 2009 10:42:42 +0200 Subject: Fix QT_NO_DATASTREAM macro checks and improve readability Some checks where in the wrong locations, and some endifs where hard to read. Merge-request: 611 Reviewed-by: Marius Storm-Olsen --- src/corelib/io/qdatastream.h | 3 +-- src/corelib/kernel/qmetatype.cpp | 4 ++-- src/corelib/kernel/qmetatype.h | 2 +- src/corelib/plugin/quuid.cpp | 2 +- src/corelib/tools/qbitarray.cpp | 5 +++-- src/corelib/tools/qbytearray.cpp | 5 +++-- src/corelib/tools/qchar.cpp | 2 +- src/corelib/tools/qlocale.cpp | 2 +- src/corelib/tools/qregexp.cpp | 2 +- src/corelib/tools/qsize.h | 4 ++++ src/gui/embedded/qkbd_qws_p.h | 3 ++- src/gui/image/qimage.cpp | 2 +- src/gui/image/qpicture.cpp | 2 ++ src/gui/image/qpicture.h | 2 ++ src/gui/image/qpixmap.cpp | 2 +- src/gui/itemviews/qheaderview.cpp | 10 ++++++---- src/gui/itemviews/qlistwidget.cpp | 3 +++ src/gui/itemviews/qstandarditemmodel.cpp | 2 +- src/gui/itemviews/qtreewidget.cpp | 3 +-- src/gui/kernel/qlayout.cpp | 4 +--- src/gui/kernel/qpalette.cpp | 4 ++-- src/gui/kernel/qsizepolicy.h | 2 ++ src/gui/painting/qcolor.cpp | 4 +--- src/gui/painting/qfixed_p.h | 2 ++ src/gui/painting/qmatrix.h | 2 ++ src/gui/painting/qpainterpath.cpp | 2 +- src/gui/painting/qpolygon.cpp | 2 +- src/gui/painting/qtransform.h | 2 ++ src/gui/text/qtextformat.cpp | 4 ++++ src/gui/text/qtextformat.h | 4 ++++ 30 files changed, 59 insertions(+), 33 deletions(-) diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h index ec5780c..077e720 100644 --- a/src/corelib/io/qdatastream.h +++ b/src/corelib/io/qdatastream.h @@ -65,9 +65,8 @@ template class QSet; template class QHash; template class QMap; -class QDataStreamPrivate; - #ifndef QT_NO_DATASTREAM +class QDataStreamPrivate; class Q_CORE_EXPORT QDataStream { public: diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index a0b954f..6b40f46 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -360,7 +360,7 @@ void QMetaType::registerStreamOperators(const char *typeName, SaveOperator saveO inf.saveOp = saveOp; inf.loadOp = loadOp; } -#endif +#endif // QT_NO_DATASTREAM /*! Returns the type name associated with the given \a type, or 0 if no @@ -885,7 +885,7 @@ bool QMetaType::load(QDataStream &stream, int type, void *data) } return true; } -#endif +#endif // QT_NO_DATASTREAM /*! Returns a copy of \a copy, assuming it is of type \a type. If \a diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index be8a667..22214a4 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -183,7 +183,7 @@ void qRegisterMetaTypeStreamOperators(const char *typeName QMetaType::registerStreamOperators(typeName, reinterpret_cast(sptr), reinterpret_cast(lptr)); } -#endif +#endif // QT_NO_DATASTREAM template struct QMetaTypeId diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index 3e05d28..cee8bf7 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -405,7 +405,7 @@ QDataStream &operator>>(QDataStream &s, QUuid &id) } return s; } -#endif +#endif // QT_NO_DATASTREAM /*! Returns true if this is the null UUID diff --git a/src/corelib/tools/qbitarray.cpp b/src/corelib/tools/qbitarray.cpp index a947ab5..591cfa9 100644 --- a/src/corelib/tools/qbitarray.cpp +++ b/src/corelib/tools/qbitarray.cpp @@ -653,6 +653,7 @@ QBitArray operator^(const QBitArray &a1, const QBitArray &a2) QBitArray stream functions *****************************************************************************/ +#ifndef QT_NO_DATASTREAM /*! \relates QBitArray @@ -660,7 +661,7 @@ QBitArray operator^(const QBitArray &a1, const QBitArray &a2) \sa \link datastreamformat.html Format of the QDataStream operators \endlink */ -#ifndef QT_NO_DATASTREAM + QDataStream &operator<<(QDataStream &out, const QBitArray &ba) { quint32 len = ba.size(); @@ -713,7 +714,7 @@ QDataStream &operator>>(QDataStream &in, QBitArray &ba) *ba.d.data() = ba.d.size() * 8 - len; return in; } -#endif +#endif // QT_NO_DATASTREAM /*! \fn DataPtr &QBitArray::data_ptr() diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp index 49dd52d..cbd9d4e 100644 --- a/src/corelib/tools/qbytearray.cpp +++ b/src/corelib/tools/qbytearray.cpp @@ -2591,6 +2591,8 @@ void QByteArray::clear() d->ref.ref(); } +#ifndef QT_NO_DATASTREAM + /*! \relates QByteArray Writes byte array \a ba to the stream \a out and returns a reference @@ -2598,7 +2600,6 @@ void QByteArray::clear() \sa {Format of the QDataStream operators} */ -#ifndef QT_NO_DATASTREAM QDataStream &operator<<(QDataStream &out, const QByteArray &ba) { @@ -2641,7 +2642,7 @@ QDataStream &operator>>(QDataStream &in, QByteArray &ba) return in; } -#endif //QT_NO_DATASTREAM +#endif // QT_NO_DATASTREAM /*! \fn bool QByteArray::operator==(const QString &str) const diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp index a940cda..250dad0 100644 --- a/src/corelib/tools/qchar.cpp +++ b/src/corelib/tools/qchar.cpp @@ -1321,7 +1321,7 @@ QDataStream &operator>>(QDataStream &in, QChar &chr) chr.unicode() = ushort(u); return in; } -#endif +#endif // QT_NO_DATASTREAM /*! \fn ushort & QChar::unicode() diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index 8c740bd..00132d7 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -1533,7 +1533,7 @@ QDataStream &operator>>(QDataStream &ds, QLocale &l) l = QLocale(s); return ds; } -#endif +#endif // QT_NO_DATASTREAM /*! diff --git a/src/corelib/tools/qregexp.cpp b/src/corelib/tools/qregexp.cpp index e1c3921..9c62c7a 100644 --- a/src/corelib/tools/qregexp.cpp +++ b/src/corelib/tools/qregexp.cpp @@ -4065,6 +4065,6 @@ QDataStream &operator>>(QDataStream &in, QRegExp ®Exp) regExp = newRegExp; return in; } -#endif +#endif // QT_NO_DATASTREAM QT_END_NAMESPACE diff --git a/src/corelib/tools/qsize.h b/src/corelib/tools/qsize.h index 34a6c99..237625e 100644 --- a/src/corelib/tools/qsize.h +++ b/src/corelib/tools/qsize.h @@ -98,8 +98,10 @@ Q_DECLARE_TYPEINFO(QSize, Q_MOVABLE_TYPE); QSize stream functions *****************************************************************************/ +#ifndef QT_NO_DATASTREAM Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QSize &); Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QSize &); +#endif /***************************************************************************** @@ -249,8 +251,10 @@ Q_DECLARE_TYPEINFO(QSizeF, Q_MOVABLE_TYPE); QSizeF stream functions *****************************************************************************/ +#ifndef QT_NO_DATASTREAM Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QSizeF &); Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QSizeF &); +#endif /***************************************************************************** diff --git a/src/gui/embedded/qkbd_qws_p.h b/src/gui/embedded/qkbd_qws_p.h index 3224da2..2ef1d0c 100644 --- a/src/gui/embedded/qkbd_qws_p.h +++ b/src/gui/embedded/qkbd_qws_p.h @@ -105,6 +105,7 @@ namespace QWSKeyboard { }; }; +#ifndef QT_NO_DATASTREAM inline QDataStream &operator>>(QDataStream &ds, QWSKeyboard::Mapping &m) { return ds >> m.keycode >> m.unicode >> m.qtcode >> m.modifiers >> m.flags >> m.special; @@ -124,6 +125,6 @@ inline QDataStream &operator<<(QDataStream &ds, const QWSKeyboard::Composing &c) { return ds << c.first << c.second << c.result; } - +#endif // QT_NO_DATASTREAM #endif // QWSKEYBOARD_H diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index c1c5631..0377ca7 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -4763,7 +4763,7 @@ QDataStream &operator>>(QDataStream &s, QImage &image) image = QImageReader(s.device(), 0).read(); return s; } -#endif +#endif // QT_NO_DATASTREAM #ifdef QT3_SUPPORT diff --git a/src/gui/image/qpicture.cpp b/src/gui/image/qpicture.cpp index 92023e0..23baa96 100644 --- a/src/gui/image/qpicture.cpp +++ b/src/gui/image/qpicture.cpp @@ -1143,6 +1143,7 @@ QPaintEngine *QPicture::paintEngine() const QPicture stream functions *****************************************************************************/ +#ifndef QT_NO_DATASTREAM /*! \relates QPicture @@ -1188,6 +1189,7 @@ QDataStream &operator>>(QDataStream &s, QPicture &r) r.d_func()->resetFormat(); return s; } +#endif // QT_NO_DATASTREAM #ifndef QT_NO_PICTUREIO diff --git a/src/gui/image/qpicture.h b/src/gui/image/qpicture.h index fe86e8d..edfac71 100644 --- a/src/gui/image/qpicture.h +++ b/src/gui/image/qpicture.h @@ -184,8 +184,10 @@ private: QPicture stream functions *****************************************************************************/ +#ifndef QT_NO_DATASTREAM Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QPicture &); Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QPicture &); +#endif #endif // QT_NO_PICTURE diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp index 8ed9e93..f6b5de2 100644 --- a/src/gui/image/qpixmap.cpp +++ b/src/gui/image/qpixmap.cpp @@ -1317,7 +1317,7 @@ QDataStream &operator>>(QDataStream &stream, QPixmap &pixmap) return stream; } -#endif //QT_NO_DATASTREAM +#endif // QT_NO_DATASTREAM #ifdef QT3_SUPPORT Q_GUI_EXPORT void copyBlt(QPixmap *dst, int dx, int dy, diff --git a/src/gui/itemviews/qheaderview.cpp b/src/gui/itemviews/qheaderview.cpp index ad93922..d28c08a 100644 --- a/src/gui/itemviews/qheaderview.cpp +++ b/src/gui/itemviews/qheaderview.cpp @@ -62,9 +62,11 @@ #ifndef QT_NO_DATASTREAM #include +#endif QT_BEGIN_NAMESPACE +#ifndef QT_NO_DATASTREAM QDataStream &operator<<(QDataStream &out, const QHeaderViewPrivate::SectionSpan &span) { span.write(out); @@ -76,7 +78,7 @@ QDataStream &operator>>(QDataStream &in, QHeaderViewPrivate::SectionSpan &span) span.read(in); return in; } -#endif +#endif // QT_NO_DATASTREAM /*! @@ -1535,7 +1537,7 @@ bool QHeaderView::restoreState(const QByteArray &state) } return false; } -#endif +#endif // QT_NO_DATASTREAM /*! \reimp @@ -3571,9 +3573,9 @@ bool QHeaderViewPrivate::read(QDataStream &in) return true; } -QT_END_NAMESPACE +#endif // QT_NO_DATASTREAM -#endif // QT_NO_DATASTREAEM +QT_END_NAMESPACE #endif // QT_NO_ITEMVIEWS diff --git a/src/gui/itemviews/qlistwidget.cpp b/src/gui/itemviews/qlistwidget.cpp index bf3b43c..e1e509d 100644 --- a/src/gui/itemviews/qlistwidget.cpp +++ b/src/gui/itemviews/qlistwidget.cpp @@ -711,6 +711,7 @@ void QListWidgetItem::write(QDataStream &out) const { out << d->values; } +#endif // QT_NO_DATASTREAM /*! \since 4.1 @@ -745,6 +746,8 @@ QListWidgetItem &QListWidgetItem::operator=(const QListWidgetItem &other) return *this; } +#ifndef QT_NO_DATASTREAM + /*! \relates QListWidgetItem diff --git a/src/gui/itemviews/qstandarditemmodel.cpp b/src/gui/itemviews/qstandarditemmodel.cpp index 10aac9a..d8adbd2 100644 --- a/src/gui/itemviews/qstandarditemmodel.cpp +++ b/src/gui/itemviews/qstandarditemmodel.cpp @@ -1938,7 +1938,7 @@ QDataStream &operator<<(QDataStream &out, const QStandardItem &item) return out; } -#endif // !QT_NO_DATASTREAM +#endif // QT_NO_DATASTREAM /*! \class QStandardItemModel diff --git a/src/gui/itemviews/qtreewidget.cpp b/src/gui/itemviews/qtreewidget.cpp index 6103225..a2bfe45 100644 --- a/src/gui/itemviews/qtreewidget.cpp +++ b/src/gui/itemviews/qtreewidget.cpp @@ -1827,6 +1827,7 @@ void QTreeWidgetItem::write(QDataStream &out) const { out << values << d->display; } +#endif // QT_NO_DATASTREAM /*! \since 4.1 @@ -1863,8 +1864,6 @@ QTreeWidgetItem &QTreeWidgetItem::operator=(const QTreeWidgetItem &other) return *this; } -#endif // QT_NO_DATASTREAM - /*! Appends the \a child item to the list of children. diff --git a/src/gui/kernel/qlayout.cpp b/src/gui/kernel/qlayout.cpp index 4463aab..0a233d5 100644 --- a/src/gui/kernel/qlayout.cpp +++ b/src/gui/kernel/qlayout.cpp @@ -1583,8 +1583,6 @@ QDataStream &operator>>(QDataStream &stream, QSizePolicy &policy) { return stream >> policy.data; } - -#endif - +#endif // QT_NO_DATASTREAM QT_END_NAMESPACE diff --git a/src/gui/kernel/qpalette.cpp b/src/gui/kernel/qpalette.cpp index 6541510..18a2142 100644 --- a/src/gui/kernel/qpalette.cpp +++ b/src/gui/kernel/qpalette.cpp @@ -125,7 +125,7 @@ QDataStream &operator>>(QDataStream &s, QColorGroup &g) { return qt_stream_in_qcolorgroup(s, g); } -#endif +#endif // QT_NO_DATASTREAM /*! Constructs a palette with the specified \a active, \a disabled and @@ -158,7 +158,7 @@ void QPalette::setColorGroup(ColorGroup cg, const QColorGroup &g) g.brush(LinkVisited), g.brush(ToolTipBase), g.brush(ToolTipText)); } -#endif +#endif // QT3_SUPPORT /*! \fn const QColor &QPalette::color(ColorRole role) const diff --git a/src/gui/kernel/qsizepolicy.h b/src/gui/kernel/qsizepolicy.h index 652fda1..32b3b4f 100644 --- a/src/gui/kernel/qsizepolicy.h +++ b/src/gui/kernel/qsizepolicy.h @@ -203,9 +203,11 @@ private: Q_DECLARE_OPERATORS_FOR_FLAGS(QSizePolicy::ControlTypes) +#ifndef QT_NO_DATASTREAM // implemented in qlayout.cpp Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QSizePolicy &); Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QSizePolicy &); +#endif inline void QSizePolicy::transpose() { Policy hData = horizontalPolicy(); diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp index b1fe3aa..fa833db 100644 --- a/src/gui/painting/qcolor.cpp +++ b/src/gui/painting/qcolor.cpp @@ -2116,9 +2116,7 @@ QDataStream &operator>>(QDataStream &stream, QColor &color) return stream; } -#endif - - +#endif // QT_NO_DATASTREAM /***************************************************************************** diff --git a/src/gui/painting/qfixed_p.h b/src/gui/painting/qfixed_p.h index 2e49615..c89d97a 100644 --- a/src/gui/painting/qfixed_p.h +++ b/src/gui/painting/qfixed_p.h @@ -181,8 +181,10 @@ inline bool operator<(int i, const QFixed &f) { return (i<<6) < f.value(); } inline bool operator>(const QFixed &f, int i) { return f.value() > (i<<6); } inline bool operator>(int i, const QFixed &f) { return (i<<6) > f.value(); } +#ifndef QT_NO_DEBUG_STREAM inline QDebug &operator<<(QDebug &dbg, const QFixed &f) { return dbg << f.toReal(); } +#endif struct QFixedPoint { QFixed x; diff --git a/src/gui/painting/qmatrix.h b/src/gui/painting/qmatrix.h index 1e5fbb4..1df2395 100644 --- a/src/gui/painting/qmatrix.h +++ b/src/gui/painting/qmatrix.h @@ -169,8 +169,10 @@ inline bool QMatrix::isIdentity() const QMatrix stream functions *****************************************************************************/ +#ifndef QT_NO_DATASTREAM Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QMatrix &); Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QMatrix &); +#endif #ifndef QT_NO_DEBUG_STREAM Q_GUI_EXPORT QDebug operator<<(QDebug, const QMatrix &); diff --git a/src/gui/painting/qpainterpath.cpp b/src/gui/painting/qpainterpath.cpp index bd91dfc..e1bb317 100644 --- a/src/gui/painting/qpainterpath.cpp +++ b/src/gui/painting/qpainterpath.cpp @@ -2366,7 +2366,7 @@ QDataStream &operator>>(QDataStream &s, QPainterPath &p) p.d_func()->dirtyControlBounds = true; return s; } -#endif +#endif // QT_NO_DATASTREAM /******************************************************************************* diff --git a/src/gui/painting/qpolygon.cpp b/src/gui/painting/qpolygon.cpp index 769c095..b79c288 100644 --- a/src/gui/painting/qpolygon.cpp +++ b/src/gui/painting/qpolygon.cpp @@ -742,7 +742,7 @@ QDataStream &operator>>(QDataStream &s, QPolygon &a) QVector &v = a; return s >> v; } -#endif +#endif // QT_NO_DATASTREAM /***************************************************************************** QPolygonF stream functions diff --git a/src/gui/painting/qtransform.h b/src/gui/painting/qtransform.h index aac7c31..a5002ca 100644 --- a/src/gui/painting/qtransform.h +++ b/src/gui/painting/qtransform.h @@ -332,8 +332,10 @@ inline QTransform &QTransform::operator-=(qreal num) } /****** stream functions *******************/ +#ifndef QT_NO_DATASTREAM Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QTransform &); Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QTransform &); +#endif #ifndef QT_NO_DEBUG_STREAM Q_GUI_EXPORT QDebug operator<<(QDebug, const QTransform &); diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp index 38ac4ca..d93f084 100644 --- a/src/gui/text/qtextformat.cpp +++ b/src/gui/text/qtextformat.cpp @@ -142,6 +142,7 @@ QTextLength::operator QVariant() const return QVariant(QVariant::TextLength, this); } +#ifndef QT_NO_DATASTREAM QDataStream &operator<<(QDataStream &stream, const QTextLength &length) { return stream << qint32(length.lengthType) << double(length.fixedValueOrPercentage); @@ -156,6 +157,7 @@ QDataStream &operator>>(QDataStream &stream, QTextLength &length) length.lengthType = QTextLength::Type(type); return stream; } +#endif // QT_NO_DATASTREAM class QTextFormatPrivate : public QSharedData { @@ -374,6 +376,7 @@ void QTextFormatPrivate::recalcFont() const fontDirty = false; } +#ifndef QT_NO_DATASTREAM Q_GUI_EXPORT QDataStream &operator<<(QDataStream &stream, const QTextFormat &fmt) { stream << fmt.format_type << fmt.properties(); @@ -396,6 +399,7 @@ Q_GUI_EXPORT QDataStream &operator>>(QDataStream &stream, QTextFormat &fmt) return stream; } +#endif // QT_NO_DATASTREAM /*! \class QTextFormat diff --git a/src/gui/text/qtextformat.h b/src/gui/text/qtextformat.h index 8eaeeb1..96c0739 100644 --- a/src/gui/text/qtextformat.h +++ b/src/gui/text/qtextformat.h @@ -76,8 +76,10 @@ class QTextCursor; class QTextDocument; class QTextLength; +#ifndef QT_NO_DATASTREAM Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QTextLength &); Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QTextLength &); +#endif class Q_GUI_EXPORT QTextLength { @@ -119,8 +121,10 @@ private: inline QTextLength::QTextLength(Type atype, qreal avalue) : lengthType(atype), fixedValueOrPercentage(avalue) {} +#ifndef QT_NO_DATASTREAM Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QTextFormat &); Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QTextFormat &); +#endif class Q_GUI_EXPORT QTextFormat { -- cgit v0.12 From ec110c41175daae436d49b1e2369f80587ba5b65 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 8 Jun 2009 10:55:45 +0200 Subject: My changes for 4.5.2 --- dist/changes-4.5.2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dist/changes-4.5.2 b/dist/changes-4.5.2 index 39082f6..6049a4d 100644 --- a/dist/changes-4.5.2 +++ b/dist/changes-4.5.2 @@ -304,6 +304,10 @@ Qt for Windows CE QDesignerFormWindowCursor::setProperty(). * [253539] Prevent crash in Designer with the Cocoa port when when using a scroll wheel to change a property. + * [252333] Fixed a regression crash in uic triggered when icon was set with different modes + than normal off. + * [252414, 252416, 252502] Fixed a crash in case of setting invalid point size + of font property in property editor - Linguist - Linguist GUI -- cgit v0.12 From 6a2202b544e3d7809312f74b0cf0b2b392bd78b7 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Mon, 8 Jun 2009 10:53:05 +0200 Subject: Doc typo fix in QSslSocket Reviewed-by: TrustMe --- src/network/ssl/qsslsocket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp index ea64042..cf2512e 100644 --- a/src/network/ssl/qsslsocket.cpp +++ b/src/network/ssl/qsslsocket.cpp @@ -450,7 +450,7 @@ QSslSocket::SslMode QSslSocket::mode() const Returns true if the socket is encrypted; otherwise, false is returned. An encrypted socket encrypts all data that is written by calling write() - or putChar() before the data is written to the network, and descrypts all + or putChar() before the data is written to the network, and decrypts all incoming data as the data is received from the network, before you call read(), readLine() or getChar(). -- cgit v0.12 From 61d1dcea0efa6b0809639b781bb49baf252b3aad Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Mon, 8 Jun 2009 09:09:29 +0200 Subject: Mac: play music from CD does not work in Phonon ...because it was never implemented. This patch does that. Task-number: 255377 --- src/3rdparty/phonon/qt7/mediaobject.h | 18 ++- src/3rdparty/phonon/qt7/mediaobject.mm | 147 +++++++++++++-------- src/3rdparty/phonon/qt7/quicktimemetadata.h | 8 +- src/3rdparty/phonon/qt7/quicktimemetadata.mm | 41 ++++-- src/3rdparty/phonon/qt7/quicktimevideoplayer.h | 19 ++- src/3rdparty/phonon/qt7/quicktimevideoplayer.mm | 163 ++++++++++++++++++++++-- 6 files changed, 313 insertions(+), 83 deletions(-) diff --git a/src/3rdparty/phonon/qt7/mediaobject.h b/src/3rdparty/phonon/qt7/mediaobject.h index 27949ec..d59ee77 100644 --- a/src/3rdparty/phonon/qt7/mediaobject.h +++ b/src/3rdparty/phonon/qt7/mediaobject.h @@ -38,7 +38,10 @@ namespace QT7 class MediaObjectAudioNode; class MediaObject : public MediaNode, - public Phonon::MediaObjectInterface, public Phonon::AddonInterface + public Phonon::MediaObjectInterface +#ifndef QT_NO_PHONON_MEDIACONTROLLER + , public Phonon::AddonInterface +#endif { Q_OBJECT Q_INTERFACES(Phonon::MediaObjectInterface Phonon::AddonInterface) @@ -105,6 +108,16 @@ namespace QT7 void metaDataChanged(QMultiMap); void currentSourceChanged(const MediaSource &newSource); + // Add-on interface: + void availableSubtitlesChanged(); + void availableAudioChannelsChanged(); + void titleChanged(int); + void availableTitlesChanged(int); + void chapterChanged(int); + void availableChaptersChanged(int); + void angleChanged(int); + void availableAnglesChanged(int); + protected: void mediaNodeEvent(const MediaNodeEvent *event); bool event(QEvent *event); @@ -118,7 +131,6 @@ namespace QT7 QuickTimeVideoPlayer *m_nextVideoPlayer; QuickTimeAudioPlayer *m_nextAudioPlayer; MediaObjectAudioNode *m_mediaObjectAudioNode; - QuickTimeMetaData *m_metaData; qint32 m_tickInterval; qint32 m_transitionTime; @@ -133,6 +145,7 @@ namespace QT7 bool m_waitNextSwap; int m_swapTimeLeft; QTime m_swapTime; + bool m_autoplayTitles; void synchAudioVideo(); void updateCurrentTime(); @@ -154,6 +167,7 @@ namespace QT7 void inspectVideoGraphRecursive(MediaNode *node, int &effectCount, int &outputCount); void inspectGraph(); bool isCrossFading(); + void setCurrentTrack(int track); QString m_errorString; Phonon::ErrorType m_errorType; diff --git a/src/3rdparty/phonon/qt7/mediaobject.mm b/src/3rdparty/phonon/qt7/mediaobject.mm index 002c337..95859ef 100644 --- a/src/3rdparty/phonon/qt7/mediaobject.mm +++ b/src/3rdparty/phonon/qt7/mediaobject.mm @@ -46,7 +46,6 @@ MediaObject::MediaObject(QObject *parent) : MediaNode(AudioSource | VideoSource, m_mediaObjectAudioNode = new MediaObjectAudioNode(m_audioPlayer, m_nextAudioPlayer); setAudioNode(m_mediaObjectAudioNode); - m_metaData = new QuickTimeMetaData(); m_audioGraph = new AudioGraph(this); m_tickInterval = 0; @@ -55,6 +54,7 @@ MediaObject::MediaObject(QObject *parent) : MediaNode(AudioSource | VideoSource, m_transitionTime = 0; m_percentageLoaded = 0; m_waitNextSwap = false; + m_autoplayTitles = true; m_audioEffectCount = 0; m_audioOutputCount = 0; m_videoEffectCount = 0; @@ -70,13 +70,12 @@ MediaObject::MediaObject(QObject *parent) : MediaNode(AudioSource | VideoSource, } MediaObject::~MediaObject() -{ +{ // m_mediaObjectAudioNode is owned by super class. m_audioPlayer->unsetVideoPlayer(); m_nextAudioPlayer->unsetVideoPlayer(); delete m_videoPlayer; delete m_nextVideoPlayer; - delete m_metaData; checkForError(); } @@ -122,7 +121,7 @@ void MediaObject::inspectGraph() // Inspect the graph to check wether there are any // effects or outputs connected. This will have // influence on the audio system and video system that ends up beeing used: - int prevVideoOutputCount = m_videoOutputCount; + int prevVideoOutputCount = m_videoOutputCount; m_audioEffectCount = 0; m_audioOutputCount = 0; m_videoEffectCount = 0; @@ -134,7 +133,7 @@ void MediaObject::inspectGraph() if (m_videoOutputCount != prevVideoOutputCount){ MediaNodeEvent e1(MediaNodeEvent::VideoOutputCountChanged, &m_videoOutputCount); notify(&e1); - } + } } void MediaObject::setupAudioSystem() @@ -167,14 +166,14 @@ void MediaObject::setupAudioSystem() if (newAudioSystem == m_audioSystem) return; - + // Enable selected audio system: - m_audioSystem = newAudioSystem; + m_audioSystem = newAudioSystem; switch (newAudioSystem){ case AS_Silent: m_audioGraph->stop(); m_videoPlayer->enableAudio(false); - m_nextVideoPlayer->enableAudio(false); + m_nextVideoPlayer->enableAudio(false); m_audioPlayer->enableAudio(false); m_nextAudioPlayer->enableAudio(false); break; @@ -214,28 +213,28 @@ void MediaObject::setSource(const MediaSource &source) IMPLEMENTED; PhononAutoReleasePool pool; setState(Phonon::LoadingState); - + // Save current state for event/signal handling below: bool prevHasVideo = m_videoPlayer->hasVideo(); qint64 prevTotalTime = totalTime(); + int prevTrackCount = m_videoPlayer->trackCount(); m_waitNextSwap = false; - + // Cancel cross-fade if any: m_nextVideoPlayer->pause(); m_nextAudioPlayer->pause(); m_mediaObjectAudioNode->cancelCrossFade(); - + // Set new source: m_audioPlayer->unsetVideoPlayer(); m_videoPlayer->setMediaSource(source); m_audioPlayer->setVideoPlayer(m_videoPlayer); - m_metaData->setVideo(m_videoPlayer); - m_audioGraph->updateStreamSpecifications(); + m_audioGraph->updateStreamSpecifications(); m_nextAudioPlayer->unsetVideoPlayer(); - m_nextVideoPlayer->unsetVideo(); + m_nextVideoPlayer->unsetCurrentMediaSource(); m_currentTime = 0; - + // Emit/notify information about the new source: QRect videoRect = m_videoPlayer->videoRect(); MediaNodeEvent e1(MediaNodeEvent::VideoFrameSizeChanged, &videoRect); @@ -246,12 +245,14 @@ void MediaObject::setSource(const MediaSource &source) updateVideo(emptyFrame); emit currentSourceChanged(source); - emit metaDataChanged(m_metaData->metaData()); + emit metaDataChanged(m_videoPlayer->metaData()); if (prevHasVideo != m_videoPlayer->hasVideo()) - emit hasVideoChanged(m_videoPlayer->hasVideo()); + emit hasVideoChanged(m_videoPlayer->hasVideo()); if (prevTotalTime != totalTime()) - emit totalTimeChanged(totalTime()); + emit totalTimeChanged(totalTime()); + if (prevTrackCount != m_videoPlayer->trackCount()) + emit availableTitlesChanged(m_videoPlayer->trackCount()); if (checkForError()) return; if (!m_videoPlayer->isDrmAuthorized()) @@ -260,7 +261,7 @@ void MediaObject::setSource(const MediaSource &source) return; if (!m_videoPlayer->canPlayMedia()) SET_ERROR("Cannot play media.", FATAL_ERROR) - + // The state might have changed from LoadingState // as a response to an error state change. So we // need to check it before stopping: @@ -287,28 +288,30 @@ void MediaObject::swapCurrentWithNext(qint32 transitionTime) // Save current state for event/signal handling below: bool prevHasVideo = m_videoPlayer->hasVideo(); qint64 prevTotalTime = totalTime(); + int prevTrackCount = m_videoPlayer->trackCount(); qSwap(m_audioPlayer, m_nextAudioPlayer); qSwap(m_videoPlayer, m_nextVideoPlayer); m_mediaObjectAudioNode->startCrossFade(transitionTime); m_audioGraph->updateStreamSpecifications(); - m_metaData->setVideo(m_videoPlayer); m_waitNextSwap = false; m_currentTime = 0; - + // Emit/notify information about the new source: QRect videoRect = m_videoPlayer->videoRect(); MediaNodeEvent e1(MediaNodeEvent::VideoFrameSizeChanged, &videoRect); notify(&e1); emit currentSourceChanged(m_videoPlayer->mediaSource()); - emit metaDataChanged(m_metaData->metaData()); + emit metaDataChanged(m_videoPlayer->metaData()); if (prevHasVideo != m_videoPlayer->hasVideo()) - emit hasVideoChanged(m_videoPlayer->hasVideo()); + emit hasVideoChanged(m_videoPlayer->hasVideo()); if (prevTotalTime != totalTime()) emit totalTimeChanged(totalTime()); + if (prevTrackCount != m_videoPlayer->trackCount()) + emit availableTitlesChanged(m_videoPlayer->trackCount()); if (checkForError()) return; if (!m_videoPlayer->isDrmAuthorized()) @@ -332,15 +335,15 @@ void MediaObject::updateTimer(int &timer, int interval) if (timer) killTimer(timer); timer = 0; - if (interval >= 0) - timer = startTimer(interval); + if (interval >= 0) + timer = startTimer(interval); } void MediaObject::play_internal() { // Play main audio/video: m_videoPlayer->play(); - m_audioPlayer->play(); + m_audioPlayer->play(); updateLipSynch(0); // Play old audio/video to finish cross-fade: if (m_nextVideoPlayer->currentTime() > 0){ @@ -382,7 +385,7 @@ void MediaObject::play() if (!m_videoPlayer->canPlayMedia()) return; if (!setState(Phonon::PlayingState)) - return; + return; if (m_audioSystem == AS_Graph){ m_audioGraph->start(); m_mediaObjectAudioNode->setMute(true); @@ -423,7 +426,7 @@ void MediaObject::stop() if (!setState(Phonon::StoppedState)) return; m_waitNextSwap = false; - m_nextVideoPlayer->unsetVideo(); + m_nextVideoPlayer->unsetCurrentMediaSource(); m_nextAudioPlayer->unsetVideoPlayer(); pause_internal(); seek(0); @@ -435,9 +438,9 @@ void MediaObject::seek(qint64 milliseconds) IMPLEMENTED; if (m_state == Phonon::ErrorState) return; - + // Stop cross-fade if any: - m_nextVideoPlayer->unsetVideo(); + m_nextVideoPlayer->unsetCurrentMediaSource(); m_nextAudioPlayer->unsetVideoPlayer(); m_mediaObjectAudioNode->cancelCrossFade(); @@ -446,7 +449,7 @@ void MediaObject::seek(qint64 milliseconds) m_videoPlayer->seek(milliseconds); m_audioPlayer->seek(m_videoPlayer->currentTime()); m_mediaObjectAudioNode->setMute(false); - + // Update time and cancel pending swap: if (m_currentTime < m_videoPlayer->duration()) m_waitNextSwap = false; @@ -557,7 +560,7 @@ bool MediaObject::isSeekable() const qint64 MediaObject::currentTime() const { IMPLEMENTED_SILENT; - const_cast(this)->updateCurrentTime(); + const_cast(this)->updateCurrentTime(); return m_currentTime; } @@ -567,19 +570,24 @@ void MediaObject::updateCurrentTime() m_currentTime = (m_audioSystem == AS_Graph) ? m_audioPlayer->currentTime() : m_videoPlayer->currentTime(); quint64 total = m_videoPlayer->duration(); - // Check if it's time to emit aboutToFinish: - quint32 mark = qMax(quint64(0), qMin(total, total + m_transitionTime - 2000)); - if (lastUpdateTime < mark && mark <= m_currentTime) - emit aboutToFinish(); - - // Check if it's time to emit prefinishMarkReached: - mark = qMax(quint64(0), total - m_prefinishMark); - if (lastUpdateTime < mark && mark <= m_currentTime) - emit prefinishMarkReached(total - m_currentTime); + if (m_videoPlayer->currentTrack() < m_videoPlayer->trackCount() - 1){ + // There are still more tracks to play after the current track. + if (m_autoplayTitles) { + if (lastUpdateTime < m_currentTime && m_currentTime == total) + setCurrentTrack(m_videoPlayer->currentTrack() + 1); + } + } else if (m_nextVideoPlayer->state() == QuickTimeVideoPlayer::NoMedia){ + // There is no more sources or tracks to play after the current source. + // Check if it's time to emit aboutToFinish: + quint32 mark = qMax(quint64(0), qMin(total, total + m_transitionTime - 2000)); + if (lastUpdateTime < mark && mark <= m_currentTime) + emit aboutToFinish(); + + // Check if it's time to emit prefinishMarkReached: + mark = qMax(quint64(0), total - m_prefinishMark); + if (lastUpdateTime < mark && mark <= m_currentTime) + emit prefinishMarkReached(total - m_currentTime); - if (m_nextVideoPlayer->state() == QuickTimeVideoPlayer::NoMedia){ - // There is no next source in que. - // Check if it's time to emit finished: if (lastUpdateTime < m_currentTime && m_currentTime == total){ emit finished(); m_currentTime = (m_audioSystem == AS_Graph) ? m_audioPlayer->currentTime() : m_videoPlayer->currentTime(); @@ -589,7 +597,7 @@ void MediaObject::updateCurrentTime() } else { // We have a next source. // Check if it's time to swap to next source: - mark = qMax(quint64(0), total + m_transitionTime); + quint32 mark = qMax(quint64(0), total + m_transitionTime); if (m_waitNextSwap && m_state == Phonon::PlayingState && m_transitionTime < m_swapTime.msecsTo(QTime::currentTime())){ swapCurrentWithNext(0); @@ -692,14 +700,14 @@ bool MediaObject::setAudioDeviceOnMovie(int id) void MediaObject::updateCrossFade() { - m_mediaObjectAudioNode->updateCrossFade(m_currentTime); + m_mediaObjectAudioNode->updateCrossFade(m_currentTime); // Clean-up previous movie if done fading: if (m_mediaObjectAudioNode->m_fadeDuration == 0){ if (m_nextVideoPlayer->isPlaying() || m_nextAudioPlayer->isPlaying()){ - m_nextVideoPlayer->unsetVideo(); + m_nextVideoPlayer->unsetCurrentMediaSource(); m_nextAudioPlayer->unsetVideoPlayer(); } - } + } } void MediaObject::updateBufferStatus() @@ -728,7 +736,7 @@ void MediaObject::updateVideoFrames() // Draw next frame if awailable: if (m_videoPlayer->videoFrameChanged()){ updateLipSynch(50); - VideoFrame frame(m_videoPlayer); + VideoFrame frame(m_videoPlayer); if (m_nextVideoPlayer->isPlaying() && m_nextVideoPlayer->hasVideo() && isCrossFading()){ @@ -736,9 +744,9 @@ void MediaObject::updateVideoFrames() frame.setBackgroundFrame(bgFrame); frame.setBaseOpacity(m_mediaObjectAudioNode->m_volume1); } - + // Send the frame through the graph: - updateVideo(frame); + updateVideo(frame); checkForError(); } } @@ -749,7 +757,7 @@ void MediaObject::updateLipSynch(int allowedOffset) return; if (m_videoSinkList.isEmpty() || m_audioSinkList.isEmpty()) return; - + if (m_videoPlayer->hasVideo()){ qint64 diff = m_audioPlayer->currentTime() - m_videoPlayer->currentTime(); if (-allowedOffset > diff || diff > allowedOffset) @@ -834,13 +842,42 @@ bool MediaObject::event(QEvent *event) return QObject::event(event); } -bool MediaObject::hasInterface(Interface /*interface*/) const +void MediaObject::setCurrentTrack(int track) +{ + if (track == m_videoPlayer->currentTrack() || track < 0 || track >= m_videoPlayer->trackCount()) + return; + + m_videoPlayer->setCurrentTrack(track); + emit titleChanged(track); + emit metaDataChanged(m_videoPlayer->metaData()); +} + +bool MediaObject::hasInterface(Interface iface) const { - return false; + return iface == AddonInterface::TitleInterface; } -QVariant MediaObject::interfaceCall(Interface /*interface*/, int /*command*/, const QList &/*arguments*/) +QVariant MediaObject::interfaceCall(Interface iface, int command, const QList ¶ms) { + switch (iface) { + case TitleInterface: + switch (command) { + case availableTitles: + return m_videoPlayer->trackCount(); + case title: + return m_videoPlayer->currentTrack(); + case setTitle: + setCurrentTrack(params.first().toInt()); + break; + case autoplayTitles: + return m_autoplayTitles; + case setAutoplayTitles: + m_autoplayTitles = params.first().toBool(); + break; + } + default: + break; + } return QVariant(); } diff --git a/src/3rdparty/phonon/qt7/quicktimemetadata.h b/src/3rdparty/phonon/qt7/quicktimemetadata.h index d524183..c589535 100644 --- a/src/3rdparty/phonon/qt7/quicktimemetadata.h +++ b/src/3rdparty/phonon/qt7/quicktimemetadata.h @@ -38,10 +38,8 @@ namespace QT7 class QuickTimeMetaData { public: - QuickTimeMetaData(); - virtual ~QuickTimeMetaData(); - - void setVideo(QuickTimeVideoPlayer *videoPlayer); + QuickTimeMetaData(QuickTimeVideoPlayer *videoPlayer); + void update(); QMultiMap metaData(); private: @@ -49,6 +47,8 @@ namespace QT7 bool m_movieChanged; QuickTimeVideoPlayer *m_videoPlayer; void readMetaData(); + void guessMetaDataForCD(); + void readMetaDataFromMovie(); #ifdef QUICKTIME_C_API_AVAILABLE QString stripCopyRightSymbol(const QString &key); diff --git a/src/3rdparty/phonon/qt7/quicktimemetadata.mm b/src/3rdparty/phonon/qt7/quicktimemetadata.mm index 851e707..2dcc152 100644 --- a/src/3rdparty/phonon/qt7/quicktimemetadata.mm +++ b/src/3rdparty/phonon/qt7/quicktimemetadata.mm @@ -15,6 +15,7 @@ along with this library. If not, see . */ +#include #include "quicktimemetadata.h" #include "quicktimevideoplayer.h" @@ -25,19 +26,14 @@ namespace Phonon namespace QT7 { -QuickTimeMetaData::QuickTimeMetaData() +QuickTimeMetaData::QuickTimeMetaData(QuickTimeVideoPlayer *videoPlayer) { - m_videoPlayer = 0; + m_videoPlayer = videoPlayer; m_movieChanged = false; } -QuickTimeMetaData::~QuickTimeMetaData() +void QuickTimeMetaData::update() { -} - -void QuickTimeMetaData::setVideo(QuickTimeVideoPlayer *videoPlayer) -{ - m_videoPlayer = videoPlayer; m_movieChanged = true; m_metaData.clear(); } @@ -145,14 +141,22 @@ void QuickTimeMetaData::readFormattedData(QTMetaDataRef metaDataRef, OSType form #endif // QUICKTIME_C_API_AVAILABLE -void QuickTimeMetaData::readMetaData() +void QuickTimeMetaData::guessMetaDataForCD() +{ + QString album = QFileInfo(m_videoPlayer->movieCompactDiscPath()).fileName(); + QString title = QFileInfo(m_videoPlayer->currentTrackPath()).fileName(); + title = title.left(title.lastIndexOf('.')); + m_metaData.insert(QLatin1String("ALBUM"), album); + m_metaData.insert(QLatin1String("TITLE"), title); + m_metaData.insert(QLatin1String("TRACKNUMBER"), QString::number(m_videoPlayer->currentTrack())); +} + +void QuickTimeMetaData::readMetaDataFromMovie() { - if (!m_videoPlayer) - return; QMultiMap metaMap; - + #ifdef QUICKTIME_C_API_AVAILABLE - QTMetaDataRef metaDataRef; + QTMetaDataRef metaDataRef; OSStatus err = QTCopyMovieMetaData([m_videoPlayer->qtMovie() quickTimeMovie], &metaDataRef); BACKEND_ASSERT2(err == noErr, "Could not read QuickTime meta data", NORMAL_ERROR) @@ -173,6 +177,17 @@ void QuickTimeMetaData::readMetaData() m_metaData.insert(QLatin1String("DESCRIPTION"), metaMap.value(QLatin1String("des"))); } +void QuickTimeMetaData::readMetaData() +{ + if (!m_videoPlayer) + return; + + if (m_videoPlayer->mediaSource().type() == Phonon::MediaSource::Disc) + guessMetaDataForCD(); + else + readMetaDataFromMovie(); +} + QMultiMap QuickTimeMetaData::metaData() { if (m_videoPlayer && m_videoPlayer->hasMovie() && m_movieChanged) diff --git a/src/3rdparty/phonon/qt7/quicktimevideoplayer.h b/src/3rdparty/phonon/qt7/quicktimevideoplayer.h index b80570a..8495e18 100644 --- a/src/3rdparty/phonon/qt7/quicktimevideoplayer.h +++ b/src/3rdparty/phonon/qt7/quicktimevideoplayer.h @@ -39,6 +39,7 @@ namespace Phonon namespace QT7 { class QuickTimeStreamReader; + class QuickTimeMetaData; class VideoRenderWidgetQTMovieView; class QuickTimeVideoPlayer : QObject @@ -56,7 +57,7 @@ namespace QT7 void setMediaSource(const MediaSource &source); MediaSource mediaSource() const; - void unsetVideo(); + void unsetCurrentMediaSource(); void play(); void pause(); @@ -84,6 +85,7 @@ namespace QT7 bool setAudioDevice(int id); void setPlaybackRate(float rate); QTMovie *qtMovie() const; + QMultiMap metaData(); float playbackRate() const; float prefferedPlaybackRate() const; @@ -103,6 +105,12 @@ namespace QT7 float percentageLoaded(); quint64 timeLoaded(); + int trackCount() const; + int currentTrack() const; + void setCurrentTrack(int track); + QString movieCompactDiscPath() const; + QString currentTrackPath() const; + static QString timeToString(quint64 ms); // Help functions when drawing to more that one widget in cocoa 64: @@ -116,6 +124,7 @@ namespace QT7 QTMovie *m_QTMovie; State m_state; QGLPixelBuffer *m_QImagePixelBuffer; + QuickTimeMetaData *m_metaData; bool m_playbackRateSat; bool m_isDrmProtected; @@ -133,6 +142,9 @@ namespace QT7 qreal m_contrast; qreal m_hue; qreal m_saturation; + NSArray *m_folderTracks; + int m_currentTrack; + QString m_movieCompactDiscPath; #ifdef QUICKTIME_C_API_AVAILABLE QTVisualContextRef m_visualContext; @@ -140,16 +152,21 @@ namespace QT7 VideoFrame m_currentFrame; QuickTimeStreamReader *m_streamReader; + void prepareCurrentMovieForPlayback(); void createVisualContext(); void openMovieFromCurrentMediaSource(); void openMovieFromDataRef(QTDataReference *dataRef); void openMovieFromFile(); void openMovieFromUrl(); void openMovieFromStream(); + void openMovieFromCompactDisc(); void openMovieFromData(QByteArray *data, char *fileType); void openMovieFromDataGuessType(QByteArray *data); QString mediaSourcePath(); bool codecExistsAccordingToSuffix(const QString &fileName); + NSString* pathToCompactDisc(); + bool isCompactDisc(NSString *path); + NSArray* scanFolder(NSString *path); void setError(NSError *error); bool errorOccured(); diff --git a/src/3rdparty/phonon/qt7/quicktimevideoplayer.mm b/src/3rdparty/phonon/qt7/quicktimevideoplayer.mm index 3f76132..93867e2 100644 --- a/src/3rdparty/phonon/qt7/quicktimevideoplayer.mm +++ b/src/3rdparty/phonon/qt7/quicktimevideoplayer.mm @@ -20,6 +20,7 @@ #include "videowidget.h" #include "audiodevice.h" #include "quicktimestreamreader.h" +#include "quicktimemetadata.h" #include #include @@ -52,6 +53,7 @@ QuickTimeVideoPlayer::QuickTimeVideoPlayer() : QObject(0) { m_state = NoMedia; m_mediaSource = MediaSource(); + m_metaData = new QuickTimeMetaData(this); m_QTMovie = 0; m_streamReader = 0; m_playbackRate = 1.0f; @@ -67,6 +69,8 @@ QuickTimeVideoPlayer::QuickTimeVideoPlayer() : QObject(0) m_primaryRenderingTarget = 0; m_primaryRenderingCIImage = 0; m_QImagePixelBuffer = 0; + m_folderTracks = 0; + m_currentTrack = 0; #ifdef QUICKTIME_C_API_AVAILABLE OSStatus err = EnterMovies(); @@ -77,7 +81,8 @@ QuickTimeVideoPlayer::QuickTimeVideoPlayer() : QObject(0) QuickTimeVideoPlayer::~QuickTimeVideoPlayer() { - unsetVideo(); + unsetCurrentMediaSource(); + delete m_metaData; [(NSObject*)m_primaryRenderingTarget release]; m_primaryRenderingTarget = 0; #ifdef QUICKTIME_C_API_AVAILABLE @@ -397,7 +402,7 @@ QRect QuickTimeVideoPlayer::videoRect() const return QRect(0, 0, size.width, size.height); } -void QuickTimeVideoPlayer::unsetVideo() +void QuickTimeVideoPlayer::unsetCurrentMediaSource() { if (!m_QTMovie) return; @@ -411,10 +416,13 @@ void QuickTimeVideoPlayer::unsetVideo() m_isDrmProtected = false; m_isDrmAuthorized = true; m_mediaSource = MediaSource(); + m_movieCompactDiscPath.clear(); [(CIImage *)m_primaryRenderingCIImage release]; m_primaryRenderingCIImage = 0; delete m_QImagePixelBuffer; m_QImagePixelBuffer = 0; + [m_folderTracks release]; + m_folderTracks = 0; } QuickTimeVideoPlayer::State QuickTimeVideoPlayer::state() const @@ -524,18 +532,25 @@ bool QuickTimeVideoPlayer::codecExistsAccordingToSuffix(const QString &fileName) void QuickTimeVideoPlayer::setMediaSource(const MediaSource &mediaSource) { PhononAutoReleasePool pool; - unsetVideo(); + unsetCurrentMediaSource(); + m_mediaSource = mediaSource; if (mediaSource.type() == MediaSource::Empty || mediaSource.type() == MediaSource::Invalid){ m_state = NoMedia; return; } + openMovieFromCurrentMediaSource(); if (errorOccured()){ - unsetVideo(); + unsetCurrentMediaSource(); return; } + prepareCurrentMovieForPlayback(); +} + +void QuickTimeVideoPlayer::prepareCurrentMovieForPlayback() +{ #ifdef QUICKTIME_C_API_AVAILABLE if (m_visualContext) SetMovieVisualContext([m_QTMovie quickTimeMovie], m_visualContext); @@ -543,14 +558,14 @@ void QuickTimeVideoPlayer::setMediaSource(const MediaSource &mediaSource) waitStatePlayable(); if (errorOccured()){ - unsetVideo(); + unsetCurrentMediaSource(); return; } readProtection(); preRollMovie(); if (errorOccured()){ - unsetVideo(); + unsetCurrentMediaSource(); return; } @@ -560,6 +575,7 @@ void QuickTimeVideoPlayer::setMediaSource(const MediaSource &mediaSource) enableAudio(m_audioEnabled); setMute(m_mute); setVolume(m_masterVolume, m_relativeVolume); + m_metaData->update(); pause(); } @@ -573,7 +589,7 @@ void QuickTimeVideoPlayer::openMovieFromCurrentMediaSource() openMovieFromUrl(); break; case MediaSource::Disc: - CASE_UNSUPPORTED("Could not open media source.", FATAL_ERROR) + openMovieFromCompactDisc(); break; case MediaSource::Stream: openMovieFromStream(); @@ -635,7 +651,7 @@ void QuickTimeVideoPlayer::openMovieFromDataGuessType(QByteArray *data) // than using e.g [QTMovie movieFileTypes:QTIncludeCommonTypes]. Some // codecs *think* they can decode the stream, and crash... #define TryOpenMovieWithCodec(type) gClearError(); \ - openMovieFromData(data, "."type); \ + openMovieFromData(data, (char *)"."type); \ if (m_QTMovie) return; TryOpenMovieWithCodec("avi"); @@ -675,6 +691,50 @@ void QuickTimeVideoPlayer::openMovieFromStream() openMovieFromDataGuessType(m_streamReader->pointerToData()); } +typedef void (*qt_sighandler_t)(int); +static void sigtest(int) { + qApp->exit(0); +} + +void QuickTimeVideoPlayer::openMovieFromCompactDisc() +{ + // Interrupting the application while the device is open + // causes the application to hang. So we need to handle + // this in a more graceful way: + qt_sighandler_t hndl = signal(SIGINT, sigtest); + if (hndl) + signal(SIGINT, hndl); + + PhononAutoReleasePool pool; + NSString *cd = 0; + QString devName = m_mediaSource.deviceName(); + if (devName.isEmpty()) { + cd = pathToCompactDisc(); + if (!cd) { + SET_ERROR("Could not open media source.", NORMAL_ERROR) + return; + } + m_movieCompactDiscPath = PhononCFString::toQString(reinterpret_cast(cd)); + } else { + if (!QFileInfo(devName).isAbsolute()) + devName = QLatin1String("/Volumes/") + devName; + cd = [reinterpret_cast(PhononCFString::toCFStringRef(devName)) autorelease]; + if (!isCompactDisc(cd)) { + SET_ERROR("Could not open media source.", NORMAL_ERROR) + return; + } + m_movieCompactDiscPath = devName; + } + + m_folderTracks = [scanFolder(cd) retain]; + setCurrentTrack(0); +} + +QString QuickTimeVideoPlayer::movieCompactDiscPath() const +{ + return m_movieCompactDiscPath; +} + MediaSource QuickTimeVideoPlayer::mediaSource() const { return m_mediaSource; @@ -950,6 +1010,93 @@ void QuickTimeVideoPlayer::readProtection() } } +QMultiMap QuickTimeVideoPlayer::metaData() +{ + return m_metaData->metaData(); +} + +int QuickTimeVideoPlayer::trackCount() const +{ + if (!m_folderTracks) + return 0; + return [m_folderTracks count]; +} + +int QuickTimeVideoPlayer::currentTrack() const +{ + return m_currentTrack; +} + +QString QuickTimeVideoPlayer::currentTrackPath() const +{ + if (!m_folderTracks) + return QString(); + + PhononAutoReleasePool pool; + NSString *trackPath = [m_folderTracks objectAtIndex:m_currentTrack]; + return PhononCFString::toQString(reinterpret_cast(trackPath)); +} + +NSString* QuickTimeVideoPlayer::pathToCompactDisc() +{ + PhononAutoReleasePool pool; + NSArray *devices = [[NSWorkspace sharedWorkspace] mountedRemovableMedia]; + for (NSString *dev in devices) { + if (isCompactDisc(dev)) + return [dev retain]; + } + return 0; +} + +bool QuickTimeVideoPlayer::isCompactDisc(NSString *path) +{ + PhononAutoReleasePool pool; + NSString *type = [NSString string]; + [[NSWorkspace sharedWorkspace] getFileSystemInfoForPath:path + isRemovable:0 + isWritable:0 + isUnmountable:0 + description:0 + type:&type]; + return [type hasPrefix:@"cdd"]; +} + +NSArray* QuickTimeVideoPlayer::scanFolder(NSString *path) +{ + NSMutableArray *tracks = [NSMutableArray arrayWithCapacity:20]; + if (!path) + return tracks; + + NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:path]; + while (NSString *track = [enumerator nextObject]) { + if (![track hasPrefix:@"."]) + [tracks addObject:[path stringByAppendingPathComponent:track]]; + } + return tracks; +} + +void QuickTimeVideoPlayer::setCurrentTrack(int track) +{ + PhononAutoReleasePool pool; + [m_QTMovie release]; + m_QTMovie = 0; + m_currentTime = 0; + m_currentTrack = track; + + if (!m_folderTracks) + return; + if (track < 0 || track >= (int)[m_folderTracks count]) + return; + + NSString *trackPath = [m_folderTracks objectAtIndex:track]; + QTDataReference *dataRef = [QTDataReference dataReferenceWithReferenceToFile:trackPath]; + State currentState = m_state; + openMovieFromDataRef(dataRef); + prepareCurrentMovieForPlayback(); + if (currentState == Playing) + play(); +} + }} QT_END_NAMESPACE -- cgit v0.12 From b5579e01a023800a6fd81193209db00e000a3620 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Mon, 8 Jun 2009 11:05:35 +0200 Subject: Made QTreeWidgetItem::operator<() check if the data is numerical when comparing. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit More information in task 166873. Merge-request: 514 Reviewed-by: Jan-Arve Sæther --- src/gui/itemviews/qtreewidget.cpp | 33 +++++++++++++++++++++++++++--- src/gui/itemviews/qtreewidget_p.h | 1 + tests/auto/qtreewidget/tst_qtreewidget.cpp | 4 ++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/gui/itemviews/qtreewidget.cpp b/src/gui/itemviews/qtreewidget.cpp index a2bfe45..1c87580 100644 --- a/src/gui/itemviews/qtreewidget.cpp +++ b/src/gui/itemviews/qtreewidget.cpp @@ -577,7 +577,7 @@ void QTreeModel::sort(int column, Qt::SortOrder order) if (column < 0 || column >= columnCount()) return; - //layoutAboutToBeChanged and layoutChanged will be called by sortChildren + //layoutAboutToBeChanged and layoutChanged will be called by sortChildren rootItem->sortChildren(column, order, true); } @@ -695,6 +695,29 @@ bool QTreeModel::itemGreaterThan(const QPair &left, } /*! + \internal + + Returns true if the type of the variant \a value + can be casted as double. +*/ +bool QTreeModel::canConvertToDouble(const QVariant &value) +{ + switch (value.type()) { + case QVariant::Bool: + case QVariant::Int: + case QVariant::UInt: + case QVariant::LongLong: + case QVariant::ULongLong: + case QVariant::Double: + case QVariant::Char: + return true; + default: + return false; + } + return false; +} + +/*! \internal */ QList::iterator QTreeModel::sortedInsertionIterator( @@ -1787,7 +1810,11 @@ QVariant QTreeWidgetItem::data(int column, int role) const bool QTreeWidgetItem::operator<(const QTreeWidgetItem &other) const { int column = view ? view->sortColumn() : 0; - return text(column) < other.text(column); + const QVariant v1 = data(column, Qt::DisplayRole); + const QVariant v2 = other.data(column, Qt::DisplayRole); + if (QTreeModel::canConvertToDouble(v1) && QTreeModel::canConvertToDouble(v2)) + return v1.toDouble() < v2.toDouble(); + return v1.toString() < v2.toString(); } #ifndef QT_NO_DATASTREAM @@ -2074,7 +2101,7 @@ void QTreeWidgetItemPrivate::sortChildren(int column, Qt::SortOrder order, bool if (climb) { QList::iterator it = q->children.begin(); for (; it != q->children.end(); ++it) { - //here we call the private object's method to avoid emitting + //here we call the private object's method to avoid emitting //the layoutAboutToBeChanged and layoutChanged signals (*it)->d->sortChildren(column, order, climb); } diff --git a/src/gui/itemviews/qtreewidget_p.h b/src/gui/itemviews/qtreewidget_p.h index a089cf5..96f734d 100644 --- a/src/gui/itemviews/qtreewidget_p.h +++ b/src/gui/itemviews/qtreewidget_p.h @@ -116,6 +116,7 @@ public: const QPair &right); static bool itemGreaterThan(const QPair &left, const QPair &right); + static bool canConvertToDouble(const QVariant &value); static QList::iterator sortedInsertionIterator( const QList::iterator &begin, const QList::iterator &end, diff --git a/tests/auto/qtreewidget/tst_qtreewidget.cpp b/tests/auto/qtreewidget/tst_qtreewidget.cpp index 906332c..32a2c40 100644 --- a/tests/auto/qtreewidget/tst_qtreewidget.cpp +++ b/tests/auto/qtreewidget/tst_qtreewidget.cpp @@ -2434,6 +2434,10 @@ void tst_QTreeWidget::itemOperatorLessThan() item1.setText(0, "b"); item2.setText(0, "a"); QCOMPARE(item1 < item2, true); + tw.sortItems(0, Qt::AscendingOrder); + item1.setData(0, Qt::DisplayRole, 11); + item2.setData(0, Qt::DisplayRole, 2); + QCOMPARE(item1 < item2, false); } } -- cgit v0.12 From fded22680a728ecba93feb87733785537c234b02 Mon Sep 17 00:00:00 2001 From: mae Date: Mon, 8 Jun 2009 12:35:20 +0200 Subject: Extend auto test to cover the emission order of the contentChange() and cursorPositionChanged() singals of QTextDocument. The contentChange() signal is used for the syntax highlighter. --- tests/auto/qtextdocument/tst_qtextdocument.cpp | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/auto/qtextdocument/tst_qtextdocument.cpp b/tests/auto/qtextdocument/tst_qtextdocument.cpp index 63a172b..27be372 100644 --- a/tests/auto/qtextdocument/tst_qtextdocument.cpp +++ b/tests/auto/qtextdocument/tst_qtextdocument.cpp @@ -163,6 +163,8 @@ private slots: void testUndoBlocks(); + void receiveCursorPositionChangedAfterContentsChange(); + private: void backgroundImage_checkExpectedHtml(const QTextDocument &doc); @@ -2453,5 +2455,35 @@ void tst_QTextDocument::testUndoBlocks() QCOMPARE(doc->toPlainText(), QString("")); } +class Receiver : public QObject +{ + Q_OBJECT + public: + QString first; + public slots: + void cursorPositionChanged() { + if (first.isEmpty()) + first = QLatin1String("cursorPositionChanged"); + } + + void contentsChange() { + if (first.isEmpty()) + first = QLatin1String("contentsChanged"); + } +}; + +void tst_QTextDocument::receiveCursorPositionChangedAfterContentsChange() +{ + QVERIFY(doc); + doc->setDocumentLayout(new MyAbstractTextDocumentLayout(doc)); + Receiver rec; + connect(doc, SIGNAL(cursorPositionChanged(QTextCursor)), + &rec, SLOT(cursorPositionChanged())); + connect(doc, SIGNAL(contentsChange(int,int,int)), + &rec, SLOT(contentsChange())); + cursor.insertText("Hello World"); + QCOMPARE(rec.first, QString("contentsChanged")); +} + QTEST_MAIN(tst_QTextDocument) #include "tst_qtextdocument.moc" -- cgit v0.12 From 11303c676166cda3aae33e7e97939e9d2942271f Mon Sep 17 00:00:00 2001 From: mae Date: Mon, 8 Jun 2009 12:43:13 +0200 Subject: Revert signal emission order in QTextDocument to 4.5 behaviour This is covered by the autotest tst_QTextDocument::receiveCursorPositionChangedAfterContentsChange() Reviewed-by: con --- src/gui/text/qtextdocument_p.cpp | 8 +++++++- src/gui/text/qtextdocument_p.h | 6 ++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp index e1da4be..7700c14 100644 --- a/src/gui/text/qtextdocument_p.cpp +++ b/src/gui/text/qtextdocument_p.cpp @@ -193,6 +193,8 @@ QTextDocumentPrivate::QTextDocumentPrivate() undoEnabled = true; inContentsChange = false; + inEdit = false; + defaultTextOption.setTabStop(80); // same as in qtextengine.cpp defaultTextOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); @@ -439,6 +441,7 @@ void QTextDocumentPrivate::insert(int pos, int strPos, int strLength, int format Q_ASSERT(pos >= 0 && pos < fragments.length()); Q_ASSERT(formats.format(format).isCharFormat()); + beginEdit(); insert_string(pos, strPos, strLength, format, QTextUndoCommand::MoveCursor); if (undoEnabled) { int b = blocks.findNode(pos); @@ -564,6 +567,7 @@ void QTextDocumentPrivate::move(int pos, int to, int length, QTextUndoCommand::O if (pos == to) return; + beginEdit(); const bool needsInsert = to != -1; #if !defined(QT_NO_DEBUG) @@ -1106,6 +1110,8 @@ void QTextDocumentPrivate::finishEdit() if (editBlock) return; + inEdit = false; + if (framesDirty) scan_frames(docChangeFrom, docChangeOldLength, docChangeLength); @@ -1175,7 +1181,7 @@ void QTextDocumentPrivate::adjustDocumentChangesAndCursors(int from, int addedOr for (int i = 0; i < cursors.size(); ++i) { QTextCursorPrivate *curs = cursors.at(i); if (curs->adjustPosition(from, addedOrRemoved, op) == QTextCursorPrivate::CursorMoved) { - if (editBlock) { + if (editBlock || inEdit) { if (!changedCursors.contains(curs)) changedCursors.append(curs); } else { diff --git a/src/gui/text/qtextdocument_p.h b/src/gui/text/qtextdocument_p.h index d754ff0..e10e7ae 100644 --- a/src/gui/text/qtextdocument_p.h +++ b/src/gui/text/qtextdocument_p.h @@ -202,6 +202,7 @@ public: inline void beginEditBlock() { editBlock++; } void joinPreviousEditBlock(); void endEditBlock(); + inline void beginEdit() { inEdit = true; } void finishEdit(); inline bool isInEditBlock() const { return editBlock; } void enableUndoRedo(bool enable); @@ -335,8 +336,9 @@ public: QCss::StyleSheet parsedDefaultStyleSheet; #endif int maximumBlockCount; - bool needsEnsureMaximumBlockCount; - bool inContentsChange; + uint needsEnsureMaximumBlockCount : 1; + uint inContentsChange : 1; + uint inEdit : 1; // between beginEdit() and finishEdit() QSizeF pageSize; QString title; QString url; -- cgit v0.12 From f38c81bfbae39c6f58d87b874d0abdee0d3ac8af Mon Sep 17 00:00:00 2001 From: Bruno Abinader Date: Mon, 8 Jun 2009 13:06:21 +0200 Subject: Reflected the state machine framework API changes on documentation. Signed-off-by: Bruno Abinader Merge-request: 602 Reviewed-by: David Boddie --- doc/src/animation.qdoc | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/doc/src/animation.qdoc b/doc/src/animation.qdoc index b4e603c..c16d6a2 100644 --- a/doc/src/animation.qdoc +++ b/doc/src/animation.qdoc @@ -327,14 +327,14 @@ \section1 Animations and States When using a \l{The State Machine Framework}{state machine}, we - have a special state, QAnimationState, that will play one or more - animations. - - The QState::addAnimatedTransition() convenience function lets you - associate an animation to a state transition. The function will - create the QAnimationState for you, and insert it into the state - machine. We also have the possibility to associate properties with - the states rather than setting the start and end values ourselves. + can associate an animation to a transition between states using a + QSignalTransition or QEventTransition class. These classes are both + derived from QAbstractClass, which defines the convenience function + addAnimation() that enables the appending of one or more animations + triggered when the transition occurs. + + We also have the possibility to associate properties with the + states rather than setting the start and end values ourselves. Below is a complete code example that animates the geometry of a QPushButton. @@ -345,18 +345,19 @@ QStateMachine *machine = new QStateMachine; QState *state1 = new QState(machine->rootState()); - state1->setPropertyOnEntry(button, "geometry", - QRect(0, 0, 100, 30)); + state1->assignProperty(button, "geometry", QRect(0, 0, 100, 30)); machine->setInitialState(state1); QState *state2 = new QState(machine->rootState()); - state2->setPropertyOnEntry(button, "geometry", - QRect(250, 250, 100, 30)); + state2->assignProperty(button, "geometry", QRect(250, 250, 100, 30)); - state1->addAnimatedTransition(button, SIGNAL(clicked()), state2, - new QPropertyAnimation(button, "geometry")); - state2->addAnimatedTransition(button, SIGNAL(clicked()), state1, - new QPropertyAnimation(button, "geometry")); + QSignalTransition *transition1 = state1->addTransition(button, + SIGNAL(clicked()), state2); + transition1->addAnimation(new QPropertyAnimation(button, "geometry")); + + QSignalTransition *transition2 = state2->addTransition(button, + SIGNAL(clicked()), state1); + transition2->addAnimation(new QPropertyAnimation(button, "geometry")); machine->start(); \endcode -- cgit v0.12 From fd6b00fcbc049ba3d7f8f0e6b9913b376130d88f Mon Sep 17 00:00:00 2001 From: David Boddie Date: Mon, 8 Jun 2009 13:25:19 +0200 Subject: qdoc: Updated the code to create references to documents and files. Task-number: 251995 Reviewed-by: Martin Smith --- tools/qdoc3/tree.cpp | 80 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/tools/qdoc3/tree.cpp b/tools/qdoc3/tree.cpp index 0fbd438..370bd5a 100644 --- a/tools/qdoc3/tree.cpp +++ b/tools/qdoc3/tree.cpp @@ -1884,23 +1884,25 @@ QString Tree::fullDocumentLocation(const Node *node) const if (!node->url().isEmpty()) return node->url(); + QString parentName; + QString anchorRef; + if (node->type() == Node::Namespace) { // The root namespace has no name - check for this before creating // an attribute containing the location of any documentation. if (!node->fileBase().isEmpty()) - return node->fileBase() + ".html"; + parentName = node->fileBase() + ".html"; else return ""; } else if (node->type() == Node::Fake) { - return node->fileBase() + ".html"; + parentName = node->fileBase() + ".html"; } else if (node->fileBase().isEmpty()) return ""; - QString parentName; Node *parentNode = 0; if ((parentNode = node->relates())) @@ -1912,10 +1914,11 @@ QString Tree::fullDocumentLocation(const Node *node) const case Node::Class: case Node::Namespace: if (parentNode && !parentNode->name().isEmpty()) - return parentName.replace(".html", "") + "-" - + node->fileBase().toLower() + ".html"; + parentName = parentName.replace(".html", "") + "-" + + node->fileBase().toLower() + ".html"; else - return node->fileBase() + ".html"; + parentName = node->fileBase() + ".html"; + break; case Node::Function: { /* @@ -1925,29 +1928,17 @@ QString Tree::fullDocumentLocation(const Node *node) const const FunctionNode *functionNode = static_cast(node); - // Functions can be compatibility functions or be obsolete. - switch (node->status()) { - case Node::Compat: - parentName.replace(".html", "-qt3.html"); - break; - case Node::Obsolete: - parentName.replace(".html", "-obsolete.html"); - break; - default: - ; - } - if (functionNode->metaness() == FunctionNode::Dtor) - return parentName + "#dtor." + functionNode->name().mid(1); + anchorRef = "#dtor." + functionNode->name().mid(1); - if (functionNode->associatedProperty()) + else if (functionNode->associatedProperty()) return fullDocumentLocation(functionNode->associatedProperty()); - if (functionNode->overloadNumber() > 1) - return parentName + "#" + functionNode->name() - + "-" + QString::number(functionNode->overloadNumber()); + else if (functionNode->overloadNumber() > 1) + anchorRef = "#" + functionNode->name() + + "-" + QString::number(functionNode->overloadNumber()); else - return parentName + "#" + functionNode->name(); + anchorRef = "#" + functionNode->name(); } /* @@ -1955,27 +1946,52 @@ QString Tree::fullDocumentLocation(const Node *node) const the latter returns the name in lower-case. For HTML anchors, we need to preserve the case. */ + break; case Node::Enum: - return parentName + "#" + node->name() + "-enum"; + anchorRef = "#" + node->name() + "-enum"; + break; case Node::Typedef: - return parentName + "#" + node->name() + "-typedef"; + anchorRef = "#" + node->name() + "-typedef"; + break; case Node::Property: - return parentName + "#" + node->name() + "-prop"; + anchorRef = "#" + node->name() + "-prop"; + break; case Node::Variable: - return parentName + "#" + node->name() + "-var"; + anchorRef = "#" + node->name() + "-var"; + break; case Node::Target: - return parentName + "#" + Doc::canonicalTitle(node->name()); + anchorRef = "#" + Doc::canonicalTitle(node->name()); + break; case Node::Fake: { - QString pageName = node->name(); - return pageName.replace("/", "-").replace(".", "-") + ".html"; + /* + Use node->fileBase() for fake nodes because they are represented + by pages whose file names are lower-case. + */ + parentName = node->fileBase(); + parentName.replace("/", "-").replace(".", "-"); + parentName += ".html"; } break; default: break; } - return ""; + // Various objects can be compat (deprecated) or obsolete. + if (node->type() != Node::Class && node->type() != Node::Namespace) { + switch (node->status()) { + case Node::Compat: + parentName.replace(".html", "-qt3.html"); + break; + case Node::Obsolete: + parentName.replace(".html", "-obsolete.html"); + break; + default: + ; + } + } + + return parentName.toLower() + anchorRef; } /*! -- cgit v0.12 From 2dbd8c48c11deb7732920d88f8b6c20bf162bd6b Mon Sep 17 00:00:00 2001 From: David Boddie Date: Mon, 8 Jun 2009 13:29:00 +0200 Subject: Doc: Added information about the Fontconfig and FreeType dependencies. Task-number: 250349 Reviewed-by: Trust Me --- doc/src/diagrams/dependencies.lout | 59 +- doc/src/diagrams/x11_dependencies.sk | 1542 +++++++++++++++++++--------------- doc/src/images/x11_dependencies.png | Bin 93480 -> 68043 bytes 3 files changed, 908 insertions(+), 693 deletions(-) diff --git a/doc/src/diagrams/dependencies.lout b/doc/src/diagrams/dependencies.lout index d20f4f1..256f7de 100644 --- a/doc/src/diagrams/dependencies.lout +++ b/doc/src/diagrams/dependencies.lout @@ -1,7 +1,13 @@ +# This file is used to create x11_dependencies.sk, which is then converted to a PNG image. +# +# lout -EPS -o dependencies.eps dependencies.lout +# pstoedit -f sk dependencies.eps x11_dependencies.sk +# makeimage.py x11_dependencies.sk x11_dependencies.png 0.25 --anti-alias + @SysInclude { picture } @SysInclude { tbl } @SysInclude { diag } -# lout -EPS dependencies.lout > dependencies.eps + macro @TTGreenColour { {cmyk 0.40 0.00 1.00 0.01} } macro @TTPurpleColour { {cmyk 0.39 0.39 0.00 0.00} } macro @DefaultColour { rgb { 0.961 0.961 0.863 } } @@ -41,31 +47,33 @@ macro @GlibColour { rgb { 0.7 0.7 0.7 } } div { top } # fmarginbelow { 0c } - aformat { @Cell A | @Cell B | @Cell marginbelow { 0c } font { +2p } C | @Cell D | @Cell E } - bformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F } - cformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell marginleft { 1.5c } E | @Cell F } - dformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F } - eformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F } - fformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F } - gformat { @Cell A | @Cell B | @Cell C | @Cell D | @StartHSpan @Cell E | @HSpan } + aformat { @Cell A | @Cell B | @StartHSpan @Cell marginbelow { 0c } font { +2p } C | @HSpan | @HSpan | @Cell F | @Cell G} + bformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F | @Cell G } + cformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell marginleft { 1.5c } F | @Cell G } + dformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F | @Cell G } + eformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F | @Cell G } + fformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F | @Cell G } + gformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @StartHSpan @Cell F | @HSpan } { @Rowa C { Qt"/"X11 library dependencies } - @Rowb C { QTGUI:: @Node paint { @TTGreenColour } QtGui } - @Rowc B { XCURSOR:: @Node paint { @OptionalColour } Xcursor } - C { XRANDR:: @Node paint { @OptionalColour } Xrandr } - D { XINERAMA:: @Node paint { @OptionalColour } Xinerama } - E { Xi:: @Node paint { @OptionalColour } Xi } - @Rowd C { XRENDER:: @Node paint { @OptionalColour } XRender } - F { Xt:: @Node paint { @DefaultColour } Xt* } - @Rowe A { QTCORE:: @Node paint { @TTPurpleColour } QtCore } - C { XFIXES:: @Node paint { @OptionalColour } Xfixes } - D { XEXT:: @Node paint { @DefaultColour } Xext } - F { SM:: @Node paint { @SMColour } SM } - @Rowf A { PTHREAD:: @Node paint { @PthreadColour } pthread } - B { GLIB:: @Node paint { @GlibColour } Glib } - D { X:: @Node paint { @DefaultColour } X11 } - F { ICE:: @Node paint { @SMColour } ICE } - @Rowg E { + @Rowb D { QTGUI:: @Node paint { @TTGreenColour } QtGui } + @Rowc C { XCURSOR:: @Node paint { @OptionalColour } Xcursor } + D { XRANDR:: @Node paint { @OptionalColour } Xrandr } + E { XINERAMA:: @Node paint { @OptionalColour } Xinerama } + F { Xi:: @Node paint { @OptionalColour } Xi } + @Rowd A { FONTCONFIG:: @Node paint { @OptionalColour } Fontconfig } + D { XRENDER:: @Node paint { @OptionalColour } XRender } + G { Xt:: @Node paint { @DefaultColour } Xt* } + @Rowe A { FREETYPE:: @Node paint { @OptionalColour } FreeType } + B { QTCORE:: @Node paint { @TTPurpleColour } QtCore } + D { XFIXES:: @Node paint { @OptionalColour } Xfixes } + E { XEXT:: @Node paint { @DefaultColour } Xext } + G { SM:: @Node paint { @SMColour } SM } + @Rowf B { PTHREAD:: @Node paint { @PthreadColour } pthread } + C { GLIB:: @Node paint { @GlibColour } Glib } + E { X:: @Node paint { @DefaultColour } X11 } + G { ICE:: @Node paint { @SMColour } ICE } + @Rowg F { @Tbl font { -2p } margin { 0.15f } @@ -101,6 +109,9 @@ macro @GlibColour { rgb { 0.7 0.7 0.7 } } @Arrow from { XEXT } to { X } @VHCurveArrow from { XCURSOR } to { XFIXES } @VHVCurveArrow from { XFIXES } to { X } +@HVCurveArrow from { QTGUI } to { FONTCONFIG } pathstyle { dotted } +@Arrow from { FONTCONFIG } to { FREETYPE } pathstyle { dotted } +@VHVCurveArrow from { FREETYPE } to { PTHREAD } @Link from { C@W } to { D@E } pathstyle { dotted } } } diff --git a/doc/src/diagrams/x11_dependencies.sk b/doc/src/diagrams/x11_dependencies.sk index 5f6b304..a9eb3e3 100644 --- a/doc/src/diagrams/x11_dependencies.sk +++ b/doc/src/diagrams/x11_dependencies.sk @@ -2,1415 +2,1619 @@ document() layout('A4',0) layer('Layer 1',1,1,0,0,(0,0,0)) -G() +fp((0,0,0)) +Fn('Helvetica') +Fs(16) +txt('Qt/X11',(254.1,398.35)) +fp((0,0,0)) +Fn('Helvetica') +Fs(16) +txt('libr',(304.9,398.35)) +fp((0,0,0)) +Fn('Helvetica') +Fs(16) +txt('ar',(326.07,398.35)) +fp((0,0,0)) +Fn('Helvetica') +Fs(16) +txt('y',(340.739,398.35)) +fp((0,0,0)) +Fn('Helvetica') +Fs(16) +txt('dependencies',(352.85,398.35)) fp((0,0,0)) le() b() -bs(268.8,339.25,0) -bs(268.8,337.15,0) -bs(352.8,337.15,0) -bs(352.8,362.2,0) -bs(350.7,362.2,0) -bs(350.7,339.25,0) -bs(268.8,339.25,0) +bs(312.898,344.199,0) +bs(312.898,342.102,0) +bs(396.898,342.102,0) +bs(396.898,367.148,0) +bs(394.801,367.148,0) +bs(394.801,344.199,0) +bs(312.898,344.199,0) bC() -fp((0.59,0.99,0)) +fp((0.594,0.99,0)) le() b() -bs(266.7,339.25,0) -bs(350.7,339.25,0) -bs(350.7,364.3,0) -bs(266.7,364.3,0) -bs(266.7,339.25,0) +bs(310.801,344.199,0) +bs(394.801,344.199,0) +bs(394.801,369.25,0) +bs(310.801,369.25,0) +bs(310.801,344.199,0) lw(1.12) lc(2) b() -bs(266.7,339.25,0) -bs(350.7,339.25,0) +bs(310.801,344.199,0) +bs(394.801,344.199,0) lw(1.12) lc(2) b() -bs(350.7,339.25,0) -bs(350.7,364.3,0) +bs(394.801,344.199,0) +bs(394.801,369.25,0) lw(1.12) lc(2) b() -bs(350.7,364.3,0) -bs(266.7,364.3,0) +bs(394.801,369.25,0) +bs(310.801,369.25,0) lw(1.12) lc(2) b() -bs(266.7,364.3,0) -bs(266.7,339.25,0) +bs(310.801,369.25,0) +bs(310.801,344.199,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('QtGui',(290.95,347)) +txt('QtGui',(335.05,351.95)) fp((0,0,0)) le() b() -bs(111.3,280.05,0) -bs(111.3,277.95,0) -bs(195.3,277.95,0) -bs(195.3,302.15,0) -bs(193.2,302.15,0) -bs(193.2,280.05,0) -bs(111.3,280.05,0) +bs(212.102,285,0) +bs(212.102,282.898,0) +bs(296.102,282.898,0) +bs(296.102,307.102,0) +bs(294,307.102,0) +bs(294,285,0) +bs(212.102,285,0) bC() fp((0.792,0.882,1)) le() b() -bs(109.2,280.05,0) -bs(193.2,280.05,0) -bs(193.2,304.25,0) -bs(109.2,304.25,0) -bs(109.2,280.05,0) +bs(210,285,0) +bs(294,285,0) +bs(294,309.199,0) +bs(210,309.199,0) +bs(210,285,0) lw(1.12) lc(2) b() -bs(109.2,280.05,0) -bs(193.2,280.05,0) +bs(210,285,0) +bs(294,285,0) lw(1.12) lc(2) b() -bs(193.2,280.05,0) -bs(193.2,304.25,0) +bs(294,285,0) +bs(294,309.199,0) lw(1.12) lc(2) b() -bs(193.2,304.25,0) -bs(109.2,304.25,0) +bs(294,309.199,0) +bs(210,309.199,0) lw(1.12) lc(2) b() -bs(109.2,304.25,0) -bs(109.2,280.05,0) +bs(210,309.199,0) +bs(210,285,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('Xcursor',(127.15,287.25)) +txt('Xcursor',(227.95,292.2)) fp((0,0,0)) le() b() -bs(268.8,280.05,0) -bs(268.8,277.95,0) -bs(352.8,277.95,0) -bs(352.8,302.15,0) -bs(350.7,302.15,0) -bs(350.7,280.05,0) -bs(268.8,280.05,0) +bs(312.898,285,0) +bs(312.898,282.898,0) +bs(396.898,282.898,0) +bs(396.898,307.102,0) +bs(394.801,307.102,0) +bs(394.801,285,0) +bs(312.898,285,0) bC() fp((0.792,0.882,1)) le() b() -bs(266.7,280.05,0) -bs(350.7,280.05,0) -bs(350.7,304.25,0) -bs(266.7,304.25,0) -bs(266.7,280.05,0) +bs(310.801,285,0) +bs(394.801,285,0) +bs(394.801,309.199,0) +bs(310.801,309.199,0) +bs(310.801,285,0) lw(1.12) lc(2) b() -bs(266.7,280.05,0) -bs(350.7,280.05,0) +bs(310.801,285,0) +bs(394.801,285,0) lw(1.12) lc(2) b() -bs(350.7,280.05,0) -bs(350.7,304.25,0) +bs(394.801,285,0) +bs(394.801,309.199,0) lw(1.12) lc(2) b() -bs(350.7,304.25,0) -bs(266.7,304.25,0) +bs(394.801,309.199,0) +bs(310.801,309.199,0) lw(1.12) lc(2) b() -bs(266.7,304.25,0) -bs(266.7,280.05,0) +bs(310.801,309.199,0) +bs(310.801,285,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('Xr',(287.8,287.25)) +txt('Xr',(331.9,292.2)) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('andr',(301.7,287.25)) +txt('andr',(345.796,292.2)) fp((0,0,0)) le() b() -bs(426.3,280.05,0) -bs(426.3,277.95,0) -bs(510.3,277.95,0) -bs(510.3,302.15,0) -bs(508.2,302.15,0) -bs(508.2,280.05,0) -bs(426.3,280.05,0) +bs(413.699,285,0) +bs(413.699,282.898,0) +bs(497.699,282.898,0) +bs(497.699,307.102,0) +bs(495.602,307.102,0) +bs(495.602,285,0) +bs(413.699,285,0) bC() fp((0.792,0.882,1)) le() b() -bs(424.2,280.05,0) -bs(508.2,280.05,0) -bs(508.2,304.25,0) -bs(424.2,304.25,0) -bs(424.2,280.05,0) +bs(411.602,285,0) +bs(495.602,285,0) +bs(495.602,309.199,0) +bs(411.602,309.199,0) +bs(411.602,285,0) lw(1.12) lc(2) b() -bs(424.2,280.05,0) -bs(508.2,280.05,0) +bs(411.602,285,0) +bs(495.602,285,0) lw(1.12) lc(2) b() -bs(508.2,280.05,0) -bs(508.2,304.25,0) +bs(495.602,285,0) +bs(495.602,309.199,0) lw(1.12) lc(2) b() -bs(508.2,304.25,0) -bs(424.2,304.25,0) +bs(495.602,309.199,0) +bs(411.602,309.199,0) lw(1.12) lc(2) b() -bs(424.2,304.25,0) -bs(424.2,280.05,0) +bs(411.602,309.199,0) +bs(411.602,285,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('Xiner',(436.55,287.25)) +txt('Xiner',(423.95,292.2)) +fp((0,0,0)) +Fn('Helvetica') +Fs(14) +txt('ama',(456.514,292.2)) +fp((0,0,0)) +le() +b() +bs(548.602,285.102,0) +bs(548.602,283,0) +bs(632.602,283,0) +bs(632.602,307,0) +bs(630.5,307,0) +bs(630.5,285.102,0) +bs(548.602,285.102,0) +bC() +fp((0.792,0.882,1)) +le() +b() +bs(546.5,285.102,0) +bs(630.5,285.102,0) +bs(630.5,309.102,0) +bs(546.5,309.102,0) +bs(546.5,285.102,0) +lw(1.12) +lc(2) +b() +bs(546.5,285.102,0) +bs(630.5,285.102,0) +lw(1.12) +lc(2) +b() +bs(630.5,285.102,0) +bs(630.5,309.102,0) +lw(1.12) +lc(2) +b() +bs(630.5,309.102,0) +bs(546.5,309.102,0) +lw(1.12) +lc(2) +b() +bs(546.5,309.102,0) +bs(546.5,285.102,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('ama',(469.125,287.25)) +txt('Xi',(582.75,292.1)) fp((0,0,0)) le() b() -bs(561.2,280.15,0) -bs(561.2,278.05,0) -bs(645.2,278.05,0) -bs(645.2,302.05,0) -bs(643.1,302.05,0) -bs(643.1,280.15,0) -bs(561.2,280.15,0) +bs(10.5,222.801,0) +bs(10.5,220.699,0) +bs(94.5,220.699,0) +bs(94.5,247.898,0) +bs(92.3984,247.898,0) +bs(92.3984,222.801,0) +bs(10.5,222.801,0) bC() fp((0.792,0.882,1)) le() b() -bs(559.1,280.15,0) -bs(643.1,280.15,0) -bs(643.1,304.15,0) -bs(559.1,304.15,0) -bs(559.1,280.15,0) +bs(8.39844,222.801,0) +bs(92.3984,222.801,0) +bs(92.3984,250,0) +bs(8.39844,250,0) +bs(8.39844,222.801,0) lw(1.12) lc(2) b() -bs(559.1,280.15,0) -bs(643.1,280.15,0) +bs(8.39844,222.801,0) +bs(92.3984,222.801,0) lw(1.12) lc(2) b() -bs(643.1,280.15,0) -bs(643.1,304.15,0) +bs(92.3984,222.801,0) +bs(92.3984,250,0) lw(1.12) lc(2) b() -bs(643.1,304.15,0) -bs(559.1,304.15,0) +bs(92.3984,250,0) +bs(8.39844,250,0) lw(1.12) lc(2) b() -bs(559.1,304.15,0) -bs(559.1,280.15,0) +bs(8.39844,250,0) +bs(8.39844,222.801,0) +fp((0,0,0)) +Fn('Helvetica') +Fs(14) +txt('F',(18.4,232.85)) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('Xi',(595.35,287.15)) +txt('ontconfig',(26.5508,232.85)) fp((0,0,0)) le() b() -bs(268.8,220.85,0) -bs(268.8,218.75,0) -bs(352.8,218.75,0) -bs(352.8,242.95,0) -bs(350.7,242.95,0) -bs(350.7,220.85,0) -bs(268.8,220.85,0) +bs(312.898,225.801,0) +bs(312.898,223.699,0) +bs(396.898,223.699,0) +bs(396.898,247.898,0) +bs(394.801,247.898,0) +bs(394.801,225.801,0) +bs(312.898,225.801,0) bC() fp((0.792,0.882,1)) le() b() -bs(266.7,220.85,0) -bs(350.7,220.85,0) -bs(350.7,245.05,0) -bs(266.7,245.05,0) -bs(266.7,220.85,0) +bs(310.801,225.801,0) +bs(394.801,225.801,0) +bs(394.801,250,0) +bs(310.801,250,0) +bs(310.801,225.801,0) lw(1.12) lc(2) b() -bs(266.7,220.85,0) -bs(350.7,220.85,0) +bs(310.801,225.801,0) +bs(394.801,225.801,0) lw(1.12) lc(2) b() -bs(350.7,220.85,0) -bs(350.7,245.05,0) +bs(394.801,225.801,0) +bs(394.801,250,0) lw(1.12) lc(2) b() -bs(350.7,245.05,0) -bs(266.7,245.05,0) +bs(394.801,250,0) +bs(310.801,250,0) lw(1.12) lc(2) b() -bs(266.7,245.05,0) -bs(266.7,220.85,0) +bs(310.801,250,0) +bs(310.801,225.801,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('XRender',(281.15,228.05)) +txt('XRender',(325.25,233)) fp((0,0,0)) le() b() -bs(662,220.95,0) -bs(662,218.85,0) -bs(746,218.85,0) -bs(746,242.95,0) -bs(743.9,242.95,0) -bs(743.9,220.95,0) -bs(662,220.95,0) +bs(649.398,225.898,0) +bs(649.398,223.801,0) +bs(733.398,223.801,0) +bs(733.398,247.898,0) +bs(731.301,247.898,0) +bs(731.301,225.898,0) +bs(649.398,225.898,0) bC() fp((0.961,0.961,0.863)) le() b() -bs(659.9,220.95,0) -bs(743.9,220.95,0) -bs(743.9,245.05,0) -bs(659.9,245.05,0) -bs(659.9,220.95,0) +bs(647.301,225.898,0) +bs(731.301,225.898,0) +bs(731.301,250,0) +bs(647.301,250,0) +bs(647.301,225.898,0) lw(1.12) lc(2) b() -bs(659.9,220.95,0) -bs(743.9,220.95,0) +bs(647.301,225.898,0) +bs(731.301,225.898,0) lw(1.12) lc(2) b() -bs(743.9,220.95,0) -bs(743.9,245.05,0) +bs(731.301,225.898,0) +bs(731.301,250,0) lw(1.12) lc(2) b() -bs(743.9,245.05,0) -bs(659.9,245.05,0) +bs(731.301,250,0) +bs(647.301,250,0) lw(1.12) lc(2) b() -bs(659.9,245.05,0) -bs(659.9,220.95,0) +bs(647.301,250,0) +bs(647.301,225.898,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('Xt*',(692.9,228.05)) +txt('Xt*',(680.3,233)) fp((0,0,0)) le() b() -bs(10.4998,160.8,0) -bs(10.4998,158.7,0) -bs(94.4998,158.7,0) -bs(94.4998,183.75,0) -bs(92.3999,183.75,0) -bs(92.3999,160.8,0) -bs(10.4998,160.8,0) +bs(10.5,160.801,0) +bs(10.5,158.699,0) +bs(94.5,158.699,0) +bs(94.5,185.699,0) +bs(92.3984,185.699,0) +bs(92.3984,160.801,0) +bs(10.5,160.801,0) +bC() +fp((0.792,0.882,1)) +le() +b() +bs(8.39844,160.801,0) +bs(92.3984,160.801,0) +bs(92.3984,187.801,0) +bs(8.39844,187.801,0) +bs(8.39844,160.801,0) +lw(1.12) +lc(2) +b() +bs(8.39844,160.801,0) +bs(92.3984,160.801,0) +lw(1.12) +lc(2) +b() +bs(92.3984,160.801,0) +bs(92.3984,187.801,0) +lw(1.12) +lc(2) +b() +bs(92.3984,187.801,0) +bs(8.39844,187.801,0) +lw(1.12) +lc(2) +b() +bs(8.39844,187.801,0) +bs(8.39844,160.801,0) +fp((0,0,0)) +Fn('Helvetica') +Fs(14) +txt('F',(21.9,170.8)) +fp((0,0,0)) +Fn('Helvetica') +Fs(14) +txt('reeT',(29.8508,170.8)) +fp((0,0,0)) +Fn('Helvetica') +Fs(14) +txt('ype',(56.9742,170.8)) +fp((0,0,0)) +le() +b() +bs(111.301,161.801,0) +bs(111.301,159.699,0) +bs(195.301,159.699,0) +bs(195.301,184.75,0) +bs(193.199,184.75,0) +bs(193.199,161.801,0) +bs(111.301,161.801,0) bC() fp((0.61,0.61,1)) le() b() -bs(8.3999,160.8,0) -bs(92.3999,160.8,0) -bs(92.3999,185.85,0) -bs(8.3999,185.85,0) -bs(8.3999,160.8,0) +bs(109.199,161.801,0) +bs(193.199,161.801,0) +bs(193.199,186.852,0) +bs(109.199,186.852,0) +bs(109.199,161.801,0) lw(1.12) lc(2) b() -bs(8.3999,160.8,0) -bs(92.3999,160.8,0) +bs(109.199,161.801,0) +bs(193.199,161.801,0) lw(1.12) lc(2) b() -bs(92.3999,160.8,0) -bs(92.3999,185.85,0) +bs(193.199,161.801,0) +bs(193.199,186.852,0) lw(1.12) lc(2) b() -bs(92.3999,185.85,0) -bs(8.3999,185.85,0) +bs(193.199,186.852,0) +bs(109.199,186.852,0) lw(1.12) lc(2) b() -bs(8.3999,185.85,0) -bs(8.3999,160.8,0) +bs(109.199,186.852,0) +bs(109.199,161.801,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('QtCore',(28.1997,168.55)) +txt('QtCore',(129,169.55)) fp((0,0,0)) le() b() -bs(268.8,161.15,0) -bs(268.8,159.05,0) -bs(352.8,159.05,0) -bs(352.8,183.4,0) -bs(350.7,183.4,0) -bs(350.7,161.15,0) -bs(268.8,161.15,0) +bs(312.898,162.148,0) +bs(312.898,160.051,0) +bs(396.898,160.051,0) +bs(396.898,184.398,0) +bs(394.801,184.398,0) +bs(394.801,162.148,0) +bs(312.898,162.148,0) bC() fp((0.792,0.882,1)) le() b() -bs(266.7,161.15,0) -bs(350.7,161.15,0) -bs(350.7,185.5,0) -bs(266.7,185.5,0) -bs(266.7,161.15,0) +bs(310.801,162.148,0) +bs(394.801,162.148,0) +bs(394.801,186.5,0) +bs(310.801,186.5,0) +bs(310.801,162.148,0) lw(1.12) lc(2) b() -bs(266.7,161.15,0) -bs(350.7,161.15,0) +bs(310.801,162.148,0) +bs(394.801,162.148,0) lw(1.12) lc(2) b() -bs(350.7,161.15,0) -bs(350.7,185.5,0) +bs(394.801,162.148,0) +bs(394.801,186.5,0) lw(1.12) lc(2) b() -bs(350.7,185.5,0) -bs(266.7,185.5,0) +bs(394.801,186.5,0) +bs(310.801,186.5,0) lw(1.12) lc(2) b() -bs(266.7,185.5,0) -bs(266.7,161.15,0) +bs(310.801,186.5,0) +bs(310.801,162.148,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('Xfix',(290.1,168.35)) +txt('Xfix',(334.2,169.35)) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('es',(313.038,168.35)) +txt('es',(357.136,169.35)) fp((0,0,0)) le() b() -bs(426.3,161.25,0) -bs(426.3,159.15,0) -bs(510.3,159.15,0) -bs(510.3,183.35,0) -bs(508.2,183.35,0) -bs(508.2,161.25,0) -bs(426.3,161.25,0) +bs(413.699,162.199,0) +bs(413.699,160.102,0) +bs(497.699,160.102,0) +bs(497.699,184.301,0) +bs(495.602,184.301,0) +bs(495.602,162.199,0) +bs(413.699,162.199,0) bC() fp((0.961,0.961,0.863)) le() b() -bs(424.2,161.25,0) -bs(508.2,161.25,0) -bs(508.2,185.45,0) -bs(424.2,185.45,0) -bs(424.2,161.25,0) +bs(411.602,162.199,0) +bs(495.602,162.199,0) +bs(495.602,186.398,0) +bs(411.602,186.398,0) +bs(411.602,162.199,0) lw(1.12) lc(2) b() -bs(424.2,161.25,0) -bs(508.2,161.25,0) +bs(411.602,162.199,0) +bs(495.602,162.199,0) lw(1.12) lc(2) b() -bs(508.2,161.25,0) -bs(508.2,185.45,0) +bs(495.602,162.199,0) +bs(495.602,186.398,0) lw(1.12) lc(2) b() -bs(508.2,185.45,0) -bs(424.2,185.45,0) +bs(495.602,186.398,0) +bs(411.602,186.398,0) lw(1.12) lc(2) b() -bs(424.2,185.45,0) -bs(424.2,161.25,0) +bs(411.602,186.398,0) +bs(411.602,162.199,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('Xe',(452.55,168.45)) +txt('Xe',(439.95,169.4)) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('xt',(469.272,168.45)) +txt('xt',(456.667,169.4)) fp((0,0,0)) le() b() -bs(662,161.05,0) -bs(662,158.95,0) -bs(746,158.95,0) -bs(746,183.5,0) -bs(743.9,183.5,0) -bs(743.9,161.05,0) -bs(662,161.05,0) +bs(649.398,162.051,0) +bs(649.398,159.949,0) +bs(733.398,159.949,0) +bs(733.398,184.5,0) +bs(731.301,184.5,0) +bs(731.301,162.051,0) +bs(649.398,162.051,0) bC() fp((0.761,0.98,0.98)) le() b() -bs(659.9,161.05,0) -bs(743.9,161.05,0) -bs(743.9,185.6,0) -bs(659.9,185.6,0) -bs(659.9,161.05,0) +bs(647.301,162.051,0) +bs(731.301,162.051,0) +bs(731.301,186.602,0) +bs(647.301,186.602,0) +bs(647.301,162.051,0) lw(1.12) lc(2) b() -bs(659.9,161.05,0) -bs(743.9,161.05,0) +bs(647.301,162.051,0) +bs(731.301,162.051,0) lw(1.12) lc(2) b() -bs(743.9,161.05,0) -bs(743.9,185.6,0) +bs(731.301,162.051,0) +bs(731.301,186.602,0) lw(1.12) lc(2) b() -bs(743.9,185.6,0) -bs(659.9,185.6,0) +bs(731.301,186.602,0) +bs(647.301,186.602,0) lw(1.12) lc(2) b() -bs(659.9,185.6,0) -bs(659.9,161.05,0) +bs(647.301,186.602,0) +bs(647.301,162.051,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('SM',(691.9,168.3)) +txt('SM',(679.3,169.3)) fp((0,0,0)) le() b() -bs(10.4998,98.9001,0) -bs(10.4998,96.8003,0) -bs(94.4998,96.8003,0) -bs(94.4998,123.7,0) -bs(92.3999,123.7,0) -bs(92.3999,98.9001,0) -bs(10.4998,98.9001,0) +bs(111.301,98.8984,0) +bs(111.301,96.8008,0) +bs(195.301,96.8008,0) +bs(195.301,123.699,0) +bs(193.199,123.699,0) +bs(193.199,98.8984,0) +bs(111.301,98.8984,0) bC() fp((0.741,0.718,0.42)) le() b() -bs(8.3999,98.9001,0) -bs(92.3999,98.9001,0) -bs(92.3999,125.8,0) -bs(8.3999,125.8,0) -bs(8.3999,98.9001,0) +bs(109.199,98.8984,0) +bs(193.199,98.8984,0) +bs(193.199,125.801,0) +bs(109.199,125.801,0) +bs(109.199,98.8984,0) lw(1.12) lc(2) b() -bs(8.3999,98.9001,0) -bs(92.3999,98.9001,0) +bs(109.199,98.8984,0) +bs(193.199,98.8984,0) lw(1.12) lc(2) b() -bs(92.3999,98.9001,0) -bs(92.3999,125.8,0) +bs(193.199,98.8984,0) +bs(193.199,125.801,0) lw(1.12) lc(2) b() -bs(92.3999,125.8,0) -bs(8.3999,125.8,0) +bs(193.199,125.801,0) +bs(109.199,125.801,0) lw(1.12) lc(2) b() -bs(8.3999,125.8,0) -bs(8.3999,98.9001,0) +bs(109.199,125.801,0) +bs(109.199,98.8984,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('pthread',(27.1499,108.8)) +txt('pthread',(127.95,108.8)) fp((0,0,0)) le() b() -bs(111.3,100.1,0) -bs(111.3,98.0002,0) -bs(195.3,98.0002,0) -bs(195.3,122.55,0) -bs(193.2,122.55,0) -bs(193.2,100.1,0) -bs(111.3,100.1,0) +bs(212.102,100.102,0) +bs(212.102,98,0) +bs(296.102,98,0) +bs(296.102,122.551,0) +bs(294,122.551,0) +bs(294,100.102,0) +bs(212.102,100.102,0) bC() fp((0.7,0.7,0.7)) le() b() -bs(109.2,100.1,0) -bs(193.2,100.1,0) -bs(193.2,124.65,0) -bs(109.2,124.65,0) -bs(109.2,100.1,0) +bs(210,100.102,0) +bs(294,100.102,0) +bs(294,124.648,0) +bs(210,124.648,0) +bs(210,100.102,0) lw(1.12) lc(2) b() -bs(109.2,100.1,0) -bs(193.2,100.1,0) +bs(210,100.102,0) +bs(294,100.102,0) lw(1.12) lc(2) b() -bs(193.2,100.1,0) -bs(193.2,124.65,0) +bs(294,100.102,0) +bs(294,124.648,0) lw(1.12) lc(2) b() -bs(193.2,124.65,0) -bs(109.2,124.65,0) +bs(294,124.648,0) +bs(210,124.648,0) lw(1.12) lc(2) b() -bs(109.2,124.65,0) -bs(109.2,100.1,0) +bs(210,124.648,0) +bs(210,100.102,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('Glib',(139.05,107.35)) +txt('Glib',(239.85,107.35)) fp((0,0,0)) le() b() -bs(426.3,100.35,0) -bs(426.3,98.2502,0) -bs(510.3,98.2502,0) -bs(510.3,122.25,0) -bs(508.2,122.25,0) -bs(508.2,100.35,0) -bs(426.3,100.35,0) +bs(413.699,100.352,0) +bs(413.699,98.25,0) +bs(497.699,98.25,0) +bs(497.699,122.25,0) +bs(495.602,122.25,0) +bs(495.602,100.352,0) +bs(413.699,100.352,0) bC() fp((0.961,0.961,0.863)) le() b() -bs(424.2,100.35,0) -bs(508.2,100.35,0) -bs(508.2,124.35,0) -bs(424.2,124.35,0) -bs(424.2,100.35,0) +bs(411.602,100.352,0) +bs(495.602,100.352,0) +bs(495.602,124.352,0) +bs(411.602,124.352,0) +bs(411.602,100.352,0) lw(1.12) lc(2) b() -bs(424.2,100.35,0) -bs(508.2,100.35,0) +bs(411.602,100.352,0) +bs(495.602,100.352,0) lw(1.12) lc(2) b() -bs(508.2,100.35,0) -bs(508.2,124.35,0) +bs(495.602,100.352,0) +bs(495.602,124.352,0) lw(1.12) lc(2) b() -bs(508.2,124.35,0) -bs(424.2,124.35,0) +bs(495.602,124.352,0) +bs(411.602,124.352,0) lw(1.12) lc(2) b() -bs(424.2,124.35,0) -bs(424.2,100.35,0) +bs(411.602,124.352,0) +bs(411.602,100.352,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('X11',(455.15,107.35)) +txt('X11',(442.55,107.35)) fp((0,0,0)) le() b() -bs(662,100.1,0) -bs(662,98.0002,0) -bs(746,98.0002,0) -bs(746,122.55,0) -bs(743.9,122.55,0) -bs(743.9,100.1,0) -bs(662,100.1,0) +bs(649.398,100.102,0) +bs(649.398,98,0) +bs(733.398,98,0) +bs(733.398,122.551,0) +bs(731.301,122.551,0) +bs(731.301,100.102,0) +bs(649.398,100.102,0) bC() fp((0.761,0.98,0.98)) le() b() -bs(659.9,100.1,0) -bs(743.9,100.1,0) -bs(743.9,124.65,0) -bs(659.9,124.65,0) -bs(659.9,100.1,0) +bs(647.301,100.102,0) +bs(731.301,100.102,0) +bs(731.301,124.648,0) +bs(647.301,124.648,0) +bs(647.301,100.102,0) lw(1.12) lc(2) b() -bs(659.9,100.1,0) -bs(743.9,100.1,0) +bs(647.301,100.102,0) +bs(731.301,100.102,0) lw(1.12) lc(2) b() -bs(743.9,100.1,0) -bs(743.9,124.65,0) +bs(731.301,100.102,0) +bs(731.301,124.648,0) lw(1.12) lc(2) b() -bs(743.9,124.65,0) -bs(659.9,124.65,0) +bs(731.301,124.648,0) +bs(647.301,124.648,0) lw(1.12) lc(2) b() -bs(659.9,124.65,0) -bs(659.9,100.1,0) +bs(647.301,124.648,0) +bs(647.301,100.102,0) fp((0,0,0)) Fn('Helvetica') Fs(14) -txt('ICE',(690.6,107.35)) +txt('ICE',(678,107.35)) fp((0,0,0)) Fn('Helvetica') -txt('some',(585.05,38.7002)) +txt('some',(572.45,38.7)) fp((0,0,0)) Fn('Helvetica') -txt('configur',(617.15,38.7002)) +txt('configur',(604.55,38.7)) fp((0,0,0)) Fn('Helvetica') -txt('ations',(659.733,38.7002)) +txt('ations',(647.13,38.7)) fp((0,0,0)) Fn('Helvetica') -txt('only',(694.4,38.7002)) +txt('only',(681.8,38.7)) fp((0,0,0)) Fn('Helvetica') -txt('*',(568.85,22.5002)) +txt('*',(556.25,22.5)) fp((0,0,0)) Fn('Helvetica') -txt('Xt',(585.05,22.5002)) +txt('Xt',(572.45,22.5)) fp((0,0,0)) Fn('Helvetica') -txt('intr',(599.4,22.5002)) +txt('intr',(586.8,22.5)) fp((0,0,0)) Fn('Helvetica') -txt('insics',(616.217,22.5002)) +txt('insics',(603.61,22.5)) fp((0,0,0)) Fn('Helvetica') -txt('only',(648.95,22.5002)) +txt('only',(636.35,22.5)) lw(1.12) lc(2) -ld((0, 2.4999899999999999)) +ld((0, 2.5)) b() -bs(308.7,339.25,0) -bs(308.7,328.05,0) +bs(352.801,344.199,0) +bs(352.801,333,0) lw(1.12) lc(2) -ld((0, 2.0312000000000001)) +ld((0, 2.03125)) b() -bs(308.7,328.05,0) -bs(308.7,332.6,0) +bs(352.801,333,0) +bs(352.801,337.551,0) lw(1.12) lc(2) ld((0, 2.45438)) b() -bs(308.7,332.6,0) -bs(308.7,332.6,0) -bc(308.7,330.744,309.438,328.963,310.75,327.651,0) +bs(352.801,337.551,0) +bs(352.801,337.551,0) +bc(352.801,335.695,353.539,333.914,354.852,332.602,0) lw(1.12) lc(2) -ld((0, 2.4543599999999999)) +ld((0, 2.45438)) b() -bs(310.75,327.65,0) -bs(310.75,327.651,0) -bc(312.063,326.338,313.844,325.6,315.7,325.6,0) +bs(354.852,332.602,0) +bs(354.852,332.602,0) +bc(356.164,331.289,357.945,330.551,359.801,330.551,0) lw(1.12) lc(2) -ld((0, 2.4639500000000001)) +ld((0, 2.4218799999999998)) b() -bs(315.7,325.6,0) -bs(387.45,325.6,0) +bs(359.801,330.551,0) +bs(403.199,330.551,0) lw(1.12) lc(2) -ld((0, 2.4639500000000001)) +ld((0, 2.4218799999999998)) b() -bs(387.45,325.6,0) -bs(459.2,325.6,0) +bs(403.199,330.551,0) +bs(446.602,330.551,0) lw(1.12) lc(2) ld((0, 2.45438)) b() -bs(459.2,325.6,0) -bs(459.2,325.6,0) -bc(461.056,325.6,462.837,324.863,464.15,323.55,0) +bs(446.602,330.551,0) +bs(446.602,330.551,0) +bc(448.457,330.551,450.238,329.812,451.551,328.5,0) lw(1.12) lc(2) ld((0, 2.45438)) b() -bs(464.15,323.55,0) -bs(464.15,323.55,0) -bc(465.462,322.237,466.2,320.457,466.2,318.6,0) +bs(451.551,328.5,0) +bs(451.551,328.5,0) +bc(452.863,327.188,453.602,325.406,453.602,323.551,0) lw(1.12) lc(2) -ld((0, 2.3437899999999998)) +ld((0, 2.3437399999999999)) b() -bs(466.2,318.6,0) -bs(466.2,313.35,0) +bs(453.602,323.551,0) +bs(453.602,318.301,0) lw(1.12) lc(2) ld((0, 2.5)) b() -bs(466.2,313.35,0) -bs(466.2,311.95,0) +bs(453.602,318.301,0) +bs(453.602,316.898,0) fp((0,0,0)) le() b() -bs(462.35,311.95,0) -bs(466.199,304.25,0) -bs(470.05,311.95,0) +bs(449.75,316.898,0) +bs(453.602,309.199,0) +bs(457.449,316.898,0) lw(1.12) lc(2) -ld((0, 2.4999899999999999)) +ld((0, 2.5)) b() -bs(308.7,339.25,0) -bs(308.7,328.05,0) +bs(352.801,344.199,0) +bs(352.801,333,0) lw(1.12) lc(2) -ld((0, 2.0088900000000001)) +ld((0, 2.0089299999999999)) b() -bs(308.7,328.05,0) -bs(308.7,332.55,0) +bs(352.801,333,0) +bs(352.801,337.5,0) +lw(1.12) +lc(2) +ld((0, 2.4543599999999999)) +b() +bs(352.801,337.5,0) +bs(352.801,337.5,0) +bc(352.801,335.645,353.539,333.863,354.852,332.551,0) lw(1.12) lc(2) ld((0, 2.45438)) b() -bs(308.7,332.55,0) -bs(308.7,332.55,0) -bc(308.7,330.694,309.438,328.913,310.75,327.601,0) +bs(354.852,332.551,0) +bs(354.852,332.551,0) +bc(356.164,331.238,357.945,330.5,359.801,330.5,0) lw(1.12) lc(2) -ld((0, 2.4543599999999999)) +ld((0, 2.4743300000000001)) b() -bs(310.75,327.6,0) -bs(310.75,327.601,0) -bc(312.063,326.288,313.844,325.55,315.7,325.55,0) +bs(359.801,330.5,0) +bs(470.648,330.5,0) lw(1.12) lc(2) -ld((0, 2.4857100000000001)) +ld((0, 2.4743300000000001)) b() -bs(459.2,325.6,0) -bs(594.1,325.55,0) +bs(470.648,330.5,0) +bs(581.5,330.5,0) lw(1.12) lc(2) -ld((0, 2.4543900000000001)) +ld((0, 2.45438)) b() -bs(594.1,325.55,0) -bs(594.1,325.55,0) -bc(595.956,325.55,597.737,324.813,599.05,323.5,0) +bs(581.5,330.5,0) +bs(581.5,330.5,0) +bc(583.355,330.5,585.137,329.762,586.449,328.449,0) lw(1.12) lc(2) -ld((0, 2.4544100000000002)) +ld((0, 2.45438)) b() -bs(599.05,323.5,0) -bs(599.05,323.5,0) -bc(600.362,322.187,601.1,320.407,601.1,318.55,0) +bs(586.449,328.449,0) +bs(586.449,328.449,0) +bc(587.762,327.137,588.5,325.355,588.5,323.5,0) lw(1.12) lc(2) -ld((0, 2.3660899999999998)) +ld((0, 2.36605)) b() -bs(601.1,318.55,0) -bs(601.1,313.25,0) +bs(588.5,323.5,0) +bs(588.5,318.199,0) lw(1.12) lc(2) ld((0, 2.5)) b() -bs(601.1,313.25,0) -bs(601.1,311.85,0) +bs(588.5,318.199,0) +bs(588.5,316.801,0) fp((0,0,0)) le() b() -bs(597.25,311.85,0) -bs(601.099,304.15,0) -bs(604.949,311.85,0) +bs(584.648,316.801,0) +bs(588.5,309.102,0) +bs(592.352,316.801,0) lw(1.12) lc(2) b() -bs(266.7,351.775,0) -bs(255.5,351.775,0) +bs(310.801,356.727,0) +bs(299.602,356.727,0) lw(1.12) lc(2) b() -bs(255.5,351.775,0) -bs(57.3999,351.775,0) +bs(299.602,356.727,0) +bs(158.199,356.727,0) lw(1.12) lc(2) b() -bs(57.3999,351.775,0) -bs(57.3999,351.775,0) -bc(53.5339,351.775,50.3999,348.641,50.3999,344.775,0) +bs(158.199,356.727,0) +bs(158.199,356.727,0) +bc(154.336,356.727,151.199,353.59,151.199,349.727,0) lw(1.12) lc(2) b() -bs(50.3999,344.775,0) -bs(50.3999,194.95,0) +bs(151.199,349.727,0) +bs(151.199,195.949,0) lw(1.12) lc(2) b() -bs(50.3999,194.95,0) -bs(50.3999,193.55,0) +bs(151.199,195.949,0) +bs(151.199,194.551,0) fp((0,0,0)) le() b() -bs(46.5496,193.55,0) -bs(50.3994,185.85,0) -bs(54.2495,193.55,0) +bs(147.352,194.551,0) +bs(151.199,186.852,0) +bs(155.051,194.551,0) lw(1.12) lc(2) b() -bs(50.3999,160.8,0) -bs(50.3999,133.5,0) +bs(151.199,161.801,0) +bs(151.199,133.5,0) fp((0,0,0)) le() b() -bs(46.5496,133.5,0) -bs(50.3994,125.8,0) -bs(54.2495,133.5,0) +bs(147.352,133.5,0) +bs(151.199,125.801,0) +bs(155.051,133.5,0) lw(1.12) lc(2) ld((0, 2)) b() -bs(50.3999,160.8,0) -bs(50.3999,149.6,0) +bs(151.199,161.801,0) +bs(151.199,150.602,0) lw(1.12) lc(2) -ld((0, 1.7745500000000001)) +ld((0, 1.5513600000000001)) b() -bs(50.3999,149.6,0) -bs(50.3999,153.575,0) +bs(151.199,150.602,0) +bs(151.199,154.074,0) lw(1.12) lc(2) -ld((0, 2.4543599999999999)) +ld((0, 2.4543400000000002)) b() -bs(50.3999,153.575,0) -bs(50.3999,153.575,0) -bc(50.3999,151.719,51.1375,149.938,52.4502,148.625,0) +bs(151.199,154.074,0) +bs(151.199,154.074,0) +bc(151.199,152.219,151.938,150.438,153.25,149.125,0) lw(1.12) lc(2) ld((0, 2.4543699999999999)) b() -bs(52.45,148.625,0) -bs(52.4502,148.625,0) -bc(53.7629,147.313,55.5435,146.575,57.3999,146.575,0) +bs(153.25,149.125,0) +bs(153.25,149.125,0) +bc(154.562,147.812,156.344,147.074,158.199,147.074,0) lw(1.12) lc(2) ld((0, 2.4218799999999998)) b() -bs(57.3999,146.575,0) -bs(100.8,146.575,0) +bs(158.199,147.074,0) +bs(201.602,147.074,0) lw(1.12) lc(2) ld((0, 2.4218799999999998)) b() -bs(100.8,146.575,0) -bs(144.2,146.575,0) +bs(201.602,147.074,0) +bs(245,147.074,0) lw(1.12) lc(2) ld((0, 2.45438)) b() -bs(144.2,146.575,0) -bs(144.2,146.575,0) -bc(146.056,146.575,147.837,145.838,149.15,144.525,0) +bs(245,147.074,0) +bs(245,147.074,0) +bc(246.855,147.074,248.637,146.336,249.949,145.023,0) lw(1.12) lc(2) -ld((0, 2.4543699999999999)) +ld((0, 2.4543900000000001)) b() -bs(149.15,144.525,0) -bs(149.15,144.525,0) -bc(150.462,143.212,151.2,141.432,151.2,139.575,0) +bs(249.949,145.023,0) +bs(249.949,145.023,0) +bc(251.262,143.711,252,141.93,252,140.074,0) lw(1.12) lc(2) -ld((0, 1.73363)) +ld((0, 1.88243)) b() -bs(151.2,139.575,0) -bs(151.2,133.75,0) +bs(252,140.074,0) +bs(252,133.75,0) lw(1.12) lc(2) ld((0, 2.5)) b() -bs(151.2,133.75,0) -bs(151.2,132.35,0) +bs(252,133.75,0) +bs(252,132.352,0) fp((0,0,0)) le() b() -bs(147.35,132.35,0) -bs(151.199,124.65,0) -bs(155.05,132.35,0) +bs(248.148,132.352,0) +bs(252,124.648,0) +bs(255.852,132.352,0) lw(1.12) lc(2) b() -bs(350.7,351.775,0) -bs(361.9,351.775,0) +bs(394.801,356.727,0) +bs(406,356.727,0) lw(1.12) lc(2) b() -bs(361.9,351.775,0) -bs(694.9,351.775,0) +bs(406,356.727,0) +bs(682.301,356.727,0) lw(1.12) lc(2) b() -bs(694.9,351.775,0) -bs(694.9,351.775,0) -bc(698.766,351.775,701.9,348.641,701.9,344.775,0) +bs(682.301,356.727,0) +bs(682.301,356.727,0) +bc(686.164,356.727,689.301,353.59,689.301,349.727,0) lw(1.12) lc(2) b() -bs(701.9,344.775,0) -bs(701.9,254.15,0) +bs(689.301,349.727,0) +bs(689.301,259.102,0) lw(1.12) lc(2) b() -bs(701.9,254.15,0) -bs(701.9,252.75,0) +bs(689.301,259.102,0) +bs(689.301,257.699,0) fp((0,0,0)) le() b() -bs(698.05,252.75,0) -bs(701.899,245.05,0) -bs(705.75,252.75,0) +bs(685.449,257.699,0) +bs(689.301,250,0) +bs(693.148,257.699,0) lw(1.12) lc(2) -ld((0, 2.4375200000000001)) +ld((0, 2.4375)) b() -bs(308.7,339.25,0) -bs(308.7,311.95,0) +bs(352.801,344.199,0) +bs(352.801,316.898,0) fp((0,0,0)) le() b() -bs(304.85,311.95,0) -bs(308.699,304.25,0) -bs(312.55,311.95,0) +bs(348.949,316.898,0) +bs(352.801,309.199,0) +bs(356.648,316.898,0) lw(1.12) lc(2) -ld((0, 2.4999899999999999)) +ld((0, 2.5)) b() -bs(308.7,339.25,0) -bs(308.7,328.05,0) +bs(352.801,344.199,0) +bs(352.801,333,0) lw(1.12) lc(2) -ld((0, 2.0312000000000001)) +ld((0, 2.03125)) b() -bs(308.7,328.05,0) -bs(308.7,332.6,0) +bs(352.801,333,0) +bs(352.801,337.551,0) lw(1.12) lc(2) ld((0, 2.45438)) b() -bs(308.7,332.6,0) -bs(308.7,332.6,0) -bc(308.7,330.744,307.962,328.963,306.65,327.651,0) +bs(352.801,337.551,0) +bs(352.801,337.551,0) +bc(352.801,335.695,352.062,333.914,350.75,332.602,0) lw(1.12) lc(2) ld((0, 2.45438)) b() -bs(306.65,327.65,0) -bs(306.65,327.651,0) -bc(305.337,326.338,303.556,325.601,301.7,325.601,0) +bs(350.75,332.602,0) +bs(350.75,332.602,0) +bc(349.438,331.289,347.656,330.551,345.801,330.551,0) lw(1.12) lc(2) -ld((0, 2.4639500000000001)) +ld((0, 2.4218799999999998)) b() -bs(301.7,325.6,0) -bs(229.95,325.6,0) +bs(345.801,330.551,0) +bs(302.398,330.551,0) lw(1.12) lc(2) -ld((0, 2.4639500000000001)) +ld((0, 2.4218799999999998)) b() -bs(229.95,325.6,0) -bs(158.2,325.6,0) +bs(302.398,330.551,0) +bs(259,330.551,0) lw(1.12) lc(2) -ld((0, 2.4543699999999999)) +ld((0, 2.45438)) b() -bs(158.2,325.6,0) -bs(158.2,325.6,0) -bc(156.344,325.6,154.563,324.863,153.25,323.55,0) +bs(259,330.551,0) +bs(259,330.551,0) +bc(257.145,330.551,255.363,329.812,254.051,328.5,0) lw(1.12) lc(2) ld((0, 2.45438)) b() -bs(153.25,323.55,0) -bs(153.25,323.55,0) -bc(151.938,322.237,151.2,320.457,151.2,318.6,0) +bs(254.051,328.5,0) +bs(254.051,328.5,0) +bc(252.738,327.188,252,325.406,252,323.551,0) lw(1.12) lc(2) -ld((0, 2.3437899999999998)) +ld((0, 2.3437399999999999)) b() -bs(151.2,318.6,0) -bs(151.2,313.35,0) +bs(252,323.551,0) +bs(252,318.301,0) lw(1.12) lc(2) ld((0, 2.5)) b() -bs(151.2,313.35,0) -bs(151.2,311.95,0) +bs(252,318.301,0) +bs(252,316.898,0) fp((0,0,0)) le() b() -bs(147.35,311.95,0) -bs(151.199,304.25,0) -bs(155.05,311.95,0) +bs(248.148,316.898,0) +bs(252,309.199,0) +bs(255.852,316.898,0) lw(1.12) lc(2) b() -bs(308.7,280.05,0) -bs(308.7,252.75,0) +bs(352.801,285,0) +bs(352.801,257.699,0) fp((0,0,0)) le() b() -bs(304.85,252.75,0) -bs(308.699,245.05,0) -bs(312.55,252.75,0) +bs(348.949,257.699,0) +bs(352.801,250,0) +bs(356.648,257.699,0) lw(1.12) lc(2) b() -bs(466.2,280.05,0) -bs(466.2,193.15,0) +bs(453.602,285,0) +bs(453.602,194.102,0) fp((0,0,0)) le() b() -bs(462.35,193.15,0) -bs(466.199,185.45,0) -bs(470.05,193.15,0) +bs(449.75,194.102,0) +bs(453.602,186.398,0) +bs(457.449,194.102,0) lw(1.12) lc(2) b() -bs(151.2,280.05,0) -bs(151.2,268.85,0) +bs(252,285,0) +bs(252,273.801,0) lw(1.12) lc(2) b() -bs(151.2,268.85,0) -bs(151.2,239.95,0) +bs(252,273.801,0) +bs(252,244.898,0) lw(1.12) lc(2) b() -bs(151.2,239.95,0) -bs(151.2,239.95,0) -bc(151.2,236.084,154.334,232.95,158.2,232.95,0) +bs(252,244.898,0) +bs(252,244.898,0) +bc(252,241.035,255.137,237.898,259,237.898,0) lw(1.12) lc(2) b() -bs(158.2,232.95,0) -bs(257.6,232.95,0) +bs(259,237.898,0) +bs(301.699,237.898,0) lw(1.12) lc(2) b() -bs(257.6,232.95,0) -bs(259,232.95,0) +bs(301.699,237.898,0) +bs(303.102,237.898,0) fp((0,0,0)) le() b() -bs(259,229.1,0) -bs(266.699,232.95,0) -bs(259,236.8,0) +bs(303.102,234.051,0) +bs(310.801,237.898,0) +bs(303.102,241.75,0) lw(1.12) lc(2) b() -bs(350.7,232.95,0) -bs(361.9,232.95,0) +bs(394.801,237.898,0) +bs(406,237.898,0) lw(1.12) lc(2) b() -bs(361.9,232.95,0) -bs(459.2,232.95,0) +bs(406,237.898,0) +bs(446.602,237.898,0) lw(1.12) lc(2) b() -bs(459.2,232.95,0) -bs(459.2,232.95,0) -bc(463.066,232.95,466.2,229.816,466.2,225.95,0) +bs(446.602,237.898,0) +bs(446.602,237.898,0) +bc(450.465,237.898,453.602,234.762,453.602,230.898,0) lw(1.12) lc(2) b() -bs(466.2,225.95,0) -bs(466.2,194.55,0) +bs(453.602,230.898,0) +bs(453.602,195.5,0) lw(1.12) lc(2) b() -bs(466.2,194.55,0) -bs(466.2,193.15,0) +bs(453.602,195.5,0) +bs(453.602,194.102,0) fp((0,0,0)) le() b() -bs(462.35,193.15,0) -bs(466.199,185.45,0) -bs(470.05,193.15,0) +bs(449.75,194.102,0) +bs(453.602,186.398,0) +bs(457.449,194.102,0) lw(1.12) lc(2) b() -bs(559.1,292.15,0) -bs(547.9,292.15,0) +bs(546.5,297.102,0) +bs(535.301,297.102,0) lw(1.12) lc(2) b() -bs(547.9,292.15,0) -bs(544.5,292.15,0) +bs(535.301,297.102,0) +bs(531.898,297.102,0) lw(1.12) lc(2) b() -bs(544.5,292.15,0) -bs(544.5,292.15,0) -bc(542.643,292.15,540.863,291.413,539.55,290.1,0) +bs(531.898,297.102,0) +bs(531.898,297.102,0) +bc(530.043,297.102,528.262,296.363,526.949,295.051,0) lw(1.12) lc(2) b() -bs(539.55,290.1,0) -bs(539.55,290.1,0) -bc(538.238,288.787,537.5,287.007,537.5,285.15,0) +bs(526.949,295.051,0) +bs(526.949,295.051,0) +bc(525.637,293.738,524.898,291.957,524.898,290.102,0) lw(1.12) lc(2) b() -bs(537.5,285.15,0) -bs(537.5,232.75,0) +bs(524.898,290.102,0) +bs(524.898,235.699,0) lw(1.12) lc(2) b() -bs(537.5,232.75,0) -bs(537.5,180.35,0) +bs(524.898,235.699,0) +bs(524.898,181.301,0) lw(1.12) lc(2) b() -bs(537.5,180.35,0) -bs(537.5,180.35,0) -bc(537.5,178.494,536.762,176.713,535.449,175.401,0) +bs(524.898,181.301,0) +bs(524.898,181.301,0) +bc(524.898,179.445,524.16,177.664,522.852,176.352,0) lw(1.12) lc(2) b() -bs(535.449,175.4,0) -bs(535.449,175.401,0) -bc(534.137,174.088,532.356,173.35,530.5,173.35,0) +bs(522.852,176.352,0) +bs(522.852,176.352,0) +bc(521.539,175.039,519.754,174.301,517.898,174.301,0) lw(1.12) lc(2) b() -bs(530.5,173.35,0) -bs(517.3,173.35,0) +bs(517.898,174.301,0) +bs(504.699,174.301,0) lw(1.12) lc(2) b() -bs(517.3,173.35,0) -bs(515.9,173.35,0) +bs(504.699,174.301,0) +bs(503.301,174.301,0) fp((0,0,0)) le() b() -bs(515.9,177.2,0) -bs(508.2,173.351,0) -bs(515.9,169.5,0) +bs(503.301,178.148,0) +bs(495.602,174.301,0) +bs(503.301,170.449,0) lw(1.12) lc(2) b() -bs(701.9,220.95,0) -bs(701.9,193.3,0) +bs(689.301,225.898,0) +bs(689.301,194.301,0) fp((0,0,0)) le() b() -bs(698.05,193.3,0) -bs(701.899,185.6,0) -bs(705.75,193.3,0) +bs(685.449,194.301,0) +bs(689.301,186.602,0) +bs(693.148,194.301,0) lw(1.12) lc(2) b() -bs(659.9,233,0) -bs(648.7,233,0) +bs(647.301,237.949,0) +bs(636.102,237.949,0) lw(1.12) lc(2) b() -bs(648.7,233,0) -bs(594.9,233,0) +bs(636.102,237.949,0) +bs(582.301,237.949,0) lw(1.12) lc(2) b() -bs(594.9,233,0) -bs(594.9,233,0) -bc(593.043,233,591.263,232.263,589.95,230.95,0) +bs(582.301,237.949,0) +bs(582.301,237.949,0) +bc(580.445,237.949,578.664,237.211,577.352,235.898,0) lw(1.12) lc(2) b() -bs(589.95,230.95,0) -bs(589.95,230.95,0) -bc(588.638,229.637,587.9,227.857,587.9,226,0) +bs(577.352,235.898,0) +bs(577.352,235.898,0) +bc(576.039,234.586,575.301,232.805,575.301,230.949,0) lw(1.12) lc(2) b() -bs(587.9,226,0) -bs(587.9,172.675,0) +bs(575.301,230.949,0) +bs(575.301,175.148,0) lw(1.12) lc(2) b() -bs(587.9,172.675,0) -bs(587.9,119.35,0) +bs(575.301,175.148,0) +bs(575.301,119.352,0) lw(1.12) lc(2) b() -bs(587.9,119.35,0) -bs(587.9,119.35,0) -bc(587.9,117.494,587.162,115.713,585.85,114.401,0) +bs(575.301,119.352,0) +bs(575.301,119.352,0) +bc(575.301,117.496,574.562,115.711,573.25,114.398,0) lw(1.12) lc(2) b() -bs(585.85,114.4,0) -bs(585.85,114.401,0) -bc(584.537,113.088,582.756,112.35,580.9,112.35,0) +bs(573.25,114.398,0) +bs(573.25,114.398,0) +bc(571.938,113.09,570.156,112.352,568.301,112.352,0) lw(1.12) lc(2) b() -bs(580.9,112.35,0) -bs(517.3,112.35,0) +bs(568.301,112.352,0) +bs(504.699,112.352,0) lw(1.12) lc(2) b() -bs(517.3,112.35,0) -bs(515.9,112.35,0) +bs(504.699,112.352,0) +bs(503.301,112.352,0) fp((0,0,0)) le() b() -bs(515.9,116.2,0) -bs(508.2,112.35,0) -bs(515.9,108.5,0) +bs(503.301,116.199,0) +bs(495.602,112.352,0) +bs(503.301,108.5,0) lw(1.12) lc(2) b() -bs(701.9,161.05,0) -bs(701.9,132.35,0) +bs(689.301,162.051,0) +bs(689.301,132.352,0) fp((0,0,0)) le() b() -bs(698.05,132.35,0) -bs(701.899,124.65,0) -bs(705.75,132.35,0) +bs(685.449,132.352,0) +bs(689.301,124.648,0) +bs(693.148,132.352,0) lw(1.12) lc(2) b() -bs(466.2,161.25,0) -bs(466.2,132.05,0) +bs(453.602,162.199,0) +bs(453.602,132.051,0) fp((0,0,0)) le() b() -bs(462.35,132.05,0) -bs(466.199,124.35,0) -bs(470.05,132.05,0) +bs(449.75,132.051,0) +bs(453.602,124.352,0) +bs(457.449,132.051,0) lw(1.12) lc(2) b() -bs(151.2,280.05,0) -bs(151.2,268.85,0) +bs(252,285,0) +bs(252,273.801,0) lw(1.12) lc(2) b() -bs(151.2,268.85,0) -bs(151.2,180.325,0) +bs(252,273.801,0) +bs(252,181.324,0) lw(1.12) lc(2) b() -bs(151.2,180.325,0) -bs(151.2,180.325,0) -bc(151.2,176.459,154.334,173.325,158.2,173.325,0) +bs(252,181.324,0) +bs(252,181.324,0) +bc(252,177.461,255.137,174.324,259,174.324,0) lw(1.12) lc(2) b() -bs(158.2,173.325,0) -bs(257.6,173.325,0) +bs(259,174.324,0) +bs(301.699,174.324,0) lw(1.12) lc(2) b() -bs(257.6,173.325,0) -bs(259,173.325,0) +bs(301.699,174.324,0) +bs(303.102,174.324,0) fp((0,0,0)) le() b() -bs(259,169.475,0) -bs(266.699,173.325,0) -bs(259,177.175,0) +bs(303.102,170.477,0) +bs(310.801,174.324,0) +bs(303.102,178.176,0) lw(1.12) lc(2) b() -bs(308.7,161.15,0) -bs(308.7,149.95,0) +bs(352.801,162.148,0) +bs(352.801,150.949,0) lw(1.12) lc(2) b() -bs(308.7,149.95,0) -bs(308.7,153.6,0) +bs(352.801,150.949,0) +bs(352.801,154.102,0) lw(1.12) lc(2) b() -bs(308.7,153.6,0) -bs(308.7,153.6,0) -bc(308.7,151.744,309.438,149.963,310.75,148.651,0) +bs(352.801,154.102,0) +bs(352.801,154.102,0) +bc(352.801,152.246,353.539,150.461,354.852,149.148,0) lw(1.12) lc(2) b() -bs(310.75,148.65,0) -bs(310.75,148.651,0) -bc(312.063,147.338,313.844,146.6,315.7,146.6,0) +bs(354.852,149.148,0) +bs(354.852,149.148,0) +bc(356.164,147.84,357.945,147.102,359.801,147.102,0) lw(1.12) lc(2) b() -bs(315.7,146.6,0) -bs(387.45,146.6,0) +bs(359.801,147.102,0) +bs(403.199,147.102,0) lw(1.12) lc(2) b() -bs(387.45,146.6,0) -bs(459.2,146.6,0) +bs(403.199,147.102,0) +bs(446.602,147.102,0) lw(1.12) lc(2) b() -bs(459.2,146.6,0) -bs(459.2,146.6,0) -bc(461.056,146.6,462.837,145.863,464.15,144.55,0) +bs(446.602,147.102,0) +bs(446.602,147.102,0) +bc(448.457,147.102,450.238,146.363,451.551,145.051,0) lw(1.12) lc(2) b() -bs(464.15,144.55,0) -bs(464.15,144.55,0) -bc(465.462,143.237,466.2,141.457,466.2,139.6,0) +bs(451.551,145.051,0) +bs(451.551,145.051,0) +bc(452.863,143.738,453.602,141.957,453.602,140.102,0) lw(1.12) lc(2) b() -bs(466.2,139.6,0) -bs(466.2,133.45,0) +bs(453.602,140.102,0) +bs(453.602,133.449,0) lw(1.12) lc(2) b() -bs(466.2,133.45,0) -bs(466.2,132.05,0) +bs(453.602,133.449,0) +bs(453.602,132.051,0) fp((0,0,0)) le() b() -bs(462.35,132.05,0) -bs(466.199,124.35,0) -bs(470.05,132.05,0) +bs(449.75,132.051,0) +bs(453.602,124.352,0) +bs(457.449,132.051,0) lw(1.12) lc(2) -ld((0, 2.2889599999999999)) +ld((0, 2.5)) b() -bs(552.65,41.8,0) -bs(580.85,41.8,0) -G_() -G() -fp((0,0,0)) -Fn('Helvetica') -Fs(16) -txt('libr',(341.317,393.4)) -fp((0,0,0)) -Fn('Helvetica') -Fs(16) -txt('ar',(362.494,393.4)) +bs(310.801,356.727,0) +bs(299.602,356.727,0) +lw(1.12) +lc(2) +ld((0, 2.48563)) +b() +bs(299.602,356.727,0) +bs(57.3984,356.727,0) +lw(1.12) +lc(2) +ld((0, 2.4543699999999999)) +b() +bs(57.3984,356.727,0) +bs(57.3984,356.727,0) +bc(53.5352,356.727,50.3984,353.59,50.3984,349.727,0) +lw(1.12) +lc(2) +ld((0, 2.4519700000000002)) +b() +bs(50.3984,349.727,0) +bs(50.3984,259.102,0) +lw(1.12) +lc(2) +ld((0, 2.5)) +b() +bs(50.3984,259.102,0) +bs(50.3984,257.699,0) fp((0,0,0)) -Fn('Helvetica') -Fs(16) -txt('y',(377.168,393.4)) +le() +b() +bs(46.5508,257.699,0) +bs(50.3984,250,0) +bs(54.25,257.699,0) +lw(1.12) +lc(2) +ld((0, 2.4375100000000001)) +b() +bs(50.3984,222.801,0) +bs(50.3984,195.5,0) fp((0,0,0)) -Fn('Helvetica') -Fs(16) -txt('dependencies',(389.267,393.4)) +le() +b() +bs(46.5508,195.5,0) +bs(50.3984,187.801,0) +bs(54.25,195.5,0) +lw(1.12) +lc(2) +b() +bs(50.3984,160.801,0) +bs(50.3984,154.148,0) +lw(1.12) +lc(2) +b() +bs(50.3984,154.148,0) +bs(50.3984,154.148,0) +bc(50.3984,152.293,51.1367,150.512,52.4492,149.199,0) +lw(1.12) +lc(2) +b() +bs(52.4492,149.199,0) +bs(52.4492,149.199,0) +bc(53.7617,147.887,55.543,147.148,57.3984,147.148,0) +lw(1.12) +lc(2) +b() +bs(57.3984,147.148,0) +bs(100.801,147.148,0) +lw(1.12) +lc(2) +b() +bs(100.801,147.148,0) +bs(144.199,147.148,0) +lw(1.12) +lc(2) +b() +bs(144.199,147.148,0) +bs(144.199,147.148,0) +bc(146.055,147.148,147.836,146.41,149.148,145.102,0) +lw(1.12) +lc(2) +b() +bs(149.148,145.102,0) +bs(149.148,145.102,0) +bc(150.461,143.789,151.199,142.004,151.199,140.148,0) +lw(1.12) +lc(2) +b() +bs(151.199,140.148,0) +bs(151.199,134.898,0) +lw(1.12) +lc(2) +b() +bs(151.199,134.898,0) +bs(151.199,133.5,0) fp((0,0,0)) -Fn('Helvetica') -Fs(16) -txt('Qt for X11',(265.517,393.4)) -G_() +le() +b() +bs(147.352,133.5,0) +bs(151.199,125.801,0) +bs(155.051,133.5,0) +lw(1.12) +lc(2) +ld((0, 2.2889599999999999)) +b() +bs(540.051,41.8008,0) +bs(568.25,41.8008,0) guidelayer('Guide Lines',1,0,0,1,(0,0,1)) grid((0,0,5,5),1,(0,0,1),'Grid') diff --git a/doc/src/images/x11_dependencies.png b/doc/src/images/x11_dependencies.png index 02bce1a..6ad952e 100644 Binary files a/doc/src/images/x11_dependencies.png and b/doc/src/images/x11_dependencies.png differ -- cgit v0.12 From 1034e372f1b9ec972d9f0586321c8f299c3955f0 Mon Sep 17 00:00:00 2001 From: Prasanth Ullattil Date: Mon, 8 Jun 2009 13:31:40 +0200 Subject: Fix GDI object leak. In case the SetWindowRgn() fails, the region object has to be deleted. Task-number: 251293 Reviewed-by: Denis Dzyubenko --- src/gui/kernel/qwidget_win.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qwidget_win.cpp b/src/gui/kernel/qwidget_win.cpp index 0f341fd..ea79329 100644 --- a/src/gui/kernel/qwidget_win.cpp +++ b/src/gui/kernel/qwidget_win.cpp @@ -1845,7 +1845,8 @@ void QWidgetPrivate::setMask_sys(const QRegion ®ion) OffsetRgn(wr, offset.x(), offset.y()); Q_ASSERT(q->testAttribute(Qt::WA_WState_Created)); - SetWindowRgn(data.winid, wr, true); + if (!SetWindowRgn(data.winid, wr, true)) + DeleteObject(wr); } void QWidgetPrivate::updateFrameStrut() -- cgit v0.12 From cbb9af732fee50010bb540d0a3dc39e67f2e4e7e Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Mon, 8 Jun 2009 14:01:26 +0200 Subject: Compile with gcc 4.0.x --- tools/qdoc3/qdoc3.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/qdoc3/qdoc3.pro b/tools/qdoc3/qdoc3.pro index 5438e5f..ed27669 100644 --- a/tools/qdoc3/qdoc3.pro +++ b/tools/qdoc3/qdoc3.pro @@ -1,8 +1,8 @@ DEFINES += QDOC2_COMPAT DEFINES += QT_NO_CAST_TO_ASCII #DEFINES += QT_NO_CAST_FROM_ASCII -DEFINES += QT_USE_FAST_OPERATOR_PLUS -DEFINES += QT_USE_FAST_CONCATENATION +#DEFINES += QT_USE_FAST_OPERATOR_PLUS +#DEFINES += QT_USE_FAST_CONCATENATION QT = core xml CONFIG += console -- cgit v0.12 From e0405b6b42ddf794935af27a0265ca259c73ce4c Mon Sep 17 00:00:00 2001 From: Ariya Hidayat Date: Mon, 8 Jun 2009 14:00:42 +0200 Subject: Make the easing curve icons more beautiful. Draw the curve with anti-aliasing. Do not use absolute black, but rather a dark black color for the lines. Draw the red and blue dots, indicating the start and end points. Reviewed-by: Jan-Arve --- examples/animation/easing/window.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/examples/animation/easing/window.cpp b/examples/animation/easing/window.cpp index cf4be15..f575483 100644 --- a/examples/animation/easing/window.cpp +++ b/examples/animation/easing/window.cpp @@ -94,11 +94,24 @@ void Window::createCurveIcons() qreal yAxis = m_iconSize.width()/3; painter.drawLine(0, xAxis, m_iconSize.width(), xAxis); painter.drawLine(yAxis, 0, yAxis, m_iconSize.height()); - painter.setPen(Qt::black); qreal curveScale = m_iconSize.height()/2; - QPoint currentPos(yAxis, xAxis); - + + painter.setPen(Qt::NoPen); + + // start point + painter.setBrush(Qt::red); + QPoint start(yAxis, xAxis - curveScale * curve.valueForProgress(0)); + painter.drawRect(start.x() - 1, start.y() - 1, 3, 3); + + // end point + painter.setBrush(Qt::blue); + QPoint end(yAxis + curveScale, xAxis - curveScale * curve.valueForProgress(1)); + painter.drawRect(end.x() - 1, end.y() - 1, 3, 3); + + painter.setPen(QColor(32, 32, 32)); + painter.setRenderHint(QPainter::Antialiasing, true); + QPoint currentPos(start); for (qreal t = 0; t < 1.0; t+=1.0/curveScale) { QPoint to; to.setX(yAxis + curveScale * t); @@ -106,6 +119,7 @@ void Window::createCurveIcons() painter.drawLine(currentPos, to); currentPos = to; } + painter.setRenderHint(QPainter::Antialiasing, false); QListWidgetItem *item = new QListWidgetItem; item->setIcon(QIcon(pix)); item->setText(metaEnum.key(i)); -- cgit v0.12 From f75ff5e473c2a8fea0092d12c289698e90bff297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= Date: Mon, 8 Jun 2009 14:24:52 +0200 Subject: Remove trailing whitespace. --- examples/animation/easing/window.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/animation/easing/window.cpp b/examples/animation/easing/window.cpp index f575483..5a1f764 100644 --- a/examples/animation/easing/window.cpp +++ b/examples/animation/easing/window.cpp @@ -41,28 +41,28 @@ #include "window.h" -Window::Window(QWidget *parent) +Window::Window(QWidget *parent) : QWidget(parent), m_iconSize(64, 64) { m_ui.setupUi(this); QButtonGroup *buttonGroup = qFindChild(this); // ### workaround for uic in 4.4 - m_ui.easingCurvePicker->setIconSize(m_iconSize); + m_ui.easingCurvePicker->setIconSize(m_iconSize); m_ui.easingCurvePicker->setMinimumHeight(m_iconSize.height() + 50); buttonGroup->setId(m_ui.lineRadio, 0); buttonGroup->setId(m_ui.circleRadio, 1); - + QEasingCurve dummy; m_ui.periodSpinBox->setValue(dummy.period()); m_ui.amplitudeSpinBox->setValue(dummy.amplitude()); m_ui.overshootSpinBox->setValue(dummy.overshoot()); - + connect(m_ui.easingCurvePicker, SIGNAL(currentRowChanged(int)), this, SLOT(curveChanged(int))); connect(buttonGroup, SIGNAL(buttonClicked(int)), this, SLOT(pathChanged(int))); connect(m_ui.periodSpinBox, SIGNAL(valueChanged(double)), this, SLOT(periodChanged(double))); connect(m_ui.amplitudeSpinBox, SIGNAL(valueChanged(double)), this, SLOT(amplitudeChanged(double))); connect(m_ui.overshootSpinBox, SIGNAL(valueChanged(double)), this, SLOT(overshootChanged(double))); createCurveIcons(); - + QPixmap pix(QLatin1String(":/images/qt-logo.png")); m_item = new PixmapItem(pix); m_scene.addItem(m_item); @@ -94,7 +94,7 @@ void Window::createCurveIcons() qreal yAxis = m_iconSize.width()/3; painter.drawLine(0, xAxis, m_iconSize.width(), xAxis); painter.drawLine(yAxis, 0, yAxis, m_iconSize.height()); - + qreal curveScale = m_iconSize.height()/2; painter.setPen(Qt::NoPen); @@ -141,7 +141,7 @@ void Window::curveChanged(int row) QEasingCurve::Type curveType = (QEasingCurve::Type)row; m_anim->setEasingCurve(curveType); m_anim->setCurrentTime(0); - + bool isElastic = curveType >= QEasingCurve::InElastic && curveType <= QEasingCurve::OutInElastic; bool isBounce = curveType >= QEasingCurve::InBounce && curveType <= QEasingCurve::OutInBounce; m_ui.periodSpinBox->setEnabled(isElastic); -- cgit v0.12 From 4003ec67b479ae9bb14d65464403fcdad6e9f394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= Date: Mon, 8 Jun 2009 14:27:51 +0200 Subject: Use a QPainterPath instead to draw the graph. This enables the antialiazing to be done on the graph as a whole, and not on every tiny line segment. The result is that the curve is painter prettier. --- examples/animation/easing/window.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/animation/easing/window.cpp b/examples/animation/easing/window.cpp index 5a1f764..8a6d850 100644 --- a/examples/animation/easing/window.cpp +++ b/examples/animation/easing/window.cpp @@ -109,16 +109,16 @@ void Window::createCurveIcons() QPoint end(yAxis + curveScale, xAxis - curveScale * curve.valueForProgress(1)); painter.drawRect(end.x() - 1, end.y() - 1, 3, 3); - painter.setPen(QColor(32, 32, 32)); - painter.setRenderHint(QPainter::Antialiasing, true); - QPoint currentPos(start); + QPainterPath curvePath; + curvePath.moveTo(start); for (qreal t = 0; t < 1.0; t+=1.0/curveScale) { QPoint to; to.setX(yAxis + curveScale * t); to.setY(xAxis - curveScale * curve.valueForProgress(t)); - painter.drawLine(currentPos, to); - currentPos = to; + curvePath.lineTo(to); } + painter.setRenderHint(QPainter::Antialiasing, true); + painter.strokePath(curvePath, QColor(32, 32, 32)); painter.setRenderHint(QPainter::Antialiasing, false); QListWidgetItem *item = new QListWidgetItem; item->setIcon(QIcon(pix)); -- cgit v0.12 From 4662f3984a89b7a702a7d24c02cb30b0a5e76ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Arve=20S=C3=A6ther?= Date: Mon, 8 Jun 2009 14:29:55 +0200 Subject: Make sure we draw the complete curve. --- examples/animation/easing/window.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/animation/easing/window.cpp b/examples/animation/easing/window.cpp index 8a6d850..3e44873 100644 --- a/examples/animation/easing/window.cpp +++ b/examples/animation/easing/window.cpp @@ -111,7 +111,7 @@ void Window::createCurveIcons() QPainterPath curvePath; curvePath.moveTo(start); - for (qreal t = 0; t < 1.0; t+=1.0/curveScale) { + for (qreal t = 0; t <= 1.0; t+=1.0/curveScale) { QPoint to; to.setX(yAxis + curveScale * t); to.setY(xAxis - curveScale * curve.valueForProgress(t)); -- cgit v0.12 From b6542eb2b1e44aea5d82ad89b8506c567aef18ad Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Mon, 8 Jun 2009 14:46:53 +0200 Subject: Small fix to exported symbol --- src/corelib/tools/qunicodetables_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/tools/qunicodetables_p.h b/src/corelib/tools/qunicodetables_p.h index e588313..5f696dd 100644 --- a/src/corelib/tools/qunicodetables_p.h +++ b/src/corelib/tools/qunicodetables_p.h @@ -178,7 +178,7 @@ namespace QUnicodeTables { } Q_CORE_EXPORT int QT_FASTCALL script(uint ucs4); - Q_CORE_EXPORT_INLINE int QT_FASTCALL script(const QChar &ch) { + inline int script(const QChar &ch) { return script(ch.unicode()); } -- cgit v0.12 From eda070eb1f0e65366eaece43e5d86baf9fb8cd89 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Mon, 8 Jun 2009 14:47:13 +0200 Subject: small code cleanup --- src/gui/itemviews/qlistview.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/gui/itemviews/qlistview.cpp b/src/gui/itemviews/qlistview.cpp index 8b50d0e..03ba641 100644 --- a/src/gui/itemviews/qlistview.cpp +++ b/src/gui/itemviews/qlistview.cpp @@ -1100,14 +1100,8 @@ void QListView::paintEvent(QPaintEvent *e) QPainter painter(d->viewport); QRect area = e->rect(); - QVector toBeRendered; -// QVector rects = e->region().rects(); -// for (int i = 0; i < rects.size(); ++i) { -// d->intersectingSet(rects.at(i).translated(horizontalOffset(), verticalOffset())); -// toBeRendered += d->intersectVector; -// } d->intersectingSet(e->rect().translated(horizontalOffset(), verticalOffset()), false); - toBeRendered = d->intersectVector; + const QVector toBeRendered = d->intersectVector; const QModelIndex current = currentIndex(); const QModelIndex hover = d->hover; -- cgit v0.12 From 9281ea186212591e636437d30747e7efd6138af6 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Mon, 8 Jun 2009 14:47:33 +0200 Subject: Fixed ListView so that it is able to move items in negative space and still paint them. The autotest is included. Task-number: 254449 Reviewed-by: ogoffart --- src/gui/itemviews/qlistview_p.h | 2 +- tests/auto/qlistview/tst_qlistview.cpp | 51 ++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/gui/itemviews/qlistview_p.h b/src/gui/itemviews/qlistview_p.h index 4568d8c..6514496 100644 --- a/src/gui/itemviews/qlistview_p.h +++ b/src/gui/itemviews/qlistview_p.h @@ -84,7 +84,7 @@ public: inline bool operator!=(const QListViewItem &other) const { return !(*this == other); } inline bool isValid() const - { return (x > -1) && (y > -1) && (w > 0) && (h > 0) && (indexHint > -1); } + { return rect().isValid() && (indexHint > -1); } inline void invalidate() { x = -1; y = -1; w = 0; h = 0; } inline void resize(const QSize &size) diff --git a/tests/auto/qlistview/tst_qlistview.cpp b/tests/auto/qlistview/tst_qlistview.cpp index f70db14..8338ffa 100644 --- a/tests/auto/qlistview/tst_qlistview.cpp +++ b/tests/auto/qlistview/tst_qlistview.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #if defined(Q_OS_WIN) || defined(Q_OS_WINCE) #include #endif @@ -107,6 +108,7 @@ private slots: void task248430_crashWith0SizedItem(); void task250446_scrollChanged(); void task196118_visualRegionForSelection(); + void task254449_draggingItemToNegativeCoordinates(); void keyboardSearch(); }; @@ -1580,6 +1582,55 @@ void tst_QListView::task196118_visualRegionForSelection() QVERIFY(view.visualRegionForSelection().isEmpty()); } +void tst_QListView::task254449_draggingItemToNegativeCoordinates() +{ + //we'll check that the items are painted correctly + class MyListView : public QListView + { + public: + void setPositionForIndex(const QPoint &position, const QModelIndex &index) + { QListView::setPositionForIndex(position, index); } + + } list; + + QStandardItemModel model(1,1); + QModelIndex index = model.index(0,0); + model.setData(index, QLatin1String("foo")); + list.setModel(&model); + list.setViewMode(QListView::IconMode); + list.show(); + QTest::qWait(200); //makes sure the layout is done + + const QPoint topLeft(-6, 0); + + + list.setPositionForIndex(topLeft, index); + + class MyItemDelegate : public QStyledItemDelegate + { + public: + MyItemDelegate() : numPaints(0) { } + void paint(QPainter *painter, + const QStyleOptionViewItem &option, const QModelIndex &index) const + { + numPaints++; + QStyledItemDelegate::paint(painter, option, index); + } + + mutable int numPaints; + } delegate; + + list.setItemDelegate(&delegate); + + //we'll make sure the item is repainted + delegate.numPaints = 0; + list.viewport()->repaint(); + + QCOMPARE(list.visualRect(index).topLeft(), topLeft); + QCOMPARE(delegate.numPaints, 1); +} + + void tst_QListView::keyboardSearch() { QStringList items; -- cgit v0.12 From a825991ad68f4b999b3063db05e3cdb73fbee834 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Mon, 8 Jun 2009 14:55:56 +0200 Subject: qdoc: Changed to mountain fresh blue. I didn't test this, because I can't build qdoc3 due to changes in QStringBuilder. --- tools/qdoc3/test/classic.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/qdoc3/test/classic.css b/tools/qdoc3/test/classic.css index fa0167b..3e2370d 100644 --- a/tools/qdoc3/test/classic.css +++ b/tools/qdoc3/test/classic.css @@ -14,12 +14,11 @@ H3 { h3.fn,span.fn { - background-color: #d5e1d5; + background-color: #e0eff6; border-width: 1px; border-style: solid; - border-color: #66bc29; + border-color: #3388be #e0eff6 #e9f8ff #e0eff6; font-weight: bold; - -moz-border-radius: 8px 8px 8px 8px; padding: 6px 0px 6px 10px; } -- cgit v0.12 From c7296d97ae0dc92b2383dfd47e1f85aa570d5d0c Mon Sep 17 00:00:00 2001 From: Benjamin Poulain Date: Mon, 8 Jun 2009 16:22:09 +0200 Subject: Sync the French tutorial with the English version Reviewed-by: Pierre --- examples/tutorials/addressbook-fr/part3/addressbook.cpp | 4 +--- examples/tutorials/addressbook-fr/part4/addressbook.cpp | 3 --- examples/tutorials/addressbook-fr/part5/addressbook.cpp | 3 --- examples/tutorials/addressbook-fr/part6/addressbook.cpp | 3 --- examples/tutorials/addressbook-fr/part7/addressbook.cpp | 3 --- 5 files changed, 1 insertion(+), 15 deletions(-) diff --git a/examples/tutorials/addressbook-fr/part3/addressbook.cpp b/examples/tutorials/addressbook-fr/part3/addressbook.cpp index 49c5206..332e808 100644 --- a/examples/tutorials/addressbook-fr/part3/addressbook.cpp +++ b/examples/tutorials/addressbook-fr/part3/addressbook.cpp @@ -125,8 +125,7 @@ void AddressBook::submitContact() if (name == "" || address == "") { QMessageBox::information(this, tr("Empty Field"), - tr("Please enter a name and adderss.")); - return; + tr("Please enter a name and address.")); } if (!contacts.contains(name)) { @@ -136,7 +135,6 @@ void AddressBook::submitContact() } else { QMessageBox::information(this, tr("Add Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); - return; } if (contacts.isEmpty()) { diff --git a/examples/tutorials/addressbook-fr/part4/addressbook.cpp b/examples/tutorials/addressbook-fr/part4/addressbook.cpp index 95def9c..06f8a09 100644 --- a/examples/tutorials/addressbook-fr/part4/addressbook.cpp +++ b/examples/tutorials/addressbook-fr/part4/addressbook.cpp @@ -135,7 +135,6 @@ void AddressBook::submitContact() if (name == "" || address == "") { QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address.")); - return; } //! [submitContact() function part1] if (currentMode == AddingMode) { @@ -147,7 +146,6 @@ void AddressBook::submitContact() } else { QMessageBox::information(this, tr("Add Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); - return; } //! [submitContact() function part1] //! [submitContact() function part2] @@ -162,7 +160,6 @@ void AddressBook::submitContact() } else { QMessageBox::information(this, tr("Edit Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); - return; } } else if (oldAddress != address) { QMessageBox::information(this, tr("Edit Successful"), diff --git a/examples/tutorials/addressbook-fr/part5/addressbook.cpp b/examples/tutorials/addressbook-fr/part5/addressbook.cpp index 5afb6b8..af3c2d0 100644 --- a/examples/tutorials/addressbook-fr/part5/addressbook.cpp +++ b/examples/tutorials/addressbook-fr/part5/addressbook.cpp @@ -142,7 +142,6 @@ void AddressBook::submitContact() if (name == "" || address == "") { QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address.")); - return; } if (currentMode == AddingMode) { @@ -154,7 +153,6 @@ void AddressBook::submitContact() } else { QMessageBox::information(this, tr("Add Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); - return; } } else if (currentMode == EditingMode) { @@ -167,7 +165,6 @@ void AddressBook::submitContact() } else { QMessageBox::information(this, tr("Edit Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); - return; } } else if (oldAddress != address) { QMessageBox::information(this, tr("Edit Successful"), diff --git a/examples/tutorials/addressbook-fr/part6/addressbook.cpp b/examples/tutorials/addressbook-fr/part6/addressbook.cpp index b7cd446..5f31c99 100644 --- a/examples/tutorials/addressbook-fr/part6/addressbook.cpp +++ b/examples/tutorials/addressbook-fr/part6/addressbook.cpp @@ -148,7 +148,6 @@ void AddressBook::submitContact() if (name == "" || address == "") { QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address.")); - return; } if (currentMode == AddingMode) { @@ -160,7 +159,6 @@ void AddressBook::submitContact() } else { QMessageBox::information(this, tr("Add Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); - return; } } else if (currentMode == EditingMode) { @@ -173,7 +171,6 @@ void AddressBook::submitContact() } else { QMessageBox::information(this, tr("Edit Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); - return; } } else if (oldAddress != address) { QMessageBox::information(this, tr("Edit Successful"), diff --git a/examples/tutorials/addressbook-fr/part7/addressbook.cpp b/examples/tutorials/addressbook-fr/part7/addressbook.cpp index 2f81d2b..8be4d2b 100644 --- a/examples/tutorials/addressbook-fr/part7/addressbook.cpp +++ b/examples/tutorials/addressbook-fr/part7/addressbook.cpp @@ -150,7 +150,6 @@ void AddressBook::submitContact() if (name == "" || address == "") { QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address.")); - return; } if (currentMode == AddingMode) { @@ -162,7 +161,6 @@ void AddressBook::submitContact() } else { QMessageBox::information(this, tr("Add Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); - return; } } else if (currentMode == EditingMode) { @@ -175,7 +173,6 @@ void AddressBook::submitContact() } else { QMessageBox::information(this, tr("Edit Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); - return; } } else if (oldAddress != address) { QMessageBox::information(this, tr("Edit Successful"), -- cgit v0.12 From 168f75927390d4ab726870946d60604abf994654 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Mon, 8 Jun 2009 14:55:54 +0200 Subject: Small simplification on code --- src/corelib/io/qnoncontiguousbytedevice_p.h | 5 --- src/corelib/kernel/qobject.cpp | 4 +-- src/corelib/plugin/qplugin.h | 2 +- src/corelib/thread/qthread.cpp | 6 ---- src/corelib/thread/qthread_p.h | 54 +++++++++++++++-------------- src/gui/itemviews/qtablewidget.cpp | 10 +++--- 6 files changed, 35 insertions(+), 46 deletions(-) diff --git a/src/corelib/io/qnoncontiguousbytedevice_p.h b/src/corelib/io/qnoncontiguousbytedevice_p.h index acfc6eb..562b759 100644 --- a/src/corelib/io/qnoncontiguousbytedevice_p.h +++ b/src/corelib/io/qnoncontiguousbytedevice_p.h @@ -96,7 +96,6 @@ public: class QNonContiguousByteDeviceByteArrayImpl : public QNonContiguousByteDevice { - Q_OBJECT public: QNonContiguousByteDeviceByteArrayImpl(QByteArray *ba); ~QNonContiguousByteDeviceByteArrayImpl(); @@ -112,7 +111,6 @@ protected: class QNonContiguousByteDeviceRingBufferImpl : public QNonContiguousByteDevice { - Q_OBJECT public: QNonContiguousByteDeviceRingBufferImpl(QRingBuffer *rb); ~QNonContiguousByteDeviceRingBufferImpl(); @@ -129,7 +127,6 @@ protected: class QNonContiguousByteDeviceIoDeviceImpl : public QNonContiguousByteDevice { - Q_OBJECT public: QNonContiguousByteDeviceIoDeviceImpl(QIODevice *d); ~QNonContiguousByteDeviceIoDeviceImpl(); @@ -151,7 +148,6 @@ protected: class QNonContiguousByteDeviceBufferImpl : public QNonContiguousByteDevice { - Q_OBJECT public: QNonContiguousByteDeviceBufferImpl(QBuffer *b); ~QNonContiguousByteDeviceBufferImpl(); @@ -169,7 +165,6 @@ protected: // ... and the reverse thing class QByteDeviceWrappingIoDevice : public QIODevice { - Q_OBJECT public: QByteDeviceWrappingIoDevice (QNonContiguousByteDevice *bd); ~QByteDeviceWrappingIoDevice (); diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 1501351..5e33a71 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -2228,11 +2228,11 @@ static void err_method_notfound(const QObject *object, if (strchr(method,')') == 0) // common typing mistake qWarning("Object::%s: Parentheses expected, %s %s::%s%s%s", func, type, object->metaObject()->className(), method+1, - loc ? " in ":"\0", loc ? loc : "\0"); + loc ? " in ": "", loc ? loc : ""); else qWarning("Object::%s: No such %s %s::%s%s%s", func, type, object->metaObject()->className(), method+1, - loc ? " in ":"\0", loc ? loc : "\0"); + loc ? " in ": "", loc ? loc : ""); } diff --git a/src/corelib/plugin/qplugin.h b/src/corelib/plugin/qplugin.h index 121a875..e3b9d32 100644 --- a/src/corelib/plugin/qplugin.h +++ b/src/corelib/plugin/qplugin.h @@ -131,7 +131,7 @@ struct qt_plugin_instance_deleter "pattern=""QT_PLUGIN_VERIFICATION_DATA""\n" \ "version="QT_VERSION_STR"\n" \ "debug="QPLUGIN_DEBUG_STR"\n" \ - "buildkey="QT_BUILD_KEY"\0"; + "buildkey="QT_BUILD_KEY; # if defined (Q_OS_WIN32) && defined(Q_CC_BOR) # define Q_STANDARD_CALL __stdcall diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index 2fb6335..8fba574 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -113,12 +113,6 @@ QThreadData::~QThreadData() // fprintf(stderr, "QThreadData %p destroyed\n", this); } -QThreadData *QThreadData::get2(QThread *thread) -{ - Q_ASSERT_X(thread != 0, "QThread", "internal error"); - return thread->d_func()->data; -} - void QThreadData::ref() { #ifndef QT_NO_THREAD diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h index 75293ce..eb290db 100644 --- a/src/corelib/thread/qthread_p.h +++ b/src/corelib/thread/qthread_p.h @@ -107,32 +107,6 @@ public: { } }; -class Q_CORE_EXPORT QThreadData -{ - QAtomicInt _ref; - -public: - QThreadData(int initialRefCount = 1); - ~QThreadData(); - - static QThreadData *current(); - static QThreadData *get2(QThread *thread); - - void ref(); - void deref(); - - QThread *thread; - bool quitNow; - int loopLevel; - QAbstractEventDispatcher *eventDispatcher; - QStack eventLoops; - QPostEventList postEventList; - bool canWait; - QMap tls; - - QMutex mutex; -}; - #ifndef QT_NO_THREAD class QThreadPrivate : public QObjectPrivate { @@ -210,6 +184,34 @@ public: #endif // QT_NO_THREAD +class QThreadData +{ + QAtomicInt _ref; + +public: + QThreadData(int initialRefCount = 1); + ~QThreadData(); + + static QThreadData *current(); + static QThreadData *get2(QThread *thread) + { Q_ASSERT_X(thread != 0, "QThread", "internal error"); return thread->d_func()->data; } + + + void ref(); + void deref(); + + QThread *thread; + bool quitNow; + int loopLevel; + QAbstractEventDispatcher *eventDispatcher; + QStack eventLoops; + QPostEventList postEventList; + bool canWait; + QMap tls; + + QMutex mutex; +}; + QT_END_NAMESPACE #endif // QTHREAD_P_H diff --git a/src/gui/itemviews/qtablewidget.cpp b/src/gui/itemviews/qtablewidget.cpp index e88301e..8cb2e55 100644 --- a/src/gui/itemviews/qtablewidget.cpp +++ b/src/gui/itemviews/qtablewidget.cpp @@ -1662,10 +1662,9 @@ void QTableWidgetPrivate::_q_emitCurrentItemChanged(const QModelIndex ¤t, void QTableWidgetPrivate::_q_sort() { - Q_Q(QTableWidget); if (sortingEnabled) { - int column = q->horizontalHeader()->sortIndicatorSection(); - Qt::SortOrder order = q->horizontalHeader()->sortIndicatorOrder(); + int column = horizontalHeader->sortIndicatorSection(); + Qt::SortOrder order = horizontalHeader->sortIndicatorOrder(); model()->sort(column, order); } } @@ -1673,11 +1672,10 @@ void QTableWidgetPrivate::_q_sort() void QTableWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { - Q_Q(QTableWidget); if (sortingEnabled && topLeft.isValid() && bottomRight.isValid()) { - int column = q->horizontalHeader()->sortIndicatorSection(); + int column = horizontalHeader->sortIndicatorSection(); if (column >= topLeft.column() && column <= bottomRight.column()) { - Qt::SortOrder order = q->horizontalHeader()->sortIndicatorOrder(); + Qt::SortOrder order = horizontalHeader->sortIndicatorOrder(); model()->ensureSorted(column, order, topLeft.row(), bottomRight.row()); } } -- cgit v0.12 From 4336436b8113d6a80428d70beda40a89713d04db Mon Sep 17 00:00:00 2001 From: Alex Cucos Date: Mon, 8 Jun 2009 16:29:18 +0200 Subject: Clip region to screen coordinates before setting its component rectangles dirty. When using Qt/E with VNC screen driver on top of the Linux framebuffer (export QWS_DISPLAY="VNC:LinuxFb") the region to be exposed needs be clipped to the real screen to avoid possible negative coordinates which in turn cause access to invalid memory locations when comparing the content of the VNC buffer with the Linux framebuffer. Merge-request: 603 Reviewed-by: Tom Cooksey --- src/gui/embedded/qscreenproxy_qws.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/embedded/qscreenproxy_qws.cpp b/src/gui/embedded/qscreenproxy_qws.cpp index 5b8f6f0..7652bd9 100644 --- a/src/gui/embedded/qscreenproxy_qws.cpp +++ b/src/gui/embedded/qscreenproxy_qws.cpp @@ -279,6 +279,7 @@ void QProxyScreen::exposeRegion(QRegion r, int changing) } realScreen->exposeRegion(r, changing); + r &= realScreen->region(); const QVector rects = r.rects(); for (int i = 0; i < rects.size(); ++i) -- cgit v0.12