summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config.tests/mac/xcodeversion.cpp6
-rw-r--r--demos/embedded/lightmaps/lightmaps.h2
-rw-r--r--demos/embedded/lightmaps/mapzoom.h2
-rw-r--r--demos/embedded/lightmaps/slippymap.h2
-rw-r--r--demos/mobile/guitartuner/src/guitartuner.rc2
-rw-r--r--dist/changes-4.7.4304
-rw-r--r--doc/doc.pri8
-rw-r--r--doc/src/declarative/declarativeui.qdoc2
-rw-r--r--doc/src/declarative/network.qdoc7
-rw-r--r--doc/src/declarative/qtquick-intro.qdoc2
-rw-r--r--doc/src/getting-started/gettingstartedqt.qdoc72
-rw-r--r--doc/src/index.qdoc4
-rw-r--r--doc/src/platforms/supported-platforms.qdoc12
-rw-r--r--doc/src/qt-features.qdoc204
-rw-r--r--doc/src/qt-webpages.qdoc2
-rw-r--r--doc/src/qt4-intro.qdoc3
-rw-r--r--doc/src/snippets/qcolumnview/main.cpp2
-rw-r--r--doc/src/snippets/textdocument-imagedrop/main.cpp2
-rw-r--r--doc/src/snippets/textdocument-imagedrop/textedit.h6
-rw-r--r--examples/tutorials/gettingStarted/gsQml/filedialog/dialogPlugin.cpp2
-rw-r--r--examples/tutorials/gettingStarted/gsQml/filedialog/directory.cpp2
-rw-r--r--examples/tutorials/gettingStarted/gsQml/filedialog/file.cpp2
-rw-r--r--examples/tutorials/gettingStarted/gsQml/filedialog/file.h2
-rwxr-xr-xexamples/tutorials/gettingStarted/gsQt/part2/main.cpp14
-rwxr-xr-xexamples/tutorials/modelview/4_headers/main.cpp2
-rw-r--r--examples/tutorials/threads/clock/clockthread.h2
-rw-r--r--mkspecs/qpa/macx-iphonedevice-g++/qmake.conf6
-rw-r--r--src/corelib/arch/qatomic_armv6.h2
-rw-r--r--src/corelib/codecs/qtextcodec.cpp9
-rw-r--r--src/corelib/io/qfile.cpp10
-rw-r--r--src/corelib/io/qfsfileengine.cpp16
-rw-r--r--src/corelib/io/qfsfileengine_unix.cpp8
-rw-r--r--src/corelib/io/qnoncontiguousbytedevice.cpp2
-rw-r--r--src/corelib/io/qurl.cpp5
-rw-r--r--src/corelib/plugin/quuid.cpp14
-rw-r--r--src/corelib/tools/qline.cpp5
-rw-r--r--src/corelib/tools/qlocale.qdoc4
-rw-r--r--src/dbus/qdbusabstractinterface.cpp31
-rw-r--r--src/dbus/qdbusabstractinterface.h3
-rw-r--r--src/dbus/qdbusabstractinterface_p.h1
-rw-r--r--src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp4
-rw-r--r--src/declarative/graphicsitems/qdeclarativeborderimage.cpp4
-rw-r--r--src/declarative/graphicsitems/qdeclarativeflickable.cpp4
-rw-r--r--src/declarative/graphicsitems/qdeclarativegridview.cpp2
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimage.cpp4
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem.cpp2
-rw-r--r--src/declarative/graphicsitems/qdeclarativelistview.cpp2
-rw-r--r--src/declarative/graphicsitems/qdeclarativemousearea.cpp2
-rw-r--r--src/declarative/graphicsitems/qdeclarativepositioners.cpp6
-rw-r--r--src/declarative/graphicsitems/qdeclarativerepeater.cpp6
-rw-r--r--src/declarative/graphicsitems/qdeclarativetext.cpp8
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit.cpp21
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit_p_p.h2
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput.cpp18
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput_p_p.h2
-rw-r--r--src/declarative/util/qdeclarativelistmodel.cpp1
-rw-r--r--src/declarative/util/qdeclarativeview.cpp2
-rw-r--r--src/gui/accessible/qaccessible_win.cpp113
-rw-r--r--src/gui/dialogs/qfiledialog_win_p.h2
-rw-r--r--src/gui/embedded/qscreen_qws.cpp1
-rw-r--r--src/gui/image/qjpeghandler.cpp5
-rw-r--r--src/gui/image/qpixmap_mac.cpp33
-rw-r--r--src/gui/inputmethod/qcoefepinputcontext_s60.cpp4
-rw-r--r--src/gui/kernel/qapplication.cpp21
-rw-r--r--src/gui/kernel/qapplication.h1
-rw-r--r--src/gui/kernel/qapplication_mac.mm5
-rw-r--r--src/gui/kernel/qapplication_qws.cpp5
-rw-r--r--src/gui/kernel/qapplication_s60.cpp11
-rw-r--r--src/gui/kernel/qapplication_win.cpp5
-rw-r--r--src/gui/kernel/qapplication_x11.cpp15
-rw-r--r--src/gui/kernel/qcocoaview_mac.mm26
-rw-r--r--src/gui/kernel/qdnd_x11.cpp17
-rw-r--r--src/gui/kernel/qkeysequence.cpp4
-rw-r--r--src/gui/kernel/qsoftkeymanager.cpp14
-rw-r--r--src/gui/kernel/qt_s60_p.h26
-rw-r--r--src/gui/kernel/qwidget_s60.cpp13
-rw-r--r--src/gui/painting/qcosmeticstroker.cpp50
-rw-r--r--src/gui/painting/qcosmeticstroker_p.h10
-rw-r--r--src/gui/painting/qpainter.cpp17
-rw-r--r--src/gui/painting/qwindowsurface_raster.cpp21
-rw-r--r--src/gui/styles/qmacstyle_mac.mm2
-rw-r--r--src/gui/styles/qs60style_s60.cpp14
-rw-r--r--src/gui/text/qfont.cpp5
-rw-r--r--src/gui/text/qfontdatabase.cpp10
-rw-r--r--src/gui/text/qfontdatabase_s60.cpp30
-rw-r--r--src/gui/text/qfontmetrics.cpp3
-rw-r--r--src/gui/text/qglyphrun.cpp3
-rw-r--r--src/gui/text/qplatformfontdatabase_qpa.cpp28
-rw-r--r--src/gui/text/qrawfont.cpp3
-rw-r--r--src/gui/text/qtextcontrol.cpp34
-rw-r--r--src/gui/text/qtextengine.cpp2
-rw-r--r--src/gui/widgets/qcombobox.cpp2
-rw-r--r--src/gui/widgets/qtextedit.cpp2
-rw-r--r--src/imports/imports.pro2
-rwxr-xr-x[-rw-r--r--]src/imports/shaders/shadereffectitem.cpp130
-rw-r--r--src/imports/shaders/shadereffectitem.h4
-rw-r--r--src/imports/shaders/shadereffectsource.cpp73
-rw-r--r--src/imports/shaders/shadereffectsource.h3
-rw-r--r--src/network/kernel/qnetworkproxy.cpp7
-rw-r--r--src/plugins/bearer/icd/dbusdispatcher.cpp4
-rw-r--r--src/plugins/bearer/icd/iapconf.cpp2
-rw-r--r--src/plugins/platforms/uikit/README4
-rw-r--r--src/plugins/platforms/uikit/phonon_av/avmediaobject.mm2
-rw-r--r--src/plugins/platforms/uikit/quikitscreen.mm2
-rw-r--r--src/plugins/platforms/uikit/quikitwindow.mm31
-rw-r--r--src/sql/models/qsqlrelationaltablemodel.cpp28
-rw-r--r--src/svg/qsvgstructure.cpp2
-rw-r--r--src/xmlpatterns/expr/qevaluationcache.cpp5
-rw-r--r--src/xmlpatterns/expr/qevaluationcache_p.h1
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml1
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_words.qml5
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_words.qml5
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp61
-rw-r--r--tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml1
-rw-r--r--tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp13
-rw-r--r--tests/auto/qabstractspinbox/tst_qabstractspinbox.cpp2
-rw-r--r--tests/auto/qaudioinput/tst_qaudioinput.cpp133
-rw-r--r--tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml4
-rw-r--r--tests/auto/qdbusabstractinterface/interface.cpp14
-rw-r--r--tests/auto/qdbusabstractinterface/interface.h1
-rw-r--r--tests/auto/qdbusabstractinterface/pinger.h7
-rw-r--r--tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp92
-rw-r--r--tests/auto/qdialog/tst_qdialog.cpp16
-rw-r--r--tests/auto/qfiledialog/tst_qfiledialog.cpp2
-rw-r--r--tests/auto/qpushbutton/tst_qpushbutton.cpp31
-rw-r--r--tools/macdeployqt/shared/shared.cpp2
-rw-r--r--tools/macdeployqt/tests/tst_deployment_mac.cpp2
-rw-r--r--tools/qdoc3/cppcodemarker.cpp2
-rw-r--r--tools/qdoc3/ditaxmlgenerator.cpp88
-rw-r--r--tools/qdoc3/ditaxmlgenerator.h11
-rw-r--r--tools/qdoc3/doc.cpp2
-rw-r--r--tools/qdoc3/doc/config/images/arrow_down.pngbin0 -> 177 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/bg_l.pngbin0 -> 100 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/bg_l_blank.pngbin0 -> 84 bytes
-rw-r--r--tools/qdoc3/doc/config/images/bg_ll_blank.pngbin0 -> 320 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/bg_r.pngbin0 -> 96 bytes
-rw-r--r--tools/qdoc3/doc/config/images/bg_ul_blank.pngbin0 -> 304 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/box_bg.pngbin0 -> 89 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/breadcrumb.pngbin0 -> 134 bytes
-rw-r--r--tools/qdoc3/doc/config/images/bullet_dn.pngbin0 -> 230 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/bullet_gt.pngbin0 -> 124 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/bullet_sq.pngbin0 -> 74 bytes
-rw-r--r--tools/qdoc3/doc/config/images/bullet_up.pngbin0 -> 210 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/feedbackground.pngbin0 -> 263 bytes
-rw-r--r--tools/qdoc3/doc/config/images/header_bg.pngbin0 -> 114 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/horBar.pngbin0 -> 2807 bytes
-rw-r--r--tools/qdoc3/doc/config/images/page.pngbin0 -> 3102 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/page_bg.pngbin0 -> 84 bytes
-rw-r--r--tools/qdoc3/doc/config/images/spinner.gifbin0 -> 2037 bytes
-rwxr-xr-xtools/qdoc3/doc/config/images/sprites-combined.pngbin0 -> 62534 bytes
-rw-r--r--tools/qdoc3/generator.cpp142
-rw-r--r--tools/qdoc3/generator.h12
-rw-r--r--tools/qdoc3/htmlgenerator.cpp103
-rw-r--r--tools/qdoc3/htmlgenerator.h11
-rw-r--r--tools/qdoc3/node.cpp13
-rw-r--r--tools/qdoc3/node.h2
-rw-r--r--tools/qdoc3/puredocparser.cpp5
-rw-r--r--tools/qdoc3/puredocparser.h1
-rw-r--r--tools/qdoc3/qmlvisitor.cpp63
-rw-r--r--tools/qdoc3/qmlvisitor.h2
-rw-r--r--tools/qdoc3/test/qt-cpp-ignore.qdocconf3
-rw-r--r--tools/qdoc3/test/qt-html-templates-online.qdocconf14
-rw-r--r--tools/qdoc3/test/qt-project.qdocconf2
-rw-r--r--tools/qtconcurrent/codegenerator/src/codegenerator.cpp4
-rw-r--r--tools/qtestlib/wince/cetest/deployment.h2
165 files changed, 1612 insertions, 995 deletions
diff --git a/config.tests/mac/xcodeversion.cpp b/config.tests/mac/xcodeversion.cpp
index df208e3..0cc3777 100644
--- a/config.tests/mac/xcodeversion.cpp
+++ b/config.tests/mac/xcodeversion.cpp
@@ -73,7 +73,7 @@ int main(int argc, const char **argv)
const char * ok3 ="3.0";
// ptr = fail1;
// printf ("string: %s\n", ptr);
-
+
int length = strlen(ptr);
if (length < 3) // expect "x.y" at least
return internal_error;
@@ -94,6 +94,6 @@ int main(int argc, const char **argv)
if (ptr[4] < '1')
return fail;
-
+
return success;
-} \ No newline at end of file
+}
diff --git a/demos/embedded/lightmaps/lightmaps.h b/demos/embedded/lightmaps/lightmaps.h
index 45b5c18..0e458ea 100644
--- a/demos/embedded/lightmaps/lightmaps.h
+++ b/demos/embedded/lightmaps/lightmaps.h
@@ -85,4 +85,4 @@ private:
bool invert;
};
-#endif \ No newline at end of file
+#endif
diff --git a/demos/embedded/lightmaps/mapzoom.h b/demos/embedded/lightmaps/mapzoom.h
index ac70a23..935660c 100644
--- a/demos/embedded/lightmaps/mapzoom.h
+++ b/demos/embedded/lightmaps/mapzoom.h
@@ -66,4 +66,4 @@ private:
QNetworkSession *networkSession;
};
-#endif \ No newline at end of file
+#endif
diff --git a/demos/embedded/lightmaps/slippymap.h b/demos/embedded/lightmaps/slippymap.h
index 64ba5c3..480dc81 100644
--- a/demos/embedded/lightmaps/slippymap.h
+++ b/demos/embedded/lightmaps/slippymap.h
@@ -84,4 +84,4 @@ private:
QUrl m_url;
};
-#endif \ No newline at end of file
+#endif
diff --git a/demos/mobile/guitartuner/src/guitartuner.rc b/demos/mobile/guitartuner/src/guitartuner.rc
index 85cee0b..b4f7a11 100644
--- a/demos/mobile/guitartuner/src/guitartuner.rc
+++ b/demos/mobile/guitartuner/src/guitartuner.rc
@@ -20,4 +20,4 @@ BEGIN
BEGIN
VALUE "Translation", 0x409, 1252
END
-END \ No newline at end of file
+END
diff --git a/dist/changes-4.7.4 b/dist/changes-4.7.4
index a37e66a..9a08d15 100644
--- a/dist/changes-4.7.4
+++ b/dist/changes-4.7.4
@@ -19,13 +19,317 @@ Merge Request: http://qt.gitorious.org
* Library *
****************************************************************************
+QtGui
+-----
+
+ - [QTBUG-20214] QRentBook: LSK and RSK of booking page will change
+ somethimes
+ - [QTBUG-19656] Spectrum: the Mode menu disappears after the device is
+ changed from portrait to landscape.
+ - [QTBUG-19260] Cursor cannot be placed between letters f and i - "fi"
+ is interpreted as one character
+ - [QTBUG-19157] Crash in QGLContextPrivate::bindTexture() when using
+ QPainter::fillRect() with a brush having a size > max_texture_size
+ - [QTBUG-19089] TextInput positionToRectangle doesn't return correct
+ coordinates for the cursor in pre-edit mode
+ - [QTBUG-19067] Font glyphs get clipped on the top
+ - [QTBUG-18500] QTextBlock crash
+ - [QTBUG-18303] Arabic multiline text is clipped on the right
+ - [QTBUG-18185] QStaticText: Wrong kerning and baselines when rotating a
+ QGraphicsView
+ - [QTBUG-17443] Feedreadercrash: when opening feed with unicode characters
+ - [QTBUG-17244] QGraphicsLayout Layouting should be done in one go. Ugly
+ layouting visible otherwise
+ - [QTBUG-17209] Bug-231 introduces an off-by-one error
+ - [QTBUG-17117] Arabic reordering problem when 2 fonts are used
+ - [QTBUG-11131] QAbstractScrollArea::setViewport() causes crash when used
+ from within event handler method
+ - [QTBUG-16422] Big coordinate values cause segfault on ARM when calling
+ QGraphicsEllipseItem::contains
+ - [QTBUG-18017] Regression: Text selection with shift-click stopped working
+ - [QTBUG-18192] Crash when invoking blockBoundingRect over a QTextDocument
+ documentLayout
+ - [QTBUG-17505] Inflexible focus handling in QGraphicsScene
+ - [QTBUG-17020] QPainter::drawText() fails to draw correct text in some
+ circumstances. Related to QTBUG-12950
+ - [QTBUG-16401] QGraphicsScene returns focus incorrectly when QGraphicsView
+ is focused
+ - [QTBUG-17812] regression: qsortfilterproxymodel::reset doesn't invalidate
+ the model (Windows)
+ - [QTBUG-17230] QPlainTextEdit corruption/crash after scrolling
+ - [QTBUG-17536] qguistatemachine::cloneEvent doesn't clone
+ GraphicsSceneWheel Events correctly
+ - [QTBUG-17254] XPM files crash QImage (write)
+ - [QTBUG-16292] QTreeView crash in indexRowSizeHint/itemHeight
+ - [QTBUG-17390] Child widgets don't inherit their parent's input contexts
+ - [QTBUG-15910] setstylesheet on a QComboBox causes a segmentation fault
+ - [QTBUG-16652] Compilation of "4.7" branch fails:
+ private/qdrawhelper_arm_simd_p.h: No such file or directory
+
+QtNetwork
+---------
+
+ - [QTBUG-17464] SIGBUS in fetchAndAddOrdered from
+ QlcdEngine::connectionStateSignalsSlot
+ - [QTBUG-16022] QHttpNetworkConnectionChannel::expand discards data if
+ gzip-stream has missing end-of-stream marker
+ - [QTBUG-17199] ICD Bearer management: Causes the main thread to hang
+ when ran on a different thread.
+
+QtCore
+------
+
+ - [QTBUG-15421] QDirIterator returns hidden directories when it should only
+ return files and returns hidden files when it should only return
+ directories
+
+QtScript
+--------
+
+ - [QTBUG-17815] Missing APIShims in obsoleted QScriptValue constructor
+ - [QTBUG-17788] Crash when calling collectGarbage() after requesting
+ arguments object of native context
+
+QtDBus
+------
+
+ - [QTBUG-14228] Ensure Qt 4.7 doesn't crash when a D-Bus message with file
+ descriptors is received
+
+QtSql
+-----
+
+ - [QTBUG-14831] Dynamic sorting of a QSortFilterProxyModel on a
+ QSqlTableModel with OnManualSubmit is broken (4.7 regression)
+
+Declarative
+-----------
+
+ - [QTBUG-20159] No effect of setting color on a QStaticText or a
+ QML element
+ - [QTBUG-18428] Colored and underlined styled text are not underlined or
+ completely coloured on device
+ - [QTBUG-18362] wigglytext.qml does not behave correctly in qmlscene
+ - [QTBUG-18266] More than one XmlListModel - Lists randomly show data from
+ wrong model
+ - [QTBUG-15983] Cannot pass enum value as signal parameter from C++ to QML
+ - [QTBUG-14974] ListView and GridView + contentY performance
+ - [QTBUG-18412] Crash in sendPostedEvents() - QObject::isWidgetType()
+ (issue with QDeclarativePixmapReply)
+ - [QTBUG-15356] PathView doesn't update if preferredHighlightBegin and
+ preferredHighlightEnd changed
+ - [QTBUG-17562] TextInput text in echo mode PasswordEchoOnEdit revealed
+ on refocus
+ - [QTBUG-17775] Crash when using FolderListModel with a repeater
+ - [QTBUG-17361] Nested pressDelays crashes application
+ - [QTBUG-15705] QDeclarativeTextInput::mousePressEvent() doesn't call
+ QInputContext::mouseHandler()
+ - [QTBUG-17501] Focus: Tap any of the Rounded-cornered rectangle, the
+ context menu doesn't disappear.
+ - [QTBUG-17008] ListView + XmlListModel freeze application when change
+ language key combination
+ - [QTBUG-17324] incorrect 'version is not installed' error when importing
+ QML module
+ - [QTBUG-16999] QML TextInput doesn't scroll if writing preedit at the end
+ of the line
+ - [QTBUG-13451] Support property versioning in QML
+ - [QTBUG-16959] Crash when using Grid.TopToBottom flow with Repeater
+ inside Grid
+ - [QTBUG-16522] QML ListView Should Support Dynamic Headers and Footers
+ - [QTBUG-17114] QtQuick 1.1 alignment regression
+ - [QTBUG-16283] TextEdit and TextInput need text selection modes
+ - [QTBUG-16284] Disable drag and drop in TextEdit and TextInput
+
+OpenVG
+------
+ - [QTBUG-18682] QImage convertToFormat does not work with certain image
+ formats when default (OpenVG) rendering engine used.
+
+OpenGL
+------
+ - [QTBUG-14217] Unresolved symbol QGLWindowSurface::staticMetaObject when
+ building for Windows Mobile 5.0 with OpenGL ES 1.1 support
+ - [QTBUG-18184] mingw gcc 4 static build failed in tools/qml because of the
+ symbol export in libQtOpenGL
+ - [QTBUG-17256] Change QGLPixmapData load functions to use the
+ 'convertInPlace' versions of QImage to save memory
+
+3rdParty
+--------
+
+ - Image formats
+ * [QTBUG-20425] Update bundled libpng to 1.5.4 (security)
+
****************************************************************************
* Platform Specific Changes *
****************************************************************************
+Qt for Linux/X11
+----------------
+
+ - Declarative
+ * [QTBUG-19914] Segfault in QDeclarativeBinding::createBinding triggered
+ by QMultimediaKit
+ - gui
+ * [QTBUG-16175] REG: Qt 4.7/Linux Qt Designer / Qt Creator show multiple
+ warnings: "Application asked to unregister timer 0x17000002 which is
+ not registered in this thread. Fix application."
+
+Qt for Windows
+--------------
+
+ - gui
+ * [QTBUG-19878] QImage constructor crash when opening some tiff images
+ - corelib
+ * [QTBUG-17014] Qt event delivery is unreliable on windows platforms
+ - declarative
+ * [QTBUG-19198] ListView lose items
+ * [QTBUG-18587] Roles are not removed in listmodel
+ - qmake
+ * [QTBUG-18537] Compiling Qt on Windows XP x64 using MinGW-w64 fails
+
+Qt for Mac OS X
+---------------
+
+ - gui
+ * [QTBUG-20496] Qt does not compile under OSX Lion or llvm-gcc
+ * [QTBUG-18547] Buffer overrun in QMacPixmapData::macCreatePixels
+ (QPixmap_mac.cpp)
+ * [QTBUG-15474] Mac: Qt:Sheet dialog permanently loses focus after
+ moving the parent window
+ * [QTBUG-15897] QMainWindow crash in destructor when having a
+ QDockWidget of type Qt::Drawer containing a QTreeWidget
+ - corelib
+ * [QTBUG-11481] Floating Dock Widget behavior on Mac [REGRESSION]
+ - network
+ * [QTBUG-14520] SSL Isn't working with osx 10.5
+ * [QTBUG-5645] SSL Memory leaks on Mac.
+
+Qt for Symbian
+--------------
+
+ - general
+ * [QTBUG-20216] Update QtOpenGL section in Symbian platform notes
+ - examples
+ * [QTBUG-15176] Default heap/stack size might not be enough for symbian
+ - qmake & mkspecs
+ * [QTBUG-20669] Symbian: DEBUGGABLE_UDEBONLY keyword needed in
+ generated mmp files
+ * [QTBUG-20192] Qt sis can't be created on symbian^1 5.0 and
+ symbian^3 PS2 environments
+ * [QTBUG-18207] QMAKE_CLEAN items with wildcards in symbian-abld
+ builds will halt the build without obvious reason.
+ * [QTBUG-17927] Simplified Chinese language is not supported
+ in Qt 4.7.2
+ - openvg
+ * [QTBUG-20339] when camera application is opened and closed, the qml
+ application in the background is getting closed
+ * [QTBUG-18027] Lazy conversion in fromSymbianCFbsBitmap for openVG
+ - opengl
+ * [QTBUG-19183] Enable multisampling if there's hw support for it
+ on Symbian
+ * [QTBUG-19180] Simplify texture pooling in GL graphics system
+ * [QTBUG-18850] Fix orientation change. Current behaviour results to
+ black screen
+ * [QTBUG-15254] Implement QPixmap::fromSymbianRSgImage() in the
+ OpenGL graphics system
+ * [QTBUG-18209] Native image handle provider support in QGLPixmapData
+ * [QTBUG-18270] Use destroyed swap behaviour in GL graphics system
+ on Symbian
+ * [QTBUG-15252] Implement CFbsBitmap backend for QPixmap in OpenGL
+ graphics system on Symbian
+ * [QTBUG-17850] Implement GL graphics system releaseCachedResources()
+ * [QTBUG-15253] Verify that applications using the OpenGL graphics
+ system on Symbian consume zero graphics memory when they are
+ not visible
+ * [QTBUG-16977] Symbian: Implement QPixmap::fromSymbianCFbsBitmap() in
+ the OpenGL graphics system
+ * [QTBUG-16949] Symbian: Recreate EGL surface on native window resize
+ - gui
+ * [QTBUG-20255] Regression: Some QMenus are shown completely transparent
+ in Symbian
+ * [QTBUG-20240] Regression: QS60Style - All standardIcons are drawn as
+ "small icons"
+ * [QTBUG-20813] Disabled splitscreen translation still moves screen
+ * [QTBUG-20034] Splitview - Auto-translation should translate as
+ little as possible to ensure visibility of the cursor
+ * [QTBUG-20007] Symbian: Do not add linked fonts to the QFontDatabase
+ * [QTBUG-19911] Orientation change causes unnecessary resizes to top
+ level window on Symbian
+ * [QTBUG-19880] Drawing a QPixmap to QImage causes a deep copy on
+ Symbian
+ * [QTBUG-19864] Predicted word is duplicated when doing an orientation
+ switch
+ * [QTBUG-19856] Doing an orientation change while in splitview mode
+ and closing VKB causes QGraphicsView to be incorrectly resized
+ * [QTBUG-19782] UI of the QWidget based applications those uses
+ QGroupBoxs are mess up in latest Symbian RND release
+ * [QTBUG-19734] KERN-EXEC 3 panic in
+ QCoeFepInputContext::translateInputWidget() method
+ * [QTBUG-19689] Textinput: last word inputted was duplicated after
+ press "Password" button
+ * [QTBUG-19578] Fix BCM2727 detection function on Symbian
+ * [QTBUG-19528] Opening symbol menu while typing with prediction on
+ causes issues
+ * [QTBUG-19471] Using QFileDialog crashes in Symbian
+ * [QTBUG-19104] while setting a softkey action in a qt application
+ on symbian, the icon specified only is shown partially
+ * [QTBUG-19043] Fullscreen main window with softkeys initially layouts
+ using full screen dimensions instead of client area dimensions
+ * [QTBUG-18863] QS60Style: compiling simulated style crashes due to
+ missing placeHolderTexture implementation
+ * [QTBUG-18493] Qt reserves graphics resources when launching application
+ directly to background
+ * [QTBUG-18486] Control pane (RSK Cancel) of the test note is covered by
+ "Options, Exit" when re-launching the application from Open applications
+ list
+ * [QTBUG-18409] If fullscreen application without softkeys opens a
+ fullscreen child dialog with softkeys, once the child dialog closes,
+ softkeys remain visible on applicaiton main screen.
+ * [QTBUG-17874] autotest failure between Qt 4.6.3 and Qt 4.7.2 in
+ QLinearGradient::setStops method on Symbian^3 platform
+ * [QTBUG-17844] Different point size for the font created using QFont
+ class and returned by QFontDialog
+ * [QTBUG-16857] Black corners around popup menu in Symbian^3
+ * [QTBUG-16785] QML app: After layout switch the focused text input field
+ is not visible on Split view
+ * [QTBUG-15031] Predictive text is not committed when writing in a QLineEdit
+ * [QTBUG-14058] Wrong availableGeometry detected in Symbian
+ * [QTBUG-17576] GraphicsViews: Focused widget is not visible after
+ orientation change
+ * [QTBUG-17930] Regression: Theme background in style is incorrect
+ * [QTBUG-18024] Don't use EGL surfaces for translucency with 32MB GPU chip
+ * [QTBUG-17984] QML application: focused text input field is not visible
+ when split view is opened
+ - declarative
+ * [QTBUG-20218] Symbian 5.3: QML text edit components are sending
+ software input panel requests
+ * [QTBUG-19821] Flickr: There is gridding on picture
+ * [QTBUG-19669] All events that QDeclarativeDebugTrace shows on
+ Symbian are of duration '0'
+ * [QTBUG-18869] Compilation breakage for Symbian (qmltooling)
+ * [QTBUG-18549] Animation timer seems to take too long time to expire
+ during scrolling a qml list in Symbian device.
+ * [QTBUG-17592] qml.pri causes havoc on Symbian 3.2 and 5.0
+ - network
+ * [QTBUG-18795] QNetworkConfigurationManager::allConfigurations
+ (QNetworkConfiguration::Active) not returning any active configuration
+ when instantiated and called from Secondary thread
+ * [QTBUG-18722] QDesktopServices::openUrl() doesn't handle URL encodings
+ correctly
+ * [QTBUG-18572] Crash with KERN-EXEC 0 when
+ QNetworkConfigurationManagerPrivate fails to connect
+ - corelib
+ * [QTBUG-17776] Qmlviewer: qmlviewer will crash after closing the
+ application "flickr demo"
+
****************************************************************************
* Tools *
****************************************************************************
+ - [QTBUG-18595] Enable remote debugging for qmlviewer
+ - [QTBUG-18063] qdoc3 depends on private header files from QML
+ - [QTBUG-16462] qdoc3 segfaults due to a uninitialized member variable
+ when using the WebXML output.
diff --git a/doc/doc.pri b/doc/doc.pri
index 253e1b4..9d67386 100644
--- a/doc/doc.pri
+++ b/doc/doc.pri
@@ -14,6 +14,8 @@ win32:!win32-g++* {
}
COPYWEBKITGUIDE = $$QT_SOURCE_TREE/examples/webkit/webkit-guide
+COPYWEBKITTARGA = $$QT_BUILD_TREE/doc-build/html-qt
+COPYWEBKITTARGB = $$QT_BUILD_TREE/doc/html
$$unixstyle {
QDOC = cd $$QT_SOURCE_TREE/tools/qdoc3/test && QT_BUILD_TREE=$$QT_BUILD_TREE QT_SOURCE_TREE=$$QT_SOURCE_TREE $$QT_BUILD_TREE/bin/qdoc3 $$DOCS_GENERATION_DEFINES
@@ -21,12 +23,14 @@ $$unixstyle {
QDOC = cd $$QT_SOURCE_TREE/tools/qdoc3/test && set QT_BUILD_TREE=$$QT_BUILD_TREE&& set QT_SOURCE_TREE=$$QT_SOURCE_TREE&& $$QT_BUILD_TREE/bin/qdoc3.exe $$DOCS_GENERATION_DEFINES
QDOC = $$replace(QDOC, "/", "\\")
COPYWEBKITGUIDE = $$replace(COPYWEBKITGUIDE, "/", "\\")
+ COPYWEBKITTARGA = $$replace(COPYWEBKITTARGA, "/", "\\")
+ COPYWEBKITTARGB = $$replace(COPYWEBKITTARGB, "/", "\\")
}
ADP_DOCS_QDOCCONF_FILE = qt-build-docs-online.qdocconf
QT_DOCUMENTATION = ($$QDOC qt-api-only.qdocconf assistant.qdocconf designer.qdocconf \
linguist.qdocconf qmake.qdocconf qdeclarative.qdocconf) && \
(cd $$QT_BUILD_TREE && \
- $$QMAKE_COPY_DIR $$COPYWEBKITGUIDE $$QT_BUILD_TREE/doc-build/html-qt && \
+ $$QMAKE_COPY_DIR $$COPYWEBKITGUIDE $$COPYWEBKITTARGA && \
$$GENERATOR doc-build/html-qt/qt.qhp -o doc/qch/qt.qch && \
$$GENERATOR doc-build/html-assistant/assistant.qhp -o doc/qch/assistant.qch && \
$$GENERATOR doc-build/html-designer/designer.qhp -o doc/qch/designer.qch && \
@@ -52,7 +56,7 @@ win32-g++*:isEmpty(QMAKE_SH) {
}
# Build rules:
-adp_docs.commands = ($$QDOC $$ADP_DOCS_QDOCCONF_FILE && $$QMAKE_COPY_DIR $$COPYWEBKITGUIDE $$QT_BUILD_TREE/doc/html)
+adp_docs.commands = ($$QDOC $$ADP_DOCS_QDOCCONF_FILE && $$QMAKE_COPY_DIR $$COPYWEBKITGUIDE $$COPYWEBKITTARGB)
adp_docs.depends += sub-qdoc3 # qdoc3
qch_docs.commands = $$QT_DOCUMENTATION
qch_docs.depends += sub-qdoc3
diff --git a/doc/src/declarative/declarativeui.qdoc b/doc/src/declarative/declarativeui.qdoc
index cecccf6..d89ca53 100644
--- a/doc/src/declarative/declarativeui.qdoc
+++ b/doc/src/declarative/declarativeui.qdoc
@@ -46,7 +46,7 @@ Qt applications.
\section1 Getting Started
\list
-\o \l{Introduction to Qt Quick}
+\o \l{Intro to Qt Quick}{Introduction to Qt Quick}
\o \l{QML for Qt Programmers}{QML Programming for Qt Programmers}
\o \l{Getting Started Programming with QML}
diff --git a/doc/src/declarative/network.qdoc b/doc/src/declarative/network.qdoc
index cb83542..0ebf8ae 100644
--- a/doc/src/declarative/network.qdoc
+++ b/doc/src/declarative/network.qdoc
@@ -134,10 +134,9 @@ One of the URL schemes built into Qt is the "qrc" scheme. This allows content to
the executable using \l{The Qt Resource System}. Using this, an executable can reference QML content
that is compiled into the executable:
-\code
- QDeclarativeView *canvas = new QDeclarativeView;
- canvas->setUrl(QUrl("qrc:/dial.qml"));
-\endcode
+\quotefromfile snippets/declarative/qtbinding/resources/main.cpp
+\skipto view
+\printuntil setSource
The content itself can then use relative URLs, and so be transparently unaware that the content is
compiled into the executable.
diff --git a/doc/src/declarative/qtquick-intro.qdoc b/doc/src/declarative/qtquick-intro.qdoc
index 4cd5db3..bdad2c3 100644
--- a/doc/src/declarative/qtquick-intro.qdoc
+++ b/doc/src/declarative/qtquick-intro.qdoc
@@ -27,7 +27,7 @@
/*!
\page qml-intro.html
-\title Introduction to Qt Quick
+\title Intro to Qt Quick
Qt Quick is a collection of technologies that are designed to help developers
create the kind of intuitive, modern, and fluid user interfaces that are
diff --git a/doc/src/getting-started/gettingstartedqt.qdoc b/doc/src/getting-started/gettingstartedqt.qdoc
index eda5ee1..d37e8e0 100644
--- a/doc/src/getting-started/gettingstartedqt.qdoc
+++ b/doc/src/getting-started/gettingstartedqt.qdoc
@@ -38,6 +38,12 @@
documentation, and find the information you need for the
application you are developing.
+ The code for this tutorial is available in \c
+ {examples/tutorials/gettingStarted/gsQt} under your Qt
+ installation. If you are using the Qt SDK, you will find it in
+ \c{Examples/4.7/tutorials/gettingStarted/gsQt} (change \c{4.7} if
+ you are using a later Qt version).
+
\section1 Hello Notepad
In this first example, we simply create and show a text edit in a
@@ -139,28 +145,28 @@
Let us take a look at the code.
\code
- 1 #include <QtGui>
- 2
- 3 int main(int argv, char **args)
- 4 {
- 5 QApplication app(argv, args);
- 6
- 7 QTextEdit textEdit;
- 8 QPushButton quitButton("Quit");
- 9
-10 QObject::connect(&quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
-11
-12 QVBoxLayout layout;
-13 layout.addWidget(&textEdit);
-14 layout.addWidget(&quitButton);
-15
-16 QWidget window;
-17 window.setLayout(&layout);
-18
-19 window.show();
-20
-21 return app.exec();
-22 }
+ 1 #include <QtGui>
+ 2
+ 3 int main(int argv, char **args)
+ 4 {
+ 5 QApplication app(argv, args);
+ 6
+ 7 QTextEdit *textEdit = new QTextEdit;
+ 8 QPushButton *quitButton = new QPushButton("&Quit");
+ 9
+10 QObject::connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
+11
+12 QVBoxLayout *layout = new QVBoxLayout;
+13 layout->addWidget(textEdit);
+14 layout->addWidget(quitButton);
+15
+16 QWidget window;
+17 window.setLayout(layout);
+18
+19 window.show();
+20
+21 return app.exec();
+22 }
\endcode
Line 1 includes QtGui, which contains all of Qt's GUI classes.
@@ -278,9 +284,25 @@
visible strings. This function is necessary when you want to
provide your application in more than one language (e.g. English
and Chinese). We will not go into details here, but you can follow
- the \c {Qt Linguist} link from the learn more table. We will not
- look at the implementation of \c quit() slot and the \c main()
- function, but you can check out the source code if you want to.
+ the \c {Qt Linguist} link from the learn more table.
+
+ Here is the \c quit() slot:
+
+ \code
+75 void Notepad::quit()
+76 {
+77 QMessageBox messageBox;
+78 messageBox.setWindowTitle(tr("Notepad"));
+79 messageBox.setText(tr("Do you really want to quit?"));
+80 messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+81 messageBox.setDefaultButton(QMessageBox::No);
+82 if (messageBox.exec() == QMessageBox::Yes)
+83 qApp->quit();
+84 }
+ \endcode
+
+ We use the QMessageBox class to display a dialog that asks the
+ user whether he/she really wants to quit.
\section2 Learn More
diff --git a/doc/src/index.qdoc b/doc/src/index.qdoc
index af418e0..2490374 100644
--- a/doc/src/index.qdoc
+++ b/doc/src/index.qdoc
@@ -38,7 +38,9 @@
\list
\o \l{Qt Features Overview}
\o \l{How to Learn Qt}
- \o \l{Introduction to Qt Quick}
+ \o \l{Introduction to Qt Quick}{Qt Quick}
+ \o \l{Qt Whitepaper}{Qt C++ Framework}
+ \o \l{Intro to Qt Quick}{Qt Quick}
\o \l{external: Qt Mobility Manual}{Qt Mobility}
\o \l{Qt WebKit}
\endlist
diff --git a/doc/src/platforms/supported-platforms.qdoc b/doc/src/platforms/supported-platforms.qdoc
index ba59c37..9d47695 100644
--- a/doc/src/platforms/supported-platforms.qdoc
+++ b/doc/src/platforms/supported-platforms.qdoc
@@ -334,8 +334,8 @@
\section2 Advanced Text Layout Engine
- Qt for Windows CE supports TrueType and raster fonts. Qt also has
- extended Unicode support and right-to-left languages. Qt's rich text
+ Qt for Windows CE supports TrueType® and raster fonts. Qt also has
+ extended Unicode support and right-to-left languages. Qt’s rich text
engine adds capabilities for complex text layouts including tables,
path tracing and text which flows around shapes.
@@ -373,7 +373,7 @@
by embedded Linux. You can use Qt to create highly memory efficient
devices and applications that have completely unique user experiences.
- Qt runs anywhere Linux runs. Qt's intuitive API means fewer lines of
+ Qt runs anywhere Linux runs. Qt’s intuitive API means fewer lines of
code and higher level functionality in less time. Use the code from
one single code-base and rebuild for all \l{Supported Platforms}
{supported platforms}.
@@ -410,7 +410,7 @@
frame buffer} that will match the physical device display, pixel for
pixel. This gives the developer a realistic testing infrastructure
testing on the desktop where the frame buffer simulates the physical
- device display's width, height and color depth.
+ device display’s width, height and color depth.
\section2 Inter-Process Communication (IPC)
@@ -421,7 +421,7 @@
\section2 Extended Font Format
Qt supports a wide range of font formats on embedded Linux including:
- TrueType, Postscript Type1 and Qt pre-rendered fonts. Qt has
+ TrueType®, Postscript® Type1 and Qt pre-rendered fonts. Qt has
extended Unicode support including automatic data extraction at build
time and automatic update at runtime.
@@ -681,7 +681,7 @@
\group platform-details
Qt is a cross-platform application and UI framework. Using Qt,
- you can write GUI applications once and deploy them
+ you can write web-enabled applications once and deploy them
across desktop, mobile and embedded operating systems without
rewriting the source code.
diff --git a/doc/src/qt-features.qdoc b/doc/src/qt-features.qdoc
deleted file mode 100644
index 0ae00b0..0000000
--- a/doc/src/qt-features.qdoc
+++ /dev/null
@@ -1,204 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** GNU Free Documentation License
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms
-** and conditions contained in a signed written agreement between you
-** and Nokia.
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page qt-overview.html
- \title Qt Features Overview
-
- This document provides a summary of the most important features of Qt,
- providing links to other pages in the documentation that cover these
- features in more detail. It is not intended to be a comprehensive
- guide to Qt's features.
-
- \section1 Fundamental Technologies in Qt
-
- Qt is built upon a set of core technologies, provided by the \l QtCore
- and \l QtGui modules. These include the following:
-
- \list
- \o \l{The Tulip Container Classes}, a set of template container classes.
- \o \l{The Arthur Paint System}, the Qt 4 painting framework.
- \o \l{The Interview Framework}, a model/view architecture for item views
- and the \l{QtSQL Module}, which also uses this architecture.
- \o \l{The Scribe Classes}, a framework for creating text documents,
- performing low-level text layout and writing OpenDocument files.
- \o A collection of \l{Qt Widget Gallery}{common desktop widgets}, styled
- to fit in on each supported platform.
- \o \l{The Qt 4 Main Window Classes}, a main window, toolbar, menu, and
- docking architecture.
- \o The \l{Graphics View} framework provides a canvas for producing
- interactive graphics.
- \o The \l{QtNetwork Module} provides support for TCP, UDP and local
- sockets that are integrated with Qt's event model, including support
- for Secure Socket Layer (SSL) communications,
- \l{QNetworkProxy}{network proxy} servers and
- \l{Bearer Management}{network bearer management}.
- \o Enhanced \l{qt4-threads.html}{thread support} allows
- \l{Signals & Slots}{signal-slot} connections across threads and
- per-thread event loops.
- Additionally, \l{Thread Support in Qt}{a framework for concurrent programming}
- using Qt paradigms makes common threading tasks easier.
- \o A \l{resource system} for embedding images and other resource files
- into executable files makes it easier to deploy applications.
- \o A \l{QTestLib Manual}{unit testing framework} for Qt applications and
- libraries.
- \endlist
-
- The mature classes provided by these technologies have been used to build
- robust, cross-platform desktop applications. They are augmented by a number
- of additional technologies and improvements that have appeared over the
- lifetime of Qt 4.
-
- \section1 Graphical User Interfaces
-
- \div{class="float-right"}
- \inlineimage gtk-tabwidget.png
- \enddiv
- \div{class="float-right"}
- \inlineimage gtk-progressbar.png
- \br
- \inlineimage gtk-checkbox.png
- \br
- \inlineimage plastique-combobox.png
- \br
- \inlineimage plastique-radiobutton.png
- \enddiv
-
- Alongside the support for traditional desktop user interfaces, Qt includes
- support for declarative UI development with \l{Qt Quick}, a set of
- technologies for creating fluid, dynamic user interfaces. A starting point
- for exploring this approach can be found in the \l{Introduction to Qt Quick}
- guide.
-
- Qt provides a range of standard user interface elements, called widgets,
- for each supported platform. Widgets can be used as containers for other
- widgets, as windows, and as regular controls that the user interacts with.
- Where the platform supports it, widgets can be made to appear partially
- transparent, and may be styled with \l{Qt Style Sheets}.
-
- Support for \l{QTouchEvent}{touch input} and \l{Gestures Programming}{gestures}
- enable widgets to be used to create intuitive user interfaces for
- touch-enabled devices.
-
- User interfaces can also be created dynamically at run-time with the
- features provided by the \l{QtUiTools} module.
-
- A selection of available widgets are shown in the \l{Qt Widget Gallery}.
- An introduction to the concepts behind widgets can be found in the
- \l{Widgets Tutorial}.
-
- \clearfloat
- \section1 Painting, Printing and Rendering
-
- \div{class="float-left"}
- \inlineimage qpainter-affinetransformations.png
- \enddiv
-
- Widgets are just one of many kinds of paint device that Qt can render onto.
- This support for unified painting makes it possible for applications to use
- the same painting code for different tasks, as well as allowing Qt to be
- extended to support additional file formats.
-
- Qt provides support for common bitmap image formats,
- \l{QtSvg Module}{Scalable Vector Graphics} (SVG) drawings and animations,
- Postscript and Portable Document Format (PDF) files. Postscript and PDF are
- integrated with \l{Printing with Qt}{Qt's printing system}, which also
- allows printed output to be previewed.
-
- Interactive graphics can be created with the
- \l{The Animation Framework}{animation framework}, allowing animations to be
- used with both widgets and graphics items. Animations can be used with the
- \l{The State Machine Framework}{state machine framework}, which provides a
- way to express application logic and integrate it with the user interface.
- Animations can be enhanced with a collection of
- \l{QGraphicsEffect}{graphics effects} that operate on graphics items and
- can be applied individually or combined to create more complex effects.
-
- Qt supports integration with \l{QtOpenGL}{OpenGL} on a number of levels,
- providing convenience functions for handling textures and colors, as well
- as providing support for pixel and sample buffers. Future support for
- higher level 3D integration is provided by Qt3D enablers which include
- \l{QMatrix4x4}{matrix multiplication}, \l{QQuaternion}{quaternions}, and an
- API for \l{QGLShader}{vertex and fragment shaders}.
-
- Two APIs are provided for multimedia. The
- \l{Phonon Overview}{Phonon Multimedia Framework} has traditionally been
- used on desktop platforms. A set of
- \l{QtMultimedia Module}{multimedia services} provides low-level access to
- the system's audio system and is often used on mobile devices.
-
- \clearfloat
- \section1 Infrastructure
-
- \div{class="float-right"}
- \inlineimage qtscript-context2d.png
- \enddiv
-
- Facilities for Inter-Process Communication (IPC) and Remote Procedure
- Calling (RPC) mechanisms are available on platforms that support the
- \l{intro-to-dbus.html}{D-Bus} message bus system.
-
- An \l{Undo Framework}{Undo framework} based on the
- \l{Books about GUI Design#Design Patterns}{Command pattern} is designed to
- enable a consistent approach to handling data in editing applications.
-
- The \l{QtScript} and \l{QtScriptTools} modules provide support for
- application scripting and debugging using the ECMAScript language.
-
- The \l{QtHelp Module} provides the foundations of an interactive help
- system that can be used in conjunction with Qt Creator or integrated into
- applications directly.
-
- XML handling is supported in a number of places in Qt. The \l QtCore module
- provides classes for reading and writing XML streams. The \l QtXmlPatterns
- module includes XQuery, XPath and XSLT support, providing facilities for
- XML processing beyond that supported by the QtXml module, which contains
- SAX and DOM parsers. XML schema validation in the QtXmlPatterns module
- covers large parts of version 1.0 of the specification.
-
- \clearfloat
- \section1 Web Client Integration
-
- Integration between \l{Webkit in Qt}{Qt and WebKit} makes it possible for
- developers to use a fully-featured Web browser engine to display documents
- and access online services. Developers can access the browser's environment
- to create documents and run scripts within one or more browser widgets.
-
- A \l{QWebElement}{DOM access API} for QtWebKit provides a cleaner and safer
- way to access elements and structures of Web pages without the use of
- JavaScript.
-
- \section1 Further Reading
-
- Many of the technologies mentioned here, as well as other, more specific
- features, are listed in the \l{What's New in Qt 4} document. A complete
- list of Qt's modules can be found on the \l{All Modules} page, which
- also includes more domain-specific technologies.
-
- The tools that are supplied with Qt are covered by the listing in the
- \l{Qt's Tools} document.
-*/
diff --git a/doc/src/qt-webpages.qdoc b/doc/src/qt-webpages.qdoc
index c993575..f67ff83 100644
--- a/doc/src/qt-webpages.qdoc
+++ b/doc/src/qt-webpages.qdoc
@@ -221,7 +221,7 @@
\title Forums on Qt Developer Network
*/
/*!
- \externalpage http://developer.qt.nokia.com/wikis
+ \externalpage http://developer.qt.nokia.com/wiki
\title Wiki on Qt Developer Network
*/
/*!
diff --git a/doc/src/qt4-intro.qdoc b/doc/src/qt4-intro.qdoc
index 01103a8..17dc1af 100644
--- a/doc/src/qt4-intro.qdoc
+++ b/doc/src/qt4-intro.qdoc
@@ -138,7 +138,7 @@
In Qt 4.4:
\list
- \o \l{WebKit in Qt}{Qt WebKit integration}, making it possible for developers
+ \o \l{Webkit in QT}{Qt WebKit integration}, making it possible for developers
to use a fully-featured Web browser to display documents and access online
services.
\o A multimedia API provided by the \l{Phonon Overview}{Phonon Multimedia Framework}.
@@ -707,6 +707,7 @@
introduced in Qt 4.7.
\sincelist 4.7
+
*/
/*!
diff --git a/doc/src/snippets/qcolumnview/main.cpp b/doc/src/snippets/qcolumnview/main.cpp
index c39a4bb..fecff12 100644
--- a/doc/src/snippets/qcolumnview/main.cpp
+++ b/doc/src/snippets/qcolumnview/main.cpp
@@ -76,4 +76,4 @@ int main(int argc, char *argv[])
columnView.show();
return app.exec();
-} \ No newline at end of file
+}
diff --git a/doc/src/snippets/textdocument-imagedrop/main.cpp b/doc/src/snippets/textdocument-imagedrop/main.cpp
index 24cd2de..0cdf3a1 100644
--- a/doc/src/snippets/textdocument-imagedrop/main.cpp
+++ b/doc/src/snippets/textdocument-imagedrop/main.cpp
@@ -49,4 +49,4 @@ int main(int argc, char * argv[])
textEdit->show();
return app.exec();
-} \ No newline at end of file
+}
diff --git a/doc/src/snippets/textdocument-imagedrop/textedit.h b/doc/src/snippets/textdocument-imagedrop/textedit.h
index 9e0492b..9db9f17 100644
--- a/doc/src/snippets/textdocument-imagedrop/textedit.h
+++ b/doc/src/snippets/textdocument-imagedrop/textedit.h
@@ -46,11 +46,11 @@
class TextEdit : public QTextEdit
{
Q_OBJECT
-
-public:
+
+public:
TextEdit(QWidget *parent=0);
bool canInsertFromMimeData( const QMimeData *source ) const;
void insertFromMimeData( const QMimeData *source );
};
-#endif \ No newline at end of file
+#endif
diff --git a/examples/tutorials/gettingStarted/gsQml/filedialog/dialogPlugin.cpp b/examples/tutorials/gettingStarted/gsQml/filedialog/dialogPlugin.cpp
index fde24d9..3b02c63 100644
--- a/examples/tutorials/gettingStarted/gsQml/filedialog/dialogPlugin.cpp
+++ b/examples/tutorials/gettingStarted/gsQml/filedialog/dialogPlugin.cpp
@@ -51,4 +51,4 @@ void DialogPlugin::registerTypes(const char *uri)
}
//FileDialog is the plugin name (same as the TARGET in the project file) and DialogPlugin is the plugin classs
-Q_EXPORT_PLUGIN2(FileDialog, DialogPlugin); \ No newline at end of file
+Q_EXPORT_PLUGIN2(FileDialog, DialogPlugin);
diff --git a/examples/tutorials/gettingStarted/gsQml/filedialog/directory.cpp b/examples/tutorials/gettingStarted/gsQml/filedialog/directory.cpp
index c675fc9..52bdfc7 100644
--- a/examples/tutorials/gettingStarted/gsQml/filedialog/directory.cpp
+++ b/examples/tutorials/gettingStarted/gsQml/filedialog/directory.cpp
@@ -221,4 +221,4 @@ void Directory::refresh()
}
m_fileList.append(file);
}
-} \ No newline at end of file
+}
diff --git a/examples/tutorials/gettingStarted/gsQml/filedialog/file.cpp b/examples/tutorials/gettingStarted/gsQml/filedialog/file.cpp
index 44b0915..17740f2 100644
--- a/examples/tutorials/gettingStarted/gsQml/filedialog/file.cpp
+++ b/examples/tutorials/gettingStarted/gsQml/filedialog/file.cpp
@@ -54,4 +54,4 @@ void File::setName(const QString &str){
m_name = str;
emit nameChanged();
}
-} \ No newline at end of file
+}
diff --git a/examples/tutorials/gettingStarted/gsQml/filedialog/file.h b/examples/tutorials/gettingStarted/gsQml/filedialog/file.h
index 21e8ebb..6aa6a6a 100644
--- a/examples/tutorials/gettingStarted/gsQml/filedialog/file.h
+++ b/examples/tutorials/gettingStarted/gsQml/filedialog/file.h
@@ -64,4 +64,4 @@ class File : public QObject{
QString m_name;
};
-#endif \ No newline at end of file
+#endif
diff --git a/examples/tutorials/gettingStarted/gsQt/part2/main.cpp b/examples/tutorials/gettingStarted/gsQt/part2/main.cpp
index 24b4d77..afa26e1 100755
--- a/examples/tutorials/gettingStarted/gsQt/part2/main.cpp
+++ b/examples/tutorials/gettingStarted/gsQt/part2/main.cpp
@@ -44,17 +44,17 @@ int main(int argv, char **args)
{
QApplication app(argv, args);
- QTextEdit textEdit;
- QPushButton quitButton("&Quit");
+ QTextEdit *textEdit = new QTextEdit;
+ QPushButton *quitButton = new QPushButton("&Quit");
- QObject::connect(&quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
+ QObject::connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
- QVBoxLayout layout;
- layout.addWidget(&textEdit);
- layout.addWidget(&quitButton);
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->addWidget(textEdit);
+ layout->addWidget(quitButton);
QWidget window;
- window.setLayout(&layout);
+ window.setLayout(layout);
window.show();
diff --git a/examples/tutorials/modelview/4_headers/main.cpp b/examples/tutorials/modelview/4_headers/main.cpp
index c89829a..8a4ab8f 100755
--- a/examples/tutorials/modelview/4_headers/main.cpp
+++ b/examples/tutorials/modelview/4_headers/main.cpp
@@ -50,4 +50,4 @@ int main(int argc, char *argv[])
tableView.setModel( &myModel );
tableView.show();
return a.exec();
-} \ No newline at end of file
+}
diff --git a/examples/tutorials/threads/clock/clockthread.h b/examples/tutorials/threads/clock/clockthread.h
index 966dbea..d77a52b 100644
--- a/examples/tutorials/threads/clock/clockthread.h
+++ b/examples/tutorials/threads/clock/clockthread.h
@@ -61,4 +61,4 @@ private slots:
};
//! [1]
-#endif // CLOCKTHREAD_H \ No newline at end of file
+#endif // CLOCKTHREAD_H
diff --git a/mkspecs/qpa/macx-iphonedevice-g++/qmake.conf b/mkspecs/qpa/macx-iphonedevice-g++/qmake.conf
index d69f58d..faec47d 100644
--- a/mkspecs/qpa/macx-iphonedevice-g++/qmake.conf
+++ b/mkspecs/qpa/macx-iphonedevice-g++/qmake.conf
@@ -43,10 +43,10 @@ QMAKE_CXX = /Developer/Platforms/iPhoneOS.platform/Developer/usr/b
QMAKE_LINK = $$QMAKE_CXX
QMAKE_LINK_SHLIB = $$QMAKE_CXX
-QMAKE_CFLAGS += -arch armv7 -marm -isysroot $$QMAKE_IOS_SDK -fmessage-length=0 -fexceptions -miphoneos-version-min=4.2
+QMAKE_CFLAGS += -arch armv7 -isysroot $$QMAKE_IOS_SDK -fmessage-length=0 -fexceptions -miphoneos-version-min=4.2
QMAKE_CXXFLAGS += $$QMAKE_CFLAGS -fvisibility=hidden -fvisibility-inlines-hidden
-QMAKE_OBJECTIVE_CFLAGS += -arch armv7 -marm -isysroot $$QMAKE_IOS_SDK -fmessage-length=0 -fexceptions -miphoneos-version-min=4.2
-QMAKE_LFLAGS += -arch armv7 -marm -miphoneos-version-min=4.2 -Wl,-syslibroot,$$QMAKE_IOS_SDK
+QMAKE_OBJECTIVE_CFLAGS += -arch armv7 -isysroot $$QMAKE_IOS_SDK -fmessage-length=0 -fexceptions -miphoneos-version-min=4.2
+QMAKE_LFLAGS += -arch armv7 -miphoneos-version-min=4.2 -Wl,-syslibroot,$$QMAKE_IOS_SDK
QMAKE_LFLAGS += -framework Foundation -framework UIKit -framework QuartzCore -lz
QMAKE_INCDIR_OPENGL =
diff --git a/src/corelib/arch/qatomic_armv6.h b/src/corelib/arch/qatomic_armv6.h
index 96b561e..dd465db 100644
--- a/src/corelib/arch/qatomic_armv6.h
+++ b/src/corelib/arch/qatomic_armv6.h
@@ -152,6 +152,7 @@ inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
asm volatile("0:\n"
"ldrex %[result], [%[_q_value]]\n"
"eors %[result], %[result], %[expectedValue]\n"
+ "itt eq\n"
"strexeq %[result], %[newValue], [%[_q_value]]\n"
"teqeq %[result], #1\n"
"beq 0b\n"
@@ -210,6 +211,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValu
asm volatile("0:\n"
"ldrex %[result], [%[_q_value]]\n"
"eors %[result], %[result], %[expectedValue]\n"
+ "itt eq\n"
"strexeq %[result], %[newValue], [%[_q_value]]\n"
"teqeq %[result], #1\n"
"beq 0b\n"
diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp
index 985f515..dd06a2a 100644
--- a/src/corelib/codecs/qtextcodec.cpp
+++ b/src/corelib/codecs/qtextcodec.cpp
@@ -213,12 +213,13 @@ QTextCodecCleanup::~QTextCodecCleanup()
destroying_is_ok = true;
#endif
- for (QList<QTextCodec *>::const_iterator it = all->constBegin()
- ; it != all->constEnd(); ++it) {
+ QList<QTextCodec *> *myAll = all;
+ all = 0; // Otherwise the d'tor destroys the iterator
+ for (QList<QTextCodec *>::const_iterator it = myAll->constBegin()
+ ; it != myAll->constEnd(); ++it) {
delete *it;
}
- delete all;
- all = 0;
+ delete myAll;
localeMapper = 0;
#ifdef Q_DEBUG_TEXTCODEC
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 929b2f9..06c403a 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -366,9 +366,11 @@ QFilePrivate::setError(QFile::FileError err, int errNum)
\value AutoCloseHandle The file handle passed into open() should be
closed by close(), the default behaviour is that close just flushes
- the file and the app is responsible for closing the file handle. When
- opening a file by name, this flag is ignored as Qt always "owns" the
+ the file and the application is responsible for closing the file handle.
+ When opening a file by name, this flag is ignored as Qt always "owns" the
file handle and must close it.
+ \value DontCloseHandle The file handle passed into open() will not be
+ closed by Qt. The application must ensure that close() is called.
*/
#ifdef QT3_SUPPORT
@@ -1210,7 +1212,7 @@ bool QFile::open(int fd, OpenMode mode)
Returns true if successful; otherwise returns false.
When a QFile is opened using this function, behaviour of close() is
- controlled by the AutoCloseHandle flag.
+ controlled by the \a handleFlags argument.
If AutoCloseHandle is specified, and this function succeeds,
then calling close() closes the adopted handle.
Otherwise, close() does not actually close the file, but only flushes it.
@@ -1269,7 +1271,7 @@ bool QFile::open(int fd, OpenMode mode, FileHandleFlags handleFlags)
Returns true if successful; otherwise returns false.
When a QFile is opened using this function, behaviour of close() is
- controlled by the AutoCloseHandle flag.
+ controlled by the \a handleFlags argument.
If AutoCloseHandle is specified, and this function succeeds,
then calling close() closes the adopted handle.
Otherwise, close() does not actually close the file, but only flushes it.
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp
index 548f9cf..e1f3123 100644
--- a/src/corelib/io/qfsfileengine.cpp
+++ b/src/corelib/io/qfsfileengine.cpp
@@ -233,6 +233,14 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh)
return open(openMode, fh, QFile::DontCloseHandle);
}
+/*!
+ Opens the file handle \a fh in \a openMode mode. Returns true
+ on success; otherwise returns false.
+
+ The \a handleFlags argument specifies whether the file handle will be
+ closed by Qt. See the QFile::FileHandleFlags documentation for more
+ information.
+*/
bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh, QFile::FileHandleFlags handleFlags)
{
Q_D(QFSFileEngine);
@@ -294,6 +302,14 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, int fd)
return open(openMode, fd, QFile::DontCloseHandle);
}
+/*!
+ Opens the file descriptor \a fd in \a openMode mode. Returns true
+ on success; otherwise returns false.
+
+ The \a handleFlags argument specifies whether the file handle will be
+ closed by Qt. See the QFile::FileHandleFlags documentation for more
+ information.
+*/
bool QFSFileEngine::open(QIODevice::OpenMode openMode, int fd, QFile::FileHandleFlags handleFlags)
{
Q_D(QFSFileEngine);
diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp
index 9de282a..4961722 100644
--- a/src/corelib/io/qfsfileengine_unix.cpp
+++ b/src/corelib/io/qfsfileengine_unix.cpp
@@ -252,6 +252,14 @@ bool QFSFileEnginePrivate::nativeOpen(QIODevice::OpenMode openMode)
return true;
}
+/*!
+ Opens the file descriptor specified by \a file in the mode given by
+ \a openMode. Returns true on success; otherwise returns false.
+
+ The \a handleFlags argument specifies whether the file handle will be
+ closed by Qt. See the QFile::FileHandleFlags documentation for more
+ information.
+*/
bool QFSFileEngine::open(QIODevice::OpenMode openMode, const RFile &file, QFile::FileHandleFlags handleFlags)
{
Q_D(QFSFileEngine);
diff --git a/src/corelib/io/qnoncontiguousbytedevice.cpp b/src/corelib/io/qnoncontiguousbytedevice.cpp
index 5568920..d5ce56b 100644
--- a/src/corelib/io/qnoncontiguousbytedevice.cpp
+++ b/src/corelib/io/qnoncontiguousbytedevice.cpp
@@ -501,8 +501,6 @@ QNonContiguousByteDevice* QNonContiguousByteDeviceFactory::create(QIODevice *dev
}
/*!
- \fn static QNonContiguousByteDevice* QNonContiguousByteDeviceFactory::create(QRingBuffer *ringBuffer);
-
Create a QNonContiguousByteDevice out of a QRingBuffer.
\internal
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 4226f9e..60a4ce3 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -63,8 +63,9 @@
unencoded representation is suitable for showing to users, but
the encoded representation is typically what you would send to
a web server. For example, the unencoded URL
- "http://b\uuml\c{}hler.example.com" would be sent to the server as
- "http://xn--bhler-kva.example.com/List%20of%20applicants.xml".
+ "http://b\uuml\c{}hler.example.com/List of applicants.xml" would be sent to the server as
+ "http://xn--bhler-kva.example.com/List%20of%20applicants.xml",
+ and this can be verified by calling the toEncoded() function.
A URL can also be constructed piece by piece by calling
setScheme(), setUserName(), setPassword(), setHost(), setPort(),
diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp
index eb29e6e..af63b79 100644
--- a/src/corelib/plugin/quuid.cpp
+++ b/src/corelib/plugin/quuid.cpp
@@ -387,17 +387,17 @@ QUuid::QUuid(const QByteArray &text)
#endif
/*!
- Creates a QUuid object from the binary representation of the UUID, as
- specified by RFC 4122 section 4.1.2. See toRfc4122() for a further
- explanation of the order of bytes required.
+ \since 4.8
- The byte array accepted is NOT a human readable format.
+ Creates a QUuid object from the binary representation of the UUID given
+ by \a bytes, as specified by RFC 4122 section 4.1.2. See toRfc4122() for a
+ further explanation of the order of bytes required.
- If the conversion fails, a null UUID is created.
+ The byte array accepted is \e not a human readable format.
- \since 4.8
+ If the conversion fails, a null UUID is created.
- \sa toRfc4122(), QUuid()
+ \sa toRfc4122(), QUuid()
*/
QUuid QUuid::fromRfc4122(const QByteArray &bytes)
{
diff --git a/src/corelib/tools/qline.cpp b/src/corelib/tools/qline.cpp
index 0f67652..af3b7d5 100644
--- a/src/corelib/tools/qline.cpp
+++ b/src/corelib/tools/qline.cpp
@@ -564,9 +564,8 @@ qreal QLineF::length() const
Returns the angle of the line in degrees.
- The return value will be in the range of values from 0.0 up to but not
- including 360.0. The angles are measured counter-clockwise from a point
- on the x-axis to the right of the origin (x > 0).
+ Positive values for the angles mean counter-clockwise while negative values
+ mean the clockwise direction. Zero degrees is at the 3 o'clock position.
\sa setAngle()
*/
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
index 5d4f305..95a7165 100644
--- a/src/corelib/tools/qlocale.qdoc
+++ b/src/corelib/tools/qlocale.qdoc
@@ -806,6 +806,10 @@
\internal
*/
/*!
+ \fn QSystemLocale::CurrencyToStringArgument::CurrencyToStringArgument(const QVariant &v, const QString &s)
+ \internal
+*/
+/*!
\variable QSystemLocale::CurrencyToStringArgument::value
An input value that should be converted to its string representation.
diff --git a/src/dbus/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp
index 187ad67..9f68313 100644
--- a/src/dbus/qdbusabstractinterface.cpp
+++ b/src/dbus/qdbusabstractinterface.cpp
@@ -88,6 +88,7 @@ QDBusAbstractInterfacePrivate::QDBusAbstractInterfacePrivate(const QString &serv
: connection(con), service(serv), path(p), interface(iface),
lastError(checkIfValid(serv, p, iface, isDynamic, (connectionPrivate() &&
connectionPrivate()->mode == QDBusConnectionPrivate::PeerMode))),
+ timeout(-1),
isValid(!lastError.isValid())
{
if (!isValid)
@@ -144,7 +145,7 @@ void QDBusAbstractInterfacePrivate::property(const QMetaProperty &mp, QVariant &
QLatin1String("Get"));
QDBusMessagePrivate::setParametersValidated(msg, true);
msg << interface << QString::fromUtf8(mp.name());
- QDBusMessage reply = connection.call(msg, QDBus::Block);
+ QDBusMessage reply = connection.call(msg, QDBus::Block, timeout);
if (reply.type() != QDBusMessage::ReplyMessage) {
lastError = reply;
@@ -210,7 +211,7 @@ bool QDBusAbstractInterfacePrivate::setProperty(const QMetaProperty &mp, const Q
QLatin1String("Set"));
QDBusMessagePrivate::setParametersValidated(msg, true);
msg << interface << QString::fromUtf8(mp.name()) << QVariant::fromValue(QDBusVariant(value));
- QDBusMessage reply = connection.call(msg, QDBus::Block);
+ QDBusMessage reply = connection.call(msg, QDBus::Block, timeout);
if (reply.type() != QDBusMessage::ReplyMessage) {
lastError = reply;
@@ -384,6 +385,28 @@ QDBusError QDBusAbstractInterface::lastError() const
}
/*!
+ Sets the timeout in seconds for all future DBus calls to \a timeout.
+ -1 means the default DBus timeout (usually 25 seconds).
+
+ \since 4.8
+*/
+void QDBusAbstractInterface::setTimeout(int timeout)
+{
+ d_func()->timeout = timeout;
+}
+
+/*!
+ Returns the current value of the timeout in seconds.
+ -1 means the default DBus timeout (usually 25 seconds).
+
+ \since 4.8
+*/
+int QDBusAbstractInterface::timeout() const
+{
+ return d_func()->timeout;
+}
+
+/*!
Places a call to the remote method specified by \a method on this interface, using \a args as
arguments. This function returns the message that was received as a reply, which can be a normal
QDBusMessage::ReplyMessage (indicating success) or QDBusMessage::ErrorMessage (if the call
@@ -442,7 +465,7 @@ QDBusMessage QDBusAbstractInterface::callWithArgumentList(QDBus::CallMode mode,
QDBusMessagePrivate::setParametersValidated(msg, true);
msg.setArguments(args);
- QDBusMessage reply = d->connection.call(msg, mode);
+ QDBusMessage reply = d->connection.call(msg, mode, d->timeout);
if (thread() == QThread::currentThread())
d->lastError = reply; // will clear if reply isn't an error
@@ -475,7 +498,7 @@ QDBusPendingCall QDBusAbstractInterface::asyncCallWithArgumentList(const QString
QDBusMessage msg = QDBusMessage::createMethodCall(service(), path(), interface(), method);
QDBusMessagePrivate::setParametersValidated(msg, true);
msg.setArguments(args);
- return d->connection.asyncCall(msg);
+ return d->connection.asyncCall(msg, d->timeout);
}
/*!
diff --git a/src/dbus/qdbusabstractinterface.h b/src/dbus/qdbusabstractinterface.h
index 72b922e..34ff410 100644
--- a/src/dbus/qdbusabstractinterface.h
+++ b/src/dbus/qdbusabstractinterface.h
@@ -95,6 +95,9 @@ public:
QDBusError lastError() const;
+ void setTimeout(int timeout);
+ int timeout() const;
+
QDBusMessage call(const QString &method,
const QVariant &arg1 = QVariant(),
const QVariant &arg2 = QVariant(),
diff --git a/src/dbus/qdbusabstractinterface_p.h b/src/dbus/qdbusabstractinterface_p.h
index a000daf..4f96165 100644
--- a/src/dbus/qdbusabstractinterface_p.h
+++ b/src/dbus/qdbusabstractinterface_p.h
@@ -77,6 +77,7 @@ public:
QString path;
QString interface;
mutable QDBusError lastError;
+ int timeout;
// this is set during creation and never changed
// it can't be const because QDBusInterfacePrivate has one more check
diff --git a/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp b/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp
index b1ebec8..8787a5e 100644
--- a/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeanimatedimage.cpp
@@ -114,7 +114,7 @@ QT_BEGIN_NAMESPACE
/*!
\qmlproperty bool AnimatedImage::cache
- \since QtQuick 1.1
+ \since Quick 1.1
Specifies whether the image should be cached. The default value is
true. Setting \a cache to false is useful when dealing with large images,
@@ -123,7 +123,7 @@ QT_BEGIN_NAMESPACE
/*!
\qmlproperty bool AnimatedImage::mirror
- \since QtQuick 1.1
+ \since Quick 1.1
This property holds whether the image should be horizontally inverted
(effectively displaying a mirrored image).
diff --git a/src/declarative/graphicsitems/qdeclarativeborderimage.cpp b/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
index 4b4efb6..9c274e9 100644
--- a/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeborderimage.cpp
@@ -215,7 +215,7 @@ QDeclarativeBorderImage::~QDeclarativeBorderImage()
/*!
\qmlproperty bool BorderImage::cache
- \since QtQuick 1.1
+ \since Quick 1.1
Specifies whether the image should be cached. The default value is
true. Setting \a cache to false is useful when dealing with large images,
@@ -224,7 +224,7 @@ QDeclarativeBorderImage::~QDeclarativeBorderImage()
/*!
\qmlproperty bool BorderImage::mirror
- \since QtQuick 1.1
+ \since Quick 1.1
This property holds whether the image should be horizontally inverted
(effectively displaying a mirrored image).
diff --git a/src/declarative/graphicsitems/qdeclarativeflickable.cpp b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
index fd2dc45..d5c58df 100644
--- a/src/declarative/graphicsitems/qdeclarativeflickable.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeflickable.cpp
@@ -1399,7 +1399,7 @@ void QDeclarativeFlickable::setContentHeight(qreal h)
/*!
\qmlmethod Flickable::resizeContent(real width, real height, QPointF center)
\preliminary
- \since QtQuick 1.1
+ \since Quick 1.1
Resizes the content to \a width x \a height about \a center.
@@ -1439,7 +1439,7 @@ void QDeclarativeFlickable::resizeContent(qreal w, qreal h, QPointF center)
/*!
\qmlmethod Flickable::returnToBounds()
\preliminary
- \since QtQuick 1.1
+ \since Quick 1.1
Ensures the content is within legal bounds.
diff --git a/src/declarative/graphicsitems/qdeclarativegridview.cpp b/src/declarative/graphicsitems/qdeclarativegridview.cpp
index e53472d..23433d6 100644
--- a/src/declarative/graphicsitems/qdeclarativegridview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativegridview.cpp
@@ -2618,7 +2618,7 @@ void QDeclarativeGridView::positionViewAtIndex(int index, int mode)
/*!
\qmlmethod GridView::positionViewAtBeginning()
\qmlmethod GridView::positionViewAtEnd()
- \since QtQuick 1.1
+ \since Quick 1.1
Positions the view at the beginning or end, taking into account any header or footer.
diff --git a/src/declarative/graphicsitems/qdeclarativeimage.cpp b/src/declarative/graphicsitems/qdeclarativeimage.cpp
index 9b9d680..e6bb798 100644
--- a/src/declarative/graphicsitems/qdeclarativeimage.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimage.cpp
@@ -473,7 +473,7 @@ QRectF QDeclarativeImage::boundingRect() const
/*!
\qmlproperty bool Image::cache
- \since QtQuick 1.1
+ \since Quick 1.1
Specifies whether the image should be cached. The default value is
true. Setting \a cache to false is useful when dealing with large images,
@@ -482,7 +482,7 @@ QRectF QDeclarativeImage::boundingRect() const
/*!
\qmlproperty bool Image::mirror
- \since QtQuick 1.1
+ \since Quick 1.1
This property holds whether the image should be horizontally inverted
(effectively displaying a mirrored image).
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index d36d163..805ca4d 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -3480,7 +3480,7 @@ qreal QDeclarativeItem::implicitHeight() const
/*!
\qmlproperty real Item::implicitWidth
\qmlproperty real Item::implicitHeight
- \since QtQuick 1.1
+ \since Quick 1.1
Defines the natural width or height of the Item if no \l width or \l height is specified.
diff --git a/src/declarative/graphicsitems/qdeclarativelistview.cpp b/src/declarative/graphicsitems/qdeclarativelistview.cpp
index f0fc96b..f29f778 100644
--- a/src/declarative/graphicsitems/qdeclarativelistview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativelistview.cpp
@@ -3028,7 +3028,7 @@ void QDeclarativeListView::positionViewAtIndex(int index, int mode)
/*!
\qmlmethod ListView::positionViewAtBeginning()
\qmlmethod ListView::positionViewAtEnd()
- \since QtQuick 1.1
+ \since Quick 1.1
Positions the view at the beginning or end, taking into account any header or footer.
diff --git a/src/declarative/graphicsitems/qdeclarativemousearea.cpp b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
index 0e06a4c..18f008a 100644
--- a/src/declarative/graphicsitems/qdeclarativemousearea.cpp
+++ b/src/declarative/graphicsitems/qdeclarativemousearea.cpp
@@ -419,7 +419,7 @@ void QDeclarativeMouseArea::setEnabled(bool a)
/*!
\qmlproperty bool MouseArea::preventStealing
- \since QtQuick 1.1
+ \since Quick 1.1
This property holds whether the mouse events may be stolen from this
MouseArea.
diff --git a/src/declarative/graphicsitems/qdeclarativepositioners.cpp b/src/declarative/graphicsitems/qdeclarativepositioners.cpp
index 483cad4..f3d1a68 100644
--- a/src/declarative/graphicsitems/qdeclarativepositioners.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepositioners.cpp
@@ -584,7 +584,7 @@ QDeclarativeRow::QDeclarativeRow(QDeclarativeItem *parent)
/*!
\qmlproperty enumeration Row::layoutDirection
- \since QtQuick 1.1
+ \since Quick 1.1
This property holds the layoutDirection of the row.
@@ -878,7 +878,7 @@ void QDeclarativeGrid::setFlow(Flow flow)
/*!
\qmlproperty enumeration Grid::layoutDirection
- \since QtQuick 1.1
+ \since Quick 1.1
This property holds the layout direction of the layout.
@@ -1236,7 +1236,7 @@ void QDeclarativeFlow::setFlow(Flow flow)
/*!
\qmlproperty enumeration Flow::layoutDirection
- \since QtQuick 1.1
+ \since Quick 1.1
This property holds the layout direction of the layout.
diff --git a/src/declarative/graphicsitems/qdeclarativerepeater.cpp b/src/declarative/graphicsitems/qdeclarativerepeater.cpp
index e881b96..813c255 100644
--- a/src/declarative/graphicsitems/qdeclarativerepeater.cpp
+++ b/src/declarative/graphicsitems/qdeclarativerepeater.cpp
@@ -128,7 +128,7 @@ QDeclarativeRepeaterPrivate::~QDeclarativeRepeaterPrivate()
/*!
\qmlsignal Repeater::onItemAdded(int index, Item item)
- \since QtQuick 1.1
+ \since Quick 1.1
This handler is called when an item is added to the repeater. The \a index
parameter holds the index at which the item has been inserted within the
@@ -137,7 +137,7 @@ QDeclarativeRepeaterPrivate::~QDeclarativeRepeaterPrivate()
/*!
\qmlsignal Repeater::onItemRemoved(int index, Item item)
- \since QtQuick 1.1
+ \since Quick 1.1
This handler is called when an item is removed from the repeater. The \a index
parameter holds the index at which the item was removed from the repeater,
@@ -306,7 +306,7 @@ int QDeclarativeRepeater::count() const
/*!
\qmlmethod Item Repeater::itemAt(index)
- \since QtQuick 1.1
+ \since Quick 1.1
Returns the \l Item that has been created at the given \a index, or \c null
if no item exists at \a index.
diff --git a/src/declarative/graphicsitems/qdeclarativetext.cpp b/src/declarative/graphicsitems/qdeclarativetext.cpp
index 20e4eef..54ff406 100644
--- a/src/declarative/graphicsitems/qdeclarativetext.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetext.cpp
@@ -1190,7 +1190,7 @@ void QDeclarativeText::setWrapMode(WrapMode mode)
/*!
\qmlproperty int Text::lineCount
- \since QtQuick 1.1
+ \since Quick 1.1
Returns the number of lines visible in the text item.
@@ -1206,7 +1206,7 @@ int QDeclarativeText::lineCount() const
/*!
\qmlproperty bool Text::truncated
- \since QtQuick 1.1
+ \since Quick 1.1
Returns true if the text has been truncated due to \l maximumLineCount
or \l elide.
@@ -1223,7 +1223,7 @@ bool QDeclarativeText::truncated() const
/*!
\qmlproperty int Text::maximumLineCount
- \since QtQuick 1.1
+ \since Quick 1.1
Set this property to limit the number of lines that the text item will show.
If elide is set to Text.ElideRight, the text will be elided appropriately.
@@ -1457,7 +1457,7 @@ qreal QDeclarativeText::paintedHeight() const
/*!
\qmlproperty real Text::lineHeight
- \since QtQuick 1.1
+ \since Quick 1.1
Sets the line height for the text.
The value can be in pixels or a multiplier depending on lineHeightMode.
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
index ca7e948..0ea7ff3 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
@@ -107,7 +107,7 @@ TextEdit {
/*!
\qmlsignal TextEdit::onLinkActivated(string link)
- \since QtQuick 1.1
+ \since Quick 1.1
This handler is called when the user clicks on a link embedded in the text.
The link must be in rich text or HTML format and the
@@ -546,7 +546,15 @@ bool QDeclarativeTextEditPrivate::determineHorizontalAlignment()
{
Q_Q(QDeclarativeTextEdit);
if (hAlignImplicit && q->isComponentComplete()) {
- bool alignToRight = text.isEmpty() ? QApplication::keyboardInputDirection() == Qt::RightToLeft : rightToLeftText;
+ bool alignToRight;
+ if (text.isEmpty()) {
+ const QString preeditText = control->textCursor().block().layout()->preeditAreaText();
+ alignToRight = preeditText.isEmpty()
+ ? QApplication::keyboardInputDirection() == Qt::RightToLeft
+ : preeditText.isRightToLeft();
+ } else {
+ alignToRight = rightToLeftText;
+ }
return setHAlign(alignToRight ? QDeclarativeTextEdit::AlignRight : QDeclarativeTextEdit::AlignLeft);
}
return false;
@@ -615,7 +623,7 @@ void QDeclarativeTextEdit::setWrapMode(WrapMode mode)
/*!
\qmlproperty int TextEdit::lineCount
- \since QtQuick 1.1
+ \since Quick 1.1
Returns the total number of lines in the textEdit item.
*/
@@ -709,7 +717,7 @@ void QDeclarativeTextEdit::moveCursorSelection(int pos)
/*!
\qmlmethod void TextEdit::moveCursorSelection(int position, SelectionMode mode = TextEdit.SelectCharacters)
- \since QtQuick 1.1
+ \since Quick 1.1
Moves the cursor to \a position and updates the selection according to the optional \a mode
parameter. (To only move the cursor, set the \l cursorPosition property.)
@@ -1074,7 +1082,7 @@ void QDeclarativeTextEdit::setSelectByMouse(bool on)
/*!
\qmlproperty enum TextEdit::mouseSelectionMode
- \since QtQuick 1.1
+ \since Quick 1.1
Specifies how text should be selected using a mouse.
@@ -1220,7 +1228,7 @@ void QDeclarativeTextEditPrivate::focusChanged(bool hasFocus)
/*!
\qmlmethod void TextEdit::deselect()
- \since QtQuick 1.1
+ \since Quick 1.1
Removes active text selection.
*/
@@ -1581,6 +1589,7 @@ void QDeclarativeTextEdit::q_textChanged()
void QDeclarativeTextEdit::moveCursorDelegate()
{
Q_D(QDeclarativeTextEdit);
+ d->determineHorizontalAlignment();
updateMicroFocus();
emit cursorRectangleChanged();
if(!d->cursor)
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
index 412d33c..731d956 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
@@ -77,7 +77,7 @@ public:
yoff(0)
{
#ifdef Q_OS_SYMBIAN
- if (QSysInfo::symbianVersion() >= QSysInfo::SV_SF_1) {
+ if (QSysInfo::symbianVersion() == QSysInfo::SV_SF_1 || QSysInfo::symbianVersion() == QSysInfo::SV_SF_3) {
showInputPanelOnFocus = false;
}
#endif
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
index 5245236..cc3f0b9 100644
--- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
@@ -407,7 +407,11 @@ bool QDeclarativeTextInputPrivate::determineHorizontalAlignment()
if (hAlignImplicit) {
// if no explicit alignment has been set, follow the natural layout direction of the text
QString text = control->text();
- bool isRightToLeft = text.isEmpty() ? QApplication::keyboardInputDirection() == Qt::RightToLeft : text.isRightToLeft();
+ if (text.isEmpty())
+ text = control->preeditAreaText();
+ bool isRightToLeft = text.isEmpty()
+ ? QApplication::keyboardInputDirection() == Qt::RightToLeft
+ : text.isRightToLeft();
return setHAlign(isRightToLeft ? QDeclarativeTextInput::AlignRight : QDeclarativeTextInput::AlignLeft);
}
return false;
@@ -874,7 +878,8 @@ void QDeclarativeTextInputPrivate::updateInputMethodHints()
\o TextInput.Normal - Displays the text as it is. (Default)
\o TextInput.Password - Displays asterixes instead of characters.
\o TextInput.NoEcho - Displays nothing.
- \o TextInput.PasswordEchoOnEdit - Displays all but the current character as asterixes.
+ \o TextInput.PasswordEchoOnEdit - Displays characters as they are entered
+ while editing, otherwise displays asterisks.
\endlist
*/
QDeclarativeTextInput::EchoMode QDeclarativeTextInput::echoMode() const
@@ -1010,7 +1015,7 @@ int QDeclarativeTextInput::positionAt(int x) const
/*!
\qmlmethod int TextInput::positionAt(int x, CursorPosition position = CursorBetweenCharacters)
- \since QtQuick 1.1
+ \since Quick 1.1
This function returns the character position at
x pixels from the left of the textInput. Position 0 is before the
@@ -1398,7 +1403,7 @@ QVariant QDeclarativeTextInput::inputMethodQuery(Qt::InputMethodQuery property)
/*!
\qmlmethod void TextInput::deselect()
- \since QtQuick 1.1
+ \since Quick 1.1
Removes active text selection.
*/
@@ -1570,7 +1575,7 @@ void QDeclarativeTextInput::setSelectByMouse(bool on)
/*!
\qmlproperty enum TextInput::mouseSelectionMode
- \since QtQuick 1.1
+ \since Quick 1.1
Specifies how text should be selected using a mouse.
@@ -1618,7 +1623,7 @@ void QDeclarativeTextInput::moveCursorSelection(int position)
/*!
\qmlmethod void TextInput::moveCursorSelection(int position, SelectionMode mode = TextInput.SelectCharacters)
- \since QtQuick 1.1
+ \since Quick 1.1
Moves the cursor to \a position and updates the selection according to the optional \a mode
parameter. (To only move the cursor, set the \l cursorPosition property.)
@@ -1906,6 +1911,7 @@ void QDeclarativeTextInput::cursorPosChanged()
void QDeclarativeTextInput::updateCursorRectangle()
{
Q_D(QDeclarativeTextInput);
+ d->determineHorizontalAlignment();
d->updateHorizontalScroll();
updateRect();//TODO: Only update rect between pos's
updateMicroFocus();
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h
index 0325016..4712c65 100644
--- a/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetextinput_p_p.h
@@ -80,7 +80,7 @@ public:
selectPressed(false)
{
#ifdef Q_OS_SYMBIAN
- if (QSysInfo::symbianVersion() >= QSysInfo::SV_SF_1) {
+ if (QSysInfo::symbianVersion() == QSysInfo::SV_SF_1 || QSysInfo::symbianVersion() == QSysInfo::SV_SF_3) {
showInputPanelOnFocus = false;
}
#endif
diff --git a/src/declarative/util/qdeclarativelistmodel.cpp b/src/declarative/util/qdeclarativelistmodel.cpp
index 28c2df6..9604117 100644
--- a/src/declarative/util/qdeclarativelistmodel.cpp
+++ b/src/declarative/util/qdeclarativelistmodel.cpp
@@ -784,6 +784,7 @@ void QDeclarativeListModelParser::setCustomData(QObject *obj, const QByteArray &
QDeclarativeListModel *rv = static_cast<QDeclarativeListModel *>(obj);
ModelNode *root = new ModelNode(rv->m_nested);
+ rv->m_nested->m_ownsRoot = true;
rv->m_nested->_root = root;
QStack<ModelNode *> nodes;
nodes << root;
diff --git a/src/declarative/util/qdeclarativeview.cpp b/src/declarative/util/qdeclarativeview.cpp
index bab991b..45995ce 100644
--- a/src/declarative/util/qdeclarativeview.cpp
+++ b/src/declarative/util/qdeclarativeview.cpp
@@ -319,6 +319,8 @@ QDeclarativeView::~QDeclarativeView()
Ensure that the URL provided is full and correct, in particular, use
\l QUrl::fromLocalFile() when loading a file from the local filesystem.
+
+ \sa {Network Transparency}{Loading Resources in QML}
*/
/*!
diff --git a/src/gui/accessible/qaccessible_win.cpp b/src/gui/accessible/qaccessible_win.cpp
index 79ac442..caabae5 100644
--- a/src/gui/accessible/qaccessible_win.cpp
+++ b/src/gui/accessible/qaccessible_win.cpp
@@ -600,6 +600,35 @@ HRESULT STDMETHODCALLTYPE QWindowsEnumerate::Skip(unsigned long celt)
return S_OK;
}
+struct AccessibleElement {
+ AccessibleElement(int entryId, QAccessibleInterface *accessible) {
+ if (entryId < 0) {
+ QPair<QObject*, int> ref = qAccessibleRecentSentEvents()->value(entryId);
+ iface = QAccessible::queryAccessibleInterface(ref.first);
+ entry = ref.second;
+ cleanupInterface = true;
+ } else {
+ iface = accessible;
+ entry = entryId;
+ cleanupInterface = false;
+ }
+ }
+
+ QString text(QAccessible::Text t) const {
+ return iface ? iface->text(t, entry) : QString();
+ }
+
+ ~AccessibleElement() {
+ if (cleanupInterface)
+ delete iface;
+ }
+
+ QAccessibleInterface *iface;
+ int entry;
+private:
+ bool cleanupInterface;
+};
+
/*
*/
class QWindowsAccessible : public IAccessible, IOleWindow, QAccessible
@@ -998,7 +1027,8 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::accLocation(long *pxLeft, long *py
if (!accessible->isValid())
return E_FAIL;
- QRect rect = accessible->rect(varID.lVal);
+ AccessibleElement elem(varID.lVal, accessible);
+ QRect rect = elem.iface ? elem.iface->rect(elem.entry) : QRect();
if (rect.isValid()) {
*pxLeft = rect.x();
*pyTop = rect.y();
@@ -1101,25 +1131,12 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accChild(VARIANT varChildID, I
int childIndex = varChildID.lVal;
QAccessibleInterface *acc = 0;
- if (childIndex < 0) {
- const int entry = childIndex;
- QPair<QObject*, int> ref = qAccessibleRecentSentEvents()->value(entry);
- if (ref.first) {
- acc = queryAccessibleInterface(ref.first);
- if (acc && ref.second) {
- if (ref.second) {
- QAccessibleInterface *res;
- int index = acc->navigate(Child, ref.second, &res);
- delete acc;
- if (index == -1)
- return E_INVALIDARG;
- acc = res;
- }
- }
- }
- } else {
- RelationFlag rel = childIndex ? Child : Self;
- accessible->navigate(rel, childIndex, &acc);
+ AccessibleElement elem(childIndex, accessible);
+ if (elem.iface) {
+ RelationFlag rel = elem.entry ? Child : Self;
+ int index = elem.iface->navigate(rel, elem.entry, &acc);
+ if (index == -1)
+ return E_INVALIDARG;
}
if (acc) {
@@ -1171,7 +1188,9 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::accDoDefaultAction(VARIANT varID)
if (!accessible->isValid())
return E_FAIL;
- return accessible->doAction(DefaultAction, varID.lVal, QVariantList()) ? S_OK : S_FALSE;
+ AccessibleElement elem(varID.lVal, accessible);
+ const bool res = elem.iface ? elem.iface->doAction(DefaultAction, elem.entry, QVariantList()) : false;
+ return res ? S_OK : S_FALSE;
}
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accDefaultAction(VARIANT varID, BSTR* pszDefaultAction)
@@ -1180,7 +1199,8 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accDefaultAction(VARIANT varID
if (!accessible->isValid())
return E_FAIL;
- QString def = accessible->actionText(DefaultAction, Name, varID.lVal);
+ AccessibleElement elem(varID.lVal, accessible);
+ QString def = elem.iface ? elem.iface->actionText(DefaultAction, Name, elem.entry) : QString();
if (def.isEmpty()) {
*pszDefaultAction = 0;
return S_FALSE;
@@ -1196,7 +1216,8 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accDescription(VARIANT varID,
if (!accessible->isValid())
return E_FAIL;
- QString descr = accessible->text(Description, varID.lVal);
+ AccessibleElement elem(varID.lVal, accessible);
+ QString descr = elem.text(Description);
if (descr.size()) {
*pszDescription = QStringToBSTR(descr);
return S_OK;
@@ -1212,7 +1233,8 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accHelp(VARIANT varID, BSTR *p
if (!accessible->isValid())
return E_FAIL;
- QString help = accessible->text(Help, varID.lVal);
+ AccessibleElement elem(varID.lVal, accessible);
+ QString help = elem.text(Help);
if (help.size()) {
*pszHelp = QStringToBSTR(help);
return S_OK;
@@ -1233,7 +1255,8 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accKeyboardShortcut(VARIANT va
if (!accessible->isValid())
return E_FAIL;
- QString sc = accessible->text(Accelerator, varID.lVal);
+ AccessibleElement elem(varID.lVal, accessible);
+ QString sc = elem.text(Accelerator);
if (sc.size()) {
*pszKeyboardShortcut = QStringToBSTR(sc);
return S_OK;
@@ -1249,7 +1272,8 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accName(VARIANT varID, BSTR* p
if (!accessible->isValid())
return E_FAIL;
- QString n = accessible->text(Name, varID.lVal);
+ AccessibleElement elem(varID.lVal, accessible);
+ QString n = elem.text(Name);
if (n.size()) {
*pszName = QStringToBSTR(n);
return S_OK;
@@ -1271,7 +1295,8 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accRole(VARIANT varID, VARIANT
if (!accessible->isValid())
return E_FAIL;
- Role role = accessible->role(varID.lVal);
+ AccessibleElement elem(varID.lVal, accessible);
+ Role role = elem.iface ? elem.iface->role(elem.entry) : NoRole;
if (role != NoRole) {
if (role == LayeredPane)
role = QAccessible::Pane;
@@ -1290,7 +1315,8 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accState(VARIANT varID, VARIAN
return E_FAIL;
(*pvarState).vt = VT_I4;
- (*pvarState).lVal = accessible->state(varID.lVal);
+ AccessibleElement elem(varID.lVal, accessible);
+ (*pvarState).lVal = elem.iface ? elem.iface->state(elem.entry) : 0;
return S_OK;
}
@@ -1300,7 +1326,8 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accValue(VARIANT varID, BSTR*
if (!accessible->isValid())
return E_FAIL;
- QString value = accessible->text(Value, varID.lVal);
+ AccessibleElement elem(varID.lVal, accessible);
+ QString value = elem.text(Value);
if (!value.isNull()) {
*pszValue = QStringToBSTR(value);
return S_OK;
@@ -1324,19 +1351,23 @@ HRESULT STDMETHODCALLTYPE QWindowsAccessible::accSelect(long flagsSelect, VARIAN
bool res = false;
- if (flagsSelect & SELFLAG_TAKEFOCUS)
- res = accessible->doAction(SetFocus, varID.lVal, QVariantList());
- if (flagsSelect & SELFLAG_TAKESELECTION) {
- accessible->doAction(ClearSelection, 0, QVariantList());
- res = accessible->doAction(AddToSelection, varID.lVal, QVariantList());
+ AccessibleElement elem(varID.lVal, accessible);
+ QAccessibleInterface *acc = elem.iface;
+ if (acc) {
+ const int entry = elem.entry;
+ if (flagsSelect & SELFLAG_TAKEFOCUS)
+ res = acc->doAction(SetFocus, entry, QVariantList());
+ if (flagsSelect & SELFLAG_TAKESELECTION) {
+ acc->doAction(ClearSelection, 0, QVariantList()); //### bug, 0 should be entry??
+ res = acc->doAction(AddToSelection, entry, QVariantList());
+ }
+ if (flagsSelect & SELFLAG_EXTENDSELECTION)
+ res = acc->doAction(ExtendSelection, entry, QVariantList());
+ if (flagsSelect & SELFLAG_ADDSELECTION)
+ res = acc->doAction(AddToSelection, entry, QVariantList());
+ if (flagsSelect & SELFLAG_REMOVESELECTION)
+ res = acc->doAction(RemoveSelection, entry, QVariantList());
}
- if (flagsSelect & SELFLAG_EXTENDSELECTION)
- res = accessible->doAction(ExtendSelection, varID.lVal, QVariantList());
- if (flagsSelect & SELFLAG_ADDSELECTION)
- res = accessible->doAction(AddToSelection, varID.lVal, QVariantList());
- if (flagsSelect & SELFLAG_REMOVESELECTION)
- res = accessible->doAction(RemoveSelection, varID.lVal, QVariantList());
-
return res ? S_OK : S_FALSE;
}
diff --git a/src/gui/dialogs/qfiledialog_win_p.h b/src/gui/dialogs/qfiledialog_win_p.h
index 1ff29d2..1408057 100644
--- a/src/gui/dialogs/qfiledialog_win_p.h
+++ b/src/gui/dialogs/qfiledialog_win_p.h
@@ -240,4 +240,4 @@ DECLARE_INTERFACE_(IFileOpenDialog, IFileDialog)
STDMETHOD(GetResults)(THIS_ IShellItemArray **ppenum) PURE;
STDMETHOD(GetSelectedItems)(THIS_ IShellItemArray **ppsai) PURE;
};
-#endif \ No newline at end of file
+#endif
diff --git a/src/gui/embedded/qscreen_qws.cpp b/src/gui/embedded/qscreen_qws.cpp
index 2c10357..b17ade0 100644
--- a/src/gui/embedded/qscreen_qws.cpp
+++ b/src/gui/embedded/qscreen_qws.cpp
@@ -1545,6 +1545,7 @@ QImage::Format QScreenPrivate::preferredImageFormat() const
\value SvgalibClass QSvgalibScreen
\value ProxyClass QProxyScreen
\value GLClass QGLScreen
+ \value IntfbClass QIntfbScreen
\value CustomClass Unknown QScreen subclass
\sa classId()
diff --git a/src/gui/image/qjpeghandler.cpp b/src/gui/image/qjpeghandler.cpp
index 673a6d6..8fea456 100644
--- a/src/gui/image/qjpeghandler.cpp
+++ b/src/gui/image/qjpeghandler.cpp
@@ -74,6 +74,11 @@ extern "C" {
#endif
}
+#if defined(JPEG_TRUE) && !defined(HAVE_BOOLEAN)
+// this jpeglib.h uses JPEG_boolean
+typedef JPEG_boolean boolean;
+#endif
+
QT_BEGIN_NAMESPACE
void QT_FASTCALL convert_rgb888_to_rgb32_C(quint32 *dst, const uchar *src, int len)
diff --git a/src/gui/image/qpixmap_mac.cpp b/src/gui/image/qpixmap_mac.cpp
index bdf1f90..47b6eef 100644
--- a/src/gui/image/qpixmap_mac.cpp
+++ b/src/gui/image/qpixmap_mac.cpp
@@ -851,7 +851,33 @@ static void qt_mac_grabDisplayRect(CGDirectDisplayID display, const QRect &displ
ptrCGLDestroyContext(glContextObj); // and destroy the context
}
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
// Returns a pixmap containing the screen contents at rect.
+static QPixmap qt_mac_grabScreenRect_10_6(const QRect &rect)
+{
+ const int maxDisplays = 128; // 128 displays should be enough for everyone.
+ CGDirectDisplayID displays[maxDisplays];
+ CGDisplayCount displayCount;
+ const CGRect cgRect = CGRectMake(rect.x(), rect.y(), rect.width(), rect.height());
+ const CGDisplayErr err = CGGetDisplaysWithRect(cgRect, maxDisplays, displays, &displayCount);
+
+ if (err && displayCount == 0)
+ return QPixmap();
+ QPixmap windowPixmap(rect.size());
+ for (uint i = 0; i < displayCount; ++i) {
+ const CGRect bounds = CGDisplayBounds(displays[i]);
+ // Translate to display-local coordinates
+ QRect displayRect = rect.translated(qRound(-bounds.origin.x), qRound(-bounds.origin.y));
+ QCFType<CGImageRef> image = CGDisplayCreateImageForRect(displays[i],
+ CGRectMake(displayRect.x(), displayRect.y(), displayRect.width(), displayRect.height()));
+ QPixmap pix = QPixmap::fromMacCGImageRef(image);
+ QPainter painter(&windowPixmap);
+ painter.drawPixmap(-bounds.origin.x, -bounds.origin.y, pix);
+ }
+ return windowPixmap;
+}
+#endif
+
static QPixmap qt_mac_grabScreenRect(const QRect &rect)
{
if (!resolveOpenGLSymbols())
@@ -927,7 +953,12 @@ QPixmap QPixmap::grabWindow(WId window, int x, int y, int w, int h)
QRect rect(globalCoord.x() + x, globalCoord.y() + y, w, h);
#ifdef QT_MAC_USE_COCOA
- return qt_mac_grabScreenRect(rect);
+#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
+ if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_6)
+ return qt_mac_grabScreenRect_10_6(rect);
+ else
+#endif
+ return qt_mac_grabScreenRect(rect);
#else
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4)
if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_4) {
diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
index 7beaa76..5ddd53f 100644
--- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
+++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp
@@ -474,7 +474,7 @@ void QCoeFepInputContext::resetSplitViewWidget(bool keepInputWidget)
if (!alwaysResize) {
if (gv->scene()) {
- if (gv->scene()->focusItem() && S60->partial_keyboardAutoTranslation) {
+ if (gv->scene()->focusItem()) {
// Check if the widget contains cursorPositionChanged signal and disconnect from it.
QByteArray signal = QMetaObject::normalizedSignature(SIGNAL(cursorPositionChanged()));
int index = gv->scene()->focusItem()->toGraphicsObject()->metaObject()->indexOfSignal(signal.right(signal.length() - 1));
@@ -580,7 +580,7 @@ void QCoeFepInputContext::ensureFocusWidgetVisible(QWidget *widget)
if (!moveWithinVisibleArea) {
// Check if the widget contains cursorPositionChanged signal and connect to it.
QByteArray signal = QMetaObject::normalizedSignature(SIGNAL(cursorPositionChanged()));
- if (gv->scene() && gv->scene()->focusItem() && S60->partial_keyboardAutoTranslation) {
+ if (gv->scene() && gv->scene()->focusItem()) {
int index = gv->scene()->focusItem()->toGraphicsObject()->metaObject()->indexOfSignal(signal.right(signal.length() - 1));
if (index != -1)
connect(gv->scene()->focusItem()->toGraphicsObject(), SIGNAL(cursorPositionChanged()), this, SLOT(translateInputWidget()));
diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp
index cd13894..15d37c3 100644
--- a/src/gui/kernel/qapplication.cpp
+++ b/src/gui/kernel/qapplication.cpp
@@ -3321,7 +3321,7 @@ bool QApplication::desktopSettingsAware()
one of the above events. If no keys are being held Qt::NoModifier is
returned.
- \sa mouseButtons()
+ \sa mouseButtons(), queryKeyboardModifiers()
*/
Qt::KeyboardModifiers QApplication::keyboardModifiers()
@@ -3330,6 +3330,25 @@ Qt::KeyboardModifiers QApplication::keyboardModifiers()
}
/*!
+ \fn Qt::KeyboardModifiers QApplication::queryKeyboardModifiers()
+
+ Queries and returns the state of the modifier keys on the keyboard.
+ Unlike keyboardModifiers, this method returns the actual keys held
+ on the input device at the time of calling the method.
+
+ It does not rely on the keypress events having been received by this
+ process, which makes it possible to check the modifiers while moving
+ a window, for instance. Note that in most cases, you should use
+ keyboardModifiers(), which is faster and more accurate since it contains
+ the state of the modifiers as they were when the currently processed
+ event was received.
+
+ \sa keyboardModifiers()
+
+ \since 4.8
+*/
+
+/*!
Returns the current state of the buttons on the mouse. The current state is
updated syncronously as the event queue is emptied of events that will
spontaneously change the mouse state (QEvent::MouseButtonPress and
diff --git a/src/gui/kernel/qapplication.h b/src/gui/kernel/qapplication.h
index 01a246a..1548849 100644
--- a/src/gui/kernel/qapplication.h
+++ b/src/gui/kernel/qapplication.h
@@ -198,6 +198,7 @@ public:
static void alert(QWidget *widget, int duration = 0);
static Qt::KeyboardModifiers keyboardModifiers();
+ static Qt::KeyboardModifiers queryKeyboardModifiers();
static Qt::MouseButtons mouseButtons();
static void setDesktopSettingsAware(bool);
diff --git a/src/gui/kernel/qapplication_mac.mm b/src/gui/kernel/qapplication_mac.mm
index c5ff799..1f75f09 100644
--- a/src/gui/kernel/qapplication_mac.mm
+++ b/src/gui/kernel/qapplication_mac.mm
@@ -1395,6 +1395,11 @@ void QApplication::restoreOverrideCursor()
}
#endif // QT_NO_CURSOR
+Qt::KeyboardModifiers QApplication::queryKeyboardModifiers()
+{
+ return qt_mac_get_modifiers(GetCurrentEventKeyModifiers());
+}
+
QWidget *QApplication::topLevelAt(const QPoint &p)
{
#ifndef QT_MAC_USE_COCOA
diff --git a/src/gui/kernel/qapplication_qws.cpp b/src/gui/kernel/qapplication_qws.cpp
index 3b6a075..193dfcd 100644
--- a/src/gui/kernel/qapplication_qws.cpp
+++ b/src/gui/kernel/qapplication_qws.cpp
@@ -2699,6 +2699,11 @@ void QApplication::alert(QWidget *, int)
{
}
+Qt::KeyboardModifiers QApplication::queryKeyboardModifiers()
+{
+ return keyboardModifiers(); // TODO proper implementation
+}
+
int QApplication::qwsProcessEvent(QWSEvent* event)
{
Q_D(QApplication);
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index 5ac9803..da1c778 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -115,6 +115,8 @@ QWidget *qt_button_down = 0; // widget got last button-down
QSymbianControl *QSymbianControl::lastFocusedControl = 0;
+static Qt::KeyboardModifiers app_keyboardModifiers = Qt::NoModifier;
+
QS60Data* qGlobalS60Data()
{
return qt_s60Data();
@@ -735,6 +737,7 @@ void QSymbianControl::HandlePointerEvent(const TPointerEvent& pEvent)
Qt::MouseButton button;
mapS60MouseEventTypeToQt(&type, &button, &pEvent);
Qt::KeyboardModifiers modifiers = mapToQtModifiers(pEvent.iModifiers);
+ app_keyboardModifiers = modifiers;
QPoint widgetPos = translatePointForFixedNativeOrientation(pEvent.iPosition);
TPoint controlScreenPos = PositionRelativeToScreen();
@@ -2590,6 +2593,11 @@ void QApplication::setEffectEnabled(Qt::UIEffect /* effect */, bool /* enable */
// TODO: Implement QApplication::setEffectEnabled(Qt::UIEffect effect, bool enable)
}
+Qt::KeyboardModifiers QApplication::queryKeyboardModifiers()
+{
+ return app_keyboardModifiers;
+}
+
TUint QApplicationPrivate::resolveS60ScanCode(TInt scanCode, TUint keysym)
{
if (!scanCode)
@@ -2752,9 +2760,6 @@ QS60ThreadLocalData::QS60ThreadLocalData()
QS60ThreadLocalData::~QS60ThreadLocalData()
{
- for (int i = 0; i < releaseFuncs.count(); ++i)
- releaseFuncs[i]();
- releaseFuncs.clear();
if (!usingCONEinstances) {
delete screenDevice;
wsSession.Close();
diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp
index c34e75f..756cb56 100644
--- a/src/gui/kernel/qapplication_win.cpp
+++ b/src/gui/kernel/qapplication_win.cpp
@@ -1319,6 +1319,11 @@ Qt::KeyboardModifiers qt_win_getKeyboardModifiers()
return modifiers;
}
+Qt::KeyboardModifiers QApplication::queryKeyboardModifiers()
+{
+ return qt_win_getKeyboardModifiers();
+}
+
/*****************************************************************************
Routines to find a Qt widget from a screen position
*****************************************************************************/
diff --git a/src/gui/kernel/qapplication_x11.cpp b/src/gui/kernel/qapplication_x11.cpp
index 666fe85..ef8e2b8 100644
--- a/src/gui/kernel/qapplication_x11.cpp
+++ b/src/gui/kernel/qapplication_x11.cpp
@@ -3058,6 +3058,21 @@ void QApplicationPrivate::_q_alertTimeOut()
}
}
+Qt::KeyboardModifiers QApplication::queryKeyboardModifiers()
+{
+ Window root;
+ Window child;
+ int root_x, root_y, win_x, win_y;
+ uint keybstate;
+ for (int i = 0; i < ScreenCount(X11->display); ++i) {
+ if (XQueryPointer(X11->display, QX11Info::appRootWindow(i), &root, &child,
+ &root_x, &root_y, &win_x, &win_y, &keybstate))
+ return X11->translateModifiers(keybstate & 0x00ff);
+ }
+ return 0;
+
+}
+
/*****************************************************************************
Special lookup functions for windows that have been reparented recently
*****************************************************************************/
diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm
index e32fdeb..0fbae59 100644
--- a/src/gui/kernel/qcocoaview_mac.mm
+++ b/src/gui/kernel/qcocoaview_mac.mm
@@ -66,9 +66,14 @@
#include <qdebug.h>
@interface NSEvent (Qt_Compile_Leopard_DeviceDelta)
+ // SnowLeopard:
- (CGFloat)deviceDeltaX;
- (CGFloat)deviceDeltaY;
- (CGFloat)deviceDeltaZ;
+ // Lion:
+ - (CGFloat)scrollingDeltaX;
+ - (CGFloat)scrollingDeltaY;
+ - (CGFloat)scrollingDeltaZ;
@end
@interface NSEvent (Qt_Compile_Leopard_Gestures)
@@ -614,7 +619,6 @@ static int qCocoaViewCount = 0;
int deltaX = 0;
int deltaY = 0;
- int deltaZ = 0;
const EventRef carbonEvent = (EventRef)[theEvent eventRef];
const UInt32 carbonEventKind = carbonEvent ? ::GetEventKind(carbonEvent) : 0;
@@ -627,15 +631,20 @@ static int qCocoaViewCount = 0;
// It looks like 1/4 degrees per pixel behaves most native.
// (NB: Qt expects the unit for delta to be 8 per degree):
const int pixelsToDegrees = 2; // 8 * 1/4
- deltaX = [theEvent deviceDeltaX] * pixelsToDegrees;
- deltaY = [theEvent deviceDeltaY] * pixelsToDegrees;
- deltaZ = [theEvent deviceDeltaZ] * pixelsToDegrees;
+ if (QSysInfo::MacintoshVersion <= QSysInfo::MV_10_6) {
+ // Mac OS 10.6
+ deltaX = [theEvent deviceDeltaX] * pixelsToDegrees;
+ deltaY = [theEvent deviceDeltaY] * pixelsToDegrees;
+ } else {
+ // Mac OS 10.7+
+ deltaX = [theEvent scrollingDeltaX] * pixelsToDegrees;
+ deltaY = [theEvent scrollingDeltaY] * pixelsToDegrees;
+ }
} else {
// carbonEventKind == kEventMouseWheelMoved
// Remove acceleration, and use either -120 or 120 as delta:
deltaX = qBound(-120, int([theEvent deltaX] * 10000), 120);
deltaY = qBound(-120, int([theEvent deltaY] * 10000), 120);
- deltaZ = qBound(-120, int([theEvent deltaZ] * 10000), 120);
}
#ifndef QT_NO_WHEELEVENT
@@ -654,13 +663,6 @@ static int qCocoaViewCount = 0;
qt_sendSpontaneousEvent(widgetToGetMouse, &qwe);
}
- if (deltaZ != 0) {
- // Qt doesn't explicitly support wheels with a Z component. In a misguided attempt to
- // try to be ahead of the pack, I'm adding this extra value.
- QWheelEvent qwe(qlocal, qglobal, deltaZ, buttons, keyMods, (Qt::Orientation)3);
- qt_sendSpontaneousEvent(widgetToGetMouse, &qwe);
- }
-
if (deltaX != 0 && deltaY != 0)
QMacScrollOptimization::performDelayedScroll();
#endif //QT_NO_WHEELEVENT
diff --git a/src/gui/kernel/qdnd_x11.cpp b/src/gui/kernel/qdnd_x11.cpp
index 0c683b4..5847021 100644
--- a/src/gui/kernel/qdnd_x11.cpp
+++ b/src/gui/kernel/qdnd_x11.cpp
@@ -1112,21 +1112,6 @@ void qt_xdnd_send_leave()
waiting_for_status = false;
}
-// TODO: remove and use QApplication::currentKeyboardModifiers() in Qt 4.8.
-static Qt::KeyboardModifiers currentKeyboardModifiers()
-{
- Window root;
- Window child;
- int root_x, root_y, win_x, win_y;
- uint keybstate;
- for (int i = 0; i < ScreenCount(X11->display); ++i) {
- if (XQueryPointer(X11->display, QX11Info::appRootWindow(i), &root, &child,
- &root_x, &root_y, &win_x, &win_y, &keybstate))
- return X11->translateModifiers(keybstate & 0x00ff);
- }
- return 0;
-}
-
void QX11Data::xdndHandleDrop(QWidget *, const XEvent * xe, bool passive)
{
DEBUG("xdndHandleDrop");
@@ -1183,7 +1168,7 @@ void QX11Data::xdndHandleDrop(QWidget *, const XEvent * xe, bool passive)
// Drop coming from another app? Update keyboard modifiers.
if (!qt_xdnd_dragging) {
- QApplicationPrivate::modifier_buttons = currentKeyboardModifiers();
+ QApplicationPrivate::modifier_buttons = QApplication::queryKeyboardModifiers();
}
QDropEvent de(qt_xdnd_current_position, possible_actions, dropData,
diff --git a/src/gui/kernel/qkeysequence.cpp b/src/gui/kernel/qkeysequence.cpp
index 5fc72d4..117b72f 100644
--- a/src/gui/kernel/qkeysequence.cpp
+++ b/src/gui/kernel/qkeysequence.cpp
@@ -933,7 +933,7 @@ QKeySequence::QKeySequence(const QString &key)
}
/*!
- \since 4.7
+ \since 4.x
Creates a key sequence from the \a key string based on \a format.
*/
QKeySequence::QKeySequence(const QString &key, QKeySequence::SequenceFormat format)
@@ -1130,7 +1130,7 @@ int QKeySequence::assign(const QString &ks)
/*!
\fn int QKeySequence::assign(const QString &keys, QKeySequence::SequenceFormat format)
- \since 4.7
+ \since 4.x
Adds the given \a keys to the key sequence (based on \a format).
\a keys may contain up to four key codes, provided they are
diff --git a/src/gui/kernel/qsoftkeymanager.cpp b/src/gui/kernel/qsoftkeymanager.cpp
index 9caa37e..510705f 100644
--- a/src/gui/kernel/qsoftkeymanager.cpp
+++ b/src/gui/kernel/qsoftkeymanager.cpp
@@ -123,10 +123,8 @@ QAction *QSoftKeyManager::createAction(StandardSoftKey standardKey, QWidget *act
default:
break;
};
- if (key != 0) {
+ if (key != 0)
QSoftKeyManager::instance()->d_func()->softKeyCommandActions.insert(action, key);
- connect(action, SIGNAL(destroyed(QObject*)), QSoftKeyManager::instance(), SLOT(cleanupHash(QObject*)));
- }
#endif
QAction::SoftKeyRole softKeyRole = QAction::NoSoftKey;
switch (standardKey) {
@@ -159,13 +157,7 @@ QAction *QSoftKeyManager::createKeyedAction(StandardSoftKey standardKey, Qt::Key
QScopedPointer<QAction> action(createAction(standardKey, actionWidget));
connect(action.data(), SIGNAL(triggered()), QSoftKeyManager::instance(), SLOT(sendKeyEvent()));
-
-#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) && !defined(SYMBIAN_VERSION_9_3) && !defined(SYMBIAN_VERSION_9_2)
- // Don't connect destroyed slot if is was already connected in createAction
- if (!(QSoftKeyManager::instance()->d_func()->softKeyCommandActions.contains(action.data())))
-#endif
connect(action.data(), SIGNAL(destroyed(QObject*)), QSoftKeyManager::instance(), SLOT(cleanupHash(QObject*)));
-
QSoftKeyManager::instance()->d_func()->keyedActions.insert(action.data(), key);
return action.take();
#endif //QT_NO_ACTION
@@ -174,9 +166,7 @@ QAction *QSoftKeyManager::createKeyedAction(StandardSoftKey standardKey, Qt::Key
void QSoftKeyManager::cleanupHash(QObject *obj)
{
Q_D(QSoftKeyManager);
- // Can't use qobject_cast in destroyed() signal handler as that'll return NULL,
- // so use static_cast instead. Since the pointer is only used as a hash key, it is safe.
- QAction *action = static_cast<QAction *>(obj);
+ QAction *action = qobject_cast<QAction*>(obj);
d->keyedActions.remove(action);
#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) && !defined(SYMBIAN_VERSION_9_3) && !defined(SYMBIAN_VERSION_9_2)
d->softKeyCommandActions.remove(action);
diff --git a/src/gui/kernel/qt_s60_p.h b/src/gui/kernel/qt_s60_p.h
index 3ec4052..ada52a0 100644
--- a/src/gui/kernel/qt_s60_p.h
+++ b/src/gui/kernel/qt_s60_p.h
@@ -97,10 +97,6 @@ static const int qt_symbian_max_screens = 4;
//this macro exists because EColor16MAP enum value doesn't exist in Symbian OS 9.2
#define Q_SYMBIAN_ECOLOR16MAP TDisplayMode(13)
-class QSymbianTypeFaceExtras;
-typedef QHash<QString, const QSymbianTypeFaceExtras *> QSymbianTypeFaceExtrasHash;
-typedef void (*QThreadLocalReleaseFunc)();
-
class Q_AUTOTEST_EXPORT QS60ThreadLocalData
{
public:
@@ -109,8 +105,6 @@ public:
bool usingCONEinstances;
RWsSession wsSession;
CWsScreenDevice *screenDevice;
- QSymbianTypeFaceExtrasHash fontData;
- QVector<QThreadLocalReleaseFunc> releaseFuncs;
};
class QS60Data
@@ -184,8 +178,6 @@ public:
inline CWsScreenDevice* screenDevice(const QWidget *widget);
inline CWsScreenDevice* screenDevice(int screenNumber);
static inline int screenNumberForWidget(const QWidget *widget);
- inline QSymbianTypeFaceExtrasHash& fontData();
- inline void addThreadLocalReleaseFunc(QThreadLocalReleaseFunc func);
static inline CCoeAppUi* appUi();
static inline CEikMenuBar* menuBar();
#ifdef Q_WS_S60
@@ -486,24 +478,6 @@ inline int QS60Data::screenNumberForWidget(const QWidget *widget)
return qt_widget_private(const_cast<QWidget *>(w))->symbianScreenNumber;
}
-inline QSymbianTypeFaceExtrasHash& QS60Data::fontData()
-{
- if (!tls.hasLocalData()) {
- tls.setLocalData(new QS60ThreadLocalData);
- }
- return tls.localData()->fontData;
-}
-
-inline void QS60Data::addThreadLocalReleaseFunc(QThreadLocalReleaseFunc func)
-{
- if (!tls.hasLocalData()) {
- tls.setLocalData(new QS60ThreadLocalData);
- }
- QS60ThreadLocalData *data = tls.localData();
- if (!data->releaseFuncs.contains(func))
- data->releaseFuncs.append(func);
-}
-
inline CCoeAppUi* QS60Data::appUi()
{
return CCoeEnv::Static()-> AppUi();
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index 807f68e..256e34b 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -235,22 +235,11 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove)
QSize oldSize(q->size());
QRect oldGeom(data.crect);
- bool checkExtra = true;
- if (q->isWindow() && (data.window_state & (Qt::WindowFullScreen | Qt::WindowMaximized))) {
- // Do not allow fullscreen/maximized windows to expand beyond client rect
- TRect r = S60->clientRect();
- w = qMin(w, r.Width());
- h = qMin(h, r.Height());
-
- if (w == r.Width() && h == r.Height())
- checkExtra = false;
- }
-
// Lose maximized status if deliberate resize
if (w != oldSize.width() || h != oldSize.height())
data.window_state &= ~Qt::WindowMaximized;
- if (checkExtra && extra) { // any size restrictions?
+ if (extra) { // any size restrictions?
w = qMin(w,extra->maxw);
h = qMin(h,extra->maxh);
w = qMax(w,extra->minw);
diff --git a/src/gui/painting/qcosmeticstroker.cpp b/src/gui/painting/qcosmeticstroker.cpp
index dbe957e..3528e6f 100644
--- a/src/gui/painting/qcosmeticstroker.cpp
+++ b/src/gui/painting/qcosmeticstroker.cpp
@@ -425,13 +425,12 @@ void QCosmeticStroker::calculateLastPoint(qreal rx1, qreal ry1, qreal rx2, qreal
swapped = true;
qSwap(y1, y2);
qSwap(x1, x2);
- --x1; --x2; --y1; --y2;
}
int xinc = F16Dot16FixedDiv(x2 - x1, y2 - y1);
int x = x1 << 10;
- int y = (y1+32) >> 6;
- int ys = (y2+32) >> 6;
+ int y = y1 >> 6;
+ int ys = y2 >> 6;
if (y != ys) {
x += ( ((((y << 6) + 32 - y1))) * xinc ) >> 6;
@@ -457,13 +456,12 @@ void QCosmeticStroker::calculateLastPoint(qreal rx1, qreal ry1, qreal rx2, qreal
swapped = true;
qSwap(x1, x2);
qSwap(y1, y2);
- --x1; --x2; --y1; --y2;
}
int yinc = F16Dot16FixedDiv(y2 - y1, x2 - x1);
int y = y1 << 10;
- int x = (x1+32) >> 6;
- int xs = (x2+32) >> 6;
+ int x = x1 >> 6;
+ int xs = x2 >> 6;
if (x != xs) {
y += ( ((((x << 6) + 32 - x1))) * yinc ) >> 6;
@@ -716,10 +714,11 @@ static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2,
QCosmeticStroker::Point last = stroker->lastPixel;
-// qDebug() << "stroke" << x1/64. << y1/64. << x2/64. << y2/64. << capString(caps);
+// qDebug() << "stroke" << x1/64. << y1/64. << x2/64. << y2/64.;
if (dx < dy) {
// vertical
+ QCosmeticStroker::Direction dir = QCosmeticStroker::TopToBottom;
bool swapped = false;
if (y1 > y2) {
@@ -727,30 +726,31 @@ static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2,
qSwap(y1, y2);
qSwap(x1, x2);
caps = swapCaps(caps);
- --x1; --x2; --y1; --y2;
+ dir = QCosmeticStroker::BottomToTop;
}
int xinc = F16Dot16FixedDiv(x2 - x1, y2 - y1);
int x = x1 << 10;
+ if ((stroker->lastDir ^ QCosmeticStroker::VerticalMask) == dir)
+ caps |= swapped ? QCosmeticStroker::CapEnd : QCosmeticStroker::CapBegin;
+
capAdjust(caps, y1, y2, x, xinc);
- int y = (y1+32) >> 6;
- int ys = (y2+32) >> 6;
+ int y = y1 >> 6;
+ int ys = y2 >> 6;
if (y != ys) {
x += ( ((((y << 6) + 32 - y1))) * xinc ) >> 6;
// calculate first and last pixel and perform dropout control
- QCosmeticStroker::Direction dir = QCosmeticStroker::TopToBottom;
QCosmeticStroker::Point first;
first.x = x >> 16;
first.y = y;
last.x = (x + (ys - y - 1)*xinc) >> 16;
last.y = ys - 1;
- if (swapped) {
+ if (swapped)
qSwap(first, last);
- dir = QCosmeticStroker::BottomToTop;
- }
+
bool axisAligned = qAbs(xinc) < (1 << 14);
if (stroker->lastPixel.x >= 0) {
if (first.x == stroker->lastPixel.x &&
@@ -765,7 +765,7 @@ static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2,
} else if (stroker->lastDir != dir &&
(((axisAligned && stroker->lastAxisAligned) &&
stroker->lastPixel.x != first.x && stroker->lastPixel.y != first.y) ||
- (qAbs(stroker->lastPixel.x - first.x) > 1 &&
+ (qAbs(stroker->lastPixel.x - first.x) > 1 ||
qAbs(stroker->lastPixel.y - first.y) > 1))) {
// have a missing pixel, insert it
if (swapped) {
@@ -793,37 +793,39 @@ static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2,
if (!dx)
return;
+ QCosmeticStroker::Direction dir = QCosmeticStroker::LeftToRight;
+
bool swapped = false;
if (x1 > x2) {
swapped = true;
qSwap(x1, x2);
qSwap(y1, y2);
caps = swapCaps(caps);
- --x1; --x2; --y1; --y2;
+ dir = QCosmeticStroker::RightToLeft;
}
int yinc = F16Dot16FixedDiv(y2 - y1, x2 - x1);
int y = y1 << 10;
- capAdjust(caps, x1, x2, y, yinc);
+ if ((stroker->lastDir ^ QCosmeticStroker::HorizontalMask) == dir)
+ caps |= swapped ? QCosmeticStroker::CapEnd : QCosmeticStroker::CapBegin;
- int x = (x1+32) >> 6;
- int xs = (x2+32) >> 6;
+ capAdjust(caps, x1, x2, y, yinc);
+ int x = x1 >> 6;
+ int xs = x2 >> 6;
if (x != xs) {
y += ( ((((x << 6) + 32 - x1))) * yinc ) >> 6;
// calculate first and last pixel to perform dropout control
- QCosmeticStroker::Direction dir = QCosmeticStroker::LeftToRight;
QCosmeticStroker::Point first;
first.x = x;
first.y = y >> 16;
last.x = xs - 1;
last.y = (y + (xs - x - 1)*yinc) >> 16;
- if (swapped) {
+ if (swapped)
qSwap(first, last);
- dir = QCosmeticStroker::RightToLeft;
- }
+
bool axisAligned = qAbs(yinc) < (1 << 14);
if (stroker->lastPixel.x >= 0) {
if (first.x == stroker->lastPixel.x && first.y == stroker->lastPixel.y) {
@@ -837,7 +839,7 @@ static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2,
} else if (stroker->lastDir != dir &&
(((axisAligned && stroker->lastAxisAligned) &&
stroker->lastPixel.x != first.x && stroker->lastPixel.y != first.y) ||
- (qAbs(stroker->lastPixel.x - first.x) > 1 &&
+ (qAbs(stroker->lastPixel.x - first.x) > 1 ||
qAbs(stroker->lastPixel.y - first.y) > 1))) {
// have a missing pixel, insert it
if (swapped) {
diff --git a/src/gui/painting/qcosmeticstroker_p.h b/src/gui/painting/qcosmeticstroker_p.h
index d7bd79a..53cdf2c 100644
--- a/src/gui/painting/qcosmeticstroker_p.h
+++ b/src/gui/painting/qcosmeticstroker_p.h
@@ -78,10 +78,12 @@ public:
// used to avoid drop outs or duplicated points
enum Direction {
- TopToBottom,
- BottomToTop,
- LeftToRight,
- RightToLeft
+ TopToBottom = 0x1,
+ BottomToTop = 0x2,
+ LeftToRight = 0x4,
+ RightToLeft = 0x8,
+ VerticalMask = 0x3,
+ HorizontalMask = 0xc
};
QCosmeticStroker(QRasterPaintEngineState *s, const QRect &dr)
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 8e64f3b..efb016e 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -5792,16 +5792,19 @@ void QPainter::drawImage(const QRectF &targetRect, const QImage &image, const QR
d->engine->drawImage(QRectF(x, y, w, h), image, QRectF(sx, sy, sw, sh), flags);
}
+#if !defined(QT_NO_RAWFONT)
/*!
- Draws the glyphs represented by \a glyphs at \a position. The \a position gives the
- edge of the baseline for the string of glyphs. The glyphs will be retrieved from the font
- selected on \a glyphs and at offsets given by the positions in \a glyphs.
+ \fn void QPainter::drawGlyphRun(const QPointF &position, const QGlyphRun &glyphs)
+
+ Draws the specified \a glyphs at the given \a position.
+ The \a position gives the edge of the baseline for the string of glyphs.
+ The glyphs will be retrieved from the font selected by \a glyphs and at
+ offsets given by the positions in \a glyphs.
\since 4.8
\sa QGlyphRun::setRawFont(), QGlyphRun::setPositions(), QGlyphRun::setGlyphIndexes()
*/
-#if !defined(QT_NO_RAWFONT)
void QPainter::drawGlyphRun(const QPointF &position, const QGlyphRun &glyphRun)
{
Q_D(QPainter);
@@ -9251,9 +9254,9 @@ void QPainter::drawPixmapFragments(const PixmapFragment *fragments, int fragment
\since 4.8
This function is used to draw the same \a pixmap with multiple target
- and source rectangles. If \a sourceRects is 0, the whole pixmap will be
- rendered at each of the target rectangles. The \a hints parameter can be
- used to pass in drawing hints.
+ and source rectangles specified by \a targetRects. If \a sourceRects is 0,
+ the whole pixmap will be rendered at each of the target rectangles.
+ The \a hints parameter can be used to pass in drawing hints.
This function is potentially faster than multiple calls to drawPixmap(),
since the backend can optimize state changes.
diff --git a/src/gui/painting/qwindowsurface_raster.cpp b/src/gui/painting/qwindowsurface_raster.cpp
index d972384..15ff044 100644
--- a/src/gui/painting/qwindowsurface_raster.cpp
+++ b/src/gui/painting/qwindowsurface_raster.cpp
@@ -229,7 +229,6 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi
QRegion wrgn(rgn);
if (!wOffset.isNull())
wrgn.translate(-wOffset);
- QRect wbr = wrgn.boundingRect();
if (wrgn.rectCount() != 1) {
int num;
@@ -237,23 +236,25 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi
XSetClipRectangles(X11->display, d_ptr->gc, 0, 0, rects, num, YXBanded);
}
- QRect br = rgn.boundingRect().translated(offset);
+ QPoint widgetOffset = offset + wOffset;
+ QRect clipRect = widget->rect().translated(widgetOffset).intersected(d_ptr->image->image.rect());
+
+ QRect br = rgn.boundingRect().translated(offset).intersected(clipRect);
+ QPoint wpos = br.topLeft() - widgetOffset;
+
#ifndef QT_NO_MITSHM
if (d_ptr->image->xshmpm) {
XCopyArea(X11->display, d_ptr->image->xshmpm, widget->handle(), d_ptr->gc,
- br.x(), br.y(), br.width(), br.height(), wbr.x(), wbr.y());
+ br.x(), br.y(), br.width(), br.height(), wpos.x(), wpos.y());
d_ptr->needsSync = true;
} else if (d_ptr->image->xshmimg) {
- const QImage &src = d->image->image;
- br = br.intersected(src.rect());
XShmPutImage(X11->display, widget->handle(), d_ptr->gc, d_ptr->image->xshmimg,
- br.x(), br.y(), wbr.x(), wbr.y(), br.width(), br.height(), False);
+ br.x(), br.y(), wpos.x(), wpos.y(), br.width(), br.height(), False);
d_ptr->needsSync = true;
} else
#endif
{
const QImage &src = d->image->image;
- br = br.intersected(src.rect());
if (src.format() != QImage::Format_RGB32 || widget->x11Info().depth() < 24) {
Q_ASSERT(src.depth() >= 16);
const QImage sub_src(src.scanLine(br.y()) + br.x() * (uint(src.depth()) / 8),
@@ -262,11 +263,11 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi
data->xinfo = widget->x11Info();
data->fromImage(sub_src, Qt::NoOpaqueDetection);
QPixmap pm = QPixmap(data);
- XCopyArea(X11->display, pm.handle(), widget->handle(), d_ptr->gc, 0 , 0 , br.width(), br.height(), wbr.x(), wbr.y());
+ XCopyArea(X11->display, pm.handle(), widget->handle(), d_ptr->gc, 0 , 0 , br.width(), br.height(), wpos.x(), wpos.y());
} else {
// qpaintengine_x11.cpp
extern void qt_x11_drawImage(const QRect &rect, const QPoint &pos, const QImage &image, Drawable hd, GC gc, Display *dpy, Visual *visual, int depth);
- qt_x11_drawImage(br, wbr.topLeft(), src, widget->handle(), d_ptr->gc, X11->display, (Visual *)widget->x11Info().visual(), widget->x11Info().depth());
+ qt_x11_drawImage(br, wpos, src, widget->handle(), d_ptr->gc, X11->display, (Visual *)widget->x11Info().visual(), widget->x11Info().depth());
}
}
@@ -311,7 +312,7 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi
}
CGContextClip(context);
- QRect r = rgn.boundingRect();
+ QRect r = rgn.boundingRect().intersected(d->image->image.rect());
const CGRect area = CGRectMake(r.x(), r.y(), r.width(), r.height());
CGImageRef image = CGBitmapContextCreateImage(d->image->cg);
CGImageRef subImage = CGImageCreateWithImageInRect(image, area);
diff --git a/src/gui/styles/qmacstyle_mac.mm b/src/gui/styles/qmacstyle_mac.mm
index 8436856..1c1713c 100644
--- a/src/gui/styles/qmacstyle_mac.mm
+++ b/src/gui/styles/qmacstyle_mac.mm
@@ -1063,7 +1063,7 @@ bool qt_mac_buttonIsRenderedFlat(const QPushButton *pushButton, const QStyleOpti
{
QMacStyle *macStyle = qobject_cast<QMacStyle *>(pushButton->style());
if (!macStyle)
- return false;
+ return true; // revert to 'flat' behavior if not Mac style
HIThemeButtonDrawInfo bdi;
macStyle->d->initHIThemePushButton(option, pushButton, kThemeStateActive, &bdi);
return bdi.kind == kThemeBevelButton;
diff --git a/src/gui/styles/qs60style_s60.cpp b/src/gui/styles/qs60style_s60.cpp
index 913352a..33619d6 100644
--- a/src/gui/styles/qs60style_s60.cpp
+++ b/src/gui/styles/qs60style_s60.cpp
@@ -91,6 +91,7 @@ enum TSupportRelease {
ES60_5_1 = 0x0008,
ES60_5_2 = 0x0010,
ES60_5_3 = 0x0020,
+ ES60_5_4 = 0x0040,
ES60_3_X = ES60_3_1 | ES60_3_2,
// Releases before Symbian Foundation
ES60_PreSF = ES60_3_1 | ES60_3_2 | ES60_5_0,
@@ -98,8 +99,10 @@ enum TSupportRelease {
ES60_Pre52 = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1,
// Releases before S60 5.3
ES60_Pre53 = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2,
+ // Releases before S60 5.4
+ ES60_Pre54 = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2 | ES60_5_3,
// Add all new releases here
- ES60_All = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2 | ES60_5_3
+ ES60_All = ES60_3_1 | ES60_3_2 | ES60_5_0 | ES60_5_1 | ES60_5_2 | ES60_5_3 | ES60_5_4
};
typedef struct {
@@ -707,7 +710,7 @@ QPixmap QS60StyleModeSpecifics::colorSkinnedGraphicsLX(
colorIndex,
icon,
iconMask,
- AknIconUtils::AvkonIconFileName(),
+ (fallbackGraphicID != KErrNotFound ? AknIconUtils::AvkonIconFileName() : KNullDesC),
fallbackGraphicID,
fallbackGraphicsMaskID,
defaultColor);
@@ -922,7 +925,7 @@ QPixmap QS60StyleModeSpecifics::createSkinnedGraphicsLX(
skinId,
icon,
iconMask,
- AknIconUtils::AvkonIconFileName(),
+ (fallbackGraphicID != KErrNotFound ? AknIconUtils::AvkonIconFileName() : KNullDesC),
fallbackGraphicID ,
fallbackGraphicsMaskID);
@@ -1016,7 +1019,7 @@ QPixmap QS60StyleModeSpecifics::createSkinnedGraphicsLX(
KAknsIIDDefault, //animation is not themed, lets force fallback graphics
animationFrame,
frameMask,
- AknIconUtils::AvkonIconFileName(),
+ (fallbackGraphicID != KErrNotFound ? AknIconUtils::AvkonIconFileName() : KNullDesC),
fallbackGraphicID ,
fallbackGraphicsMaskID);
}
@@ -1228,7 +1231,8 @@ bool QS60StyleModeSpecifics::checkSupport(const int supportedRelease)
(currentRelease == QSysInfo::SV_S60_5_0 && supportedRelease & ES60_5_0) ||
(currentRelease == QSysInfo::SV_S60_5_1 && supportedRelease & ES60_5_1) ||
(currentRelease == QSysInfo::SV_S60_5_2 && supportedRelease & ES60_5_2) ||
- (currentRelease == QSysInfo::SV_S60_5_3 && supportedRelease & ES60_5_3) );
+ (currentRelease == QSysInfo::SV_S60_5_3 && supportedRelease & ES60_5_3) ||
+ (currentRelease == QSysInfo::SV_S60_5_4 && supportedRelease & ES60_5_4) );
}
TAknsItemID QS60StyleModeSpecifics::partSpecificThemeId(int part)
diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp
index 2d6af3b..2df88e2 100644
--- a/src/gui/text/qfont.cpp
+++ b/src/gui/text/qfont.cpp
@@ -919,8 +919,9 @@ QString QFont::styleName() const
/*!
\since 4.8
- Sets the style name of the font. When set, other style properties
- like \a style() and \a weight() will be ignored for font matching.
+ Sets the style name of the font to the given \a styleName.
+ When set, other style properties like style() and weight() will be ignored
+ for font matching.
\sa styleName()
*/
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index 79503f9..1d463c4 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -1943,8 +1943,9 @@ bool QFontDatabase::isScalable(const QString &family,
/*!
- Returns a list of the point sizes available for the font that has
- family \a family and style \a style. The list may be empty.
+ \fn QList<int> QFontDatabase::pointSizes(const QString &family, const QString &style)
+ Returns a list of the point sizes available for the font with the
+ given \a family and \a style. The list may be empty.
\sa smoothSizes(), standardSizes()
*/
@@ -2052,8 +2053,9 @@ QFont QFontDatabase::font(const QString &family, const QString &style,
/*!
- Returns the point sizes of a font that has family \a family and
- style \a style that will look attractive. The list may be empty.
+ \fn QList<int> QFontDatabase::smoothSizes(const QString &family, const QString &style)
+ Returns the point sizes of a font with the given \a family and \a style
+ that will look attractive. The list may be empty.
For non-scalable fonts and bitmap scalable fonts, this function
is equivalent to pointSizes().
diff --git a/src/gui/text/qfontdatabase_s60.cpp b/src/gui/text/qfontdatabase_s60.cpp
index ffa4e59..8400feb 100644
--- a/src/gui/text/qfontdatabase_s60.cpp
+++ b/src/gui/text/qfontdatabase_s60.cpp
@@ -166,6 +166,7 @@ public:
COpenFontRasterizer *m_rasterizer;
mutable QList<const QSymbianTypeFaceExtras *> m_extras;
+ mutable QHash<QString, const QSymbianTypeFaceExtras *> m_extrasHash;
mutable QSet<QString> m_applicationFontFamilies;
};
@@ -268,9 +269,8 @@ void QSymbianFontDatabaseExtrasImplementation::clear()
static_cast<const QSymbianFontDatabaseExtrasImplementation*>(db->symbianExtras);
if (!dbExtras)
return; // initializeDb() has never been called
- QSymbianTypeFaceExtrasHash &extrasHash = S60->fontData();
if (QSymbianTypeFaceExtras::symbianFontTableApiAvailable()) {
- qDeleteAll(extrasHash);
+ qDeleteAll(dbExtras->m_extrasHash);
} else {
typedef QList<const QSymbianTypeFaceExtras *>::iterator iterator;
for (iterator p = dbExtras->m_extras.begin(); p != dbExtras->m_extras.end(); ++p) {
@@ -279,16 +279,11 @@ void QSymbianFontDatabaseExtrasImplementation::clear()
}
dbExtras->m_extras.clear();
}
- extrasHash.clear();
+ dbExtras->m_extrasHash.clear();
}
void qt_cleanup_symbianFontDatabase()
{
- static bool cleanupDone = false;
- if (cleanupDone)
- return;
- cleanupDone = true;
-
QFontDatabasePrivate *db = privateDb();
if (!db)
return;
@@ -339,12 +334,9 @@ COpenFont* OpenFontFromBitmapFont(const CBitmapFont* aBitmapFont)
const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(const QString &aTypeface,
bool bold, bool italic) const
{
- QSymbianTypeFaceExtrasHash &extrasHash = S60->fontData();
- if (extrasHash.isEmpty() && QThread::currentThread() != QApplication::instance()->thread())
- S60->addThreadLocalReleaseFunc(clear);
const QString typeface = qt_symbian_fontNameWithAppFontMarker(aTypeface);
const QString searchKey = typeface + QString::number(int(bold)) + QString::number(int(italic));
- if (!extrasHash.contains(searchKey)) {
+ if (!m_extrasHash.contains(searchKey)) {
TFontSpec searchSpec(qt_QString2TPtrC(typeface), 1);
if (bold)
searchSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
@@ -358,7 +350,7 @@ const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(c
QScopedPointer<CFont, CFontFromScreenDeviceReleaser> sFont(font);
QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font);
sFont.take();
- extrasHash.insert(searchKey, extras);
+ m_extrasHash.insert(searchKey, extras);
} else {
const TInt err = m_store->GetNearestFontToDesignHeightInPixels(font, searchSpec);
Q_ASSERT(err == KErrNone && font);
@@ -372,20 +364,20 @@ const QSymbianTypeFaceExtras *QSymbianFontDatabaseExtrasImplementation::extras(c
const TOpenFontFaceAttrib* const attrib = openFont->FaceAttrib();
const QString foundKey =
QString((const QChar*)attrib->FullName().Ptr(), attrib->FullName().Length());
- if (!extrasHash.contains(foundKey)) {
+ if (!m_extrasHash.contains(foundKey)) {
QScopedPointer<CFont, CFontFromFontStoreReleaser> sFont(font);
QSymbianTypeFaceExtras *extras = new QSymbianTypeFaceExtras(font, openFont);
sFont.take();
m_extras.append(extras);
- extrasHash.insert(searchKey, extras);
- extrasHash.insert(foundKey, extras);
+ m_extrasHash.insert(searchKey, extras);
+ m_extrasHash.insert(foundKey, extras);
} else {
m_store->ReleaseFont(font);
- extrasHash.insert(searchKey, extrasHash.value(foundKey));
+ m_extrasHash.insert(searchKey, m_extrasHash.value(foundKey));
}
}
}
- return extrasHash.value(searchKey);
+ return m_extrasHash.value(searchKey);
}
void QSymbianFontDatabaseExtrasImplementation::removeAppFontData(
@@ -981,7 +973,7 @@ bool QFontDatabase::removeAllApplicationFonts()
bool QFontDatabase::supportsThreadedFontRendering()
{
- return QSymbianTypeFaceExtras::symbianFontTableApiAvailable();
+ return false;
}
static
diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp
index f3d4107..1d93d54 100644
--- a/src/gui/text/qfontmetrics.cpp
+++ b/src/gui/text/qfontmetrics.cpp
@@ -442,9 +442,10 @@ bool QFontMetrics::inFont(QChar ch) const
}
/*!
+ \fn bool QFontMetrics::inFontUcs4(uint character) const
\since 4.8
- Returns true if the character encoded in UCS-4/UTF-32 is a valid
+ Returns true if the given \a character encoded in UCS-4/UTF-32 is a valid
character in the font; otherwise returns false.
*/
bool QFontMetrics::inFontUcs4(uint ucs4) const
diff --git a/src/gui/text/qglyphrun.cpp b/src/gui/text/qglyphrun.cpp
index 2865d91..442f7cc 100644
--- a/src/gui/text/qglyphrun.cpp
+++ b/src/gui/text/qglyphrun.cpp
@@ -175,7 +175,8 @@ QRawFont QGlyphRun::rawFont() const
}
/*!
- Sets the font in which to look up the glyph indexes to \a font.
+ Sets the font specified by \a rawFont to be the font used to look up the
+ glyph indexes.
\sa rawFont(), setGlyphIndexes()
*/
diff --git a/src/gui/text/qplatformfontdatabase_qpa.cpp b/src/gui/text/qplatformfontdatabase_qpa.cpp
index d1d1f94..e3eeca5 100644
--- a/src/gui/text/qplatformfontdatabase_qpa.cpp
+++ b/src/gui/text/qplatformfontdatabase_qpa.cpp
@@ -160,6 +160,9 @@ QSupportedWritingSystems::QSupportedWritingSystems(const QSupportedWritingSystem
d->ref.ref();
}
+/*!
+ Assigns the \a other supported writing systems object to this object.
+*/
QSupportedWritingSystems &QSupportedWritingSystems::operator=(const QSupportedWritingSystems &other)
{
if (d != other.d) {
@@ -171,6 +174,9 @@ QSupportedWritingSystems &QSupportedWritingSystems::operator=(const QSupportedWr
return *this;
}
+/*!
+ Destroys the object.
+*/
QSupportedWritingSystems::~QSupportedWritingSystems()
{
if (!d->ref.deref())
@@ -187,12 +193,26 @@ void QSupportedWritingSystems::detach()
}
}
+/*!
+ Sets the supported state of the writing system given by \a writingSystem to
+ the value specified by \a support. A value of true indicates that the
+ writing system is supported; a value of false indicates that it is
+ unsupported.
+
+ \sa supported()
+*/
void QSupportedWritingSystems::setSupported(QFontDatabase::WritingSystem writingSystem, bool support)
{
detach();
d->vector[writingSystem] = support;
}
+/*!
+ Returns true if the writing system given by \a writingSystem is supported;
+ otherwise returns false.
+
+ \sa setSupported()
+*/
bool QSupportedWritingSystems::supported(QFontDatabase::WritingSystem writingSystem) const
{
return d->vector.at(writingSystem);
@@ -295,7 +315,7 @@ QStringList QPlatformFontDatabase::addApplicationFont(const QByteArray &fontData
}
/*!
-
+ Releases the font handle and deletes any associated data loaded from a file.
*/
void QPlatformFontDatabase::releaseHandle(void *handle)
{
@@ -304,7 +324,13 @@ void QPlatformFontDatabase::releaseHandle(void *handle)
}
/*!
+ Returns the path to the font directory.
+
+ The font directory is stored in the general Qt settings unless it has been
+ overridden by the \c QT_QPA_FONTDIR environment variable.
+ When using builds of Qt that do not support settings, the \c QT_QPA_FONTDIR
+ environment variable is the only way to specify the font directory.
*/
QString QPlatformFontDatabase::fontDir() const
{
diff --git a/src/gui/text/qrawfont.cpp b/src/gui/text/qrawfont.cpp
index e3e5c57..60a6cb3 100644
--- a/src/gui/text/qrawfont.cpp
+++ b/src/gui/text/qrawfont.cpp
@@ -485,7 +485,8 @@ QVector<quint32> QRawFont::glyphIndexesForString(const QString &text) const
must be at least \a numChars, if that's still not enough, this function will return
false, then you can resize \a glyphIndexes from the size returned in \a numGlyphs.
- \sa glyphIndexesForString(), advancesForGlyphIndexes(), QGlyphs, QTextLayout::glyphs(), QTextFragment::glyphs()
+ \sa glyphIndexesForString(), advancesForGlyphIndexes(), QGlyphRun,
+ QTextLayout::glyphRuns(), QTextFragment::glyphRuns()
*/
bool QRawFont::glyphIndexesForChars(const QChar *chars, int numChars, quint32 *glyphIndexes, int *numGlyphs) const
{
diff --git a/src/gui/text/qtextcontrol.cpp b/src/gui/text/qtextcontrol.cpp
index e32e112..bde2c34 100644
--- a/src/gui/text/qtextcontrol.cpp
+++ b/src/gui/text/qtextcontrol.cpp
@@ -680,20 +680,30 @@ void QTextControlPrivate::extendWordwiseSelection(int suggestedNewPosition, qrea
if (!wordSelectionEnabled && (mouseXPosition < wordStartX || mouseXPosition > wordEndX))
return;
- // keep the already selected word even when moving to the left
- // (#39164)
- if (suggestedNewPosition < selectedWordOnDoubleClick.position())
- cursor.setPosition(selectedWordOnDoubleClick.selectionEnd());
- else
- cursor.setPosition(selectedWordOnDoubleClick.selectionStart());
+ if (wordSelectionEnabled) {
+ if (suggestedNewPosition < selectedWordOnDoubleClick.position()) {
+ cursor.setPosition(selectedWordOnDoubleClick.selectionEnd());
+ setCursorPosition(wordStartPos, QTextCursor::KeepAnchor);
+ } else {
+ cursor.setPosition(selectedWordOnDoubleClick.selectionStart());
+ setCursorPosition(wordEndPos, QTextCursor::KeepAnchor);
+ }
+ } else {
+ // keep the already selected word even when moving to the left
+ // (#39164)
+ if (suggestedNewPosition < selectedWordOnDoubleClick.position())
+ cursor.setPosition(selectedWordOnDoubleClick.selectionEnd());
+ else
+ cursor.setPosition(selectedWordOnDoubleClick.selectionStart());
- const qreal differenceToStart = mouseXPosition - wordStartX;
- const qreal differenceToEnd = wordEndX - mouseXPosition;
+ const qreal differenceToStart = mouseXPosition - wordStartX;
+ const qreal differenceToEnd = wordEndX - mouseXPosition;
- if (differenceToStart < differenceToEnd)
- setCursorPosition(wordStartPos, QTextCursor::KeepAnchor);
- else
- setCursorPosition(wordEndPos, QTextCursor::KeepAnchor);
+ if (differenceToStart < differenceToEnd)
+ setCursorPosition(wordStartPos, QTextCursor::KeepAnchor);
+ else
+ setCursorPosition(wordEndPos, QTextCursor::KeepAnchor);
+ }
if (interactionFlags & Qt::TextSelectableByMouse) {
#ifndef QT_NO_CLIPBOARD
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index 9301f16..9f148ee 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -1534,8 +1534,6 @@ void QTextEngine::itemize() const
while (uc < e) {
switch (*uc) {
case QChar::ObjectReplacementCharacter:
- if (analysis->bidiLevel % 2)
- --analysis->bidiLevel;
analysis->script = QUnicodeTables::Common;
analysis->flags = QScriptAnalysis::Object;
break;
diff --git a/src/gui/widgets/qcombobox.cpp b/src/gui/widgets/qcombobox.cpp
index 41394e3..fc251bf 100644
--- a/src/gui/widgets/qcombobox.cpp
+++ b/src/gui/widgets/qcombobox.cpp
@@ -2497,7 +2497,7 @@ void QComboBox::showPopup()
} else {
TRect staConTopRect = TRect();
AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStaconTop, staConTopRect);
- listRect.setWidth(listRect.height());
+ listRect.setWidth(screen.height());
//by default popup is centered on screen in landscape
listRect.moveCenter(screen.center());
if (staConTopRect.IsEmpty() && AknLayoutUtils::CbaLocation() != AknLayoutUtils::EAknCbaLocationBottom) {
diff --git a/src/gui/widgets/qtextedit.cpp b/src/gui/widgets/qtextedit.cpp
index 61d4fed..2670089 100644
--- a/src/gui/widgets/qtextedit.cpp
+++ b/src/gui/widgets/qtextedit.cpp
@@ -2472,8 +2472,6 @@ bool QTextEdit::find(const QString &exp, QTextDocument::FindFlags options)
and the text edit will try to guess the right format.
Use setHtml() or setPlainText() directly to avoid text edit's guessing.
-
- \sa toPlainText(), toHtml()
*/
void QTextEdit::setText(const QString &text)
{
diff --git a/src/imports/imports.pro b/src/imports/imports.pro
index c1298e2..d0e24b0 100644
--- a/src/imports/imports.pro
+++ b/src/imports/imports.pro
@@ -1,5 +1,5 @@
TEMPLATE = subdirs
SUBDIRS += folderlistmodel particles gestures
-contains(QT_CONFIG, opengl): SUBDIRS += shaders
+contains(QT_CONFIG, opengl):!contains(QT_CONFIG, opengles1): SUBDIRS += shaders
diff --git a/src/imports/shaders/shadereffectitem.cpp b/src/imports/shaders/shadereffectitem.cpp
index 056581c..b954e5a 100644..100755
--- a/src/imports/shaders/shadereffectitem.cpp
+++ b/src/imports/shaders/shadereffectitem.cpp
@@ -199,8 +199,13 @@ Rectangle {
*/
+#ifdef Q_OS_SYMBIAN
+#define OBSERVE_GL_CONTEXT_LOSS 1
+#endif
+
ShaderEffectItem::ShaderEffectItem(QDeclarativeItem *parent)
: QDeclarativeItem(parent)
+ , m_program(0)
, m_meshResolution(1, 1)
, m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4)
, m_blending(true)
@@ -214,15 +219,21 @@ ShaderEffectItem::ShaderEffectItem(QDeclarativeItem *parent)
, m_hasShaderPrograms(false)
, m_mirrored(false)
, m_defaultVertexShader(true)
+ , m_contextObserver(0)
{
setFlag(QGraphicsItem::ItemHasNoContents, false);
connect(this, SIGNAL(visibleChanged()), this, SLOT(handleVisibilityChange()));
m_active = isVisible();
+
+#ifndef OBSERVE_GL_CONTEXT_LOSS
+ m_program = new QGLShaderProgram(this);
+#endif
}
ShaderEffectItem::~ShaderEffectItem()
{
reset();
+ delete m_contextObserver;
}
@@ -243,11 +254,6 @@ ShaderEffectItem::~ShaderEffectItem()
*/
-/*!
- \property ShaderEffectItem::fragmentShader
- \brief the OpenGL fragment shader code.
-*/
-
void ShaderEffectItem::setFragmentShader(const QString &code)
{
if (m_fragment_code.constData() == code.constData())
@@ -281,11 +287,6 @@ void ShaderEffectItem::setFragmentShader(const QString &code)
*/
-/*!
- \property ShaderEffectItem::vertexShader
- \brief the OpenGL vertex shader code.
-*/
-
void ShaderEffectItem::setVertexShader(const QString &code)
{
if (m_vertex_code.constData() == code.constData())
@@ -320,11 +321,6 @@ void ShaderEffectItem::setVertexShader(const QString &code)
The default value is true.
*/
-/*!
- \property ShaderEffectItem::blending
- \brief the drawing is done using blending.
-*/
-
void ShaderEffectItem::setBlending(bool enable)
{
if (m_blending == enable)
@@ -347,11 +343,6 @@ void ShaderEffectItem::setBlending(bool enable)
The default value is QSize(1,1).
*/
-/*!
- \property ShaderEffectItem::meshResolution
- \brief the amount of triangles in the mesh for both x and y-axis.
-*/
-
void ShaderEffectItem::setMeshResolution(const QSize &size)
{
if (size == m_meshResolution)
@@ -422,10 +413,38 @@ void ShaderEffectItem::renderEffect(QPainter *painter, const QMatrix4x4 &matrix)
if (!painter || !painter->device())
return;
- if (!m_program.isLinked() || m_program_dirty)
+#ifdef OBSERVE_GL_CONTEXT_LOSS
+ QGLContext *context = const_cast <QGLContext*> (QGLContext::currentContext());
+ if (!m_program || !m_contextObserver || !m_contextObserver->isValid()) {
+ // Context has changed, re-create QGLShaderProgram
+ if (context) {
+ delete m_program;
+ m_program = 0;
+
+ delete m_contextObserver;
+ m_contextObserver = 0;
+
+ m_program = new QGLShaderProgram(this);
+ m_contextObserver = new QGLFramebufferObject(QSize(2,2));
+
+ if (!m_contextObserver || !m_program) {
+ delete m_program;
+ m_program = 0;
+ delete m_contextObserver;
+ m_contextObserver = 0;
+ qWarning() << "ShaderEffectItem::renderEffect - Creating QGLShaderProgram or QGLFrameBufferObject failed!";
+ }
+ }
+ }
+#endif
+
+ if (!m_program)
+ return;
+
+ if (!m_program->isLinked() || m_program_dirty)
updateShaderProgram();
- m_program.bind();
+ m_program->bind();
QMatrix4x4 combinedMatrix;
combinedMatrix.scale(2.0 / painter->device()->width(), -2.0 / painter->device()->height(), 1.0);
@@ -434,7 +453,7 @@ void ShaderEffectItem::renderEffect(QPainter *painter, const QMatrix4x4 &matrix)
updateEffectState(combinedMatrix);
for (int i = 0; i < m_attributeNames.size(); ++i) {
- m_program.enableAttributeArray(m_geometry.attributes()[i].position);
+ m_program->enableAttributeArray(m_geometry.attributes()[i].position);
}
bindGeometry();
@@ -472,11 +491,14 @@ void ShaderEffectItem::renderEffect(QPainter *painter, const QMatrix4x4 &matrix)
glDisable(GL_DEPTH_TEST);
for (int i = 0; i < m_attributeNames.size(); ++i)
- m_program.disableAttributeArray(m_geometry.attributes()[i].position);
+ m_program->disableAttributeArray(m_geometry.attributes()[i].position);
}
void ShaderEffectItem::updateEffectState(const QMatrix4x4 &matrix)
{
+ if (!m_program)
+ return;
+
for (int i = m_sources.size() - 1; i >= 0; --i) {
const ShaderEffectItem::SourceData &source = m_sources.at(i);
if (!source.source)
@@ -487,10 +509,10 @@ void ShaderEffectItem::updateEffectState(const QMatrix4x4 &matrix)
}
if (m_respectsOpacity)
- m_program.setUniformValue("qt_Opacity", static_cast<float> (effectiveOpacity()));
+ m_program->setUniformValue("qt_Opacity", static_cast<float> (effectiveOpacity()));
if (m_respectsMatrix){
- m_program.setUniformValue("qt_ModelViewProjectionMatrix", matrix);
+ m_program->setUniformValue("qt_ModelViewProjectionMatrix", matrix);
}
QSet<QByteArray>::const_iterator it;
@@ -500,37 +522,37 @@ void ShaderEffectItem::updateEffectState(const QMatrix4x4 &matrix)
switch (v.type()) {
case QVariant::Color:
- m_program.setUniformValue(name.constData(), qvariant_cast<QColor>(v));
+ m_program->setUniformValue(name.constData(), qvariant_cast<QColor>(v));
break;
case QVariant::Double:
- m_program.setUniformValue(name.constData(), (float) qvariant_cast<double>(v));
+ m_program->setUniformValue(name.constData(), (float) qvariant_cast<double>(v));
break;
case QVariant::Transform:
- m_program.setUniformValue(name.constData(), qvariant_cast<QTransform>(v));
+ m_program->setUniformValue(name.constData(), qvariant_cast<QTransform>(v));
break;
case QVariant::Int:
- m_program.setUniformValue(name.constData(), v.toInt());
+ m_program->setUniformValue(name.constData(), GLint(v.toInt()));
break;
case QVariant::Bool:
- m_program.setUniformValue(name.constData(), GLint(v.toBool()));
+ m_program->setUniformValue(name.constData(), GLint(v.toBool()));
break;
case QVariant::Size:
case QVariant::SizeF:
- m_program.setUniformValue(name.constData(), v.toSizeF());
+ m_program->setUniformValue(name.constData(), v.toSizeF());
break;
case QVariant::Point:
case QVariant::PointF:
- m_program.setUniformValue(name.constData(), v.toPointF());
+ m_program->setUniformValue(name.constData(), v.toPointF());
break;
case QVariant::Rect:
case QVariant::RectF:
{
QRectF r = v.toRectF();
- m_program.setUniformValue(name.constData(), r.x(), r.y(), r.width(), r.height());
+ m_program->setUniformValue(name.constData(), r.x(), r.y(), r.width(), r.height());
}
break;
case QVariant::Vector3D:
- m_program.setUniformValue(name.constData(), qvariant_cast<QVector3D>(v));
+ m_program->setUniformValue(name.constData(), qvariant_cast<QVector3D>(v));
break;
default:
break;
@@ -558,6 +580,9 @@ static inline int size_of_type(GLenum type)
void ShaderEffectItem::bindGeometry()
{
+ if (!m_program)
+ return;
+
char const *const *attrNames = m_attributeNames.constData();
int offset = 0;
for (int j = 0; j < m_attributeNames.size(); ++j) {
@@ -574,7 +599,7 @@ void ShaderEffectItem::bindGeometry()
if (normalize)
qWarning() << "ShaderEffectItem::bindGeometry() - non supported attribute type!";
- m_program.setAttributeArray(a.position, (GLfloat*) (((char*) m_geometry.vertexData()) + offset), a.tupleSize, m_geometry.stride());
+ m_program->setAttributeArray(a.position, (GLfloat*) (((char*) m_geometry.vertexData()) + offset), a.tupleSize, m_geometry.stride());
//glVertexAttribPointer(a.position, a.tupleSize, a.type, normalize, m_geometry.stride(), (char *) m_geometry.vertexData() + offset);
offset += a.tupleSize * size_of_type(a.type);
}
@@ -657,6 +682,16 @@ void ShaderEffectItem::setActive(bool enable)
}
}
+ // QGLShaderProgram is deleted when not active (to minimize GPU memory usage).
+#ifdef OBSERVE_GL_CONTEXT_LOSS
+ if (!m_active && m_program) {
+ delete m_program;
+ m_program = 0;
+ delete m_contextObserver;
+ m_contextObserver = 0;
+ }
+#endif
+
emit activeChanged();
markDirty();
}
@@ -776,7 +811,9 @@ void ShaderEffectItem::reset()
{
disconnectPropertySignals();
- m_program.removeAllShaders();
+ if (m_program)
+ m_program->removeAllShaders();
+
m_attributeNames.clear();
m_uniformNames.clear();
for (int i = 0; i < m_sources.size(); ++i) {
@@ -821,6 +858,9 @@ void ShaderEffectItem::updateProperties()
void ShaderEffectItem::updateShaderProgram()
{
+ if (!m_program)
+ return;
+
QString vertexCode = m_vertex_code;
QString fragmentCode = m_fragment_code;
@@ -830,16 +870,16 @@ void ShaderEffectItem::updateShaderProgram()
if (fragmentCode.isEmpty())
fragmentCode = QString::fromLatin1(qt_default_fragment_code);
- m_program.addShaderFromSourceCode(QGLShader::Vertex, vertexCode);
- m_program.addShaderFromSourceCode(QGLShader::Fragment, fragmentCode);
+ m_program->addShaderFromSourceCode(QGLShader::Vertex, vertexCode);
+ m_program->addShaderFromSourceCode(QGLShader::Fragment, fragmentCode);
for (int i = 0; i < m_attributeNames.size(); ++i) {
- m_program.bindAttributeLocation(m_attributeNames.at(i), m_geometry.attributes()[i].position);
+ m_program->bindAttributeLocation(m_attributeNames.at(i), m_geometry.attributes()[i].position);
}
- if (!m_program.link()) {
+ if (!m_program->link()) {
qWarning("ShaderEffectItem: Shader compilation failed:");
- qWarning() << m_program.log();
+ qWarning() << m_program->log();
}
if (!m_attributeNames.contains(qt_postion_attribute_name))
@@ -849,10 +889,10 @@ void ShaderEffectItem::updateShaderProgram()
if (!m_respectsMatrix)
qWarning("ShaderEffectItem: Missing reference to \'qt_ModelViewProjectionMatrix\'.");
- if (m_program.isLinked()) {
- m_program.bind();
+ if (m_program->isLinked()) {
+ m_program->bind();
for (int i = 0; i < m_sources.size(); ++i)
- m_program.setUniformValue(m_sources.at(i).name.constData(), i);
+ m_program->setUniformValue(m_sources.at(i).name.constData(), (GLint) i);
}
m_program_dirty = false;
diff --git a/src/imports/shaders/shadereffectitem.h b/src/imports/shaders/shadereffectitem.h
index aebe897..6c225a2 100644
--- a/src/imports/shaders/shadereffectitem.h
+++ b/src/imports/shaders/shadereffectitem.h
@@ -115,7 +115,7 @@ private:
private:
QString m_fragment_code;
QString m_vertex_code;
- QGLShaderProgram m_program;
+ QGLShaderProgram* m_program;
QVector<const char *> m_attributeNames;
QSet<QByteArray> m_uniformNames;
QSize m_meshResolution;
@@ -143,6 +143,8 @@ private:
bool m_hasShaderPrograms : 1;
bool m_mirrored : 1;
bool m_defaultVertexShader : 1;
+
+ QGLFramebufferObject* m_contextObserver;
};
QT_END_HEADER
diff --git a/src/imports/shaders/shadereffectsource.cpp b/src/imports/shaders/shadereffectsource.cpp
index 6210c41..f7a8a93 100644
--- a/src/imports/shaders/shadereffectsource.cpp
+++ b/src/imports/shaders/shadereffectsource.cpp
@@ -105,11 +105,6 @@ ShaderEffectSource::~ShaderEffectSource()
sourceItem regardless of its clipping property.
*/
-/*!
- \property ShaderEffectSource::sourceItem
- \brief the Item which is the source for the effect.
-*/
-
void ShaderEffectSource::setSourceItem(QDeclarativeItem *item)
{
if (item == m_sourceItem)
@@ -159,26 +154,17 @@ void ShaderEffectSource::setSourceItem(QDeclarativeItem *item)
The default value is Qt.rect(0,0,0,0).
*/
-/*!
- \property ShaderEffectSource::sourceRect
- \brief the relative sourceRect for the source.
-*/
-
void ShaderEffectSource::setSourceRect(const QRectF &rect)
{
if (rect == m_sourceRect)
return;
m_sourceRect = rect;
updateSizeAndTexture();
- updateBackbuffer();
emit sourceRectChanged();
emit repaintRequired();
- if (m_sourceItem) {
- ShaderEffect* effect = qobject_cast<ShaderEffect*> (m_sourceItem->graphicsEffect());
- if (effect)
- effect->m_changed = true;
- }
+ m_dirtyTexture = true;
+ markSourceItemDirty();
}
/*!
@@ -192,11 +178,6 @@ void ShaderEffectSource::setSourceRect(const QRectF &rect)
The default value is QSize(0,0).
*/
-/*!
- \property ShaderEffectSource::textureSize
- \brief the texture size for the source.
-*/
-
void ShaderEffectSource::setTextureSize(const QSize &size)
{
if (size == m_textureSize)
@@ -207,11 +188,8 @@ void ShaderEffectSource::setTextureSize(const QSize &size)
emit textureSizeChanged();
emit repaintRequired();
- if (m_sourceItem) {
- ShaderEffect* effect = qobject_cast<ShaderEffect*> (m_sourceItem->graphicsEffect());
- if (effect)
- effect->m_changed = true;
- }
+ m_dirtyTexture = true;
+ markSourceItemDirty();
}
/*!
@@ -227,11 +205,6 @@ void ShaderEffectSource::setTextureSize(const QSize &size)
The default value is true.
*/
-/*!
- \property ShaderEffectSource::live
- \brief the flag tells whether source item content is changing between frames.
-*/
-
void ShaderEffectSource::setLive(bool s)
{
if (s == m_live)
@@ -251,11 +224,6 @@ void ShaderEffectSource::setLive(bool s)
The default value is false.
*/
-/*!
- \property ShaderEffectSource::hideSource
- \brief the flag tells whether original source item content should be hidden.
-*/
-
void ShaderEffectSource::setHideSource(bool hide)
{
if (hide == m_hideSource)
@@ -283,19 +251,16 @@ void ShaderEffectSource::setHideSource(bool hide)
*/
-/*!
- \property ShaderEffectSource::wrapMode
- \brief the wrap parameter for the source after it has been mapped as a texture.
-*/
-
void ShaderEffectSource::setWrapMode(WrapMode mode)
{
if (mode == m_wrapMode)
return;
m_wrapMode = mode;
- updateBackbuffer();
emit wrapModeChanged();
+
+ m_dirtyTexture = true;
+ markSourceItemDirty();
}
/*!
@@ -314,7 +279,7 @@ void ShaderEffectSource::grab()
emit repaintRequired();
}
-void ShaderEffectSource::bind() const
+void ShaderEffectSource::bind()
{
GLint filtering = smooth() ? GL_LINEAR : GL_NEAREST;
GLuint hwrap = (m_wrapMode == Repeat || m_wrapMode == RepeatHorizontally) ? GL_REPEAT : GL_CLAMP_TO_EDGE;
@@ -323,9 +288,13 @@ void ShaderEffectSource::bind() const
#if !defined(QT_OPENGL_ES_2)
glEnable(GL_TEXTURE_2D);
#endif
- if (m_fbo) {
+
+ if (m_fbo && m_fbo->isValid()) {
glBindTexture(GL_TEXTURE_2D, m_fbo->texture());
} else {
+ m_dirtyTexture = true;
+ emit repaintRequired();
+ markSourceItemDirty();
glBindTexture(GL_TEXTURE_2D, 0);
}
@@ -354,7 +323,7 @@ void ShaderEffectSource::derefFromEffectItem()
void ShaderEffectSource::updateBackbuffer()
{
- if (!m_sourceItem)
+ if (!m_sourceItem || !QGLContext::currentContext())
return;
// Multisampling is not (for now) supported.
@@ -370,7 +339,7 @@ void ShaderEffectSource::updateBackbuffer()
if (!m_fbo) {
m_fbo = new ShaderEffectBuffer(size, format);
} else {
- if (m_fbo->size() != size || m_fbo->format().internalTextureFormat() != GLenum(m_format)) {
+ if (!m_fbo->isValid() || m_fbo->size() != size || m_fbo->format().internalTextureFormat() != GLenum(m_format)) {
delete m_fbo;
m_fbo = 0;
m_fbo = new ShaderEffectBuffer(size, format);
@@ -397,6 +366,16 @@ void ShaderEffectSource::markSourceSizeDirty()
emit repaintRequired();
}
+void ShaderEffectSource::markSourceItemDirty()
+{
+ m_dirtyTexture = true;
+ if (m_sourceItem) {
+ ShaderEffect* effect = qobject_cast<ShaderEffect*> (m_sourceItem->graphicsEffect());
+ if (effect)
+ effect->m_changed = true;
+ }
+}
+
void ShaderEffectSource::updateSizeAndTexture()
{
if (m_sourceItem) {
@@ -407,7 +386,7 @@ void ShaderEffectSource::updateSizeAndTexture()
size.setWidth(1);
if (size.height() < 1)
size.setHeight(1);
- if (m_fbo && m_fbo->size() != size) {
+ if (m_fbo && (m_fbo->size() != size || !m_fbo->isValid())) {
delete m_fbo;
m_fbo = 0;
delete m_multisampledFbo;
diff --git a/src/imports/shaders/shadereffectsource.h b/src/imports/shaders/shadereffectsource.h
index 0f03a6a..af8a815 100644
--- a/src/imports/shaders/shadereffectsource.h
+++ b/src/imports/shaders/shadereffectsource.h
@@ -99,7 +99,7 @@ public:
void setWrapMode(WrapMode mode);
bool isActive() const { return m_refs; }
- void bind() const;
+ void bind();
void refFromEffectItem();
void derefFromEffectItem();
void updateBackbuffer();
@@ -124,6 +124,7 @@ Q_SIGNALS:
public Q_SLOTS:
void markSceneGraphDirty();
void markSourceSizeDirty();
+ void markSourceItemDirty();
private:
void updateSizeAndTexture();
diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp
index 6d4df44..71d61a4 100644
--- a/src/network/kernel/qnetworkproxy.cpp
+++ b/src/network/kernel/qnetworkproxy.cpp
@@ -1197,6 +1197,11 @@ void QNetworkProxyQuery::setUrl(const QUrl &url)
}
#ifndef QT_NO_BEARERMANAGEMENT
+/*!
+ Returns the network configuration of the proxy query.
+
+ \sa setNetworkConfiguration()
+*/
QNetworkConfiguration QNetworkProxyQuery::networkConfiguration() const
{
return d ? d->config : QNetworkConfiguration();
@@ -1214,7 +1219,7 @@ QNetworkConfiguration QNetworkProxyQuery::networkConfiguration() const
you should first start the QNetworkSession and obtain the active
configuration from its properties.
- \sa networkConfiguration
+ \sa networkConfiguration()
*/
void QNetworkProxyQuery::setNetworkConfiguration(const QNetworkConfiguration &networkConfiguration)
{
diff --git a/src/plugins/bearer/icd/dbusdispatcher.cpp b/src/plugins/bearer/icd/dbusdispatcher.cpp
index 60e4640..62dec62 100644
--- a/src/plugins/bearer/icd/dbusdispatcher.cpp
+++ b/src/plugins/bearer/icd/dbusdispatcher.cpp
@@ -195,7 +195,7 @@ static bool appendVariantToDBusMessage(const QVariant& argument,
break;
case QVariant::String: {
- QByteArray data = argument.toString().toLatin1();
+ QByteArray data = argument.toString().toUtf8();
str_data = data.data();
dbus_message_iter_append_basic(dbus_iter, DBUS_TYPE_STRING,
&str_data);
@@ -363,7 +363,7 @@ static QVariant getVariantFromDBusMessage(DBusMessageIter *iter) {
case DBUS_TYPE_STRING:
{
dbus_message_iter_get_basic(iter, &str_data);
- QString str(str_data);
+ QString str(QString::fromUtf8(str_data));
QVariant variant(str);
return variant;
}
diff --git a/src/plugins/bearer/icd/iapconf.cpp b/src/plugins/bearer/icd/iapconf.cpp
index a29e326..e326edf 100644
--- a/src/plugins/bearer/icd/iapconf.cpp
+++ b/src/plugins/bearer/icd/iapconf.cpp
@@ -143,7 +143,7 @@ QVariant IAPConfPrivate::valueToVariant(ConnSettingsValue *value)
return QVariant(value->value.bool_val ? true : false);
case CONN_SETTINGS_VALUE_STRING:
- return QVariant(QString(value->value.string_val));
+ return QVariant(QString::fromUtf8(value->value.string_val));
case CONN_SETTINGS_VALUE_DOUBLE:
return QVariant(value->value.double_val);
diff --git a/src/plugins/platforms/uikit/README b/src/plugins/platforms/uikit/README
index 81ef0bd..795e72a 100644
--- a/src/plugins/platforms/uikit/README
+++ b/src/plugins/platforms/uikit/README
@@ -37,11 +37,11 @@ After configuring and building Qt you need to also build src/plugins/platforms/u
Simulator:
----------
-configure -qpa -xplatform qpa/macx-iphonesimulator-g++ -arch i386 -developer-build -release -opengl es2 -no-accessibility -no-qt3support -no-multimedia -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
+configure -qpa -xplatform qpa/macx-iphonesimulator-g++ -arch i386 -developer-build -release -opengl es2 -no-accessibility -no-qt3support -no-multimedia -no-phonon-backend -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
Device:
-------
-configure -qpa -xplatform qpa/macx-iphonedevice-g++ -arch armv7 -no-neon -developer-build -release -opengl es2 -no-accessibility -no-qt3support -no-multimedia -no-phonon-backend -no-svg -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
+configure -qpa -xplatform qpa/macx-iphonedevice-g++ -arch armv7 -no-neon -developer-build -release -opengl es2 -no-accessibility -no-qt3support -no-multimedia -no-phonon-backend -no-webkit -no-scripttools -no-openssl -no-sql-mysql -no-sql-odbc -no-cups -no-iconv -no-dbus -static -nomake tools -nomake demos -nomake docs -nomake examples -nomake translations
2) XCode setup:
- there are examples in the examples subdirectory of the platform plugin
diff --git a/src/plugins/platforms/uikit/phonon_av/avmediaobject.mm b/src/plugins/platforms/uikit/phonon_av/avmediaobject.mm
index 388866f..9cbddc0 100644
--- a/src/plugins/platforms/uikit/phonon_av/avmediaobject.mm
+++ b/src/plugins/platforms/uikit/phonon_av/avmediaobject.mm
@@ -60,7 +60,7 @@
- (id)initWithMediaObject:(AVMediaObject *)obj
{
- if (self = [self init]) {
+ if ((self = [self init])) {
mediaObject = obj;
}
return self;
diff --git a/src/plugins/platforms/uikit/quikitscreen.mm b/src/plugins/platforms/uikit/quikitscreen.mm
index d7d8207..3c1e360 100644
--- a/src/plugins/platforms/uikit/quikitscreen.mm
+++ b/src/plugins/platforms/uikit/quikitscreen.mm
@@ -56,7 +56,7 @@ QUIKitScreen::QUIKitScreen(int screenIndex)
CGRect bounds = [uiScreen() bounds];
m_geometry = QRect(bounds.origin.x, bounds.origin.y, bounds.size.width, bounds.size.height);
- m_format = QImage::Format_ARGB32;
+ m_format = QImage::Format_ARGB32_Premultiplied;
m_depth = 24;
diff --git a/src/plugins/platforms/uikit/quikitwindow.mm b/src/plugins/platforms/uikit/quikitwindow.mm
index 6e018fe..640b92e 100644
--- a/src/plugins/platforms/uikit/quikitwindow.mm
+++ b/src/plugins/platforms/uikit/quikitwindow.mm
@@ -53,6 +53,23 @@
#include <QtDebug>
+static GLint stencilBits()
+{
+ static GLint bits;
+ static bool initialized = false;
+ if (!initialized) {
+ glGetIntegerv(GL_STENCIL_BITS, &bits);
+ initialized = true;
+ }
+ return bits;
+}
+
+static GLint depthBits()
+{
+ // we can choose between GL_DEPTH24_STENCIL8_OES and GL_DEPTH_COMPONENT16
+ return stencilBits() > 0 ? 24 : 16;
+}
+
class EAGLPlatformContext : public QPlatformGLContext
{
public:
@@ -60,13 +77,13 @@ public:
: mView(view)
{
mFormat.setWindowApi(QPlatformWindowFormat::OpenGL);
- mFormat.setDepthBufferSize(24);
+ mFormat.setDepthBufferSize(depthBits());
mFormat.setAccumBufferSize(0);
mFormat.setRedBufferSize(8);
mFormat.setGreenBufferSize(8);
mFormat.setBlueBufferSize(8);
mFormat.setAlphaBufferSize(8);
- mFormat.setStencilBufferSize(8);
+ mFormat.setStencilBufferSize(stencilBits());
mFormat.setSamples(0);
mFormat.setSampleBuffers(false);
mFormat.setDoubleBuffer(true);
@@ -74,7 +91,7 @@ public:
mFormat.setRgba(true);
mFormat.setAlpha(true);
mFormat.setAccum(false);
- mFormat.setStencil(true);
+ mFormat.setStencil(stencilBits() > 0);
mFormat.setStereo(false);
mFormat.setDirectRendering(false);
@@ -203,9 +220,13 @@ private:
glGenRenderbuffers(1, &mDepthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, mDepthRenderbuffer);
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, mFramebufferWidth, mFramebufferHeight);
+ if (stencilBits() > 0) {
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, mFramebufferWidth, mFramebufferHeight);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepthRenderbuffer);
+ } else {
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, mFramebufferWidth, mFramebufferHeight);
+ }
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepthRenderbuffer);
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepthRenderbuffer);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
diff --git a/src/sql/models/qsqlrelationaltablemodel.cpp b/src/sql/models/qsqlrelationaltablemodel.cpp
index 5b0406f..0edfaf4 100644
--- a/src/sql/models/qsqlrelationaltablemodel.cpp
+++ b/src/sql/models/qsqlrelationaltablemodel.cpp
@@ -710,24 +710,32 @@ void QSqlRelationalTableModel::clear()
}
-/*! \enum QSqlRelationalTableModel::JoinMode
+/*!
+ \enum QSqlRelationalTableModel::JoinMode
+ \since 4.8
- \value InnerJoin - Inner join mode, return rows when there is at least one match in both tables.
- \value LeftJoin - Left join mode, returns all rows from the left table (table_name1), even if there are no matches in the right table (table_name2).
+ This enum specifies the type of mode to use when joining two tables.
- \see QSqlRelationalTableModel::setJoinMode
- \since 4.8
+ \value InnerJoin Inner join mode, return rows when there is at least one
+ match in both tables.
+ \value LeftJoin Left join mode, returns all rows from the left table
+ (table_name1), even if there are no matches in the right
+ table (table_name2).
+
+ \sa QSqlRelationalTableModel::setJoinMode()
*/
/*!
- Sets the SQL join mode to show or hide rows with NULL foreign keys.
- In InnerJoin mode (the default) these rows will not be showed: use the
+ \since 4.8
+ Sets the SQL join mode to the value given by \a joinMode to show or hide
+ rows with NULL foreign keys.
+
+ In InnerJoin mode (the default) these rows will not be shown; use the
LeftJoin mode if you want to show them.
- \see QSqlRelationalTableModel::JoinMode
- \since 4.8
+ \sa QSqlRelationalTableModel::JoinMode
*/
-void QSqlRelationalTableModel::setJoinMode( QSqlRelationalTableModel::JoinMode joinMode )
+void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
{
Q_D(QSqlRelationalTableModel);
d->joinMode = joinMode;
diff --git a/src/svg/qsvgstructure.cpp b/src/svg/qsvgstructure.cpp
index cc158ba..4d9fad5 100644
--- a/src/svg/qsvgstructure.cpp
+++ b/src/svg/qsvgstructure.cpp
@@ -369,7 +369,7 @@ QSvgNode * QSvgStructureNode::previousSiblingNode(QSvgNode *n) const
{
QSvgNode *prev = 0;
QList<QSvgNode*>::const_iterator itr = m_renderers.constBegin();
- while (itr != m_renderers.constEnd()) {
+ for (; itr != m_renderers.constEnd(); ++itr) {
QSvgNode *node = *itr;
if (node == n)
return prev;
diff --git a/src/xmlpatterns/expr/qevaluationcache.cpp b/src/xmlpatterns/expr/qevaluationcache.cpp
index 67109eb..3b6fc92 100644
--- a/src/xmlpatterns/expr/qevaluationcache.cpp
+++ b/src/xmlpatterns/expr/qevaluationcache.cpp
@@ -49,10 +49,9 @@ template<bool IsForGlobal>
EvaluationCache<IsForGlobal>::EvaluationCache(const Expression::Ptr &op,
const VariableDeclaration *varDecl,
const VariableSlotID aSlot) : SingleContainer(op)
- , m_declaration(varDecl)
+ , m_declarationUsedByMany(varDecl->usedByMany())
, m_varSlot(aSlot)
{
- Q_ASSERT(m_declaration);
Q_ASSERT(m_varSlot > -1);
}
@@ -199,7 +198,7 @@ Expression::Ptr EvaluationCache<IsForGlobal>::compress(const StaticContext::Ptr
if(m_operand->is(IDRangeVariableReference))
return m_operand;
- if(m_declaration->usedByMany())
+ if (m_declarationUsedByMany)
{
/* If it's only an atomic value an EvaluationCache is overkill. However,
* it's still needed for functions like fn:current-time() that must adhere to
diff --git a/src/xmlpatterns/expr/qevaluationcache_p.h b/src/xmlpatterns/expr/qevaluationcache_p.h
index 4111634..67ee5c2 100644
--- a/src/xmlpatterns/expr/qevaluationcache_p.h
+++ b/src/xmlpatterns/expr/qevaluationcache_p.h
@@ -125,6 +125,7 @@ namespace QPatternist
private:
static DynamicContext::Ptr topFocusContext(const DynamicContext::Ptr &context);
const VariableDeclaration* m_declaration;
+ bool m_declarationUsedByMany;
/**
* This variable must not be called m_slot. If it so, a compiler bug on
* HP-UX-aCC-64 is triggered in the constructor initializor. See the
diff --git a/tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml
index 43ea8d8..6e739bf 100644
--- a/tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml
+++ b/tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml
@@ -18,6 +18,7 @@ Rectangle {
objectName: "text"
anchors.fill: parent
text: top.text
+ focus: true
}
}
}
diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_words.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_words.qml
index 22a9871..f8d2e4e 100644
--- a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_words.qml
+++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_words.qml
@@ -1,7 +1,8 @@
-import QtQuick 1.0
+import QtQuick 1.1
TextEdit {
focus: true
- text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ text: "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"
selectByMouse: false
+ mouseSelectionMode: TextEdit.SelectWords
}
diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_words.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_words.qml
index d61da46..f58fd45 100644
--- a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_words.qml
+++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_words.qml
@@ -1,7 +1,8 @@
-import QtQuick 1.0
+import QtQuick 1.1
TextEdit {
focus: true
- text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ text: "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"
selectByMouse: true
+ mouseSelectionMode: TextEdit.SelectWords
}
diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
index 5d6f2a2..fde0588 100644
--- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
+++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
@@ -454,6 +454,8 @@ void tst_qdeclarativetextedit::hAlign_RightToLeft()
QVERIFY(textEdit != 0);
canvas->show();
+ const QString rtlText = textEdit->text();
+
// implicit alignment should follow the reading direction of text
QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight);
QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2);
@@ -530,6 +532,16 @@ void tst_qdeclarativetextedit::hAlign_RightToLeft()
QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignLeft);
QVERIFY(textEdit->positionToRectangle(0).x() < canvas->width()/2);
+ QApplication::setActiveWindow(canvas);
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+ textEdit->setText(QString());
+ { QInputMethodEvent ev(rtlText, QList<QInputMethodEvent::Attribute>()); QApplication::sendEvent(canvas, &ev); }
+ QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight);
+ { QInputMethodEvent ev("Hello world!", QList<QInputMethodEvent::Attribute>()); QApplication::sendEvent(canvas, &ev); }
+ QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignLeft);
+
#ifndef Q_OS_MAC // QTBUG-18040
// empty text with implicit alignment follows the system locale-based
// keyboard input direction from QApplication::keyboardInputDirection
@@ -1315,20 +1327,32 @@ void tst_qdeclarativetextedit::moveCursorSelectionSequence()
void tst_qdeclarativetextedit::mouseSelection_data()
{
QTest::addColumn<QString>("qmlfile");
- QTest::addColumn<bool>("expectSelection");
+ QTest::addColumn<int>("from");
+ QTest::addColumn<int>("to");
+ QTest::addColumn<QString>("selectedText");
// import installed
- QTest::newRow("on") << SRCDIR "/data/mouseselection_true.qml" << true;
- QTest::newRow("off") << SRCDIR "/data/mouseselection_false.qml" << false;
- QTest::newRow("default") << SRCDIR "/data/mouseselection_default.qml" << false;
- QTest::newRow("on word selection") << SRCDIR "/data/mouseselection_true_words.qml" << true;
- QTest::newRow("off word selection") << SRCDIR "/data/mouseselection_false_words.qml" << false;
+ QTest::newRow("on") << SRCDIR "/data/mouseselection_true.qml" << 4 << 9 << "45678";
+ QTest::newRow("off") << SRCDIR "/data/mouseselection_false.qml" << 4 << 9 << QString();
+ QTest::newRow("default") << SRCDIR "/data/mouseselection_default.qml" << 4 << 9 << QString();
+ QTest::newRow("off word selection") << SRCDIR "/data/mouseselection_false_words.qml" << 4 << 9 << QString();
+ QTest::newRow("on word selection (4,9)") << SRCDIR "/data/mouseselection_true_words.qml" << 4 << 9 << "0123456789";
+ QTest::newRow("on word selection (2,13)") << SRCDIR "/data/mouseselection_true_words.qml" << 2 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ QTest::newRow("on word selection (2,30)") << SRCDIR "/data/mouseselection_true_words.qml" << 2 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ QTest::newRow("on word selection (9,13)") << SRCDIR "/data/mouseselection_true_words.qml" << 9 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ QTest::newRow("on word selection (9,30)") << SRCDIR "/data/mouseselection_true_words.qml" << 9 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ QTest::newRow("on word selection (13,2)") << SRCDIR "/data/mouseselection_true_words.qml" << 13 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ QTest::newRow("on word selection (20,2)") << SRCDIR "/data/mouseselection_true_words.qml" << 20 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ QTest::newRow("on word selection (12,9)") << SRCDIR "/data/mouseselection_true_words.qml" << 12 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ QTest::newRow("on word selection (30,9)") << SRCDIR "/data/mouseselection_true_words.qml" << 30 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ";
}
void tst_qdeclarativetextedit::mouseSelection()
{
QFETCH(QString, qmlfile);
- QFETCH(bool, expectSelection);
+ QFETCH(int, from);
+ QFETCH(int, to);
+ QFETCH(QString, selectedText);
QDeclarativeView *canvas = createView(qmlfile);
@@ -1342,25 +1366,20 @@ void tst_qdeclarativetextedit::mouseSelection()
QVERIFY(textEditObject != 0);
// press-and-drag-and-release from x1 to x2
- int x1 = 10;
- int x2 = 70;
- int y = textEditObject->height()/2;
- QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y)));
+ QPoint p1 = canvas->mapFromScene(textEditObject->positionToRectangle(from).center());
+ QPoint p2 = canvas->mapFromScene(textEditObject->positionToRectangle(to).center());
+ QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, p1);
//QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work
- QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
+ QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(p2), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier);
QApplication::sendEvent(canvas->viewport(), &mv);
- QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y)));
- QString str = textEditObject->selectedText();
- if (expectSelection)
- QVERIFY(str.length() > 3); // don't reallly care *what* was selected (and it's too sensitive to platform)
- else
- QVERIFY(str.isEmpty());
+ QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, p2);
+ QCOMPARE(textEditObject->selectedText(), selectedText);
// Clicking and shift to clicking between the same points should select the same text.
textEditObject->setCursorPosition(0);
- QTest::mouseClick(canvas->viewport(), Qt::LeftButton, Qt::NoModifier, canvas->mapFromScene(QPoint(x1,y)));
- QTest::mouseClick(canvas->viewport(), Qt::LeftButton, Qt::ShiftModifier, canvas->mapFromScene(QPoint(x2,y)));
- QCOMPARE(textEditObject->selectedText(), str);
+ QTest::mouseClick(canvas->viewport(), Qt::LeftButton, Qt::NoModifier, p1);
+ QTest::mouseClick(canvas->viewport(), Qt::LeftButton, Qt::ShiftModifier, p2);
+ QCOMPARE(textEditObject->selectedText(), selectedText);
delete canvas;
}
diff --git a/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml
index b11535e..7f27bbe 100644
--- a/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml
+++ b/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml
@@ -18,6 +18,7 @@ Rectangle {
objectName: "text"
anchors.fill: parent
text: top.text
+ focus: true
}
}
}
diff --git a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
index 280f952..bb895bf 100644
--- a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
+++ b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp
@@ -1198,6 +1198,8 @@ void tst_qdeclarativetextinput::horizontalAlignment_RightToLeft()
QVERIFY(textInput != 0);
canvas->show();
+ const QString rtlText = textInput->text();
+
QDeclarativeTextInputPrivate *textInputPrivate = QDeclarativeTextInputPrivate::get(textInput);
QVERIFY(textInputPrivate != 0);
QVERIFY(-textInputPrivate->hscroll > canvas->width()/2);
@@ -1262,6 +1264,17 @@ void tst_qdeclarativetextinput::horizontalAlignment_RightToLeft()
QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignLeft);
QVERIFY(-textInputPrivate->hscroll < canvas->width()/2);
+ QApplication::setActiveWindow(canvas);
+ QTest::qWaitForWindowShown(canvas);
+ QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
+
+ // If there is no committed text, the preedit text should determine the alignment.
+ textInput->setText(QString());
+ { QInputMethodEvent ev(rtlText, QList<QInputMethodEvent::Attribute>()); QApplication::sendEvent(canvas, &ev); }
+ QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignRight);
+ { QInputMethodEvent ev("Hello world!", QList<QInputMethodEvent::Attribute>()); QApplication::sendEvent(canvas, &ev); }
+ QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignLeft);
+
#ifndef Q_OS_MAC // QTBUG-18040
// empty text with implicit alignment follows the system locale-based
// keyboard input direction from QApplication::keyboardInputDirection
diff --git a/tests/auto/qabstractspinbox/tst_qabstractspinbox.cpp b/tests/auto/qabstractspinbox/tst_qabstractspinbox.cpp
index d14c75b..4e93663 100644
--- a/tests/auto/qabstractspinbox/tst_qabstractspinbox.cpp
+++ b/tests/auto/qabstractspinbox/tst_qabstractspinbox.cpp
@@ -154,7 +154,7 @@ void tst_QAbstractSpinBox::task228728_cssselector()
{
//QAbstractSpinBox does some call to stylehint into his constructor.
//so while the stylesheet want to access property, it should not crash
- qApp->setStyleSheet("[alignement=\"1\"], [text=\"foo\"] { color:black; }" );
+ qApp->setStyleSheet("[alignment=\"1\"], [text=\"foo\"] { color:black; }" );
QSpinBox box;
}
diff --git a/tests/auto/qaudioinput/tst_qaudioinput.cpp b/tests/auto/qaudioinput/tst_qaudioinput.cpp
index 6025bdb..0004c42 100644
--- a/tests/auto/qaudioinput/tst_qaudioinput.cpp
+++ b/tests/auto/qaudioinput/tst_qaudioinput.cpp
@@ -86,14 +86,14 @@ void tst_QAudioInput::initTestCase()
// Only perform tests if audio input device exists!
QList<QAudioDeviceInfo> devices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
- if(devices.size() > 0)
+ if (devices.size() > 0)
available = true;
else {
qWarning()<<"NOTE: no audio input device found, no test will be performed";
available = false;
}
- if(available)
+ if (available)
audio = new QAudioInput(format, this);
}
@@ -124,6 +124,9 @@ void tst_QAudioInput::invalidFormat_data()
void tst_QAudioInput::invalidFormat()
{
+ if (!available)
+ QSKIP("No audio input device found, no test will be performed", SkipAll);
+
QFETCH(QAudioFormat, invalidFormat);
QAudioInput audioInput(invalidFormat, this);
@@ -140,81 +143,85 @@ void tst_QAudioInput::invalidFormat()
void tst_QAudioInput::settings()
{
- if(available) {
- // Confirm the setting we added in the init function.
- QAudioFormat f = audio->format();
-
- QVERIFY(format.channels() == f.channels());
- QVERIFY(format.frequency() == f.frequency());
- QVERIFY(format.sampleSize() == f.sampleSize());
- QVERIFY(format.codec() == f.codec());
- QVERIFY(format.byteOrder() == f.byteOrder());
- QVERIFY(format.sampleType() == f.sampleType());
- }
+ if (!available)
+ QSKIP("No audio input device found, no test will be performed", SkipAll);
+
+ // Confirm the setting we added in the init function.
+ QAudioFormat f = audio->format();
+
+ QVERIFY(format.channels() == f.channels());
+ QVERIFY(format.frequency() == f.frequency());
+ QVERIFY(format.sampleSize() == f.sampleSize());
+ QVERIFY(format.codec() == f.codec());
+ QVERIFY(format.byteOrder() == f.byteOrder());
+ QVERIFY(format.sampleType() == f.sampleType());
}
void tst_QAudioInput::buffers()
{
- if(available) {
- // Should always have a buffer size greater than zero.
- int store = audio->bufferSize();
- audio->setBufferSize(4096);
- QVERIFY(audio->bufferSize() > 0);
- audio->setBufferSize(store);
- QVERIFY(audio->bufferSize() == store);
- }
+ if (!available)
+ QSKIP("No audio input device found, no test will be performed", SkipAll);
+
+ // Should always have a buffer size greater than zero.
+ int store = audio->bufferSize();
+ audio->setBufferSize(4096);
+ QVERIFY(audio->bufferSize() > 0);
+ audio->setBufferSize(store);
+ QVERIFY(audio->bufferSize() == store);
}
void tst_QAudioInput::notifyInterval()
{
- if(available) {
- QVERIFY(audio->notifyInterval() == 1000); // Default
+ if (!available)
+ QSKIP("No audio input device found, no test will be performed", SkipAll);
- audio->setNotifyInterval(500);
- QVERIFY(audio->notifyInterval() == 500); // Custom
+ QVERIFY(audio->notifyInterval() == 1000); // Default
- audio->setNotifyInterval(1000); // reset
- }
+ audio->setNotifyInterval(500);
+ QVERIFY(audio->notifyInterval() == 500); // Custom
+
+ audio->setNotifyInterval(1000); // reset
}
void tst_QAudioInput::pullFile()
{
- if(available) {
- QFile filename(SRCDIR"test.raw");
- filename.open( QIODevice::WriteOnly | QIODevice::Truncate );
-
- QSignalSpy readSignal(audio, SIGNAL(notify()));
- QSignalSpy stateSignal(audio, SIGNAL(stateChanged(QAudio::State)));
-
- // Always have default states, before start
- QVERIFY(audio->state() == QAudio::StoppedState);
- QVERIFY(audio->error() == QAudio::NoError);
- QVERIFY(audio->elapsedUSecs() == 0);
-
- audio->start(&filename);
- QTest::qWait(20);
- // Check state and periodSize() are valid non-zero values.
- QVERIFY(audio->state() == QAudio::ActiveState);
- QVERIFY(audio->error() == QAudio::NoError);
- QVERIFY(audio->elapsedUSecs() > 10000 && audio->elapsedUSecs() < 800000);
- QVERIFY(audio->periodSize() > 0);
- QVERIFY(stateSignal.count() == 1); // State changed to QAudio::ActiveState
-
- // Wait until finished...
- QTest::qWait(5000);
-
- QVERIFY(readSignal.count() > 0);
- QVERIFY(audio->processedUSecs() > 0);
-
- audio->stop();
- QTest::qWait(20);
- QVERIFY(audio->state() == QAudio::StoppedState);
- QVERIFY(audio->elapsedUSecs() == 0);
- // Can only check to make sure we got at least 1 more signal, but can be more.
- QVERIFY(stateSignal.count() > 1);
-
- filename.close();
- }
+ if (!available)
+ QSKIP("No audio input device found, no test will be performed", SkipAll);
+
+ QFile filename(SRCDIR"test.raw");
+ filename.open( QIODevice::WriteOnly | QIODevice::Truncate );
+
+ QSignalSpy readSignal(audio, SIGNAL(notify()));
+ QSignalSpy stateSignal(audio, SIGNAL(stateChanged(QAudio::State)));
+
+ // Always have default states, before start
+ QVERIFY(audio->state() == QAudio::StoppedState);
+ QVERIFY(audio->error() == QAudio::NoError);
+ QVERIFY(audio->elapsedUSecs() == 0);
+
+ audio->start(&filename);
+ QTest::qWait(20);
+ // Check state and periodSize() are valid non-zero values.
+ QVERIFY(audio->state() == QAudio::ActiveState);
+ QVERIFY(audio->error() == QAudio::NoError);
+ QVERIFY(audio->elapsedUSecs() > 10000 && audio->elapsedUSecs() < 800000);
+ QVERIFY(audio->periodSize() > 0);
+ QVERIFY(stateSignal.count() == 1); // State changed to QAudio::ActiveState
+
+ // Wait until finished...
+ QTest::qWait(5000);
+
+ QVERIFY(readSignal.count() > 0);
+ QVERIFY(audio->processedUSecs() > 0);
+
+ audio->stop();
+ QTest::qWait(20);
+ QVERIFY(audio->state() == QAudio::StoppedState);
+ QVERIFY(audio->elapsedUSecs() == 0);
+ // Can only check to make sure we got at least 1 more signal, but can be more.
+ QVERIFY(stateSignal.count() > 1);
+
+ filename.close();
}
QTEST_MAIN(tst_QAudioInput)
diff --git a/tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml b/tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml
index 1667591..d945ec9 100644
--- a/tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml
+++ b/tests/auto/qdbusabstractinterface/com.trolltech.QtDBus.Pinger.xml
@@ -15,6 +15,10 @@
<annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="RegisteredType"/>
</signal>
<method name="voidMethod" />
+ <method name="sleepMethod">
+ <arg type="i" />
+ <arg type="i" direction="out"/>
+ </method>
<method name="stringMethod">
<arg type="s" direction="out"/>
</method>
diff --git a/tests/auto/qdbusabstractinterface/interface.cpp b/tests/auto/qdbusabstractinterface/interface.cpp
index 0326177..849db93 100644
--- a/tests/auto/qdbusabstractinterface/interface.cpp
+++ b/tests/auto/qdbusabstractinterface/interface.cpp
@@ -40,9 +40,23 @@
****************************************************************************/
#include "interface.h"
+#include <QThread>
Interface::Interface()
{
}
+// Export the sleep function
+// TODO QT5: remove this class, QThread::msleep is now public
+class FriendlySleepyThread : public QThread {
+public:
+ using QThread::msleep;
+};
+
+int Interface::sleepMethod(int msec)
+{
+ FriendlySleepyThread::msleep(msec);
+ return 42;
+}
+
#include "moc_interface.cpp"
diff --git a/tests/auto/qdbusabstractinterface/interface.h b/tests/auto/qdbusabstractinterface/interface.h
index b840a38..0fb15fe 100644
--- a/tests/auto/qdbusabstractinterface/interface.h
+++ b/tests/auto/qdbusabstractinterface/interface.h
@@ -101,6 +101,7 @@ public:
public slots:
Q_SCRIPTABLE void voidMethod() {}
+ Q_SCRIPTABLE int sleepMethod(int);
Q_SCRIPTABLE QString stringMethod() { return "Hello, world"; }
Q_SCRIPTABLE RegisteredType complexMethod() { return RegisteredType("Hello, world"); }
Q_SCRIPTABLE QString multiOutMethod(int &value) { value = 42; return "Hello, world"; }
diff --git a/tests/auto/qdbusabstractinterface/pinger.h b/tests/auto/qdbusabstractinterface/pinger.h
index 6245a5a..739a142 100644
--- a/tests/auto/qdbusabstractinterface/pinger.h
+++ b/tests/auto/qdbusabstractinterface/pinger.h
@@ -117,6 +117,13 @@ public Q_SLOTS: // METHODS
return reply;
}
+ inline QDBusPendingReply<int> sleepMethod(int in0)
+ {
+ QList<QVariant> argumentList;
+ argumentList << qVariantFromValue(in0);
+ return asyncCallWithArgumentList(QLatin1String("sleepMethod"), argumentList);
+ }
+
inline QDBusPendingReply<QString> stringMethod()
{
QList<QVariant> argumentList;
diff --git a/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp b/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
index 00e3a76..994df05 100644
--- a/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
+++ b/tests/auto/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
@@ -111,6 +111,8 @@ private slots:
void makeAsyncComplexCallPeer();
void makeAsyncMultiOutCallPeer();
+ void callWithTimeout();
+
void stringPropRead();
void stringPropWrite();
void variantPropRead();
@@ -458,6 +460,96 @@ void tst_QDBusAbstractInterface::makeAsyncMultiOutCallPeer()
QCoreApplication::instance()->processEvents();
}
+static const char server_serviceName[] = "com.trolltech.autotests.dbusserver";
+static const char server_objectPath[] = "/com/trolltech/server";
+static const char server_interfaceName[] = "com.trolltech.QtDBus.Pinger";
+
+class DBusServerThread : public QThread
+{
+public:
+ DBusServerThread() {
+ start();
+ m_ready.acquire();
+ }
+ ~DBusServerThread() {
+ quit();
+ wait();
+ }
+
+ void run()
+ {
+ QDBusConnection con = QDBusConnection::connectToBus(QDBusConnection::SessionBus, "ThreadConnection");
+ if (!con.isConnected())
+ qWarning("Error registering to DBus");
+ if (!con.registerService(server_serviceName))
+ qWarning("Error registering service name");
+ Interface targetObj;
+ con.registerObject(server_objectPath, &targetObj, QDBusConnection::ExportScriptableContents);
+ m_ready.release();
+ exec();
+
+ QDBusConnection::disconnectFromBus( con.name() );
+ }
+private:
+ QSemaphore m_ready;
+};
+
+void tst_QDBusAbstractInterface::callWithTimeout()
+{
+ QDBusConnection con = QDBusConnection::sessionBus();
+ QVERIFY2(con.isConnected(), "Not connected to D-Bus");
+
+ DBusServerThread serverThread;
+
+ QDBusMessage msg = QDBusMessage::createMethodCall(server_serviceName,
+ server_objectPath, server_interfaceName, "sleepMethod");
+ msg << 100;
+
+ {
+ // Call with no timeout -> works
+ QDBusMessage reply = con.call(msg);
+ QCOMPARE((int)reply.type(), (int)QDBusMessage::ReplyMessage);
+ QCOMPARE(reply.arguments().at(0).toInt(), 42);
+ }
+
+ {
+ // Call with 1 sec timeout -> fails
+ QDBusMessage reply = con.call(msg, QDBus::Block, 1);
+ QCOMPARE(reply.type(), QDBusMessage::ErrorMessage);
+ }
+
+ // Now using QDBusInterface
+
+ QDBusInterface iface(server_serviceName, server_objectPath, server_interfaceName, con);
+ {
+ // Call with no timeout
+ QDBusMessage reply = iface.call("sleepMethod", 100);
+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
+ QCOMPARE(reply.arguments().at(0).toInt(), 42);
+ }
+ {
+ // Call with 1 sec timeout -> fails
+ iface.setTimeout(1);
+ QDBusMessage reply = iface.call("sleepMethod", 100);
+ QCOMPARE(reply.type(), QDBusMessage::ErrorMessage);
+ }
+
+ // Now using generated code
+ com::trolltech::QtDBus::Pinger p(server_serviceName, server_objectPath, QDBusConnection::sessionBus());
+ {
+ // Call with no timeout
+ QDBusReply<int> reply = p.sleepMethod(100);
+ QVERIFY(reply.isValid());
+ QCOMPARE(int(reply), 42);
+ }
+ {
+ // Call with 1 sec timeout -> fails
+ p.setTimeout(1);
+ QDBusReply<int> reply = p.sleepMethod(100);
+ QVERIFY(!reply.isValid());
+ }
+}
+
void tst_QDBusAbstractInterface::stringPropRead()
{
Pinger p = getPinger();
diff --git a/tests/auto/qdialog/tst_qdialog.cpp b/tests/auto/qdialog/tst_qdialog.cpp
index 6d9f798..86dde21 100644
--- a/tests/auto/qdialog/tst_qdialog.cpp
+++ b/tests/auto/qdialog/tst_qdialog.cpp
@@ -467,6 +467,22 @@ void tst_QDialog::throwInExec()
#if defined(Q_WS_MAC) || (defined(Q_WS_WINCE) && defined(_ARM_))
QSKIP("Throwing exceptions in exec() is not supported on this platform.", SkipAll);
#endif
+
+#if defined(Q_OS_LINUX)
+ // C++ exceptions can't be passed through glib callbacks. Skip the test if
+ // we're using the glib event loop.
+ QByteArray dispatcher = QAbstractEventDispatcher::instance()->metaObject()->className();
+ if (dispatcher.contains("Glib")) {
+ QSKIP(
+ qPrintable(QString(
+ "Throwing exceptions in exec() won't work if %1 event dispatcher is used.\n"
+ "Try running with QT_NO_GLIB=1 in environment."
+ ).arg(QString::fromLatin1(dispatcher))),
+ SkipAll
+ );
+ }
+#endif
+
int caughtExceptions = 0;
try {
ExceptionDialog dialog;
diff --git a/tests/auto/qfiledialog/tst_qfiledialog.cpp b/tests/auto/qfiledialog/tst_qfiledialog.cpp
index 08d2e88..81da8a3 100644
--- a/tests/auto/qfiledialog/tst_qfiledialog.cpp
+++ b/tests/auto/qfiledialog/tst_qfiledialog.cpp
@@ -80,7 +80,9 @@
# define SRCDIR "C:/Private/" TOSTRING(SYMBIAN_SRCDIR_UID) "/"
#elif defined(Q_OS_UNIX)
#ifdef QT_BUILD_INTERNAL
+QT_BEGIN_NAMESPACE
extern Q_GUI_EXPORT QString qt_tildeExpansion(const QString &path, bool *expanded = 0);
+QT_END_NAMESPACE
#endif
#endif
diff --git a/tests/auto/qpushbutton/tst_qpushbutton.cpp b/tests/auto/qpushbutton/tst_qpushbutton.cpp
index 7742f6b..db4f385 100644
--- a/tests/auto/qpushbutton/tst_qpushbutton.cpp
+++ b/tests/auto/qpushbutton/tst_qpushbutton.cpp
@@ -91,6 +91,9 @@ private slots:
void animateClick();
void toggle();
void clicked();
+#ifdef Q_OS_MAC
+ void macClicked();
+#endif
void toggled();
void isEnabled();
void defaultAndAutoDefault();
@@ -469,6 +472,34 @@ void tst_QPushButton::clicked()
QCOMPARE( release_count, (uint)10 );
}
+#ifdef Q_OS_MAC
+// test that the corners of a mac style button are not treated as clicks.
+// but that if a style is applied, they are.
+void tst_QPushButton::macClicked()
+{
+ QPushButton *macTestWidget = new QPushButton( "Push button" );
+ macTestWidget->show();
+ connect( macTestWidget, SIGNAL(clicked()), this, SLOT(onClicked()) );
+
+ QTest::mouseClick( macTestWidget, Qt::LeftButton, 0, QPoint(1,1) );
+ QVERIFY( click_count == 0 );
+
+ QTest::mouseClick( macTestWidget, Qt::LeftButton, 0, macTestWidget->rect().center() );
+ QVERIFY( click_count == 1 );
+
+ resetCounters();
+ macTestWidget->setStyleSheet("background: white;");
+
+ QTest::mouseClick( macTestWidget, Qt::LeftButton, 0, QPoint(1,1) );
+ QVERIFY( click_count == 1 );
+
+ QTest::mouseClick( macTestWidget, Qt::LeftButton, 0, macTestWidget->rect().center() );
+ QVERIFY( click_count == 2 );
+
+ delete macTestWidget;
+}
+#endif
+
/*
void tst_QPushButton::group()
{
diff --git a/tools/macdeployqt/shared/shared.cpp b/tools/macdeployqt/shared/shared.cpp
index 1a9a6ab..156f1de 100644
--- a/tools/macdeployqt/shared/shared.cpp
+++ b/tools/macdeployqt/shared/shared.cpp
@@ -127,7 +127,7 @@ FrameworkInfo parseOtoolLibraryLine(const QString &line, bool useDebugLibs)
while (part < parts.count()) {
const QString currentPart = parts.at(part).simplified() ;
++part;
- if (currentPart == "")
+ if (currentPart.isEmpty())
continue;
if (state == QtPath) {
diff --git a/tools/macdeployqt/tests/tst_deployment_mac.cpp b/tools/macdeployqt/tests/tst_deployment_mac.cpp
index 858dc45..5921199 100644
--- a/tools/macdeployqt/tests/tst_deployment_mac.cpp
+++ b/tools/macdeployqt/tests/tst_deployment_mac.cpp
@@ -230,4 +230,4 @@ void tst_deployment_mac::testFindAppBinarty()
QTEST_MAIN(tst_deployment_mac)
-#include "tst_deployment_mac.moc" \ No newline at end of file
+#include "tst_deployment_mac.moc"
diff --git a/tools/qdoc3/cppcodemarker.cpp b/tools/qdoc3/cppcodemarker.cpp
index 585d6ce..b3dc31a 100644
--- a/tools/qdoc3/cppcodemarker.cpp
+++ b/tools/qdoc3/cppcodemarker.cpp
@@ -955,7 +955,7 @@ QString CppCodeMarker::addMarkUp(const QString &in,
ident += ch;
finish = i;
readChar();
- } while (ch >= 0 && isalnum(ch) || ch == '_');
+ } while (isalnum(ch) || ch == '_');
if (classRegExp.exactMatch(ident)) {
tag = QLatin1String("type");
diff --git a/tools/qdoc3/ditaxmlgenerator.cpp b/tools/qdoc3/ditaxmlgenerator.cpp
index ae7385e..fc66923 100644
--- a/tools/qdoc3/ditaxmlgenerator.cpp
+++ b/tools/qdoc3/ditaxmlgenerator.cpp
@@ -62,6 +62,25 @@ QT_BEGIN_NAMESPACE
#define COMMAND_VERSION Doc::alias("version")
int DitaXmlGenerator::id = 0;
+QString DitaXmlGenerator::sinceTitles[] =
+ {
+ " New Namespaces",
+ " New Classes",
+ " New Member Functions",
+ " New Functions in Namespaces",
+ " New Global Functions",
+ " New Macros",
+ " New Enum Types",
+ " New Typedefs",
+ " New Properties",
+ " New Variables",
+ " New QML Elements",
+ " New Qml Properties",
+ " New Qml Signals",
+ " New Qml Methods",
+ ""
+ };
+
/*
The strings in this array must appear in the same order as
the values in enum DitaXmlGenerator::DitaTag.
@@ -2098,9 +2117,10 @@ DitaXmlGenerator::generateClassLikeNode(const InnerNode* inner, CodeMarker* mark
generateSince(qcn, marker);
enterSection("h2","Detailed Description");
generateBody(qcn, marker);
- if (cn)
+ if (cn) {
generateQmlText(cn->doc().body(), cn, marker, qcn->name());
- generateAlsoList(cn, marker);
+ generateAlsoList(cn, marker);
+ }
leaveSection();
leaveSection(); // </apiDesc>
@@ -3933,6 +3953,70 @@ void DitaXmlGenerator::findAllClasses(const InnerNode* node)
}
}
+/*!
+ For generating the "New Classes... in 4.x" section on the
+ What's New in 4.x" page.
+ */
+void DitaXmlGenerator::findAllSince(const InnerNode* node)
+{
+ NodeList::const_iterator child = node->childNodes().constBegin();
+ while (child != node->childNodes().constEnd()) {
+ QString sinceVersion = (*child)->since();
+ if (((*child)->access() != Node::Private) && !sinceVersion.isEmpty()) {
+ NewSinceMaps::iterator nsmap = newSinceMaps.find(sinceVersion);
+ if (nsmap == newSinceMaps.end())
+ nsmap = newSinceMaps.insert(sinceVersion,NodeMultiMap());
+ NewClassMaps::iterator ncmap = newClassMaps.find(sinceVersion);
+ if (ncmap == newClassMaps.end())
+ ncmap = newClassMaps.insert(sinceVersion,NodeMap());
+ NewClassMaps::iterator nqcmap = newQmlClassMaps.find(sinceVersion);
+ if (nqcmap == newQmlClassMaps.end())
+ nqcmap = newQmlClassMaps.insert(sinceVersion,NodeMap());
+
+ if ((*child)->type() == Node::Function) {
+ FunctionNode *func = static_cast<FunctionNode *>(*child);
+ if ((func->status() > Node::Obsolete) &&
+ (func->metaness() != FunctionNode::Ctor) &&
+ (func->metaness() != FunctionNode::Dtor)) {
+ nsmap.value().insert(func->name(),(*child));
+ }
+ }
+ else if ((*child)->url().isEmpty()) {
+ if ((*child)->type() == Node::Class && !(*child)->doc().isEmpty()) {
+ QString className = (*child)->name();
+ if ((*child)->parent() &&
+ (*child)->parent()->type() == Node::Namespace &&
+ !(*child)->parent()->name().isEmpty())
+ className = (*child)->parent()->name()+"::"+className;
+ nsmap.value().insert(className,(*child));
+ ncmap.value().insert(className,(*child));
+ }
+ else if ((*child)->subType() == Node::QmlClass) {
+ QString className = (*child)->name();
+ if ((*child)->parent() &&
+ (*child)->parent()->type() == Node::Namespace &&
+ !(*child)->parent()->name().isEmpty())
+ className = (*child)->parent()->name()+"::"+className;
+ nsmap.value().insert(className,(*child));
+ nqcmap.value().insert(className,(*child));
+ }
+ }
+ else {
+ QString name = (*child)->name();
+ if ((*child)->parent() &&
+ (*child)->parent()->type() == Node::Namespace &&
+ !(*child)->parent()->name().isEmpty())
+ name = (*child)->parent()->name()+"::"+name;
+ nsmap.value().insert(name,(*child));
+ }
+ if ((*child)->isInnerNode()) {
+ findAllSince(static_cast<InnerNode *>(*child));
+ }
+ }
+ ++child;
+ }
+}
+
void DitaXmlGenerator::findAllFunctions(const InnerNode* node)
{
NodeList::ConstIterator c = node->childNodes().begin();
diff --git a/tools/qdoc3/ditaxmlgenerator.h b/tools/qdoc3/ditaxmlgenerator.h
index d8d3563..408f46c 100644
--- a/tools/qdoc3/ditaxmlgenerator.h
+++ b/tools/qdoc3/ditaxmlgenerator.h
@@ -51,6 +51,12 @@
QT_BEGIN_NAMESPACE
+typedef QMultiMap<QString, Node*> NodeMultiMap;
+typedef QMap<QString, NodeMultiMap> NewSinceMaps;
+typedef QMap<Node*, NodeMultiMap> ParentMaps;
+typedef QMap<QString, const Node*> NodeMap;
+typedef QMap<QString, NodeMap> NewClassMaps;
+
typedef QMap<QString, QString> GuidMap;
typedef QMap<QString, GuidMap*> GuidMaps;
@@ -412,6 +418,7 @@ class DitaXmlGenerator : public PageGenerator
void findAllFunctions(const InnerNode *node);
void findAllLegaleseTexts(const InnerNode *node);
void findAllNamespaces(const InnerNode *node);
+ void findAllSince(const InnerNode *node);
static int hOffset(const Node *node);
static bool isThreeColumnEnumValueTable(const Atom *atom);
virtual QString getLink(const Atom *atom,
@@ -508,6 +515,10 @@ class DitaXmlGenerator : public PageGenerator
#endif
QMap<QString, NodeMap > funcIndex;
QMap<Text, const Node*> legaleseTexts;
+ NewSinceMaps newSinceMaps;
+ static QString sinceTitles[];
+ NewClassMaps newClassMaps;
+ NewClassMaps newQmlClassMaps;
static int id;
static QString ditaTags[];
QStack<QXmlStreamWriter*> xmlWriterStack;
diff --git a/tools/qdoc3/doc.cpp b/tools/qdoc3/doc.cpp
index 37f68f8..479931d 100644
--- a/tools/qdoc3/doc.cpp
+++ b/tools/qdoc3/doc.cpp
@@ -828,7 +828,7 @@ void DocParser::parse(const QString& source,
append(Atom::AnnotatedList, getArgument());
break;
case CMD_SINCELIST:
- append(Atom::SinceList, getRestOfLine().simplified());
+ append(Atom::SinceList, getArgument());
break;
case CMD_GENERATELIST:
append(Atom::GeneratedList, getArgument());
diff --git a/tools/qdoc3/doc/config/images/arrow_down.png b/tools/qdoc3/doc/config/images/arrow_down.png
new file mode 100644
index 0000000..9d01e97
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/arrow_down.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/bg_l.png b/tools/qdoc3/doc/config/images/bg_l.png
new file mode 100755
index 0000000..90b1da1
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/bg_l.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/bg_l_blank.png b/tools/qdoc3/doc/config/images/bg_l_blank.png
new file mode 100755
index 0000000..5a9673d
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/bg_l_blank.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/bg_ll_blank.png b/tools/qdoc3/doc/config/images/bg_ll_blank.png
new file mode 100644
index 0000000..95a1c45
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/bg_ll_blank.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/bg_r.png b/tools/qdoc3/doc/config/images/bg_r.png
new file mode 100755
index 0000000..f0fb121
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/bg_r.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/bg_ul_blank.png b/tools/qdoc3/doc/config/images/bg_ul_blank.png
new file mode 100644
index 0000000..7051261
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/bg_ul_blank.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/box_bg.png b/tools/qdoc3/doc/config/images/box_bg.png
new file mode 100755
index 0000000..3322f92
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/box_bg.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/breadcrumb.png b/tools/qdoc3/doc/config/images/breadcrumb.png
new file mode 100755
index 0000000..0ded551
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/breadcrumb.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/bullet_dn.png b/tools/qdoc3/doc/config/images/bullet_dn.png
new file mode 100644
index 0000000..f776247
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/bullet_dn.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/bullet_gt.png b/tools/qdoc3/doc/config/images/bullet_gt.png
new file mode 100755
index 0000000..7561b4e
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/bullet_gt.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/bullet_sq.png b/tools/qdoc3/doc/config/images/bullet_sq.png
new file mode 100755
index 0000000..a84845e
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/bullet_sq.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/bullet_up.png b/tools/qdoc3/doc/config/images/bullet_up.png
new file mode 100644
index 0000000..7de2f06
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/bullet_up.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/feedbackground.png b/tools/qdoc3/doc/config/images/feedbackground.png
new file mode 100755
index 0000000..3a38d99
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/feedbackground.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/header_bg.png b/tools/qdoc3/doc/config/images/header_bg.png
new file mode 100644
index 0000000..a436aa6
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/header_bg.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/horBar.png b/tools/qdoc3/doc/config/images/horBar.png
new file mode 100755
index 0000000..100fe91
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/horBar.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/page.png b/tools/qdoc3/doc/config/images/page.png
new file mode 100644
index 0000000..1db151b
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/page.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/page_bg.png b/tools/qdoc3/doc/config/images/page_bg.png
new file mode 100755
index 0000000..9b3bd99
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/page_bg.png
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/spinner.gif b/tools/qdoc3/doc/config/images/spinner.gif
new file mode 100644
index 0000000..1ed786f
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/spinner.gif
Binary files differ
diff --git a/tools/qdoc3/doc/config/images/sprites-combined.png b/tools/qdoc3/doc/config/images/sprites-combined.png
new file mode 100755
index 0000000..3a48b21
--- /dev/null
+++ b/tools/qdoc3/doc/config/images/sprites-combined.png
Binary files differ
diff --git a/tools/qdoc3/generator.cpp b/tools/qdoc3/generator.cpp
index c20d2b4..3367301 100644
--- a/tools/qdoc3/generator.cpp
+++ b/tools/qdoc3/generator.cpp
@@ -77,25 +77,6 @@ QString Generator::outDir;
QString Generator::project;
QHash<QString, QString> Generator::outputPrefixes;
-QString Generator::sinceTitles[] =
- {
- " New Namespaces",
- " New Classes",
- " New Member Functions",
- " New Functions in Namespaces",
- " New Global Functions",
- " New Macros",
- " New Enum Types",
- " New Typedefs",
- " New Properties",
- " New Variables",
- " New QML Elements",
- " New QML Properties",
- " New QML Signals",
- " New QML Methods",
- ""
- };
-
static void singularPlural(Text& text, const NodeList& nodes)
{
if (nodes.count() == 1)
@@ -779,18 +760,8 @@ QString Generator::typeString(const Node *node)
case Node::Class:
return "class";
case Node::Fake:
- {
- switch (node->subType()) {
- case Node::QmlClass:
- return "element";
- case Node::QmlPropertyGroup:
- return "property group";
- case Node::QmlBasicType:
- return "type";
- default:
- return "documentation";
- }
- }
+ default:
+ return "documentation";
case Node::Enum:
return "enum";
case Node::Typedef:
@@ -799,8 +770,6 @@ QString Generator::typeString(const Node *node)
return "function";
case Node::Property:
return "property";
- default:
- return "documentation";
}
}
@@ -1122,21 +1091,11 @@ void Generator::generateSince(const Node *node, CodeMarker *marker)
text << " was introduced or modified in ";
else
text << " was introduced in ";
-
- QStringList since = node->since().split(" ");
- if (since.count() == 1) {
- // Handle legacy use of \since <version>.
- if (project.isEmpty())
- text << "version";
- else
- text << project;
- text << " " << since[0];
- } else {
- // Reconstruct the <project> <version> string.
- text << " " << since.join(" ");
- }
-
- text << "." << Atom::ParaRight;
+ if (project.isEmpty())
+ text << "version";
+ else
+ text << project;
+ text << " " << node->since() << "." << Atom::ParaRight;
generateText(text, node, marker);
}
}
@@ -1387,91 +1346,4 @@ QStringList Generator::getMetadataElements(const InnerNode* inner, const QString
return s;
}
-/*!
- For generating the "New Classes... in 4.6" section on the
- What's New in 4.6" page.
- */
-void Generator::findAllSince(const InnerNode *node)
-{
- NodeList::const_iterator child = node->childNodes().constBegin();
-
- // Traverse the tree, starting at the node supplied.
-
- while (child != node->childNodes().constEnd()) {
-
- QString sinceString = (*child)->since();
-
- if (((*child)->access() != Node::Private) && !sinceString.isEmpty()) {
-
- // Insert a new entry into each map for each new since string found.
- NewSinceMaps::iterator nsmap = newSinceMaps.find(sinceString);
- if (nsmap == newSinceMaps.end())
- nsmap = newSinceMaps.insert(sinceString,NodeMultiMap());
-
- NewClassMaps::iterator ncmap = newClassMaps.find(sinceString);
- if (ncmap == newClassMaps.end())
- ncmap = newClassMaps.insert(sinceString,NodeMap());
-
- NewClassMaps::iterator nqcmap = newQmlClassMaps.find(sinceString);
- if (nqcmap == newQmlClassMaps.end())
- nqcmap = newQmlClassMaps.insert(sinceString,NodeMap());
-
- if ((*child)->type() == Node::Function) {
- // Insert functions into the general since map.
- FunctionNode *func = static_cast<FunctionNode *>(*child);
- if ((func->status() > Node::Obsolete) &&
- (func->metaness() != FunctionNode::Ctor) &&
- (func->metaness() != FunctionNode::Dtor)) {
- nsmap.value().insert(func->name(),(*child));
- }
- }
- else if ((*child)->url().isEmpty()) {
- if ((*child)->type() == Node::Class && !(*child)->doc().isEmpty()) {
- // Insert classes into the since and class maps.
- QString className = (*child)->name();
- if ((*child)->parent() &&
- (*child)->parent()->type() == Node::Namespace &&
- !(*child)->parent()->name().isEmpty())
- className = (*child)->parent()->name()+"::"+className;
-
- nsmap.value().insert(className,(*child));
- ncmap.value().insert(className,(*child));
- }
- else if ((*child)->subType() == Node::QmlClass) {
- // Insert QML elements into the since and element maps.
- QString className = (*child)->name();
- if ((*child)->parent() &&
- (*child)->parent()->type() == Node::Namespace &&
- !(*child)->parent()->name().isEmpty())
- className = (*child)->parent()->name()+"::"+className;
-
- nsmap.value().insert(className,(*child));
- nqcmap.value().insert(className,(*child));
- }
- else if ((*child)->type() == Node::QmlProperty) {
- // Insert QML properties into the since map.
- QString propertyName = (*child)->name();
- nsmap.value().insert(propertyName,(*child));
- }
- }
- else {
- // Insert external documents into the general since map.
- QString name = (*child)->name();
- if ((*child)->parent() &&
- (*child)->parent()->type() == Node::Namespace &&
- !(*child)->parent()->name().isEmpty())
- name = (*child)->parent()->name()+"::"+name;
-
- nsmap.value().insert(name,(*child));
- }
-
- // Find child nodes with since commands.
- if ((*child)->isInnerNode()) {
- findAllSince(static_cast<InnerNode *>(*child));
- }
- }
- ++child;
- }
-}
-
QT_END_NAMESPACE
diff --git a/tools/qdoc3/generator.h b/tools/qdoc3/generator.h
index e66915b..e5e9747 100644
--- a/tools/qdoc3/generator.h
+++ b/tools/qdoc3/generator.h
@@ -57,12 +57,6 @@
QT_BEGIN_NAMESPACE
-typedef QMap<QString, const Node*> NodeMap;
-typedef QMultiMap<QString, Node*> NodeMultiMap;
-typedef QMap<QString, NodeMultiMap> NewSinceMaps;
-typedef QMap<Node*, NodeMultiMap> ParentMaps;
-typedef QMap<QString, NodeMap> NewClassMaps;
-
class ClassNode;
class Config;
class CodeMarker;
@@ -158,7 +152,6 @@ class Generator
QString getMetadataElement(const InnerNode* inner, const QString& t);
QStringList getMetadataElements(const InnerNode* inner, const QString& t);
- void findAllSince(const InnerNode *node);
private:
void generateReimplementedFrom(const FunctionNode *func,
@@ -187,11 +180,6 @@ class Generator
const NodeList& subs,
CodeMarker *marker);
- static QString sinceTitles[];
- NewSinceMaps newSinceMaps;
- NewClassMaps newClassMaps;
- NewClassMaps newQmlClassMaps;
-
private:
QString amp;
QString lt;
diff --git a/tools/qdoc3/htmlgenerator.cpp b/tools/qdoc3/htmlgenerator.cpp
index 655c3b4..52da178 100644
--- a/tools/qdoc3/htmlgenerator.cpp
+++ b/tools/qdoc3/htmlgenerator.cpp
@@ -66,6 +66,25 @@ bool HtmlGenerator::debugging_on = false;
QString HtmlGenerator::divNavTop = "";
+QString HtmlGenerator::sinceTitles[] =
+ {
+ " New Namespaces",
+ " New Classes",
+ " New Member Functions",
+ " New Functions in Namespaces",
+ " New Global Functions",
+ " New Macros",
+ " New Enum Types",
+ " New Typedefs",
+ " New Properties",
+ " New Variables",
+ " New QML Elements",
+ " New QML Properties",
+ " New QML Signals",
+ " New QML Methods",
+ ""
+ };
+
static bool showBrokenLinks = false;
static QRegExp linkTag("(<@link node=\"([^\"]+)\">).*(</@link>)");
@@ -587,18 +606,14 @@ int HtmlGenerator::generateAtom(const Atom *atom,
ncmap = newClassMaps.find(atom->string());
NewClassMaps::const_iterator nqcmap;
nqcmap = newQmlClassMaps.find(atom->string());
-
if ((nsmap != newSinceMaps.constEnd()) && !nsmap.value().isEmpty()) {
QList<Section> sections;
QList<Section>::ConstIterator s;
-
for (int i=0; i<LastSinceType; ++i)
sections.append(Section(sinceTitle(i),QString(),QString(),QString()));
NodeMultiMap::const_iterator n = nsmap.value().constBegin();
-
while (n != nsmap.value().constEnd()) {
-
const Node* node = n.value();
switch (node->type()) {
case Node::Fake:
@@ -1331,7 +1346,6 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
// Generate brief text and status for modules.
generateBrief(fake, marker);
generateStatus(fake, marker);
- generateSince(fake, marker);
if (moduleNamespaceMap.contains(fake->name())) {
out() << "<a name=\"" << registerRef("namespaces") << "\"></a>" << divNavTop << "\n";
@@ -1348,7 +1362,6 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
// Generate brief text and status for modules.
generateBrief(fake, marker);
generateStatus(fake, marker);
- generateSince(fake, marker);
out() << "<ul>\n";
@@ -1380,7 +1393,6 @@ void HtmlGenerator::generateFakeNode(const FakeNode *fake, CodeMarker *marker)
generateQmlInherits(qml_cn, marker);
generateQmlInheritedBy(qml_cn, marker);
generateQmlInstantiates(qml_cn, marker);
- generateSince(qml_cn, marker);
QString allQmlMembersLink = generateAllQmlMembersFile(qml_cn, marker);
if (!allQmlMembersLink.isEmpty()) {
@@ -2230,6 +2242,9 @@ void HtmlGenerator::generateCompactList(const Node *relative,
for (int i=0; i<NumParagraphs; i++) // i = 0..36
paragraphOffset[i+1] = paragraphOffset[i] + paragraph[i].count();
+ int curParNr = 0;
+ int curParOffset = 0;
+
/*
Output the alphabet as a row of links.
*/
@@ -2247,12 +2262,8 @@ void HtmlGenerator::generateCompactList(const Node *relative,
Output a <div> element to contain all the <dl> elements.
*/
out() << "<div class=\"flowListDiv\">\n";
- numTableRows = 0;
-
- int curParNr = 0;
- int curParOffset = 0;
- for (int i=0; i<classMap.count(); i++) {
+ for (int i=0; i<classMap.count()-1; i++) {
while ((curParNr < NumParagraphs) &&
(curParOffset == paragraph[curParNr].count())) {
++curParNr;
@@ -2313,9 +2324,7 @@ void HtmlGenerator::generateCompactList(const Node *relative,
out() << "</dd>\n";
curParOffset++;
}
- if (classMap.count() > 0)
- out() << "</dl>\n";
-
+ out() << "</dl>\n";
out() << "</div>\n";
}
@@ -3348,6 +3357,70 @@ void HtmlGenerator::findAllClasses(const InnerNode *node)
}
}
+/*!
+ For generating the "New Classes... in 4.6" section on the
+ What's New in 4.6" page.
+ */
+void HtmlGenerator::findAllSince(const InnerNode *node)
+{
+ NodeList::const_iterator child = node->childNodes().constBegin();
+ while (child != node->childNodes().constEnd()) {
+ QString sinceVersion = (*child)->since();
+ if (((*child)->access() != Node::Private) && !sinceVersion.isEmpty()) {
+ NewSinceMaps::iterator nsmap = newSinceMaps.find(sinceVersion);
+ if (nsmap == newSinceMaps.end())
+ nsmap = newSinceMaps.insert(sinceVersion,NodeMultiMap());
+ NewClassMaps::iterator ncmap = newClassMaps.find(sinceVersion);
+ if (ncmap == newClassMaps.end())
+ ncmap = newClassMaps.insert(sinceVersion,NodeMap());
+ NewClassMaps::iterator nqcmap = newQmlClassMaps.find(sinceVersion);
+ if (nqcmap == newQmlClassMaps.end())
+ nqcmap = newQmlClassMaps.insert(sinceVersion,NodeMap());
+
+ if ((*child)->type() == Node::Function) {
+ FunctionNode *func = static_cast<FunctionNode *>(*child);
+ if ((func->status() > Node::Obsolete) &&
+ (func->metaness() != FunctionNode::Ctor) &&
+ (func->metaness() != FunctionNode::Dtor)) {
+ nsmap.value().insert(func->name(),(*child));
+ }
+ }
+ else if ((*child)->url().isEmpty()) {
+ if ((*child)->type() == Node::Class && !(*child)->doc().isEmpty()) {
+ QString className = (*child)->name();
+ if ((*child)->parent() &&
+ (*child)->parent()->type() == Node::Namespace &&
+ !(*child)->parent()->name().isEmpty())
+ className = (*child)->parent()->name()+"::"+className;
+ nsmap.value().insert(className,(*child));
+ ncmap.value().insert(className,(*child));
+ }
+ else if ((*child)->subType() == Node::QmlClass) {
+ QString className = (*child)->name();
+ if ((*child)->parent() &&
+ (*child)->parent()->type() == Node::Namespace &&
+ !(*child)->parent()->name().isEmpty())
+ className = (*child)->parent()->name()+"::"+className;
+ nsmap.value().insert(className,(*child));
+ nqcmap.value().insert(className,(*child));
+ }
+ }
+ else {
+ QString name = (*child)->name();
+ if ((*child)->parent() &&
+ (*child)->parent()->type() == Node::Namespace &&
+ !(*child)->parent()->name().isEmpty())
+ name = (*child)->parent()->name()+"::"+name;
+ nsmap.value().insert(name,(*child));
+ }
+ if ((*child)->isInnerNode()) {
+ findAllSince(static_cast<InnerNode *>(*child));
+ }
+ }
+ ++child;
+ }
+}
+
void HtmlGenerator::findAllFunctions(const InnerNode *node)
{
NodeList::ConstIterator c = node->childNodes().begin();
diff --git a/tools/qdoc3/htmlgenerator.h b/tools/qdoc3/htmlgenerator.h
index e36c562..70ec0b7 100644
--- a/tools/qdoc3/htmlgenerator.h
+++ b/tools/qdoc3/htmlgenerator.h
@@ -56,6 +56,12 @@
QT_BEGIN_NAMESPACE
+typedef QMultiMap<QString, Node*> NodeMultiMap;
+typedef QMap<QString, NodeMultiMap> NewSinceMaps;
+typedef QMap<Node*, NodeMultiMap> ParentMaps;
+typedef QMap<QString, const Node*> NodeMap;
+typedef QMap<QString, NodeMap> NewClassMaps;
+
class HelpProjectWriter;
class HtmlGenerator : public PageGenerator
@@ -218,6 +224,7 @@ class HtmlGenerator : public PageGenerator
void findAllFunctions(const InnerNode *node);
void findAllLegaleseTexts(const InnerNode *node);
void findAllNamespaces(const InnerNode *node);
+ void findAllSince(const InnerNode *node);
static int hOffset(const Node *node);
static bool isThreeColumnEnumValueTable(const Atom *atom);
virtual QString getLink(const Atom *atom,
@@ -285,6 +292,10 @@ class HtmlGenerator : public PageGenerator
NodeMap qmlClasses;
QMap<QString, NodeMap > funcIndex;
QMap<Text, const Node *> legaleseTexts;
+ NewSinceMaps newSinceMaps;
+ static QString sinceTitles[];
+ NewClassMaps newClassMaps;
+ NewClassMaps newQmlClassMaps;
static int id;
public:
static bool debugging_on;
diff --git a/tools/qdoc3/node.cpp b/tools/qdoc3/node.cpp
index 87bbd93..56d76d3 100644
--- a/tools/qdoc3/node.cpp
+++ b/tools/qdoc3/node.cpp
@@ -157,16 +157,6 @@ void Node::setLink(LinkType linkType, const QString &link, const QString &desc)
}
/*!
- Sets the information about the project and version a node was introduced
- in. The string is simplified, removing excess whitespace before being
- stored.
-*/
-void Node::setSince(const QString &since)
-{
- sinc = since.simplified();
-}
-
-/*!
Returns a string representing the access specifier.
*/
QString Node::accessString() const
@@ -555,7 +545,8 @@ void InnerNode::removeFromRelated()
*/
void InnerNode::deleteChildren()
{
- qDeleteAll(children);
+ NodeList childrenCopy = children; // `children` will be changed in ~Node()
+ qDeleteAll(childrenCopy);
}
/*!
diff --git a/tools/qdoc3/node.h b/tools/qdoc3/node.h
index cb16bea..e1e9440 100644
--- a/tools/qdoc3/node.h
+++ b/tools/qdoc3/node.h
@@ -151,7 +151,7 @@ class Node
void setDoc(const Doc& doc, bool replace = false);
void setStatus(Status status) { sta = status; }
void setThreadSafeness(ThreadSafeness safeness) { saf = safeness; }
- void setSince(const QString &since);
+ void setSince(const QString &since) { sinc = since; }
void setRelates(InnerNode* pseudoParent);
void setModuleName(const QString &module) { mod = module; }
void setLink(LinkType linkType, const QString &link, const QString &desc);
diff --git a/tools/qdoc3/puredocparser.cpp b/tools/qdoc3/puredocparser.cpp
index c7db1bf..0f21cbc 100644
--- a/tools/qdoc3/puredocparser.cpp
+++ b/tools/qdoc3/puredocparser.cpp
@@ -55,6 +55,11 @@ PureDocParser::~PureDocParser()
{
}
+QString PureDocParser::language()
+{
+ return "qdoc";
+}
+
QStringList PureDocParser::sourceFileNameFilter()
{
return QStringList("*.qdoc");
diff --git a/tools/qdoc3/puredocparser.h b/tools/qdoc3/puredocparser.h
index 7f0434d..814c829 100644
--- a/tools/qdoc3/puredocparser.h
+++ b/tools/qdoc3/puredocparser.h
@@ -64,6 +64,7 @@ public:
PureDocParser();
virtual ~PureDocParser();
+ virtual QString language();
virtual QStringList sourceFileNameFilter();
};
diff --git a/tools/qdoc3/qmlvisitor.cpp b/tools/qdoc3/qmlvisitor.cpp
index 98e188d..a8886de 100644
--- a/tools/qdoc3/qmlvisitor.cpp
+++ b/tools/qdoc3/qmlvisitor.cpp
@@ -69,18 +69,30 @@ QmlDocVisitor::~QmlDocVisitor()
QDeclarativeJS::AST::SourceLocation QmlDocVisitor::precedingComment(quint32 offset) const
{
- QDeclarativeJS::AST::SourceLocation currentLoc;
+ QListIterator<QDeclarativeJS::AST::SourceLocation> it(engine->comments());
+ it.toBack();
- foreach (const QDeclarativeJS::AST::SourceLocation &loc, engine->comments()) {
- if (loc.begin() >= offset)
+ while (it.hasPrevious()) {
+
+ QDeclarativeJS::AST::SourceLocation loc = it.previous();
+
+ if (loc.begin() <= lastEndOffset)
+ // Return if we reach the end of the preceding structure.
break;
- else if (loc.begin() > lastEndOffset && loc.end() < offset)
- currentLoc = loc;
- }
- if (currentLoc.isValid()) {
- QString comment = document.mid(currentLoc.offset, currentLoc.length);
- if (comment.startsWith("!") || comment.startsWith("*"))
- return currentLoc;
+
+ else if (usedComments.contains(loc.begin()))
+ // Return if we encounter a previously used comment.
+ break;
+
+ else if (loc.begin() > lastEndOffset && loc.end() < offset) {
+
+ // Only examine multiline comments in order to avoid snippet markers.
+ if (document.mid(loc.offset - 1, 1) == "*") {
+ QString comment = document.mid(loc.offset, loc.length);
+ if (comment.startsWith("!") || comment.startsWith("*"))
+ return loc;
+ }
+ }
}
return QDeclarativeJS::AST::SourceLocation();
@@ -93,20 +105,18 @@ void QmlDocVisitor::applyDocumentation(QDeclarativeJS::AST::SourceLocation locat
if (loc.isValid()) {
QString source = document.mid(loc.offset, loc.length);
- if (source.startsWith(QLatin1String("!")) ||
- (source.startsWith(QLatin1String("*")) &&
- source[1] != QLatin1Char('*'))) {
-
- Location start(filePath);
- start.setLineNo(loc.startLine);
- start.setColumnNo(loc.startColumn);
- Location finish(filePath);
- finish.setLineNo(loc.startLine);
- finish.setColumnNo(loc.startColumn);
-
- Doc doc(start, finish, source.mid(1), commands);
- node->setDoc(doc);
- }
+
+ Location start(filePath);
+ start.setLineNo(loc.startLine);
+ start.setColumnNo(loc.startColumn);
+ Location finish(filePath);
+ finish.setLineNo(loc.startLine);
+ finish.setColumnNo(loc.startColumn);
+
+ Doc doc(start, finish, source.mid(1), commands);
+ node->setDoc(doc);
+
+ usedComments.insert(loc.offset);
}
}
@@ -152,6 +162,11 @@ bool QmlDocVisitor::visit(QDeclarativeJS::AST::UiImportList *imports)
return true;
}
+void QmlDocVisitor::endVisit(QDeclarativeJS::AST::UiImportList *definition)
+{
+ lastEndOffset = definition->lastSourceLocation().end();
+}
+
/*!
Visits public member declarations, such as signals and properties.
These only include custom signals and properties.
diff --git a/tools/qdoc3/qmlvisitor.h b/tools/qdoc3/qmlvisitor.h
index 1d3a401..28821a9 100644
--- a/tools/qdoc3/qmlvisitor.h
+++ b/tools/qdoc3/qmlvisitor.h
@@ -57,6 +57,7 @@ public:
virtual ~QmlDocVisitor();
bool visit(QDeclarativeJS::AST::UiImportList *imports);
+ void endVisit(QDeclarativeJS::AST::UiImportList *definition);
bool visit(QDeclarativeJS::AST::UiObjectDefinition *definition);
void endVisit(QDeclarativeJS::AST::UiObjectDefinition *definition);
@@ -77,6 +78,7 @@ private:
QString document;
QList<QPair<QString, QString> > importList;
QSet<QString> commands;
+ QSet<quint32> usedComments;
Tree *tree;
InnerNode *current;
};
diff --git a/tools/qdoc3/test/qt-cpp-ignore.qdocconf b/tools/qdoc3/test/qt-cpp-ignore.qdocconf
index 044eef4..5b41ae3 100644
--- a/tools/qdoc3/test/qt-cpp-ignore.qdocconf
+++ b/tools/qdoc3/test/qt-cpp-ignore.qdocconf
@@ -73,7 +73,8 @@ Cpp.ignoretokens = QAXFACTORY_EXPORT \
Q_DECLARATIVE_EXPORT \
Q_GADGET \
QWEBKIT_EXPORT \
- Q_INVOKABLE
+ Q_INVOKABLE \
+ Q_DECL_CONSTEXPR
Cpp.ignoredirectives = Q_DECLARE_HANDLE \
Q_DECLARE_INTERFACE \
Q_DECLARE_METATYPE \
diff --git a/tools/qdoc3/test/qt-html-templates-online.qdocconf b/tools/qdoc3/test/qt-html-templates-online.qdocconf
index 03ed6fa..3584b68 100644
--- a/tools/qdoc3/test/qt-html-templates-online.qdocconf
+++ b/tools/qdoc3/test/qt-html-templates-online.qdocconf
@@ -181,16 +181,4 @@ HTML.footer = \
" <div id=\"blurpage\">\n" \
" </div>\n" \
"\n" \
- " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n" \
- " <script type=\"text/javascript\">\n" \
- " var _gaq = _gaq || [];\n" \
- " _gaq.push(['_setAccount', 'UA-4457116-5']);\n" \
- " _gaq.push(['_trackPageview']);\n" \
- " (function() {\n" \
- " var ga = document.createElement('script'); " \
- "ga.type = 'text/javascript'; ga.async = true;\n" \
- " ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + " \
- "'.google-analytics.com/ga.js';\n" \
- " var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n" \
- " })();\n" \
- " </script>\n"
+ " <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n"
diff --git a/tools/qdoc3/test/qt-project.qdocconf b/tools/qdoc3/test/qt-project.qdocconf
index fca6545..57bf797 100644
--- a/tools/qdoc3/test/qt-project.qdocconf
+++ b/tools/qdoc3/test/qt-project.qdocconf
@@ -105,7 +105,7 @@ exampledirs = $QT_SOURCE_TREE/doc/src \
$QT_SOURCE_TREE/examples/tutorials \
$QT_SOURCE_TREE \
$QT_SOURCE_TREE/qmake/examples \
- $QT_SOURCE_TREE/src/3rdparty/webkit/WebKit/qt/docs
+ $QT_SOURCE_TREE/src/3rdparty/webkit/Source/WebKit/qt/docs
imagedirs = $QT_SOURCE_TREE/doc/src/images \
$QT_SOURCE_TREE/examples \
$QT_SOURCE_TREE/doc/src/declarative/pics \
diff --git a/tools/qtconcurrent/codegenerator/src/codegenerator.cpp b/tools/qtconcurrent/codegenerator/src/codegenerator.cpp
index b8436b9..c81fe97 100644
--- a/tools/qtconcurrent/codegenerator/src/codegenerator.cpp
+++ b/tools/qtconcurrent/codegenerator/src/codegenerator.cpp
@@ -134,7 +134,7 @@ const Compound operator+(const Item &a, const char * const text)
const Compound operator+(const char * const text, const Item &b)
{
- return Compound(Text(text), b);
+ return Compound(Text(text), b);
}
-} \ No newline at end of file
+}
diff --git a/tools/qtestlib/wince/cetest/deployment.h b/tools/qtestlib/wince/cetest/deployment.h
index f3645e0..a5ef32d 100644
--- a/tools/qtestlib/wince/cetest/deployment.h
+++ b/tools/qtestlib/wince/cetest/deployment.h
@@ -72,4 +72,4 @@ private:
inline void DeploymentHandler::setConnection(AbstractRemoteConnection *connection) { m_connection = connection; }
inline AbstractRemoteConnection* DeploymentHandler::connection() const { return m_connection; }
-#endif \ No newline at end of file
+#endif