diff options
author | Geir Vattekar <geir.vattekar@nokia.com> | 2010-10-08 07:21:51 (GMT) |
---|---|---|
committer | Geir Vattekar <geir.vattekar@nokia.com> | 2010-10-08 07:21:51 (GMT) |
commit | 904b56a9cc810b340d1b7db81199fc0e15b4aab6 (patch) | |
tree | 5792edd70546f6500210164327d0014f147d1ffe | |
parent | 91396846206e6b41d32fa8a30888261581bd28dc (diff) | |
parent | 8130fcbffe365c0e019f45baae7f1b273d8e17e7 (diff) | |
download | Qt-904b56a9cc810b340d1b7db81199fc0e15b4aab6.zip Qt-904b56a9cc810b340d1b7db81199fc0e15b4aab6.tar.gz Qt-904b56a9cc810b340d1b7db81199fc0e15b4aab6.tar.bz2 |
Merge branch '4.7' of git@scm.dev.nokia.troll.no:qt/qt-doc-team into 4.7
136 files changed, 4199 insertions, 1297 deletions
diff --git a/config.tests/unix/icd/icd.cpp b/config.tests/unix/icd/icd.cpp index 19c171b..08ef115 100644 --- a/config.tests/unix/icd/icd.cpp +++ b/config.tests/unix/icd/icd.cpp @@ -39,9 +39,15 @@ ** ****************************************************************************/ -#include <libicd-network-wlan-dev.h> #include <wlancond.h> + #include <icd/dbus_api.h> +#include <icd/network_api_defines.h> + +#include <icd/osso-ic.h> +#include <icd/osso-ic-dbus.h> + +#include <conn_settings.h> int main(int, char **) { @@ -4902,9 +4902,8 @@ case "$XPLATFORM" in *symbian*) # Raptor does not support configure tests. # the main commands needed to compile; - (cd config.tests/symbian - mkdir -p rcomp - cd rcomp + (mkdir -p config.tests/symbian/rcomp + cd config.tests/symbian/rcomp rm -f rcomp_test.rsg touch rcomp_test.rpp rcomp_test.rsc rcomp_test.rss rcomp -u -m045,046,047 -s./rcomp_test.rpp -o./rcomp_test.rsc -h./rcomp_test.rsg -i./rcomp_test.rss 2>&1 > /dev/null @@ -5486,8 +5485,8 @@ if [ "$PLATFORM_X11" = "yes" -o "$PLATFORM_QWS" = "yes" ]; then # auto-detect icd support if [ "$CFG_GLIB" = "yes" -a "$CFG_ICD" != "no" ]; then if [ -n "$PKG_CONFIG" ]; then - QT_CFLAGS_CONNSETTINGS=`$PKG_CONFIG --cflags connsettings 2>/dev/null` - QT_LIBS_CONNSETTINGS=`$PKG_CONFIG --libs connsettings 2>/dev/null` + QT_CFLAGS_CONNSETTINGS=`$PKG_CONFIG --cflags connsettings icd2 2>/dev/null` + QT_LIBS_CONNSETTINGS=`$PKG_CONFIG --libs connsettings icd2 2>/dev/null` fi if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/icd "ICD" $L_FLAGS $I_FLAGS $l_FLAGS $QT_CFLAGS_CONNSETTINGS $QT_LIBS_CONNSETTINGS; then [ "$CFG_ICD" = "auto" ] && CFG_ICD=yes @@ -7225,7 +7224,14 @@ if [ "$CFG_SCRIPTTOOLS" = "yes" -a "$CFG_SCRIPT" = "no" ]; then exit 1 fi if [ "$CFG_SCRIPTTOOLS" = "auto" -a "$CFG_SCRIPT" != "no" ]; then - CFG_SCRIPTTOOLS="yes" + case "$XPLATFORM" in + symbian*) + CFG_SCRIPTTOOLS="no" + ;; + *) + CFG_SCRIPTTOOLS="yes" + ;; + esac elif [ "$CFG_SCRIPT" = "no" ]; then CFG_SCRIPTTOOLS="no" fi diff --git a/configure.exe b/configure.exe Binary files differindex e2f4331..f8d520a 100755 --- a/configure.exe +++ b/configure.exe diff --git a/demos/declarative/flickr/flickr.qml b/demos/declarative/flickr/flickr.qml index 1533c04..740ee35 100644 --- a/demos/declarative/flickr/flickr.qml +++ b/demos/declarative/flickr/flickr.qml @@ -109,7 +109,7 @@ Item { states: State { name: "DetailedView" PropertyChanges { target: views; x: -parent.width } - PropertyChanges { target: toolBar; button1Label: "More..." } + PropertyChanges { target: toolBar; button1Label: "View..." } PropertyChanges { target: toolBar onButton1Clicked: if (imageDetails.state=='') imageDetails.state='Back'; else imageDetails.state='' diff --git a/demos/declarative/flickr/mobile/ImageDetails.qml b/demos/declarative/flickr/mobile/ImageDetails.qml index 5dd3b4e..9d1464e 100644 --- a/demos/declarative/flickr/mobile/ImageDetails.qml +++ b/demos/declarative/flickr/mobile/ImageDetails.qml @@ -172,6 +172,8 @@ Flipable { states: State { name: "Back" PropertyChanges { target: itemRotation; angle: 180 } + PropertyChanges { target: toolBar; button2Visible: false } + PropertyChanges { target: toolBar; button1Label: "Back" } } transitions: Transition { diff --git a/demos/declarative/flickr/mobile/ToolBar.qml b/demos/declarative/flickr/mobile/ToolBar.qml index 55f19d2..d8abb14 100644 --- a/demos/declarative/flickr/mobile/ToolBar.qml +++ b/demos/declarative/flickr/mobile/ToolBar.qml @@ -46,20 +46,24 @@ Item { property alias button1Label: button1.text property alias button2Label: button2.text + property alias button2Visible: button2.visible + signal button1Clicked signal button2Clicked BorderImage { source: "images/titlebar.sci"; width: parent.width; height: parent.height + 14; y: -7 } - Button { - id: button1 - anchors.left: parent.left; anchors.leftMargin: 5; y: 3; width: 140; height: 32 - onClicked: toolbar.button1Clicked() - } + Row { + anchors.right: parent.right; anchors.rightMargin: 5; y: 3; height: 32; spacing: 30 + Button { + id: button1 + width: 140; height: 32 + onClicked: toolbar.button1Clicked() + } - Button { - id: button2 - anchors.right: parent.right; anchors.rightMargin: 5; y: 3; width: 140; height: 32 - onClicked: toolbar.button2Clicked() + Button { + id: button2; width: 140; height: 32 + onClicked: toolbar.button2Clicked() + } } } diff --git a/demos/declarative/minehunt/main.cpp b/demos/declarative/minehunt/main.cpp index 8bbaee9..2b286ef 100644 --- a/demos/declarative/minehunt/main.cpp +++ b/demos/declarative/minehunt/main.cpp @@ -58,7 +58,7 @@ int main(int argc, char *argv[]) canvas.setResizeMode(QDeclarativeView::SizeRootObjectToView); #endif canvas.engine()->rootContext()->setContextObject(game); - canvas.setSource(QString("minehunt.qml")); + canvas.setSource(QString("qrc:minehunt.qml")); QObject::connect(canvas.engine(), SIGNAL(quit()), &app, SLOT(quit())); #ifdef Q_OS_SYMBIAN diff --git a/demos/declarative/minehunt/minehunt.pro b/demos/declarative/minehunt/minehunt.pro index 7a491ab..753ca4e 100644 --- a/demos/declarative/minehunt/minehunt.pro +++ b/demos/declarative/minehunt/minehunt.pro @@ -6,6 +6,7 @@ CONFIG += qt plugin # Input HEADERS += minehunt.h SOURCES += main.cpp minehunt.cpp +RESOURCES = minehunt.qrc sources.files = minehunt.qml minehunt.pro MinehuntCore sources.path = $$[QT_INSTALL_DEMOS]/declarative/minehunt diff --git a/demos/declarative/minehunt/minehunt.qrc b/demos/declarative/minehunt/minehunt.qrc new file mode 100644 index 0000000..fa8e27d --- /dev/null +++ b/demos/declarative/minehunt/minehunt.qrc @@ -0,0 +1,20 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>minehunt.qml</file> + <file>MinehuntCore/Explosion.qml</file> + <file>MinehuntCore/Tile.qml</file> + <file>MinehuntCore/qmldir</file> + <file>MinehuntCore/pics/background.png</file> + <file>MinehuntCore/pics/back.png</file> + <file>MinehuntCore/pics/bomb-color.png</file> + <file>MinehuntCore/pics/bomb.png</file> + <file>MinehuntCore/pics/face-sad.png</file> + <file>MinehuntCore/pics/face-smile-big.png</file> + <file>MinehuntCore/pics/face-smile.png</file> + <file>MinehuntCore/pics/flag-color.png</file> + <file>MinehuntCore/pics/flag.png</file> + <file>MinehuntCore/pics/front.png</file> + <file>MinehuntCore/pics/quit.png</file> + <file>MinehuntCore/pics/star.png</file> +</qresource> +</RCC> diff --git a/demos/qmediaplayer/mediaplayer.cpp b/demos/qmediaplayer/mediaplayer.cpp index 3cb0616..97a8e35 100644 --- a/demos/qmediaplayer/mediaplayer.cpp +++ b/demos/qmediaplayer/mediaplayer.cpp @@ -716,7 +716,7 @@ void MediaPlayer::openFile() void MediaPlayer::bufferStatus(int percent) { - if (percent == 0 || percent == 100) + if (percent == 100) progressLabel->setText(QString()); else { QString str = QString::fromLatin1("(%1%)").arg(percent); diff --git a/demos/qtdemo/menumanager.cpp b/demos/qtdemo/menumanager.cpp index fe3c5aa..ea9146e 100644 --- a/demos/qtdemo/menumanager.cpp +++ b/demos/qtdemo/menumanager.cpp @@ -518,6 +518,7 @@ QString MenuManager::resolveExeFile(const QString &name) dir.cd(dirName); dir.cd(fileName); + fileName = fileName.split("/").last(); QFile unixFile(dir.path() + "/" + fileName); if (unixFile.exists()) return unixFile.fileName(); QFile winR(dir.path() + "\\release\\" + fileName + ".exe"); diff --git a/demos/qtdemo/xml/examples.xml b/demos/qtdemo/xml/examples.xml index 0ab048e..27f72bb 100644 --- a/demos/qtdemo/xml/examples.xml +++ b/demos/qtdemo/xml/examples.xml @@ -18,7 +18,7 @@ <example filename="boxes" name="Boxes" /> <example filename="sub-attaq" name="Sub-attaq" /> <example filename="spectrum" name="Spectrum Analyzer" /> - <example filename="declarative/minehunt" name="Minehunt" executable="false" qml="true"/> + <example filename="declarative/minehunt" name="Minehunt"/> <example filename="declarative/snake" name="Snake" executable="false" qml="true"/> <example filename="deform" name="Vector Deformation" /> <example filename="books" name="Books" /> diff --git a/demos/textedit/textedit.cpp b/demos/textedit/textedit.cpp index e1f24a1..165c97c 100644 --- a/demos/textedit/textedit.cpp +++ b/demos/textedit/textedit.cpp @@ -262,7 +262,7 @@ void TextEdit::setupEditActions() tb->addAction(a); menu->addAction(a); #ifndef QT_NO_CLIPBOARD - actionPaste->setEnabled(!QApplication::clipboard()->text().isEmpty()); + actionPaste->setEnabled(QApplication::clipboard()->mimeData()->hasText()); #endif } @@ -681,7 +681,7 @@ void TextEdit::cursorPositionChanged() void TextEdit::clipboardDataChanged() { #ifndef QT_NO_CLIPBOARD - actionPaste->setEnabled(!QApplication::clipboard()->text().isEmpty()); + actionPaste->setEnabled(QApplication::clipboard()->mimeData()->hasText()); #endif } diff --git a/dist/changes-4.7.1 b/dist/changes-4.7.1 index 2d79ac1..51a10a3 100644 --- a/dist/changes-4.7.1 +++ b/dist/changes-4.7.1 @@ -109,7 +109,11 @@ QtDBus QtMultimedia ------------ - + - QAudioOutput + * [QTBUG-11586] Support audio with more than two channels. + * [QTBUG-11755] Fixed outputing audio in push mode with ALSA. + * [QTBUG-11883] Fixed segmentation fault when closing a QAudioInput or + QAudioOutput. QtNetwork --------- @@ -304,7 +308,7 @@ Qt for Symbian * [QTBUG-4586] Fixed wrong paths in include/ActiveQt/headers.pri. * [QTBUG-11671] Fixed audio-backend detection in configure tests. - - qmake + - qmake & mkspecs * [QTBUG-13523] Added support for using -L notation in the LIBS variable when building with the symbian/linux-armcc or gcce mkspec. * [QTBUG-12851] Fix assertion on Windows when DESTDIR is empty in static @@ -314,6 +318,31 @@ Qt for Symbian .pro file. * [QTBUG-13081] vc[x]proj generators: support /MAP option without file name. + * [QTBUG-13902] Added support for unsigned smart installer package creation. + * [QTBUG-13991] No longer need to manually edit smart installer pkg file for publishing. + * [QT-3949] Load environment.prf from Symbian SDK if it exists there. + * [QTBUG-13499] Provide a way to compile with RVCT 4.0 using generated Makefile. + * [QTBUG-13336] Ignore MAKEFILE variable for Symbian abld and sbsv2 builds. + * [QTBUG-13363] Fix Symbian handling of projects with special characters in TARGET. + * [QTBUG-12762 & QTBUG-13307] Gcce building support for symbian-sbsv2 + * [QTBUG-13147] Added support for DEPLOYMENT.pkg_build_version + * [QTBUG-12884] Fix "installer_sis" and "deploy" targets when TARGET has path. + * [QTBUG-12879] Fix check to remove unnecessary deployments in Symbian. + * [QTBUG-12716] Make bld.inf target in Symbian mkspecs to depend on .pro file. + * [QTBUG-12715] Rename Symbian generated mmp/mk files to include target in filename. + * [QTBUG-12617] Fix package header in cases where VERSION doesn't contain all values. + * Fix run and runonphone targets for projects that have TARGET with path. + * Fix QT_LIBINFIX for QT_PLUGINS_BASE_DIR. + * No longer require PRE_TARGETDEPS items to be absolute for symbian-sbsv2 mkspec. + * Do smart command replacement for commands containing $$QMAKE_* + command variables, such as $$QMAKE_COPY, when generating bld.inf + extensions for QMAKE_EXTRA_* variables for symbian-sbsv2 mkspec. + + - s60installs + * Fixed qsymbianbearer.qtplugin exports in s60installs.pro. + + - patch_capabilities.pl + * [QTBUG-13760] Improved output of patch_capabilities.pl script. - QInputContext * [QTBUG-12949] Fixed a bug where passwords would not be committed when @@ -321,6 +350,23 @@ Qt for Symbian * [QTBUG-13472] Fixed crash in input methods when using symbols menu and numbers only. + - QDesktopWidget + * [QTBUG-14058] Fix QApplication::desktop()->availableGeometry(). + + - QtCore + * [QTBUG-13802] Symbian^4 platform detection for QSysInfo::symbianVersion(). + * [QTBUG-13612] Do not wait for QThread exit when destroying global statics. + * [QT-3895] Change RLibrary handle in QS60PluginResolver to be process wide. + * [QTBUG-11218] Fix QProcessManager destruction. + + - Qt Plugins + * [QT-3949] Remove pre-Symbian3 plugins from Symbian3 and later builds and + Check S60_VERSION instead of existence of certain files in bearer plugin. + + - Demos & Examples + * [QTBUG-13461] Remove some .pro statements left behind after IAP usage cleanup + * [QTBUG-12276] Assigned valid UID3 for fortuneserver example. + Qt for Windows CE ----------------- - Gui diff --git a/doc/src/development/qtestlib.qdoc b/doc/src/development/qtestlib.qdoc index 23d6670..cc5afd2 100644 --- a/doc/src/development/qtestlib.qdoc +++ b/doc/src/development/qtestlib.qdoc @@ -749,9 +749,10 @@ \section1 External Tools Tools for handling and visualizing test data are available as part of - the \l{qtestlib-tools} project on the Qt Labs Web site. These include - a tool for comparing performance data obtained from test runs and a - utility to generate Web-based graphs of performance data. + the qtestlib-tools project on the + \l{http://labs.qt.nokia.com/}{http://labs.qt.nokia.com/}Qt Labs Web site. + These include a tool for comparing performance data obtained from test + runs and a utility to generate Web-based graphs of performance data. See the \l{qtestlib-tools Announcement} for more information on these tools and a simple graphing example. diff --git a/doc/src/examples/basiclayouts.qdoc b/doc/src/examples/basiclayouts.qdoc index 1ecf394..cbc9297 100644 --- a/doc/src/examples/basiclayouts.qdoc +++ b/doc/src/examples/basiclayouts.qdoc @@ -66,7 +66,7 @@ horizontal layout. Next we use the \c createGridGroupBox() function to create a group box containing several line edits and a small text editor which are displayed in a grid layout. Finally, we use the - \c createFormGroupBox() function to createa a group box with + \c createFormGroupBox() function to create a group box with three labels and three input fields: a line edit, a combo box and a spin box. diff --git a/doc/src/getting-started/installation.qdoc b/doc/src/getting-started/installation.qdoc index 3eb761d..c6e79d9 100644 --- a/doc/src/getting-started/installation.qdoc +++ b/doc/src/getting-started/installation.qdoc @@ -392,10 +392,10 @@ must be run as root. */ /*! \page install-wince.html -\title Installing Qt on Windows CE +\title Installing Qt for Windows CE \ingroup installation \ingroup qtce -\brief How to install Qt on Windows CE. +\brief How to install Qt for Windows CE. \previouspage Installation \tableofcontents @@ -492,9 +492,9 @@ in the \l{Qt for Windows CE Requirements} document. */ /*! \page install-Symbian-installer.html -\title Installing Qt on the Symbian platform from a Binary Package +\title Installing Qt for the Symbian platform from a Binary Package \ingroup qtsymbian -\brief How to install Qt on the Symbian platform from a binary package. +\brief How to install Qt for the Symbian platform from a binary package. \previouspage Installation \tableofcontents @@ -551,10 +551,10 @@ Symbian platform, */ /*! \page install-Symbian.html -\title Installing Qt on the Symbian platform +\title Installing Qt for the Symbian platform \ingroup installation \ingroup qtsymbian -\brief How to install Qt on the Symbian platform. +\brief How to install Qt for the Symbian platform. \previouspage Installation \tableofcontents @@ -685,10 +685,10 @@ Binary Package} document. */ /*! \page install-Symbian-linux.html -\title Installing Qt on the Symbian platform using Linux (experimental) +\title Installing Qt for the Symbian platform using Linux (experimental) \ingroup installation \ingroup qtsymbian -\brief How to install Qt on the Symbian platform using Linux. +\brief How to install Qt for the Symbian platform using Linux. \previouspage Installation \tableofcontents diff --git a/doc/src/howtos/unix-signal-handlers.qdoc b/doc/src/howtos/unix-signal-handlers.qdoc index fe01772..ca34bfb 100644 --- a/doc/src/howtos/unix-signal-handlers.qdoc +++ b/doc/src/howtos/unix-signal-handlers.qdoc @@ -78,7 +78,7 @@ In your Unix signal handlers, you write a byte to the \e write end of a socket pair and return. This will cause the corresponding QSocketNotifier to emit its activated() signal, which will in turn - cause the appropriate Qt slott function to run. + cause the appropriate Qt slot function to run. \snippet doc/src/snippets/code/doc_src_unix-signal-handlers.qdoc 3 diff --git a/doc/src/overviews.qdoc b/doc/src/overviews.qdoc index 7b02f1a..b9bd3b4 100644 --- a/doc/src/overviews.qdoc +++ b/doc/src/overviews.qdoc @@ -54,7 +54,7 @@ \brief The Qt components for constructing native look & feel desktop UI's. These pages are about Qt's traditional set of GUI components for - building both native look ^ feel and custom UI's for the desktop + building both native look & feel and custom UI's for the desktop environment. Use \l{Qt Quick} for building UI's for mobile devices. \generatelist {related} diff --git a/doc/src/platforms/supported-platforms.qdoc b/doc/src/platforms/supported-platforms.qdoc index e7de4c3..31866c4 100644 --- a/doc/src/platforms/supported-platforms.qdoc +++ b/doc/src/platforms/supported-platforms.qdoc @@ -115,8 +115,8 @@ \o gcc (\l{http://www.scratchbox.org/}{Scratchbox)} \row \o Windows CE 5.0 (ARMv4i, x86, MIPS) \o MSVC 2005 WinCE 5.0 Standard (x86, pocket, smart, mipsii) - \row \o Windows CE 6.0 (ARMv4i, x86, MIPS) - \o MSVC 2008 WinCE 6.0 Professional + \row \o Windows Embedded CE 6.0 (ARMv4i, x86, MIPS) + \o MSVC 2008 WinCE Embedded 6.0 Professional \row \o Maemo 5(Linux, ARM, X11) \o gcc (\l{http://www.scratchbox.org/}{Scratchbox)} \row \o Symbian (Symbian/S60 3.1, 3.2) diff --git a/doc/src/template/style/style.css b/doc/src/template/style/style.css index 3dcea96..ec0202a 100755 --- a/doc/src/template/style/style.css +++ b/doc/src/template/style/style.css @@ -664,6 +664,7 @@ #resultdialog.active { display: block; + width:30%; } #resultdialog #resultclose { diff --git a/examples/declarative/i18n/i18n.qml b/examples/declarative/i18n/i18n.qml index 8dac88d..219deda 100644 --- a/examples/declarative/i18n/i18n.qml +++ b/examples/declarative/i18n/i18n.qml @@ -65,7 +65,8 @@ Rectangle { anchors.fill: parent; spacing: 20 Text { - text: "If a translation is available for the system language (eg. French) then the string below will translated (eg. 'Bonjour'). Otherwise it will show 'Hello'." + text: "If a translation is available for the system language (eg. French) then the + string below will translated (eg. 'Bonjour'). Otherwise it will show 'Hello'." width: parent.width; wrapMode: Text.WordWrap } diff --git a/mkspecs/features/symbian/symbian_building.prf b/mkspecs/features/symbian/symbian_building.prf index 539609d..614fb65 100644 --- a/mkspecs/features/symbian/symbian_building.prf +++ b/mkspecs/features/symbian/symbian_building.prf @@ -187,9 +187,11 @@ contains(TEMPLATE, app):!contains(QMAKE_LINK, "^@:.*") { linux-armcc: { QMAKE_LIBS += usrt2_2.lib dfpaeabi.dso dfprvct2_2.dso drtaeabi.dso scppnwdl.dso drtrvct2_2.dso h_t__uf.l\\(switch8.o\\) QMAKE_LIBS += -leexe.lib\\(uc_exe_.o\\) - contains(CONFIG, "qt"):contains(QT, "core") { #if linking with QtCore + contains(CONFIG, "qt"):contains(QT, "gui") { #if linking with QtCore + QMAKE_LIBS -= -lqtmain$${QT_LIBINFIX}.lib QMAKE_LIBS += -lqtmain$${QT_LIBINFIX}.lib } else { + QMAKE_LIBS -= -llibcrt0.lib QMAKE_LIBS += -llibcrt0.lib } } else :linux-gcce { @@ -197,9 +199,12 @@ contains(TEMPLATE, app):!contains(QMAKE_LINK, "^@:.*") { QMAKE_LIBS += \ -l:eexe.lib \ -l:usrt2_2.lib - contains(CONFIG, "qt"):contains(QT, "core") { #if linking with QtCore + contains(CONFIG, "qt"):contains(QT, "gui") { #if linking with QtCore + QMAKE_LIBS -= -l:qtmain$${QT_LIBINFIX}.lib QMAKE_LIBS += -l:qtmain$${QT_LIBINFIX}.lib } else { + QMAKE_LIBS -= -l:libcrt0.lib + QMAKE_LIBS -= -l:libcrt0_gcce.lib QMAKE_LIBS += -l:libcrt0_gcce.lib } QMAKE_LIBS += \ diff --git a/mkspecs/linux-g++-maemo/qplatformdefs.h b/mkspecs/linux-g++-maemo/qplatformdefs.h index d7feb9e..df6152a 100644 --- a/mkspecs/linux-g++-maemo/qplatformdefs.h +++ b/mkspecs/linux-g++-maemo/qplatformdefs.h @@ -42,3 +42,4 @@ #include "../linux-g++/qplatformdefs.h" #define QT_GUI_DOUBLE_CLICK_RADIUS 20 +#define QT_GUI_DRAG_DISTANCE 16 diff --git a/qmake/generators/unix/unixmake.cpp b/qmake/generators/unix/unixmake.cpp index da4bbb7..71a6061 100644 --- a/qmake/generators/unix/unixmake.cpp +++ b/qmake/generators/unix/unixmake.cpp @@ -636,11 +636,13 @@ UnixMakefileGenerator::processPrlFiles() if(opt.startsWith("-L") || (Option::target_mode == Option::TARG_MACX_MODE && opt.startsWith("-F"))) { - if(lit == 0 || !lflags[arch].contains(opt)) - lflags[arch].append(opt); - } else if(opt.startsWith("-l")) { - if(lit == l.size()-1 || !lflags[arch].contains(opt)) + if(!lflags[arch].contains(opt)) lflags[arch].append(opt); + } else if(opt.startsWith("-l") || opt == "-pthread") { + // Make sure we keep the dependency-order of libraries + if (lflags[arch].contains(opt)) + lflags[arch].removeAll(opt); + lflags[arch].append(opt); } else if(Option::target_mode == Option::TARG_MACX_MODE && opt.startsWith("-framework")) { if(opt.length() > 11) opt = opt.mid(11); @@ -672,7 +674,7 @@ UnixMakefileGenerator::processPrlFiles() lflags[arch].append(opt); } } else if(!opt.isNull()) { - if(lit == 0 || l.lastIndexOf(opt, lit-1) == -1) + if(!lflags[arch].contains(opt)) lflags[arch].append(opt); } } diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp index 2505056..c963f46 100644 --- a/qmake/generators/win32/msbuild_objectmodel.cpp +++ b/qmake/generators/win32/msbuild_objectmodel.cpp @@ -377,6 +377,16 @@ inline XmlOutput::xml_output valueTagT( const triState v) } +static QString vcxCommandSeparator() +{ + // MSBuild puts the contents of the custom commands into a batch file and calls it. + // As we want every sub-command to be error-checked (as is done by makefile-based + // backends), we insert the checks ourselves, using the undocumented jump target. + static QString cmdSep = + QLatin1String("
if errorlevel 1 goto VCEnd
"); + return cmdSep; +} + // VCXCLCompilerTool ------------------------------------------------- VCXCLCompilerTool::VCXCLCompilerTool() : BrowseInformation(_False), @@ -2142,32 +2152,6 @@ VCXCustomBuildTool::VCXCustomBuildTool() XmlOutput &operator<<(XmlOutput &xml, const VCXCustomBuildTool &tool) { - // The code below offers two ways to split custom build step commands. - // Normally the $$escape_expand(\n\t) is used in a project file, which is correctly translated - // in all generators. However, if you use $$escape_expand(\n\r) (or \n\h) instead, the VCPROJ - // generator will instead of binding the commands with " && " will insert a proper newline into - // the VCPROJ file. We sometimes use this method of splitting commands if the custom buildstep - // contains a command-line which is too big to run on certain OS. - QString cmds; - int end = tool.CommandLine.count(); - for(int i = 0; i < end; ++i) { - QString cmdl = tool.CommandLine.at(i); - if (cmdl.contains("\r\t")) { - if (i == end - 1) - cmdl = cmdl.trimmed(); - cmdl.replace("\r\t", " && "); - } else if (cmdl.contains("\r\n")) { - ; - } else if (cmdl.contains("\r\\h")) { - // The above \r\n should work, but doesn't, so we have this hack - cmdl.replace("\r\\h", "\r\n"); - } else { - if (i < end - 1) - cmdl += " && "; - } - cmds += cmdl; - } - if ( !tool.AdditionalDependencies.isEmpty() ) { xml << tag("AdditionalInputs") @@ -2175,11 +2159,11 @@ XmlOutput &operator<<(XmlOutput &xml, const VCXCustomBuildTool &tool) << valueTagDefX(tool.AdditionalDependencies, "AdditionalInputs", ";"); } - if( !cmds.isEmpty() ) + if( !tool.CommandLine.isEmpty() ) { xml << tag("Command") << attrTag("Condition", QString("'$(Configuration)|$(Platform)'=='%1'").arg(tool.ConfigName)) - << valueTag(cmds); + << valueTag(tool.CommandLine.join(vcxCommandSeparator())); } if ( !tool.Description.isEmpty() ) @@ -2249,7 +2233,7 @@ XmlOutput &operator<<(XmlOutput &xml, const VCXEventTool &tool) { return xml << tag(tool.EventName) - << attrTagS(_Command, tool.CommandLine) + << attrTagS(_Command, tool.CommandLine.join(vcxCommandSeparator())) << attrTagS(_Message, tool.Description) << closetag(tool.EventName); } @@ -2525,7 +2509,7 @@ bool VCXFilter::addExtraCompiler(const VCXFilterFile &info) if (!CustomBuildTool.Description.isEmpty()) CustomBuildTool.Description += " & "; CustomBuildTool.Description += cmd_name; - CustomBuildTool.CommandLine += cmd.trimmed().split("\n", QString::SkipEmptyParts); + CustomBuildTool.CommandLine += VCToolBase::fixCommandLine(cmd.trimmed()); int space = cmd.indexOf(' '); QFileInfo finf(cmd.left(space)); if (CustomBuildTool.ToolPath.isEmpty()) diff --git a/qmake/generators/win32/msbuild_objectmodel.h b/qmake/generators/win32/msbuild_objectmodel.h index 567985d..acca6c1 100644 --- a/qmake/generators/win32/msbuild_objectmodel.h +++ b/qmake/generators/win32/msbuild_objectmodel.h @@ -382,7 +382,7 @@ protected: public: // Variables - QString CommandLine; + QStringList CommandLine; QString Description; triState UseInBuild; QString EventName; diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp index 92e8aeb..907f8dc 100644 --- a/qmake/generators/win32/msvc_nmake.cpp +++ b/qmake/generators/win32/msvc_nmake.cpp @@ -310,10 +310,7 @@ void NmakeMakefileGenerator::writeBuildRulesPart(QTextStream &t) t << "\n\tsigntool sign /F " << signature << " $(DESTDIR_TARGET)"; } if(!project->isEmpty("QMAKE_POST_LINK")) { - if (useSignature) - t << " && " << var("QMAKE_POST_LINK"); - else - t << "\n\t" << var("QMAKE_POST_LINK"); + t << "\n\t" << var("QMAKE_POST_LINK"); } t << endl; } diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp index 980e686..f5ca1be 100644 --- a/qmake/generators/win32/msvc_objectmodel.cpp +++ b/qmake/generators/win32/msvc_objectmodel.cpp @@ -280,6 +280,24 @@ inline XmlOutput::xml_output attrX(const char *name, const QStringList &v, const return attr(name, v.join(s)); } +// VCToolBase ------------------------------------------------- +QStringList VCToolBase::fixCommandLine(const QString &input) +{ + // The splitting regexp is a bit bizarre for backwards compat reasons (why else ...). + return input.split(QRegExp(QLatin1String("\n\t|\r\\\\h|\r\n"))); +} + +static QString vcCommandSeparator() +{ + // MSVC transforms the build tree into a single batch file, simply pasting the contents + // of the custom commands into it, and putting an "if errorlevel goto" statement behind it. + // As we want every sub-command to be error-checked (as is done by makefile-based + // backends), we insert the checks ourselves, using the undocumented jump target. + static QString cmdSep = + QLatin1String("
if errorlevel 1 goto VCReportError
"); + return cmdSep; +} + // VCCLCompilerTool ------------------------------------------------- VCCLCompilerTool::VCCLCompilerTool() : AssemblerOutput(asmListingNone), @@ -1913,36 +1931,11 @@ VCCustomBuildTool::VCCustomBuildTool() XmlOutput &operator<<(XmlOutput &xml, const VCCustomBuildTool &tool) { - // The code below offers two ways to split custom build step commands. - // Normally the $$escape_expand(\n\t) is used in a project file, which is correctly translated - // in all generators. However, if you use $$escape_expand(\n\r) (or \n\h) instead, the VCPROJ - // generator will instead of binding the commands with " && " will insert a proper newline into - // the VCPROJ file. We sometimes use this method of splitting commands if the custom buildstep - // contains a command-line which is too big to run on certain OS. - QString cmds; - int end = tool.CommandLine.count(); - for(int i = 0; i < end; ++i) { - QString cmdl = tool.CommandLine.at(i); - if (cmdl.contains("\r\t")) { - if (i == end - 1) - cmdl = cmdl.trimmed(); - cmdl.replace("\r\t", " && "); - } else if (cmdl.contains("\r\n")) { - ; - } else if (cmdl.contains("\r\\h")) { - // The above \r\n should work, but doesn't, so we have this hack - cmdl.replace("\r\\h", "\r\n"); - } else { - if (i < end - 1) - cmdl += " && "; - } - cmds += cmdl; - } return xml << tag(_Tool) << attrS(_Name, tool.ToolName) << attrX(_AdditionalDependencies, tool.AdditionalDependencies, ";") - << attrS(_CommandLine, cmds) + << attrS(_CommandLine, tool.CommandLine.join(vcCommandSeparator())) << attrS(_Description, tool.Description) << attrX(_Outputs, tool.Outputs, ";") << attrS(_Path, tool.ToolPath) @@ -2002,7 +1995,7 @@ XmlOutput &operator<<(XmlOutput &xml, const VCEventTool &tool) << tag(_Tool) << attrS(_Name, tool.ToolName) << attrS(_Path, tool.ToolPath) - << attrS(_CommandLine, tool.CommandLine) + << attrS(_CommandLine, tool.CommandLine.join(vcCommandSeparator())) << attrS(_Description, tool.Description) << attrT(_ExcludedFromBuild, tool.ExcludedFromBuild) << closetag(_Tool); @@ -2296,7 +2289,7 @@ bool VCFilter::addExtraCompiler(const VCFilterFile &info) if (!CustomBuildTool.Description.isEmpty()) CustomBuildTool.Description += " & "; CustomBuildTool.Description += cmd_name; - CustomBuildTool.CommandLine += cmd.trimmed().split("\n", QString::SkipEmptyParts); + CustomBuildTool.CommandLine += VCToolBase::fixCommandLine(cmd.trimmed()); int space = cmd.indexOf(' '); QFileInfo finf(cmd.left(space)); if (CustomBuildTool.ToolPath.isEmpty()) diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h index 97f8570..22013e0 100644 --- a/qmake/generators/win32/msvc_objectmodel.h +++ b/qmake/generators/win32/msvc_objectmodel.h @@ -475,6 +475,7 @@ public: for (QStringList::ConstIterator it=options.begin(); (it!=options.end()); it++) parseOption((*it).toLatin1()); } + static QStringList fixCommandLine(const QString &input); }; class VCConfiguration; @@ -746,7 +747,7 @@ protected: public: // Variables - QString CommandLine; + QStringList CommandLine; QString Description; triState ExcludedFromBuild; QString ToolName; diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index 8686ae8..cff7a14 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -1027,37 +1027,23 @@ void VcprojGenerator::initPreBuildEventTools() { } -QString VcprojGenerator::fixCommandLine(DotNET version, const QString &input) const -{ - QString result = input; - - if (version >= NET2005) - result = result.replace(QLatin1Char('\n'), QLatin1String("
")); - - return result; -} - void VcprojGenerator::initPostBuildEventTools() { VCConfiguration &conf = vcProject.Configuration; if(!project->values("QMAKE_POST_LINK").isEmpty()) { - QString cmdline = fixCommandLine(conf.CompilerVersion, var("QMAKE_POST_LINK")); + QStringList cmdline = VCToolBase::fixCommandLine(var("QMAKE_POST_LINK")); conf.postBuild.CommandLine = cmdline; - if (conf.CompilerVersion < NET2005) - cmdline = cmdline.replace("\n", "&&"); - conf.postBuild.Description = cmdline; + conf.postBuild.Description = cmdline.join(QLatin1String("\r\n")); } QString signature = !project->isEmpty("SIGNATURE_FILE") ? var("SIGNATURE_FILE") : var("DEFAULT_SIGNATURE"); bool useSignature = !signature.isEmpty() && !project->isActiveConfig("staticlib") && !project->isEmpty("CE_SDK") && !project->isEmpty("CE_ARCH"); if(useSignature) - conf.postBuild.CommandLine.prepend(QLatin1String("signtool sign /F ") + signature + " \"$(TargetPath)\"\n" + - (!conf.postBuild.CommandLine.isEmpty() ? " && " : "")); + conf.postBuild.CommandLine.prepend( + QLatin1String("signtool sign /F ") + signature + QLatin1String(" \"$(TargetPath)\"")); if(!project->values("MSVCPROJ_COPY_DLL").isEmpty()) { - if(!conf.postBuild.CommandLine.isEmpty()) - conf.postBuild.CommandLine += " && "; conf.postBuild.Description += var("MSVCPROJ_COPY_DLL_DESC"); conf.postBuild.CommandLine += var("MSVCPROJ_COPY_DLL"); } @@ -1186,9 +1172,9 @@ void VcprojGenerator::initPreLinkEventTools() { VCConfiguration &conf = vcProject.Configuration; if(!project->values("QMAKE_PRE_LINK").isEmpty()) { - QString cmdline = fixCommandLine(conf.CompilerVersion, var("QMAKE_PRE_LINK")); - conf.preLink.Description = cmdline; + QStringList cmdline = VCToolBase::fixCommandLine(var("QMAKE_PRE_LINK")); conf.preLink.CommandLine = cmdline; + conf.preLink.Description = cmdline.join(QLatin1String("\r\n")); } } diff --git a/qmake/generators/win32/msvc_vcproj.h b/qmake/generators/win32/msvc_vcproj.h index 8f028a1..05e765e 100644 --- a/qmake/generators/win32/msvc_vcproj.h +++ b/qmake/generators/win32/msvc_vcproj.h @@ -130,7 +130,6 @@ protected: QList<VcprojGenerator*> mergedProjects; private: - QString fixCommandLine(DotNET version, const QString &input) const; QUuid increaseUUID(const QUuid &id); friend class VCFilter; }; diff --git a/qmake/generators/win32/msvc_vcxproj.cpp b/qmake/generators/win32/msvc_vcxproj.cpp index 271d9ae..396d2bf 100644 --- a/qmake/generators/win32/msvc_vcxproj.cpp +++ b/qmake/generators/win32/msvc_vcxproj.cpp @@ -380,9 +380,9 @@ void VcxprojGenerator::initPostBuildEventTools() { VCXConfiguration &conf = vcxProject.Configuration; if(!project->values("QMAKE_POST_LINK").isEmpty()) { - QString cmdline = var("QMAKE_POST_LINK"); + QStringList cmdline = VCToolBase::fixCommandLine(var("QMAKE_POST_LINK")); conf.postBuild.CommandLine = cmdline; - conf.postBuild.Description = cmdline; + conf.postBuild.Description = cmdline.join(QLatin1String("\r\n")); conf.postBuild.UseInBuild = _True; } @@ -390,14 +390,12 @@ void VcxprojGenerator::initPostBuildEventTools() bool useSignature = !signature.isEmpty() && !project->isActiveConfig("staticlib") && !project->isEmpty("CE_SDK") && !project->isEmpty("CE_ARCH"); if(useSignature) { - conf.postBuild.CommandLine.prepend(QLatin1String("signtool sign /F ") + signature + " \"$(TargetPath)\"\n" + - (!conf.postBuild.CommandLine.isEmpty() ? " && " : "")); + conf.postBuild.CommandLine.prepend( + QLatin1String("signtool sign /F ") + signature + QLatin1String(" \"$(TargetPath)\"")); conf.postBuild.UseInBuild = _True; } if(!project->values("MSVCPROJ_COPY_DLL").isEmpty()) { - if(!conf.postBuild.CommandLine.isEmpty()) - conf.postBuild.CommandLine += " && "; conf.postBuild.Description += var("MSVCPROJ_COPY_DLL_DESC"); conf.postBuild.CommandLine += var("MSVCPROJ_COPY_DLL"); conf.postBuild.UseInBuild = _True; @@ -530,9 +528,9 @@ void VcxprojGenerator::initPreLinkEventTools() { VCXConfiguration &conf = vcxProject.Configuration; if(!project->values("QMAKE_PRE_LINK").isEmpty()) { - QString cmdline = var("QMAKE_PRE_LINK"); - conf.preLink.Description = cmdline; + QStringList cmdline = VCToolBase::fixCommandLine(var("QMAKE_PRE_LINK")); conf.preLink.CommandLine = cmdline; + conf.preLink.Description = cmdline.join(QLatin1String("\r\n")); conf.preLink.UseInBuild = _True; } } diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog index fbaf5d2..fd6c3f7 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog +++ b/src/3rdparty/javascriptcore/JavaScriptCore/ChangeLog @@ -1,3 +1,24 @@ +2010-08-24 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Don't seed the JS random number generator from time() + https://bugs.webkit.org/show_bug.cgi?id=41868 + <rdar://problem/8171025> + + Switch to using the secure random number generator to + seed the fast random generator, and make the generator + be per global object. + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + * runtime/JSGlobalObject.h: + (JSC::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): + (JSC::JSGlobalObject::weakRandomNumber): + * runtime/MathObject.cpp: + (JSC::mathProtoFuncRandom): + 2010-06-18 Tucker Jay <jay.tucker@nokia.com> Reviewed by NOBODY (OOPS!). @@ -94,6 +115,16 @@ * wtf/Platform.h: +2010-05-06 Fumitoshi Ukai <ukai@chromium.org> + + Reviewed by Alexey Proskuryakov. + + JavaScriptCore/wtf/RandomNumber.h should provide using WTF::* + https://bugs.webkit.org/show_bug.cgi?id=38719 + + * wtf/RandomNumber.h: + Add using directives. + 2010-04-28 Simon Hausmann <simon.hausmann@nokia.com>, Kent Hansen <kent.hansen@nokia.com> Reviewed by Darin Adler. diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalData.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalData.cpp index 34b5f82..1c25c16 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalData.cpp +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalData.cpp @@ -144,7 +144,6 @@ JSGlobalData::JSGlobalData(bool isShared) , firstStringifierToMark(0) , markStack(jsArrayVPtr) , cachedUTCOffset(NaN) - , weakRandom(static_cast<int>(currentTime())) #ifndef NDEBUG , mainThreadOnly(false) #endif diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalData.h b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalData.h index 49a6c4c..dcd3289 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalData.h +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalData.h @@ -184,8 +184,6 @@ namespace JSC { UString cachedDateString; double cachedDateStringValue; - - WeakRandom weakRandom; #ifndef NDEBUG bool mainThreadOnly; diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h index 340e04d..7c20272 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSGlobalObject.h @@ -31,6 +31,7 @@ #include "StructureChain.h" #include <wtf/HashSet.h> #include <wtf/OwnPtr.h> +#include <wtf/RandomNumber.h> namespace JSC { @@ -91,6 +92,7 @@ namespace JSC { , datePrototype(0) , regExpPrototype(0) , methodCallDummy(0) + , weakRandom(static_cast<unsigned>(randomNumber() * (std::numeric_limits<unsigned>::max() + 1.0))) { } @@ -154,6 +156,7 @@ namespace JSC { RefPtr<JSGlobalData> globalData; HashSet<GlobalCodeBlock*> codeBlocks; + WeakRandom weakRandom; }; public: @@ -271,6 +274,7 @@ namespace JSC { return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags)); } + double weakRandomNumber() { return d()->weakRandom.get(); } protected: static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | OverridesGetPropertyNames | JSVariableObject::StructureFlags; diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/MathObject.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/MathObject.cpp index 8f22fba..807cfe7 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/MathObject.cpp +++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/MathObject.cpp @@ -210,7 +210,7 @@ JSValue JSC_HOST_CALL mathProtoFuncPow(ExecState* exec, JSObject*, JSValue, cons JSValue JSC_HOST_CALL mathProtoFuncRandom(ExecState* exec, JSObject*, JSValue, const ArgList&) { - return jsDoubleNumber(exec, exec->globalData().weakRandom.get()); + return jsDoubleNumber(exec, exec->lexicalGlobalObject()->weakRandomNumber()); } JSValue JSC_HOST_CALL mathProtoFuncRound(ExecState* exec, JSObject*, JSValue, const ArgList& args) diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/RandomNumber.h b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/RandomNumber.h index fe1687c..e54e9ae 100644 --- a/src/3rdparty/javascriptcore/JavaScriptCore/wtf/RandomNumber.h +++ b/src/3rdparty/javascriptcore/JavaScriptCore/wtf/RandomNumber.h @@ -39,4 +39,7 @@ namespace WTF { } +using WTF::randomNumber; +using WTF::weakRandomNumber; + #endif diff --git a/src/3rdparty/javascriptcore/VERSION b/src/3rdparty/javascriptcore/VERSION index 6f5fb7c..9991ac0 100644 --- a/src/3rdparty/javascriptcore/VERSION +++ b/src/3rdparty/javascriptcore/VERSION @@ -4,8 +4,8 @@ This is a snapshot of JavaScriptCore from The commit imported was from the - javascriptcore-snapshot-28062010 branch/tag + javascriptcore-snapshot-05102010 branch/tag and has the sha1 checksum - 0fccd26d3624e80cf68873701ef70ad72ca66bec + 82ead85cfea5859044eeb25b33314dcc0fa5eea1 diff --git a/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp b/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp index 3702560..dfc5840 100644 --- a/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp +++ b/src/3rdparty/phonon/mmf/abstractmediaplayer.cpp @@ -51,10 +51,15 @@ MMF::AbstractMediaPlayer::AbstractMediaPlayer , m_parent(parent) , m_pending(NothingPending) , m_positionTimer(new QTimer(this)) + , m_position(0) , m_bufferStatusTimer(new QTimer(this)) , m_mmfMaxVolume(NullMaxVolume) , m_prefinishMarkSent(false) , m_aboutToFinishSent(false) +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD + , m_download(0) + , m_downloadStalled(false) +#endif { connect(m_positionTimer.data(), SIGNAL(timeout()), this, SLOT(positionTick())); connect(m_bufferStatusTimer.data(), SIGNAL(timeout()), this, SLOT(bufferStatusTick())); @@ -183,6 +188,7 @@ void MMF::AbstractMediaPlayer::seek(qint64 ms) } doSeek(ms); + m_position = ms; resetMarksIfRewound(); if(wasPlaying && state() != ErrorState) { @@ -207,6 +213,11 @@ bool MMF::AbstractMediaPlayer::isSeekable() const return true; } +qint64 MMF::AbstractMediaPlayer::currentTime() const +{ + return m_position; +} + void MMF::AbstractMediaPlayer::doSetTickInterval(qint32 interval) { TRACE_CONTEXT(AbstractMediaPlayer::doSetTickInterval, EAudioApi); @@ -247,7 +258,19 @@ void MMF::AbstractMediaPlayer::open() symbianErr = openFile(*file); if (KErrNone != symbianErr) errorMessage = tr("Error opening file"); - } else { + } +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD + else if (url.scheme() == QLatin1String("http")) { + Q_ASSERT(!m_download); + m_download = new Download(url, this); + connect(m_download, SIGNAL(lengthChanged(qint64)), + this, SLOT(downloadLengthChanged(qint64))); + connect(m_download, SIGNAL(stateChanged(Download::State)), + this, SLOT(downloadStateChanged(Download::State))); + m_download->start(); + } +#endif + else { symbianErr = openUrl(url.toString()); if (KErrNone != symbianErr) errorMessage = tr("Error opening URL"); @@ -288,6 +311,16 @@ void MMF::AbstractMediaPlayer::open() TRACE_EXIT_0(); } +void MMF::AbstractMediaPlayer::close() +{ + doClose(); +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD + delete m_download; + m_download = 0; +#endif + m_position = 0; +} + void MMF::AbstractMediaPlayer::volumeChanged(qreal volume) { TRACE_CONTEXT(AbstractMediaPlayer::volumeChanged, EAudioInternal); @@ -374,7 +407,8 @@ void MMF::AbstractMediaPlayer::bufferingComplete() { stopBufferStatusTimer(); emit MMF::AbstractPlayer::bufferStatus(100); - changeState(m_stateBeforeBuffering); + if (!progressiveDownloadStalled()) + changeState(m_stateBeforeBuffering); } void MMF::AbstractMediaPlayer::maxVolumeChanged(int mmfMaxVolume) @@ -385,13 +419,30 @@ void MMF::AbstractMediaPlayer::maxVolumeChanged(int mmfMaxVolume) void MMF::AbstractMediaPlayer::loadingComplete(int error) { - Q_ASSERT(Phonon::LoadingState == state()); - - if (KErrNone == error) { - updateMetaData(); - changeState(StoppedState); + TRACE_CONTEXT(AbstractMediaPlayer::loadingComplete, EAudioApi); + TRACE_ENTRY("state %d error %d", state(), error); + if (progressiveDownloadStalled()) { + Q_ASSERT(Phonon::BufferingState == state()); + if (KErrNone == error) { + bufferingComplete(); + doSeek(m_position); + startPlayback(); +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD + m_downloadStalled = false; +#endif + } } else { - setError(tr("Loading clip failed"), error); + Q_ASSERT(Phonon::LoadingState == state()); + if (KErrNone == error) { + updateMetaData(); + changeState(StoppedState); + } else { + if (isProgressiveDownload() && KErrCorrupt == error) { + setProgressiveDownloadStalled(); + } else { + setError(tr("Loading clip failed"), error); + } + } } } @@ -415,8 +466,12 @@ void MMF::AbstractMediaPlayer::playbackComplete(int error) QMetaObject::invokeMethod(m_parent, "switchToNextSource", Qt::QueuedConnection); } else { - setError(tr("Playback complete"), error); - emit finished(); + if (isProgressiveDownload() && KErrCorrupt == error) { + setProgressiveDownloadStalled(); + } else { + setError(tr("Playback complete"), error); + emit finished(); + } } } @@ -425,15 +480,36 @@ qint64 MMF::AbstractMediaPlayer::toMilliSeconds(const TTimeIntervalMicroSeconds return in.Int64() / 1000; } +bool MMF::AbstractMediaPlayer::isProgressiveDownload() const +{ +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD + return (0 != m_download); +#else + return false; +#endif +} + +bool MMF::AbstractMediaPlayer::progressiveDownloadStalled() const +{ +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD + return m_downloadStalled; +#else + return false; +#endif +} + //----------------------------------------------------------------------------- // Slots //----------------------------------------------------------------------------- void MMF::AbstractMediaPlayer::positionTick() { - const qint64 current = currentTime(); - emitMarksIfReached(current); - emit MMF::AbstractPlayer::tick(current); + const qint64 pos = getCurrentTime(); + if (pos > m_position) { + m_position = pos; + emitMarksIfReached(m_position); + emit MMF::AbstractPlayer::tick(m_position); + } } void MMF::AbstractMediaPlayer::emitMarksIfReached(qint64 current) @@ -458,7 +534,7 @@ void MMF::AbstractMediaPlayer::emitMarksIfReached(qint64 current) void MMF::AbstractMediaPlayer::resetMarksIfRewound() { - const qint64 current = currentTime(); + const qint64 current = getCurrentTime(); const qint64 total = totalTime(); const qint64 remaining = total - current; @@ -487,10 +563,74 @@ void MMF::AbstractMediaPlayer::startPlayback() changeState(PlayingState); } +void MMF::AbstractMediaPlayer::setProgressiveDownloadStalled() +{ +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD + TRACE_CONTEXT(AbstractMediaPlayer::setProgressiveDownloadStalled, EAudioApi); + TRACE_ENTRY("state %d", state()); + Q_ASSERT(isProgressiveDownload()); + m_downloadStalled = true; + doClose(); + bufferingStarted(); + // Video player loses window handle when closed - need to reapply it here + videoOutputChanged(); + m_download->resume(); +#endif +} + void MMF::AbstractMediaPlayer::bufferStatusTick() { - emit MMF::AbstractPlayer::bufferStatus(bufferStatus()); + // During progressive download, there is no way to detect the buffering status. + // Phonon does not support a "buffering; amount unknown" signal, therefore we + // return a buffering status of zero. + const int status = progressiveDownloadStalled() ? 0 : bufferStatus(); + emit MMF::AbstractPlayer::bufferStatus(status); +} + +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD +void MMF::AbstractMediaPlayer::downloadLengthChanged(qint64 length) +{ + TRACE_CONTEXT(AbstractMediaPlayer::downloadLengthChanged, EAudioApi); + TRACE_ENTRY("length %Ld", length); + Q_UNUSED(length) + if (m_downloadStalled) { + bufferingComplete(); + int err = m_parent->openFileHandle(m_download->targetFileName()); + if (KErrNone == err) + err = openFile(*m_parent->file()); + if (KErrNone != err) + setError(tr("Error opening file")); + } +} + +void MMF::AbstractMediaPlayer::downloadStateChanged(Download::State state) +{ + TRACE_CONTEXT(AbstractMediaPlayer::downloadStateChanged, EAudioApi); + TRACE_ENTRY("state %d", state); + switch (state) { + case Download::Idle: + case Download::Initializing: + break; + case Download::Downloading: + { + int err = m_parent->openFileHandle(m_download->targetFileName()); + if (KErrNone == err) + err = openFile(*m_parent->file()); + else if (KErrCorrupt == err) + // Insufficient data downloaded - enter Buffering state + setProgressiveDownloadStalled(); + if (KErrNone != err) + setError(tr("Error opening file")); + } + break; + case Download::Complete: + break; + case Download::Error: + setError(tr("Download error")); + break; + } } +#endif // PHONON_MMF_PROGRESSIVE_DOWNLOAD Phonon::State MMF::AbstractMediaPlayer::phononState(PrivateState state) const { diff --git a/src/3rdparty/phonon/mmf/abstractmediaplayer.h b/src/3rdparty/phonon/mmf/abstractmediaplayer.h index e795ecb..c3b4528 100644 --- a/src/3rdparty/phonon/mmf/abstractmediaplayer.h +++ b/src/3rdparty/phonon/mmf/abstractmediaplayer.h @@ -23,6 +23,9 @@ along with this library. If not, see <http://www.gnu.org/licenses/>. #include <QScopedPointer> #include <e32std.h> #include "abstractplayer.h" +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD +# include "download.h" +#endif class RFile; @@ -48,6 +51,7 @@ protected: public: virtual void open(); + virtual void close(); // MediaObjectInterface virtual void play(); @@ -55,6 +59,7 @@ public: virtual void stop(); virtual void seek(qint64 milliseconds); virtual bool isSeekable() const; + virtual qint64 currentTime() const; virtual void volumeChanged(qreal volume); protected: @@ -68,12 +73,15 @@ protected: virtual void doStop() = 0; virtual void doSeek(qint64 pos) = 0; virtual int setDeviceVolume(int mmfVolume) = 0; + virtual int openFile(const QString &fileName) = 0; virtual int openFile(RFile& file) = 0; virtual int openUrl(const QString& url) = 0; virtual int openDescriptor(const TDesC8 &des) = 0; virtual int bufferStatus() const = 0; + virtual void doClose() = 0; void updateMetaData(); + virtual qint64 getCurrentTime() const = 0; virtual int numberOfMetaDataEntries() const = 0; virtual QPair<QString, QString> metaDataEntry(int index) const = 0; @@ -86,6 +94,9 @@ protected: static qint64 toMilliSeconds(const TTimeIntervalMicroSeconds &); + bool isProgressiveDownload() const; + bool progressiveDownloadStalled() const; + private: void startPositionTimer(); void stopPositionTimer(); @@ -96,6 +107,7 @@ private: void emitMarksIfReached(qint64 position); void resetMarksIfRewound(); void startPlayback(); + void setProgressiveDownloadStalled(); enum Pending { NothingPending, @@ -108,6 +120,10 @@ private: private Q_SLOTS: void positionTick(); void bufferStatusTick(); +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD + void downloadLengthChanged(qint64); + void downloadStateChanged(Download::State); +#endif private: MediaObject *const m_parent; @@ -115,6 +131,7 @@ private: Pending m_pending; QScopedPointer<QTimer> m_positionTimer; + qint64 m_position; QScopedPointer<QTimer> m_bufferStatusTimer; PrivateState m_stateBeforeBuffering; @@ -127,6 +144,11 @@ private: // Used for playback of resource files TPtrC8 m_buffer; +#ifdef PHONON_MMF_PROGRESSIVE_DOWNLOAD + Download *m_download; + bool m_downloadStalled; +#endif + QMultiMap<QString, QString> m_metaData; }; diff --git a/src/3rdparty/phonon/mmf/abstractvideoplayer.cpp b/src/3rdparty/phonon/mmf/abstractvideoplayer.cpp index fb20bea..1ab5bae 100644 --- a/src/3rdparty/phonon/mmf/abstractvideoplayer.cpp +++ b/src/3rdparty/phonon/mmf/abstractvideoplayer.cpp @@ -16,6 +16,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>. */ +#include <QDir> #include <QUrl> #include <QTimer> #include <QWidget> @@ -132,6 +133,13 @@ int MMF::AbstractVideoPlayer::setDeviceVolume(int mmfVolume) return err; } +int MMF::AbstractVideoPlayer::openFile(const QString &fileName) +{ + const QHBufC nativeFileName(QDir::toNativeSeparators(fileName)); + TRAPD(err, m_player->OpenFileL(*nativeFileName)); + return err; +} + int MMF::AbstractVideoPlayer::openFile(RFile &file) { TRAPD(err, m_player->OpenFileL(file)); @@ -157,7 +165,7 @@ int MMF::AbstractVideoPlayer::bufferStatus() const return result; } -void MMF::AbstractVideoPlayer::close() +void MMF::AbstractVideoPlayer::doClose() { m_player->Close(); } @@ -167,9 +175,9 @@ bool MMF::AbstractVideoPlayer::hasVideo() const return true; } -qint64 MMF::AbstractVideoPlayer::currentTime() const +qint64 MMF::AbstractVideoPlayer::getCurrentTime() const { - TRACE_CONTEXT(AbstractVideoPlayer::currentTime, EVideoApi); + TRACE_CONTEXT(AbstractVideoPlayer::getCurrentTime, EVideoApi); TTimeIntervalMicroSeconds us; TRAPD(err, us = m_player->PositionL()) @@ -246,7 +254,9 @@ void MMF::AbstractVideoPlayer::MvpuoOpenComplete(TInt aError) TRACE_CONTEXT(AbstractVideoPlayer::MvpuoOpenComplete, EVideoApi); TRACE_ENTRY("state %d error %d", state(), aError); - __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic)); + __ASSERT_ALWAYS(LoadingState == state() || + progressiveDownloadStalled() && BufferingState == state(), + Utils::panic(InvalidStatePanic)); if (KErrNone == aError) m_player->Prepare(); @@ -261,7 +271,9 @@ void MMF::AbstractVideoPlayer::MvpuoPrepareComplete(TInt aError) TRACE_CONTEXT(AbstractVideoPlayer::MvpuoPrepareComplete, EVideoApi); TRACE_ENTRY("state %d error %d", state(), aError); - __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic)); + __ASSERT_ALWAYS(LoadingState == state() || + progressiveDownloadStalled() && BufferingState == state(), + Utils::panic(InvalidStatePanic)); TRAPD(err, getVideoClipParametersL(aError)); @@ -470,7 +482,7 @@ void MMF::AbstractVideoPlayer::updateScaleFactors(const QSize &windowSize, bool void MMF::AbstractVideoPlayer::parametersChanged(VideoParameters parameters) { - if (state() == LoadingState) + if (state() == LoadingState || progressiveDownloadStalled() && BufferingState == state()) m_pendingChanges |= parameters; else handleParametersChanged(parameters); diff --git a/src/3rdparty/phonon/mmf/abstractvideoplayer.h b/src/3rdparty/phonon/mmf/abstractvideoplayer.h index 3ff3c75..3bc5c7c 100644 --- a/src/3rdparty/phonon/mmf/abstractvideoplayer.h +++ b/src/3rdparty/phonon/mmf/abstractvideoplayer.h @@ -64,21 +64,22 @@ public: virtual void doStop(); virtual void doSeek(qint64 milliseconds); virtual int setDeviceVolume(int mmfVolume); + virtual int openFile(const QString &fileName); virtual int openFile(RFile &file); virtual int openUrl(const QString &url); virtual int openDescriptor(const TDesC8 &des); virtual int bufferStatus() const; - virtual void close(); + virtual void doClose(); // MediaObjectInterface virtual bool hasVideo() const; - virtual qint64 currentTime() const; virtual qint64 totalTime() const; // AbstractPlayer virtual void videoOutputChanged(); // AbstractMediaPlayer + virtual qint64 getCurrentTime() const; virtual int numberOfMetaDataEntries() const; virtual QPair<QString, QString> metaDataEntry(int index) const; diff --git a/src/3rdparty/phonon/mmf/audioplayer.cpp b/src/3rdparty/phonon/mmf/audioplayer.cpp index 7c8b9bd..dc5c800 100644 --- a/src/3rdparty/phonon/mmf/audioplayer.cpp +++ b/src/3rdparty/phonon/mmf/audioplayer.cpp @@ -16,6 +16,7 @@ along with this library. If not, see <http://www.gnu.org/licenses/>. */ +#include <QDir> #include <QUrl> #include "audioplayer.h" @@ -109,6 +110,13 @@ int MMF::AudioPlayer::setDeviceVolume(int mmfVolume) #endif } +int MMF::AudioPlayer::openFile(const QString &fileName) +{ + const QHBufC nativeFileName(QDir::toNativeSeparators(fileName)); + TRAPD(err, m_player->OpenFileL(*nativeFileName)); + return err; +} + int MMF::AudioPlayer::openFile(RFile& file) { TRAPD(err, m_player->OpenFileL(file)); @@ -150,7 +158,7 @@ int MMF::AudioPlayer::bufferStatus() const return result; } -void MMF::AudioPlayer::close() +void MMF::AudioPlayer::doClose() { m_player->Close(); } @@ -160,9 +168,9 @@ bool MMF::AudioPlayer::hasVideo() const return false; } -qint64 MMF::AudioPlayer::currentTime() const +qint64 MMF::AudioPlayer::getCurrentTime() const { - TRACE_CONTEXT(AudioPlayer::currentTime, EAudioApi); + TRACE_CONTEXT(AudioPlayer::getCurrentTime, EAudioApi); TTimeIntervalMicroSeconds us; const TInt err = m_player->GetPosition(us); @@ -203,7 +211,9 @@ void MMF::AudioPlayer::MapcInitComplete(TInt aError, TRACE_CONTEXT(AudioPlayer::MapcInitComplete, EAudioInternal); TRACE_ENTRY("state %d error %d", state(), aError); - __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic)); + __ASSERT_ALWAYS(LoadingState == state() || + progressiveDownloadStalled() && BufferingState == state(), + Utils::panic(InvalidStatePanic)); if (KErrNone == aError) { maxVolumeChanged(m_player->MaxVolume()); diff --git a/src/3rdparty/phonon/mmf/audioplayer.h b/src/3rdparty/phonon/mmf/audioplayer.h index e43cadd..cf4f6d5 100644 --- a/src/3rdparty/phonon/mmf/audioplayer.h +++ b/src/3rdparty/phonon/mmf/audioplayer.h @@ -65,18 +65,19 @@ typedef CMdaAudioPlayerUtility NativePlayer; virtual void doStop(); virtual void doSeek(qint64 milliseconds); virtual int setDeviceVolume(int mmfVolume); + virtual int openFile(const QString &fileName); virtual int openFile(RFile& file); virtual int openUrl(const QString& url); virtual int openDescriptor(const TDesC8 &des); virtual int bufferStatus() const; - virtual void close(); + virtual void doClose(); // MediaObjectInterface virtual bool hasVideo() const; - virtual qint64 currentTime() const; virtual qint64 totalTime() const; // AbstractMediaPlayer + virtual qint64 getCurrentTime() const; virtual int numberOfMetaDataEntries() const; virtual QPair<QString, QString> metaDataEntry(int index) const; diff --git a/src/3rdparty/phonon/mmf/download.cpp b/src/3rdparty/phonon/mmf/download.cpp new file mode 100644 index 0000000..7b80e4a --- /dev/null +++ b/src/3rdparty/phonon/mmf/download.cpp @@ -0,0 +1,194 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#include "download.h" +#include "utils.h" +#include <QtCore/QDir> +#include <QtCore/private/qcore_symbian_p.h> + +QT_BEGIN_NAMESPACE + +using namespace Phonon; +using namespace Phonon::MMF; + +static const TBool InheritDownloads = EFalse; + +DownloadPrivate::DownloadPrivate(Download *parent) + : QObject(parent) + , m_parent(parent) + , m_download(0) + , m_length(0) +{ + +} + +DownloadPrivate::~DownloadPrivate() +{ + m_downloadManager.Disconnect(); + m_downloadManager.Close(); +} + +bool DownloadPrivate::start() +{ + TRACE_CONTEXT(DownloadPrivate::start, EVideoApi); + Q_ASSERT(!m_download); + // Connect to download manager + RProcess process; + const TUid uid3 = process.SecureId(); + TRAPD(err, m_downloadManager.ConnectL(uid3, *this, InheritDownloads)); + TRACE("connect err %d", err); + if (KErrNone == err) { + // Start download + QHBufC url(m_parent->sourceUrl().toString()); + TPtr8 url8 = url->Des().Collapse(); + TRAP(err, m_download = &m_downloadManager.CreateDownloadL(url8)); + TRACE("start err %d", err); + if (KErrNone == err) + m_download->Start(); + } + return (KErrNone == err); +} + +void DownloadPrivate::resume() +{ + +} + +void DownloadPrivate::HandleDMgrEventL(RHttpDownload &aDownload, THttpDownloadEvent aEvent) +{ + TRACE_CONTEXT(DownloadPrivate::HandleDMgrEventL, EVideoApi); + Q_ASSERT(&aDownload == m_download); + switch (aEvent.iDownloadState) { + case EHttpDlPaused: + if (EHttpContentTypeReceived == aEvent.iProgressState) { + TRACE_0("paused, content type received"); + m_download->Start(); + } + break; + case EHttpDlInprogress: + switch (aEvent.iProgressState) { + case EHttpProgResponseHeaderReceived: + { + TFileName fileName; + m_download->GetStringAttribute(EDlAttrDestFilename, fileName); + TRACE("in progress, response header received, filename %S", &fileName); + const QString fileNameQt = QDir::fromNativeSeparators(qt_TDesC2QString(fileName)); + m_parent->downloadStarted(fileNameQt); + } + break; + case EHttpProgResponseBodyReceived: + { + TInt32 length = 0; + m_download->GetIntAttribute(EDlAttrDownloadedSize, length); + if (length != m_length) { + TRACE("in progress, length %d", length); + m_length = length; + emit lengthChanged(m_length); + } + } + break; + } + break; + case EHttpDlCompleted: + TRACE_0("complete"); + m_parent->complete(); + break; + case EHttpDlFailed: + TRACE_0("failed"); + m_parent->error(); + break; + } +} + +Download::Download(const QUrl &url, QObject *parent) + : QObject(parent) + , m_private(new DownloadPrivate(this)) + , m_sourceUrl(url) + , m_state(Idle) +{ + qRegisterMetaType<Download::State>(); + connect(m_private, SIGNAL(lengthChanged(qint64)), this, SIGNAL(lengthChanged(qint64))); +} + +Download::~Download() +{ + +} + +const QUrl &Download::sourceUrl() const +{ + return m_sourceUrl; +} + +const QString &Download::targetFileName() const +{ + return m_targetFileName; +} + +void Download::start() +{ + TRACE_CONTEXT(Download::start, EVideoApi); + TRACE_ENTRY_0(); + Q_ASSERT(Idle == m_state); + const bool ok = m_private->start(); + setState(ok ? Initializing : Error); + TRACE_EXIT_0(); +} + +void Download::resume() +{ + TRACE_CONTEXT(Download::resume, EVideoApi); + TRACE_ENTRY_0(); + m_private->resume(); + TRACE_EXIT_0(); +} + +void Download::setState(State state) +{ + TRACE_CONTEXT(Download::setState, EVideoApi); + TRACE("oldState %d newState %d", m_state, state); + const State oldState = m_state; + m_state = state; + if (oldState != m_state) + emit stateChanged(m_state); +} + +void Download::error() +{ + TRACE_CONTEXT(Download::error, EVideoApi); + TRACE_0(""); + setState(Error); +} + +void Download::downloadStarted(const QString &targetFileName) +{ + TRACE_CONTEXT(Download::downloadStarted, EVideoApi); + TRACE_0("downloadStarted"); + m_targetFileName = targetFileName; + setState(Downloading); +} + +void Download::complete() +{ + TRACE_CONTEXT(Download::complete, EVideoApi); + TRACE_0(""); + setState(Complete); +} + +QT_END_NAMESPACE + diff --git a/src/3rdparty/phonon/mmf/download.h b/src/3rdparty/phonon/mmf/download.h new file mode 100644 index 0000000..bda7963 --- /dev/null +++ b/src/3rdparty/phonon/mmf/download.h @@ -0,0 +1,109 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#ifndef PHONON_MMF_DOWNLOAD_H +#define PHONON_MMF_DOWNLOAD_H + +#include <QtCore/QMetaType> +#include <QtCore/QString> +#include <QtCore/QUrl> +#include <downloadmgrclient.h> + +QT_FORWARD_DECLARE_CLASS(QByteArray) +QT_FORWARD_DECLARE_CLASS(QFile) + +QT_BEGIN_NAMESPACE + +namespace Phonon +{ +namespace MMF +{ + +class Download; + +class DownloadPrivate : public QObject + , public MHttpDownloadMgrObserver +{ + Q_OBJECT +public: + DownloadPrivate(Download *parent); + ~DownloadPrivate(); + bool start(); + void resume(); +signals: + void error(); + void targetFileNameChanged(); + void lengthChanged(qint64 length); + void complete(); +private: + // MHttpDownloadMgrObserver + void HandleDMgrEventL(RHttpDownload &aDownload, THttpDownloadEvent aEvent); +private: + Download *m_parent; + RHttpDownloadMgr m_downloadManager; + RHttpDownload *m_download; + qint64 m_length; +}; + +class Download : public QObject +{ + Q_OBJECT + friend class DownloadPrivate; +public: + Download(const QUrl &url, QObject *parent = 0); + ~Download(); + const QUrl &sourceUrl() const; + const QString &targetFileName() const; + void start(); + void resume(); + + enum State { + Idle, + Initializing, + Downloading, + Complete, + Error + }; + +signals: + void lengthChanged(qint64 length); + void stateChanged(Download::State state); + +private: + void setState(State state); + + // Called by DownloadPrivate + void error(); + void downloadStarted(const QString &targetFileName); + void complete(); + +private: + DownloadPrivate *m_private; + QUrl m_sourceUrl; + QString m_targetFileName; + State m_state; +}; + +} +} + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(Phonon::MMF::Download::State) + +#endif diff --git a/src/3rdparty/phonon/mmf/mediaobject.cpp b/src/3rdparty/phonon/mmf/mediaobject.cpp index 98326b8..2c7a7ef 100644 --- a/src/3rdparty/phonon/mmf/mediaobject.cpp +++ b/src/3rdparty/phonon/mmf/mediaobject.cpp @@ -61,6 +61,9 @@ MMF::MediaObject::MediaObject(QObject *parent) : MMF::MediaNode::MediaNode(paren TRACE_CONTEXT(MediaObject::MediaObject, EAudioApi); TRACE_ENTRY_0(); + const int err = m_fileServer.Connect(); + QT_TRAP_THROWING(User::LeaveIfError(err)); + Q_UNUSED(parent); TRACE_EXIT_0(); @@ -99,12 +102,6 @@ bool MMF::MediaObject::openRecognizer() return false; } - err = m_fileServer.Connect(); - if (KErrNone != err) { - TRACE("RFs::Connect error %d", err); - return false; - } - // This must be called in order to be able to share file handles with // the recognizer server (see fileMediaType function). err = m_fileServer.ShareProtected(); @@ -127,13 +124,8 @@ MMF::MediaType MMF::MediaObject::fileMediaType MediaType result = MediaTypeUnknown; if (openRecognizer()) { - - const QHBufC fileNameSymbian(QDir::toNativeSeparators(fileName)); - - Q_ASSERT(!m_file); - m_file = new RFile; - TInt err = m_file->Open(m_fileServer, *fileNameSymbian, EFileRead | EFileShareReadersOnly); - + TInt err = openFileHandle(fileName); + const QHBufC nativeFileName(QDir::toNativeSeparators(fileName)); if (KErrNone == err) { TDataRecognitionResult recognizerResult; err = m_recognizer.RecognizeData(*m_file, recognizerResult); @@ -141,16 +133,30 @@ MMF::MediaType MMF::MediaObject::fileMediaType const TPtrC mimeType = recognizerResult.iDataType.Des(); result = Utils::mimeTypeToMediaType(mimeType); } else { - TRACE("RApaLsSession::RecognizeData filename %S error %d", fileNameSymbian.data(), err); + TRACE("RApaLsSession::RecognizeData filename %S error %d", nativeFileName.data(), err); } } else { - TRACE("RFile::Open filename %S error %d", fileNameSymbian.data(), err); + TRACE("RFile::Open filename %S error %d", nativeFileName.data(), err); } } return result; } +int MMF::MediaObject::openFileHandle(const QString &fileName) +{ + TRACE_CONTEXT(MediaObject::openFileHandle, EAudioInternal); + const QHBufC nativeFileName(QDir::toNativeSeparators(fileName)); + TRACE_ENTRY("filename %S", nativeFileName.data()); + if (m_file) + m_file->Close(); + delete m_file; + m_file = 0; + m_file = new RFile; + TInt err = m_file->Open(m_fileServer, *nativeFileName, EFileRead | EFileShareReadersOrWriters); + return err; +} + MMF::MediaType MMF::MediaObject::bufferMediaType(const uchar *data, qint64 size) { TRACE_CONTEXT(MediaObject::bufferMediaType, EAudioInternal); diff --git a/src/3rdparty/phonon/mmf/mediaobject.h b/src/3rdparty/phonon/mmf/mediaobject.h index 5399e27..5d785fb 100644 --- a/src/3rdparty/phonon/mmf/mediaobject.h +++ b/src/3rdparty/phonon/mmf/mediaobject.h @@ -89,6 +89,7 @@ public: void setVideoOutput(AbstractVideoOutput* videoOutput); + int openFileHandle(const QString &fileName); RFile* file() const; QResource* resource() const; diff --git a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp index 94f08bd..e4f70de 100644 --- a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp +++ b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp @@ -249,7 +249,11 @@ void QDeclarativeWebView::init() { d = new QDeclarativeWebViewPrivate(this); - QWebSettings::enablePersistentStorage(); + if (QWebSettings::iconDatabasePath().isNull() && + QWebSettings::globalSettings()->localStoragePath().isNull() && + QWebSettings::offlineStoragePath().isNull() && + QWebSettings::offlineWebApplicationCachePath().isNull()) + QWebSettings::enablePersistentStorage(); setAcceptedMouseButtons(Qt::LeftButton); setFlag(QGraphicsItem::ItemHasNoContents, true); diff --git a/src/corelib/arch/qatomic_arm.h b/src/corelib/arch/qatomic_arm.h index 9df02a2..bca3375 100644 --- a/src/corelib/arch/qatomic_arm.h +++ b/src/corelib/arch/qatomic_arm.h @@ -107,7 +107,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree() // kernel places a restartable cmpxchg implementation at a fixed address extern "C" typedef int (qt_atomic_eabi_cmpxchg_int_t)(int oldval, int newval, volatile int *ptr); -extern "C" typedef int (qt_atomic_eabi_cmpxchg_ptr_t)(void *oldval, void *newval, volatile void *ptr); +extern "C" typedef int (qt_atomic_eabi_cmpxchg_ptr_t)(const void *oldval, const void *newval, volatile void *ptr); #define qt_atomic_eabi_cmpxchg_int (*reinterpret_cast<qt_atomic_eabi_cmpxchg_int_t *>(0xffff0fc0)) #define qt_atomic_eabi_cmpxchg_ptr (*reinterpret_cast<qt_atomic_eabi_cmpxchg_ptr_t *>(0xffff0fc0)) diff --git a/src/corelib/arch/symbian/debugfunction.cpp b/src/corelib/arch/symbian/debugfunction.cpp index f3b5d2d..31937e8 100644 --- a/src/corelib/arch/symbian/debugfunction.cpp +++ b/src/corelib/arch/symbian/debugfunction.cpp @@ -549,7 +549,7 @@ void ResetAllocCellLevels(TAny* aPtr, RHybridHeap::TCellType aType, TAny* aCell, if (aType == RHybridHeap::EGoodAllocatedCell) { - RHybridHeap::SDebugCell* DbgCell = (RHybridHeap::SDebugCell*)((TUint8*)aCell-RHeap::EDebugHdrSize); + RHybridHeap::SDebugCell* DbgCell = (RHybridHeap::SDebugCell*)((TUint8*)aCell-RHybridHeap::EDebugHdrSize); DbgCell->nestingLevel = 0; } } @@ -1105,7 +1105,7 @@ void RHybridHeap::DoCheckSlab(slab* aSlab, TAllocatorType aSlabType, TAny* aBfr) unsigned used = SlabHeaderUsedm4(h)+4; unsigned size = SlabHeaderSize(h); __HEAP_CORRUPTED_TEST( (used < SLABSIZE),ETHeapBadCellAddress, aBfr, aSlab); - __HEAP_CORRUPTED_TEST( ((size > 3 ) && (size < MAXSLABSIZE)), ETHeapBadCellAddress,aBfr,aSlab); + __HEAP_CORRUPTED_TEST( ((size > 3 ) && (size <= MAXSLABSIZE)), ETHeapBadCellAddress,aBfr,aSlab); unsigned count = 0; switch ( aSlabType ) diff --git a/src/corelib/arch/symbian/heap_hybrid_p.h b/src/corelib/arch/symbian/heap_hybrid_p.h index 736af72..95fb3d4 100644 --- a/src/corelib/arch/symbian/heap_hybrid_p.h +++ b/src/corelib/arch/symbian/heap_hybrid_p.h @@ -103,11 +103,15 @@ public: EGetSize=48, EGetMaxLength, EGetBase, EAlignInteger, EAlignAddr }; enum TDebugOp { EWalk = 128, EHybridHeap }; - enum TAllocFail + enum THybridAllocFail { ERandom, ETrueRandom, EDeterministic, EHybridNone, EFailNext, EReset, EBurstRandom, EBurstTrueRandom, EBurstDeterministic, EBurstFailNext, ECheckFailure, }; + enum { EDebugHdrSize = sizeof(SDebugCell) }; +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS + struct SRAllocatorBurstFail {TInt iBurst; TInt iRate; TInt iUnused[2];}; +#endif struct HeapInfo { diff --git a/src/corelib/arch/symbian/qt_hybridheap_symbian_p.h b/src/corelib/arch/symbian/qt_hybridheap_symbian_p.h index 5827aca..36c7b6d 100644 --- a/src/corelib/arch/symbian/qt_hybridheap_symbian_p.h +++ b/src/corelib/arch/symbian/qt_hybridheap_symbian_p.h @@ -90,7 +90,7 @@ // disabling code ported from Symbian^4 that we don't want/can't have in earlier platforms #define QT_SYMBIAN4_ALLOCATOR_UNWANTED_CODE -#if defined(SYMBIAN_VERSION_9_2) || defined(SYMBIAN_VERSION_9_1) +#if defined(SYMBIAN_VERSION_9_1) || defined(SYMBIAN_VERSION_9_2) || defined(SYMBIAN_VERSION_9_3) || defined(SYMBIAN_VERSION_9_4) || defined(SYMBIAN_VERSION_SYMBIAN2) #define NO_NAMED_LOCAL_CHUNKS #endif @@ -100,6 +100,9 @@ inline int noBTrace() {return 0;} #define BTraceContext12(a,b,c,d,e) noBTrace() #endif +// declare ETHeapBadDebugFailParameter, where missing +#define ETHeapBadDebugFailParameter ((TCdtPanic)213) + #ifndef QT_SYMBIAN_HAVE_U32STD_H struct SThreadCreateInfo { diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 32e85db..1c41eca 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -2771,7 +2771,7 @@ \value ElideNone Ellipsis should NOT appear in the text. Qt::ElideMiddle is normally the most appropriate choice for URLs (e.g., - "\l{http://qt.nokia.com/careers/movingto/brisbane/}{http://qt.nok...ovingto/brisbane/}"), + "\l{http://bugreports.qt.nokia.com/browse/QTWEBSITE-13}{http://bugreports.qt.../QTWEBSITE-13/}"), whereas Qt::ElideRight is appropriate for other strings (e.g., "\l{http://qt.nokia.com/doc/qq/qq09-mac-deployment.html}{Deploying Applications on Ma...}"). diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp index 6c1b6e7..983d249 100644 --- a/src/corelib/plugin/quuid.cpp +++ b/src/corelib/plugin/quuid.cpp @@ -582,48 +582,65 @@ QT_BEGIN_INCLUDE_NAMESPACE #include <stdlib.h> // for RAND_MAX QT_END_INCLUDE_NAMESPACE +#if !defined(QT_BOOTSTRAPPED) && defined(Q_OS_UNIX) +Q_GLOBAL_STATIC(QThreadStorage<QFile *>, devUrandomStorage); +#endif + QUuid QUuid::createUuid() { QUuid result; uint *data = &(result.data1); -#ifdef Q_OS_UNIX - QFile devUrandom; - devUrandom.setFileName(QLatin1String("/dev/urandom")); - if (devUrandom.open(QIODevice::ReadOnly)) { - qint64 numToRead = 4 * sizeof(uint); - devUrandom.read((char *) data, numToRead); // should read 128-bits of data +#if defined(Q_OS_UNIX) + QFile *devUrandom; +# if !defined(QT_BOOTSTRAPPED) + devUrandom = devUrandomStorage()->localData(); + if (!devUrandom) { + devUrandom = new QFile(QLatin1String("/dev/urandom")); + devUrandom->open(QIODevice::ReadOnly | QIODevice::Unbuffered); + devUrandomStorage()->setLocalData(devUrandom); + } +# else + QFile file(QLatin1String("/dev/urandom")); + devUrandom = &file; + devUrandom->open(QIODevice::ReadOnly | QIODevice::Unbuffered); +# endif + enum { AmountToRead = 4 * sizeof(uint) }; + if (devUrandom->isOpen() + && devUrandom->read((char *) data, AmountToRead) == AmountToRead) { + // we got what we wanted, nothing more to do + ; } else #endif { static const int intbits = sizeof(int)*8; static int randbits = 0; if (!randbits) { - int r = 0; + int r = 0; int max = RAND_MAX; do { ++r; } while ((max=max>>1)); randbits = r; } - // Seed the PRNG once per thread with a combination of current time, a - // stack address and a serial counter (since thread stack addresses are - // re-used). + // Seed the PRNG once per thread with a combination of current time, a + // stack address and a serial counter (since thread stack addresses are + // re-used). #ifndef QT_BOOTSTRAPPED - static QThreadStorage<int *> uuidseed; - if (!uuidseed.hasLocalData()) - { - int *pseed = new int; - static QBasicAtomicInt serial = Q_BASIC_ATOMIC_INITIALIZER(2); - qsrand(*pseed = QDateTime::currentDateTime().toTime_t() - + quintptr(&pseed) - + serial.fetchAndAddRelaxed(1)); - uuidseed.setLocalData(pseed); - } + static QThreadStorage<int *> uuidseed; + if (!uuidseed.hasLocalData()) + { + int *pseed = new int; + static QBasicAtomicInt serial = Q_BASIC_ATOMIC_INITIALIZER(2); + qsrand(*pseed = QDateTime::currentDateTime().toTime_t() + + quintptr(&pseed) + + serial.fetchAndAddRelaxed(1)); + uuidseed.setLocalData(pseed); + } #else - static bool seeded = false; - if (!seeded) - qsrand(QDateTime::currentDateTime().toTime_t() - + quintptr(&seeded)); + static bool seeded = false; + if (!seeded) + qsrand(QDateTime::currentDateTime().toTime_t() + + quintptr(&seeded)); #endif int chunks = 16 / sizeof(uint); @@ -631,7 +648,7 @@ QUuid QUuid::createUuid() uint randNumber = 0; for (int filled = 0; filled < intbits; filled += randbits) randNumber |= qrand()<<filled; - *(data+chunks) = randNumber; + *(data+chunks) = randNumber; } } diff --git a/src/corelib/thread/qthreadstorage.cpp b/src/corelib/thread/qthreadstorage.cpp index 88d73cc..2fc04f5 100644 --- a/src/corelib/thread/qthreadstorage.cpp +++ b/src/corelib/thread/qthreadstorage.cpp @@ -79,6 +79,21 @@ QThreadStorageData::QThreadStorageData(void (*func)(void *)) { QMutexLocker locker(mutex()); DestructorMap *destr = destructors(); + if (!destr) { + /* + the destructors vector has already been destroyed, yet a new + QThreadStorage is being allocated. this can only happen during global + destruction, at which point we assume that there is only one thread. + in order to keep QThreadStorage working, we need somewhere to store + the data, best place we have in this situation is at the tail of the + current thread's tls vector. the destructor is ignored, since we have + no where to store it, and no way to actually call it. + */ + QThreadData *data = QThreadData::current(); + id = data->tls.count(); + DEBUG_MSG("QThreadStorageData: Allocated id %d, destructor %p cannot be stored", id, func); + return; + } for (id = 0; id < destr->count(); id++) { if (destr->at(id) == 0) break; @@ -139,13 +154,15 @@ void **QThreadStorageData::set(void *p) data->thread); QMutexLocker locker(mutex()); - void (*destructor)(void *) = destructors()->value(id); + DestructorMap *destr = destructors(); + void (*destructor)(void *) = destr ? destr->value(id) : 0; locker.unlock(); void *q = value; value = 0; - destructor(q); + if (destructor) + destructor(q); } // store new data diff --git a/src/corelib/tools/qelapsedtimer.cpp b/src/corelib/tools/qelapsedtimer.cpp index cb5e701..ee7c9b9 100644 --- a/src/corelib/tools/qelapsedtimer.cpp +++ b/src/corelib/tools/qelapsedtimer.cpp @@ -83,7 +83,7 @@ QT_BEGIN_NAMESPACE function, which can be used to determine if a certain number of milliseconds has already elapsed: - \snippet doc/src/snippets/qelapsedtimer/main.cpp 1 + \snippet doc/src/snippets/qelapsedtimer/main.cpp 2 \section1 Reference clocks diff --git a/src/corelib/tools/qregexp.cpp b/src/corelib/tools/qregexp.cpp index 36827d0..a8bf38f 100644 --- a/src/corelib/tools/qregexp.cpp +++ b/src/corelib/tools/qregexp.cpp @@ -74,10 +74,6 @@ int qFindString(const QChar *haystack, int haystackLen, int from, #define RXERR_INTERVAL QT_TRANSLATE_NOOP("QRegExp", "invalid interval") #define RXERR_CATEGORY QT_TRANSLATE_NOOP("QRegExp", "invalid category") -/* - WARNING! Be sure to read qregexp.tex before modifying this file. -*/ - /*! \class QRegExp \reentrant diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index d1060d2..d8dab43 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -565,7 +565,7 @@ const QString::Null QString::null = { }; and join a list of strings into a single string with an optional separator using QStringList::join(). You can obtain a list of strings from a string list that contain a particular substring or - that match a particular QRegExp using the QStringList::find() + that match a particular QRegExp using the QStringList::filter() function. : \section1 Querying String Data @@ -4275,7 +4275,7 @@ QString& QString::fill(QChar ch, int size) Returns the number of characters in this string. Equivalent to size(). - \sa setLength() + \sa resize() */ /*! diff --git a/src/declarative/graphicsitems/qdeclarativeloader.cpp b/src/declarative/graphicsitems/qdeclarativeloader.cpp index 1066c2b..5647b14 100644 --- a/src/declarative/graphicsitems/qdeclarativeloader.cpp +++ b/src/declarative/graphicsitems/qdeclarativeloader.cpp @@ -337,7 +337,9 @@ void QDeclarativeLoaderPrivate::_q_sourceLoaded() return; } - QDeclarativeContext *ctxt = new QDeclarativeContext(qmlContext(q)); + QDeclarativeContext *creationContext = component->creationContext(); + if (!creationContext) creationContext = qmlContext(q); + QDeclarativeContext *ctxt = new QDeclarativeContext(creationContext); ctxt->setContextObject(q); QDeclarativeComponent *c = component; diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp index d134929..31943b2 100644 --- a/src/declarative/graphicsitems/qdeclarativepathview.cpp +++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp @@ -300,6 +300,19 @@ void QDeclarativePathViewPrivate::setHighlightPosition(qreal pos) } } +void QDeclarativePathView::pathUpdated() +{ + Q_D(QDeclarativePathView); + QList<QDeclarativeItem*>::iterator it = d->items.begin(); + while (it != d->items.end()) { + QDeclarativeItem *item = *it; + if (QDeclarativePathViewAttached *att = d->attached(item)) + att->m_percent = -1; + ++it; + } + refill(); +} + void QDeclarativePathViewPrivate::updateItem(QDeclarativeItem *item, qreal percent) { if (QDeclarativePathViewAttached *att = attached(item)) { @@ -526,9 +539,9 @@ void QDeclarativePathView::setPath(QDeclarativePath *path) if (d->path == path) return; if (d->path) - disconnect(d->path, SIGNAL(changed()), this, SLOT(refill())); + disconnect(d->path, SIGNAL(changed()), this, SLOT(pathUpdated())); d->path = path; - connect(d->path, SIGNAL(changed()), this, SLOT(refill())); + connect(d->path, SIGNAL(changed()), this, SLOT(pathUpdated())); if (d->isValid() && isComponentComplete()) { d->clear(); if (d->attType) { @@ -1318,6 +1331,8 @@ void QDeclarativePathView::refill() if (idx >= d->modelCount) idx = 0; } + if (!d->items.count()) + d->firstIndex = -1; if (d->modelCount) { // add items to beginning and end diff --git a/src/declarative/graphicsitems/qdeclarativepathview_p.h b/src/declarative/graphicsitems/qdeclarativepathview_p.h index 62a8c44..7775b1c 100644 --- a/src/declarative/graphicsitems/qdeclarativepathview_p.h +++ b/src/declarative/graphicsitems/qdeclarativepathview_p.h @@ -186,6 +186,7 @@ private Q_SLOTS: void modelReset(); void createdItem(int index, QDeclarativeItem *item); void destroyingItem(QDeclarativeItem *item); + void pathUpdated(); private: friend class QDeclarativePathViewAttached; diff --git a/src/declarative/graphicsitems/qdeclarativerepeater.cpp b/src/declarative/graphicsitems/qdeclarativerepeater.cpp index 00f2848..cb64212 100644 --- a/src/declarative/graphicsitems/qdeclarativerepeater.cpp +++ b/src/declarative/graphicsitems/qdeclarativerepeater.cpp @@ -134,13 +134,13 @@ QDeclarativeRepeaterPrivate::~QDeclarativeRepeaterPrivate() create items as they are required. Also, note that Repeater is \l {Item}-based, and can only repeat \l {Item}-derived objects. - For example, it cannot be used to repeat QObjects: + For example, it cannot be used to repeat QtObjects: \badcode Item { - //XXX does not work! Can't repeat QObject as it doesn't derive from Item. + //XXX does not work! Can't repeat QtObject as it doesn't derive from Item. Repeater { model: 10 - QObject {} + QtObject {} } } \endcode diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp index 4817999..637dd77 100644 --- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp +++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp @@ -417,7 +417,11 @@ void QDeclarativeTextInput::setCursorVisible(bool on) return; d->cursorVisible = on; d->control->setCursorBlinkPeriod(on?QApplication::cursorFlashTime():0); - //d->control should emit the cursor update regions + QRect r = d->control->cursorRect(); + if (d->control->inputMask().isEmpty()) + updateRect(r); + else + updateRect(); emit cursorVisibleChanged(d->cursorVisible); } diff --git a/src/declarative/qml/qdeclarativeboundsignal.cpp b/src/declarative/qml/qdeclarativeboundsignal.cpp index 8769122..6af3e05 100644 --- a/src/declarative/qml/qdeclarativeboundsignal.cpp +++ b/src/declarative/qml/qdeclarativeboundsignal.cpp @@ -103,7 +103,7 @@ QDeclarativeBoundSignal::QDeclarativeBoundSignal(QObject *scope, const QMetaMeth if (evaluateIdx == -1) evaluateIdx = metaObject()->methodCount(); QDeclarative_setParent_noEvent(this, parent); - QMetaObject::connect(scope, m_signal.methodIndex(), this, evaluateIdx); + QDeclarativePropertyPrivate::connect(scope, m_signal.methodIndex(), this, evaluateIdx); } QDeclarativeBoundSignal::QDeclarativeBoundSignal(QDeclarativeContext *ctxt, const QString &val, @@ -117,7 +117,7 @@ QDeclarativeBoundSignal::QDeclarativeBoundSignal(QDeclarativeContext *ctxt, cons if (evaluateIdx == -1) evaluateIdx = metaObject()->methodCount(); QDeclarative_setParent_noEvent(this, parent); - QMetaObject::connect(scope, m_signal.methodIndex(), this, evaluateIdx); + QDeclarativePropertyPrivate::connect(scope, m_signal.methodIndex(), this, evaluateIdx); m_expression = new QDeclarativeExpression(ctxt, scope, val); } diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index 90d38b3..dc28e22 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -945,7 +945,8 @@ void QDeclarativeCompiler::genObject(QDeclarativeParser::Object *obj) propertyCache = enginePrivate->cache(obj->metaObject()->superClass())->copy(); propertyCache->append(engine, obj->metaObject(), QDeclarativePropertyCache::Data::NoFlags, - QDeclarativePropertyCache::Data::IsVMEFunction); + QDeclarativePropertyCache::Data::IsVMEFunction, + QDeclarativePropertyCache::Data::IsVMESignal); if (obj == unitRoot) { propertyCache->addref(); @@ -1098,7 +1099,8 @@ void QDeclarativeCompiler::genObjectBody(QDeclarativeParser::Object *obj) QDeclarativePropertyCache *propertyCache = enginePrivate->cache(prop->value->metaObject()->superClass())->copy(); propertyCache->append(engine, prop->value->metaObject(), QDeclarativePropertyCache::Data::NoFlags, - QDeclarativePropertyCache::Data::IsVMEFunction); + QDeclarativePropertyCache::Data::IsVMEFunction, + QDeclarativePropertyCache::Data::IsVMESignal); output->propertyCaches << propertyCache; output->bytecode << meta; diff --git a/src/declarative/qml/qdeclarativenotifier.cpp b/src/declarative/qml/qdeclarativenotifier.cpp index 8c946f8..2e3f756 100644 --- a/src/declarative/qml/qdeclarativenotifier.cpp +++ b/src/declarative/qml/qdeclarativenotifier.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ #include "private/qdeclarativenotifier_p.h" +#include "private/qdeclarativeproperty_p.h" QT_BEGIN_NAMESPACE @@ -66,6 +67,21 @@ void QDeclarativeNotifier::emitNotify(QDeclarativeNotifierEndpoint *endpoint) if (oldDisconnected) *oldDisconnected = endpoint; } +void QDeclarativeNotifierEndpoint::connect(QObject *source, int sourceSignal) +{ + Signal *s = toSignal(); + + if (s->source == source && s->sourceSignal == sourceSignal) + return; + + disconnect(); + + QDeclarativePropertyPrivate::connect(source, sourceSignal, target, targetMethod); + + s->source = source; + s->sourceSignal = sourceSignal; +} + void QDeclarativeNotifierEndpoint::copyAndClear(QDeclarativeNotifierEndpoint &other) { other.disconnect(); diff --git a/src/declarative/qml/qdeclarativenotifier_p.h b/src/declarative/qml/qdeclarativenotifier_p.h index 0781caf..ad04ba8 100644 --- a/src/declarative/qml/qdeclarativenotifier_p.h +++ b/src/declarative/qml/qdeclarativenotifier_p.h @@ -75,7 +75,7 @@ public: inline bool isConnected(QObject *source, int sourceSignal); inline bool isConnected(QDeclarativeNotifier *); - inline void connect(QObject *source, int sourceSignal); + void connect(QObject *source, int sourceSignal); inline void connect(QDeclarativeNotifier *); inline void disconnect(); @@ -175,21 +175,6 @@ bool QDeclarativeNotifierEndpoint::isConnected(QDeclarativeNotifier *notifier) return NotifierType == type && asNotifier()->notifier == notifier; } -void QDeclarativeNotifierEndpoint::connect(QObject *source, int sourceSignal) -{ - Signal *s = toSignal(); - - if (s->source == source && s->sourceSignal == sourceSignal) - return; - - disconnect(); - - QMetaObject::connect(source, sourceSignal, target, targetMethod); - - s->source = source; - s->sourceSignal = sourceSignal; -} - void QDeclarativeNotifierEndpoint::connect(QDeclarativeNotifier *notifier) { Notifier *n = toNotifier(); diff --git a/src/declarative/qml/qdeclarativeproperty.cpp b/src/declarative/qml/qdeclarativeproperty.cpp index bc20bff..b5fb619 100644 --- a/src/declarative/qml/qdeclarativeproperty.cpp +++ b/src/declarative/qml/qdeclarativeproperty.cpp @@ -53,6 +53,7 @@ #include "private/qdeclarativestringconverters_p.h" #include "private/qdeclarativelist_p.h" #include "private/qdeclarativecompiler_p.h" +#include "private/qdeclarativevmemetaobject_p.h" #include <QStringList> #include <QtCore/qdebug.h> @@ -1212,7 +1213,7 @@ bool QDeclarativeProperty::connectNotifySignal(QObject *dest, int method) const QMetaProperty prop = d->object->metaObject()->property(d->core.coreIndex); if (prop.hasNotifySignal()) { - return QMetaObject::connect(d->object, prop.notifySignalIndex(), dest, method, Qt::DirectConnection); + return QDeclarativePropertyPrivate::connect(d->object, prop.notifySignalIndex(), dest, method, Qt::DirectConnection); } else { return false; } @@ -1383,4 +1384,57 @@ QMetaMethod QDeclarativePropertyPrivate::findSignalByName(const QMetaObject *mo, return QMetaMethod(); } +static inline int QMetaObject_methods(const QMetaObject *metaObject) +{ + struct Private + { + int revision; + int className; + int classInfoCount, classInfoData; + int methodCount, methodData; + }; + + return reinterpret_cast<const Private *>(metaObject->d.data)->methodCount; +} + +static inline void flush_vme_signal(const QObject *object, int index) +{ + QDeclarativeData *data = static_cast<QDeclarativeData *>(QObjectPrivate::get(const_cast<QObject *>(object))->declarativeData); + if (data && data->propertyCache) { + QDeclarativePropertyCache::Data *property = data->propertyCache->method(index); + + if (property && property->flags & QDeclarativePropertyCache::Data::IsVMESignal) { + const QMetaObject *metaObject = object->metaObject(); + int methodOffset = metaObject->methodOffset(); + + while (methodOffset > index) { + methodOffset -= QMetaObject_methods(metaObject); + metaObject = metaObject->d.superdata; + } + + QDeclarativeVMEMetaObject *vme = + static_cast<QDeclarativeVMEMetaObject *>(const_cast<QMetaObject *>(metaObject)); + + vme->connectAliasSignal(index); + } + } +} + +/*! +Connect \a sender \a signal_index to \a receiver \a method_index with the specified +\a type and \a types. This behaves identically to QMetaObject::connect() except that +it connects any lazy "proxy" signal connections set up by QML. + +It is possible that this logic should be moved to QMetaObject::connect(). +*/ +bool QDeclarativePropertyPrivate::connect(const QObject *sender, int signal_index, + const QObject *receiver, int method_index, + int type, int *types) +{ + flush_vme_signal(sender, signal_index); + flush_vme_signal(receiver, method_index); + + return QMetaObject::connect(sender, signal_index, receiver, method_index, type, types); +} + QT_END_NAMESPACE diff --git a/src/declarative/qml/qdeclarativeproperty_p.h b/src/declarative/qml/qdeclarativeproperty_p.h index 8522561..a8438c8 100644 --- a/src/declarative/qml/qdeclarativeproperty_p.h +++ b/src/declarative/qml/qdeclarativeproperty_p.h @@ -133,6 +133,9 @@ public: static int valueTypeCoreIndex(const QDeclarativeProperty &that); static int bindingIndex(const QDeclarativeProperty &that); static QMetaMethod findSignalByName(const QMetaObject *mo, const QByteArray &); + static bool connect(const QObject *sender, int signal_index, + const QObject *receiver, int method_index, + int type = 0, int *types = 0); }; Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativePropertyPrivate::WriteFlags) diff --git a/src/declarative/qml/qdeclarativepropertycache.cpp b/src/declarative/qml/qdeclarativepropertycache.cpp index 08503c2..9e1ceb8 100644 --- a/src/declarative/qml/qdeclarativepropertycache.cpp +++ b/src/declarative/qml/qdeclarativepropertycache.cpp @@ -94,6 +94,8 @@ void QDeclarativePropertyCache::Data::load(const QMetaMethod &m) { coreIndex = m.methodIndex(); flags |= Data::IsFunction; + if (m.methodType() == QMetaMethod::Signal) + flags |= Data::IsSignal; propType = QVariant::Invalid; const char *returnType = m.typeName(); @@ -215,7 +217,7 @@ QDeclarativePropertyCache *QDeclarativePropertyCache::copy() const } void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaObject *metaObject, - Data::Flag propertyFlags, Data::Flag methodFlags) + Data::Flag propertyFlags, Data::Flag methodFlags, Data::Flag signalFlags) { QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(engine); @@ -251,6 +253,8 @@ void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaOb int methodCount = metaObject->methodCount(); int methodOffset = qMax(2, metaObject->methodOffset()); // 2 to block the destroyed signal + + methodIndexCache.resize(methodCount); for (int ii = methodOffset; ii < methodCount; ++ii) { QMetaMethod m = metaObject->method(ii); if (m.access() == QMetaMethod::Private) @@ -272,6 +276,10 @@ void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaOb data->load(m); if (m.methodType() == QMetaMethod::Slot || m.methodType() == QMetaMethod::Method) data->flags |= methodFlags; + else if (m.methodType() == QMetaMethod::Signal) + data->flags |= signalFlags; + + methodIndexCache[ii] = data; stringCache.insert(methodName, data); identifierCache.insert(data->identifier.identifier, data); @@ -350,6 +358,15 @@ QDeclarativePropertyCache::property(int index) const } QDeclarativePropertyCache::Data * +QDeclarativePropertyCache::method(int index) const +{ + if (index < 0 || index >= methodIndexCache.count()) + return 0; + + return methodIndexCache.at(index); +} + +QDeclarativePropertyCache::Data * QDeclarativePropertyCache::property(const QString &str) const { return stringCache.value(str); diff --git a/src/declarative/qml/qdeclarativepropertycache_p.h b/src/declarative/qml/qdeclarativepropertycache_p.h index 72cfeba..79b126d 100644 --- a/src/declarative/qml/qdeclarativepropertycache_p.h +++ b/src/declarative/qml/qdeclarativepropertycache_p.h @@ -94,8 +94,9 @@ public: // Apply only to IsFunctions IsVMEFunction = 0x00000400, - HasArguments = 0x00000800 - + HasArguments = 0x00000800, + IsSignal = 0x00001000, + IsVMESignal = 0x00002000, }; Q_DECLARE_FLAGS(Flags, Flag) @@ -125,7 +126,7 @@ public: QDeclarativePropertyCache *copy() const; void append(QDeclarativeEngine *, const QMetaObject *, Data::Flag propertyFlags = Data::NoFlags, - Data::Flag methodFlags = Data::NoFlags); + Data::Flag methodFlags = Data::NoFlags, Data::Flag signalFlags = Data::NoFlags); static QDeclarativePropertyCache *create(QDeclarativeEngine *, const QMetaObject *); static Data create(const QMetaObject *, const QString &); @@ -133,6 +134,7 @@ public: inline Data *property(const QScriptDeclarativeClass::Identifier &id) const; Data *property(const QString &) const; Data *property(int) const; + Data *method(int) const; QStringList propertyNames() const; inline QDeclarativeEngine *qmlEngine() const; @@ -152,6 +154,7 @@ private: QDeclarativeEngine *engine; IndexCache indexCache; + IndexCache methodIndexCache; StringCache stringCache; IdentifierCache identifierCache; }; diff --git a/src/declarative/qml/qdeclarativeproxymetaobject.cpp b/src/declarative/qml/qdeclarativeproxymetaobject.cpp index c2dce0a..ceb6977 100644 --- a/src/declarative/qml/qdeclarativeproxymetaobject.cpp +++ b/src/declarative/qml/qdeclarativeproxymetaobject.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ #include "private/qdeclarativeproxymetaobject_p.h" +#include "private/qdeclarativeproperty_p.h" QT_BEGIN_NAMESPACE @@ -95,8 +96,7 @@ int QDeclarativeProxyMetaObject::metaCall(QMetaObject::Call c, int id, void **a) QMetaMethod method = metaObject->method(jj + methodOffset); if (method.methodType() == QMetaMethod::Signal) - QMetaObject::connect(proxy, methodOffset + jj, - object, localOffset + jj); + QDeclarativePropertyPrivate::connect(proxy, methodOffset + jj, object, localOffset + jj); } } diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp index 4e41c22..360186c 100644 --- a/src/declarative/qml/qdeclarativevme.cpp +++ b/src/declarative/qml/qdeclarativevme.cpp @@ -608,7 +608,7 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEStack<QObject *> &stack, if (!QMetaObject::checkConnectArgs(prop.method().signature(), method.signature())) VME_EXCEPTION(QCoreApplication::translate("QDeclarativeVME","Cannot connect mismatched signal/slot %1 %vs. %2").arg(QString::fromLatin1(method.signature())).arg(QString::fromLatin1(prop.method().signature()))); - QMetaObject::connect(target, prop.index(), assign, method.methodIndex()); + QDeclarativePropertyPrivate::connect(target, prop.index(), assign, method.methodIndex()); } else { VME_EXCEPTION(QCoreApplication::translate("QDeclarativeVME","Cannot assign an object to signal property %1").arg(QString::fromUtf8(pr))); diff --git a/src/declarative/qml/qdeclarativevmemetaobject.cpp b/src/declarative/qml/qdeclarativevmemetaobject.cpp index 3e32006..37f08fc 100644 --- a/src/declarative/qml/qdeclarativevmemetaobject.cpp +++ b/src/declarative/qml/qdeclarativevmemetaobject.cpp @@ -584,19 +584,7 @@ int QDeclarativeVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a) if (!target) return -1; - if (c == QMetaObject::ReadProperty && !aConnected.testBit(id)) { - int sigIdx = methodOffset + id + metaData->propertyCount; - QMetaObject::connect(context, d->contextIdx + ctxtPriv->notifyIndex, object, sigIdx); - - if (d->propertyIdx != -1) { - QMetaProperty prop = - target->metaObject()->property(d->propertyIdx); - if (prop.hasNotifySignal()) - QMetaObject::connect(target, prop.notifySignalIndex(), - object, sigIdx); - } - aConnected.setBit(id); - } + connectAlias(id); if (d->propertyIdx == -1) { *reinterpret_cast<QObject **>(a[0]) = target; @@ -818,4 +806,38 @@ void QDeclarativeVMEMetaObject::setVMEProperty(int index, const QScriptValue &v) return writeVarProperty(index - propOffset, v); } +void QDeclarativeVMEMetaObject::connectAlias(int aliasId) +{ + if (!aConnected.testBit(aliasId)) { + aConnected.setBit(aliasId); + + QDeclarativeContext *context = ctxt->asQDeclarativeContext(); + QDeclarativeContextPrivate *ctxtPriv = QDeclarativeContextPrivate::get(context); + + QDeclarativeVMEMetaData::AliasData *d = metaData->aliasData() + aliasId; + + QObject *target = ctxtPriv->data->idValues[d->contextIdx].data(); + if (!target) + return; + + int sigIdx = methodOffset + aliasId + metaData->propertyCount; + QMetaObject::connect(context, d->contextIdx + ctxtPriv->notifyIndex, object, sigIdx); + + if (d->propertyIdx != -1) { + QMetaProperty prop = target->metaObject()->property(d->propertyIdx); + if (prop.hasNotifySignal()) + QDeclarativePropertyPrivate::connect(target, prop.notifySignalIndex(), object, sigIdx); + } + } +} + +void QDeclarativeVMEMetaObject::connectAliasSignal(int index) +{ + int aliasId = (index - methodOffset) - metaData->propertyCount; + if (aliasId < 0 || aliasId >= metaData->aliasCount) + return; + + connectAlias(aliasId); +} + QT_END_NAMESPACE diff --git a/src/declarative/qml/qdeclarativevmemetaobject_p.h b/src/declarative/qml/qdeclarativevmemetaobject_p.h index 20ca80b..4ccaa73 100644 --- a/src/declarative/qml/qdeclarativevmemetaobject_p.h +++ b/src/declarative/qml/qdeclarativevmemetaobject_p.h @@ -126,6 +126,7 @@ public: QScriptValue vmeProperty(int index); void setVMEProperty(int index, const QScriptValue &); + void connectAliasSignal(int index); protected: virtual int metaCall(QMetaObject::Call _c, int _id, void **_a); @@ -140,6 +141,7 @@ private: QDeclarativeVMEVariant *data; + void connectAlias(int aliasId); QBitArray aConnected; QBitArray aInterceptors; QHash<int, QPair<int, QDeclarativePropertyValueInterceptor*> > interceptors; diff --git a/src/declarative/qml/qdeclarativewatcher.cpp b/src/declarative/qml/qdeclarativewatcher.cpp index da1419f..b9d5ec8 100644 --- a/src/declarative/qml/qdeclarativewatcher.cpp +++ b/src/declarative/qml/qdeclarativewatcher.cpp @@ -46,6 +46,7 @@ #include "qdeclarative.h" #include <qdeclarativedebugservice_p.h> +#include "private/qdeclarativeproperty_p.h" #include <QtCore/qmetaobject.h> #include <QtCore/qdebug.h> @@ -103,7 +104,7 @@ QDeclarativeWatchProxy::QDeclarativeWatchProxy(int id, refreshIdx = QDeclarativeWatchProxy::staticMetaObject.indexOfMethod("notifyValueChanged()"); if (prop.hasNotifySignal()) - QMetaObject::connect(m_object, prop.notifySignalIndex(), this, refreshIdx); + QDeclarativePropertyPrivate::connect(m_object, prop.notifySignalIndex(), this, refreshIdx); } void QDeclarativeWatchProxy::notifyValueChanged() diff --git a/src/gui/embedded/qkbd_qws.cpp b/src/gui/embedded/qkbd_qws.cpp index b28e293..a6c8002 100644 --- a/src/gui/embedded/qkbd_qws.cpp +++ b/src/gui/embedded/qkbd_qws.cpp @@ -450,6 +450,8 @@ void QWSKeyboardHandler::endAutoRepeat() /*! \fn QWSKeyboardHandler::KeycodeAction QWSKeyboardHandler::processKeycode(quint16 keycode, bool isPress, bool autoRepeat) + \since 4.6 + Maps \a keycode according to a keymap and sends that key event to the \l{Qt for Embedded Linux} server application. diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index fdacefc..3323fbc 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -477,11 +477,14 @@ bool Q_GUI_EXPORT qt_tab_all_widgets = true; bool qt_in_tab_key_event = false; int qt_antialiasing_threshold = -1; static int drag_time = 500; +#ifndef QT_GUI_DRAG_DISTANCE +#define QT_GUI_DRAG_DISTANCE 4 +#endif #ifdef Q_OS_SYMBIAN // The screens are a bit too small to for your thumb when using only 4 pixels drag distance. -static int drag_distance = 12; +static int drag_distance = 12; //XXX move to qplatformdefs.h #else -static int drag_distance = 4; +static int drag_distance = QT_GUI_DRAG_DISTANCE; #endif static Qt::LayoutDirection layout_direction = Qt::LeftToRight; QSize QApplicationPrivate::app_strut = QSize(0,0); // no default application strut diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index 1127c84..296f24f 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -152,18 +152,12 @@ void QS60Data::controlVisibilityChanged(CCoeControl *control, bool visible) if (backingStore.data()) { backingStore.registerWidget(widget); } else { -#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS - S60->wsSession().SendEffectCommand(ETfxCmdRestoreLayer); -#endif backingStore.create(window); backingStore.registerWidget(widget); qt_widget_private(widget)->invalidateBuffer(widget->rect()); widget->repaint(); } } else { -#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS - S60->wsSession().SendEffectCommand(ETfxCmdDeallocateLayer); -#endif backingStore.unregisterWidget(widget); // In order to ensure that any resources used by the window surface // are immediately freed, we flush the WSERV command buffer. diff --git a/src/gui/kernel/qclipboard_x11.cpp b/src/gui/kernel/qclipboard_x11.cpp index 4b75f0a..55548ef 100644 --- a/src/gui/kernel/qclipboard_x11.cpp +++ b/src/gui/kernel/qclipboard_x11.cpp @@ -595,7 +595,7 @@ static inline int maxSelectionIncr(Display *dpy) { return XMaxRequestSize(dpy) > 65536 ? 65536*4 : XMaxRequestSize(dpy)*4 - 100; } bool QX11Data::clipboardReadProperty(Window win, Atom property, bool deleteProperty, - QByteArray *buffer, int *size, Atom *type, int *format, bool nullterm) + QByteArray *buffer, int *size, Atom *type, int *format) { int maxsize = maxSelectionIncr(display); ulong bytes_left; // bytes_after @@ -641,13 +641,13 @@ bool QX11Data::clipboardReadProperty(Window win, Atom property, bool deletePrope break; } - int newSize = proplen + (nullterm ? 1 : 0); + int newSize = proplen; buffer->resize(newSize); bool ok = (buffer->size() == newSize); VDEBUG("QClipboard: read_property(): buffer resized to %d", buffer->size()); - if (ok) { + if (ok && newSize) { // could allocate buffer while (bytes_left) { @@ -683,23 +683,19 @@ bool QX11Data::clipboardReadProperty(Window win, Atom property, bool deletePrope XTextProperty textprop; textprop.encoding = *type; textprop.format = *format; - textprop.nitems = length; + textprop.nitems = buffer_offset; textprop.value = (unsigned char *) buffer->data(); char **list_ret = 0; int count; if (XmbTextPropertyToTextList(display, &textprop, &list_ret, &count) == Success && count && list_ret) { - offset = strlen(list_ret[0]); - buffer->resize(offset + (nullterm ? 1 : 0)); + offset = buffer_offset = strlen(list_ret[0]); + buffer->resize(offset); memcpy(buffer->data(), list_ret[0], offset); } if (list_ret) XFreeStringList(list_ret); } - - // zero-terminate (for text) - if (nullterm) - buffer->data()[buffer_offset] = '\0'; } // correct size, not 0-term. @@ -742,7 +738,7 @@ QByteArray QX11Data::clipboardReadIncrementalProperty(Window win, Atom property, if (event.xproperty.atom != property || event.xproperty.state != PropertyNewValue) continue; - if (X11->clipboardReadProperty(win, property, true, &tmp_buf, &length, 0, 0, false)) { + if (X11->clipboardReadProperty(win, property, true, &tmp_buf, &length, 0, 0)) { if (length == 0) { // no more data, we're done if (nullterm) { buf.resize(offset+1); @@ -836,7 +832,7 @@ static Atom send_selection(QClipboardData *d, Atom target, Window window, Atom p ATOM(INCR), 32, PropModeReplace, (uchar *) &bytes, 1); (void)new QClipboardINCRTransaction(window, property, atomFormat, dataFormat, data, increment); - return ATOM(INCR); + return property; } // make sure we can perform the XChangeProperty in a single request @@ -1070,7 +1066,7 @@ bool QClipboard::event(QEvent *e) QByteArray multi_data; if (req->property == XNone || !X11->clipboardReadProperty(req->requestor, req->property, false, &multi_data, - 0, &multi_type, &multi_format, 0) + 0, &multi_type, &multi_format) || multi_format != 32) { // MULTIPLE property not formatted correctly XSendEvent(dpy, req->requestor, False, NoEventMask, &event); @@ -1292,7 +1288,7 @@ QByteArray QClipboardWatcher::getDataInFormat(Atom fmtatom) const Atom type; XSelectInput(dpy, win, PropertyChangeMask); - if (X11->clipboardReadProperty(win, ATOM(_QT_SELECTION), true, &buf, 0, &type, 0, false)) { + if (X11->clipboardReadProperty(win, ATOM(_QT_SELECTION), true, &buf, 0, &type, 0)) { if (type == ATOM(INCR)) { int nbytes = buf.size() >= 4 ? *((int*)buf.data()) : 0; buf = X11->clipboardReadIncrementalProperty(win, ATOM(_QT_SELECTION), nbytes, false); diff --git a/src/gui/kernel/qcocoaapplicationdelegate_mac.mm b/src/gui/kernel/qcocoaapplicationdelegate_mac.mm index 7a9dc70..9b07d64 100644 --- a/src/gui/kernel/qcocoaapplicationdelegate_mac.mm +++ b/src/gui/kernel/qcocoaapplicationdelegate_mac.mm @@ -320,5 +320,10 @@ static void cleanupCocoaApplicationDelegate() [NSApp terminate:self]; } +- (void)qtDispatcherToQAction:(id)sender +{ + [[NSApp QT_MANGLE_NAMESPACE(qt_qcocoamenuLoader)] qtDispatcherToQAction:sender]; +} + @end #endif diff --git a/src/gui/kernel/qdnd_x11.cpp b/src/gui/kernel/qdnd_x11.cpp index 92dd0a1..68d7688 100644 --- a/src/gui/kernel/qdnd_x11.cpp +++ b/src/gui/kernel/qdnd_x11.cpp @@ -1887,7 +1887,7 @@ static QVariant xdndObtainData(const char *format, QVariant::Type requestedType) if (got) { Atom type; - if (X11->clipboardReadProperty(tw->effectiveWinId(), ATOM(XdndSelection), true, &result, 0, &type, 0, false)) { + if (X11->clipboardReadProperty(tw->effectiveWinId(), ATOM(XdndSelection), true, &result, 0, &type, 0)) { if (type == ATOM(INCR)) { int nbytes = result.size() >= 4 ? *((int*)result.data()) : 0; result = X11->clipboardReadIncrementalProperty(tw->effectiveWinId(), ATOM(XdndSelection), nbytes, false); diff --git a/src/gui/kernel/qmotifdnd_x11.cpp b/src/gui/kernel/qmotifdnd_x11.cpp index 0a7b350..3334455 100644 --- a/src/gui/kernel/qmotifdnd_x11.cpp +++ b/src/gui/kernel/qmotifdnd_x11.cpp @@ -766,7 +766,7 @@ QVariant QX11Data::motifdndObtainData(const char *mimeType) if (got) { Atom type; - if (X11->clipboardReadProperty(tw->internalWinId(), Dnd_selection, true, &result, 0, &type, 0, false)) { + if (X11->clipboardReadProperty(tw->internalWinId(), Dnd_selection, true, &result, 0, &type, 0)) { } } diff --git a/src/gui/kernel/qt_x11_p.h b/src/gui/kernel/qt_x11_p.h index 7383382..d62d9c3 100644 --- a/src/gui/kernel/qt_x11_p.h +++ b/src/gui/kernel/qt_x11_p.h @@ -350,7 +350,7 @@ struct QX11Data // from qclipboard_x11.cpp bool clipboardWaitForEvent(Window win, int type, XEvent *event, int timeout); bool clipboardReadProperty(Window win, Atom property, bool deleteProperty, - QByteArray *buffer, int *size, Atom *type, int *format, bool nullterm); + QByteArray *buffer, int *size, Atom *type, int *format); QByteArray clipboardReadIncrementalProperty(Window win, Atom property, int nbytes, bool nullterm); // from qdnd_x11.cpp diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp index 8d80e10..9085e98 100644 --- a/src/gui/kernel/qwidget_x11.cpp +++ b/src/gui/kernel/qwidget_x11.cpp @@ -1933,20 +1933,27 @@ void QWidgetPrivate::show_sys() if (flags & Qt::WindowStaysOnTopHint) { if (flags & Qt::WindowStaysOnBottomHint) qWarning() << "QWidget: Incompatible window flags: the window can't be on top and on bottom at the same time"; - netWmState.append(ATOM(_NET_WM_STATE_ABOVE)); - netWmState.append(ATOM(_NET_WM_STATE_STAYS_ON_TOP)); + if (!netWmState.contains(ATOM(_NET_WM_STATE_ABOVE))) + netWmState.append(ATOM(_NET_WM_STATE_ABOVE)); + if (!netWmState.contains(ATOM(_NET_WM_STATE_STAYS_ON_TOP))) + netWmState.append(ATOM(_NET_WM_STATE_STAYS_ON_TOP)); } else if (flags & Qt::WindowStaysOnBottomHint) { - netWmState.append(ATOM(_NET_WM_STATE_BELOW)); + if (!netWmState.contains(ATOM(_NET_WM_STATE_BELOW))) + netWmState.append(ATOM(_NET_WM_STATE_BELOW)); } if (q->isFullScreen()) { - netWmState.append(ATOM(_NET_WM_STATE_FULLSCREEN)); + if (!netWmState.contains(ATOM(_NET_WM_STATE_FULLSCREEN))) + netWmState.append(ATOM(_NET_WM_STATE_FULLSCREEN)); } if (q->isMaximized()) { - netWmState.append(ATOM(_NET_WM_STATE_MAXIMIZED_HORZ)); - netWmState.append(ATOM(_NET_WM_STATE_MAXIMIZED_VERT)); + if (!netWmState.contains(ATOM(_NET_WM_STATE_MAXIMIZED_HORZ))) + netWmState.append(ATOM(_NET_WM_STATE_MAXIMIZED_HORZ)); + if (!netWmState.contains(ATOM(_NET_WM_STATE_MAXIMIZED_VERT))) + netWmState.append(ATOM(_NET_WM_STATE_MAXIMIZED_VERT)); } if (data.window_modality != Qt::NonModal) { - netWmState.append(ATOM(_NET_WM_STATE_MODAL)); + if (!netWmState.contains(ATOM(_NET_WM_STATE_MODAL))) + netWmState.append(ATOM(_NET_WM_STATE_MODAL)); } if (!netWmState.isEmpty()) { diff --git a/src/gui/painting/qpaintengine_s60.cpp b/src/gui/painting/qpaintengine_s60.cpp index 068ca0c..d7fc0af 100644 --- a/src/gui/painting/qpaintengine_s60.cpp +++ b/src/gui/painting/qpaintengine_s60.cpp @@ -59,44 +59,63 @@ bool QS60PaintEngine::begin(QPaintDevice *device) { Q_D(QS60PaintEngine); - pixmapData->beginDataAccess(); - bool ret = QRasterPaintEngine::begin(device); - // Make sure QPaintEngine::paintDevice() returns the proper device. - // QRasterPaintEngine changes pdev to QImage in case of RasterClass QPixmapData - // which is incorrect in Symbian. - d->pdev = device; - return ret; + if (pixmapData->classId() == QPixmapData::RasterClass) { + pixmapData->beginDataAccess(); + bool ret = QRasterPaintEngine::begin(device); + // Make sure QPaintEngine::paintDevice() returns the proper device. + // QRasterPaintEngine changes pdev to QImage in case of RasterClass QPixmapData + // which is incorrect in Symbian. + d->pdev = device; + return ret; + } + + return QRasterPaintEngine::begin(device); } bool QS60PaintEngine::end() { - bool ret = QRasterPaintEngine::end(); - pixmapData->endDataAccess(); - return ret; + if (pixmapData->classId() == QPixmapData::RasterClass) { + bool ret = QRasterPaintEngine::end(); + pixmapData->endDataAccess(); + return ret; + } + return QRasterPaintEngine::end(); } void QS60PaintEngine::drawPixmap(const QPointF &p, const QPixmap &pm) { - QS60PixmapData *srcData = static_cast<QS60PixmapData *>(pm.pixmapData()); - srcData->beginDataAccess(); - QRasterPaintEngine::drawPixmap(p, pm); - srcData->endDataAccess(); + if (pm.pixmapData()->classId() == QPixmapData::RasterClass) { + QS60PixmapData *srcData = static_cast<QS60PixmapData *>(pm.pixmapData()); + srcData->beginDataAccess(); + QRasterPaintEngine::drawPixmap(p, pm); + srcData->endDataAccess(); + } else { + QRasterPaintEngine::drawPixmap(p, pm); + } } void QS60PaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) { - QS60PixmapData *srcData = static_cast<QS60PixmapData *>(pm.pixmapData()); - srcData->beginDataAccess(); - QRasterPaintEngine::drawPixmap(r, pm, sr); - srcData->endDataAccess(); + if (pm.pixmapData()->classId() == QPixmapData::RasterClass) { + QS60PixmapData *srcData = static_cast<QS60PixmapData *>(pm.pixmapData()); + srcData->beginDataAccess(); + QRasterPaintEngine::drawPixmap(r, pm, sr); + srcData->endDataAccess(); + } else { + QRasterPaintEngine::drawPixmap(r, pm, sr); + } } void QS60PaintEngine::drawTiledPixmap(const QRectF &r, const QPixmap &pm, const QPointF &sr) { - QS60PixmapData *srcData = static_cast<QS60PixmapData *>(pm.pixmapData()); - srcData->beginDataAccess(); - QRasterPaintEngine::drawTiledPixmap(r, pm, sr); - srcData->endDataAccess(); + if (pm.pixmapData()->classId() == QPixmapData::RasterClass) { + QS60PixmapData *srcData = static_cast<QS60PixmapData *>(pm.pixmapData()); + srcData->beginDataAccess(); + QRasterPaintEngine::drawTiledPixmap(r, pm, sr); + srcData->endDataAccess(); + } else { + QRasterPaintEngine::drawTiledPixmap(r, pm, sr); + } } void QS60PaintEngine::prepare(QImage *image) diff --git a/src/gui/styles/qgtkstyle.cpp b/src/gui/styles/qgtkstyle.cpp index c5429dd..9cc64b3 100644 --- a/src/gui/styles/qgtkstyle.cpp +++ b/src/gui/styles/qgtkstyle.cpp @@ -225,9 +225,8 @@ QPalette QGtkStyle::standardPalette() const GtkStyle *style = d->gtkStyle(); GtkWidget *gtkButton = d->gtkWidget("GtkButton"); GtkWidget *gtkEntry = d->getTextColorWidget(); - - GdkColor gdkBg, gdkBase, gdkText, gdkForeground, gdkSbg, gdkSfg; - QColor bg, base, text, fg, highlight, highlightText; + GdkColor gdkBg, gdkBase, gdkText, gdkForeground, gdkSbg, gdkSfg, gdkaSbg, gdkaSfg; + QColor bg, base, text, fg, highlight, highlightText, inactiveHighlight, inactiveHighlightedTExt; gdkBg = style->bg[GTK_STATE_NORMAL]; gdkForeground = gtkButton->style->fg[GTK_STATE_NORMAL]; @@ -237,14 +236,23 @@ QPalette QGtkStyle::standardPalette() const gdkText = gtkEntry->style->text[GTK_STATE_NORMAL]; gdkSbg = gtkEntry->style->base[GTK_STATE_SELECTED]; gdkSfg = gtkEntry->style->text[GTK_STATE_SELECTED]; + + // The ACTIVE base color is really used for inactive windows + gdkaSbg = gtkEntry->style->base[GTK_STATE_ACTIVE]; + gdkaSfg = gtkEntry->style->text[GTK_STATE_ACTIVE]; + bg = QColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8); text = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8); fg = QColor(gdkForeground.red>>8, gdkForeground.green>>8, gdkForeground.blue>>8); base = QColor(gdkBase.red>>8, gdkBase.green>>8, gdkBase.blue>>8); highlight = QColor(gdkSbg.red>>8, gdkSbg.green>>8, gdkSbg.blue>>8); highlightText = QColor(gdkSfg.red>>8, gdkSfg.green>>8, gdkSfg.blue>>8); + inactiveHighlight = QColor(gdkaSbg.red>>8, gdkaSbg.green>>8, gdkaSbg.blue>>8); + inactiveHighlightedTExt = QColor(gdkaSfg.red>>8, gdkaSfg.green>>8, gdkaSfg.blue>>8); palette.setColor(QPalette::HighlightedText, highlightText); + + palette.setColor(QPalette::Light, bg.lighter(125)); palette.setColor(QPalette::Shadow, bg.darker(130)); palette.setColor(QPalette::Dark, bg.darker(120)); @@ -279,6 +287,10 @@ QPalette QGtkStyle::standardPalette() const highlightText.setHsv(highlightText.hue(), 0, highlightText.value(), highlightText.alpha()); palette.setColor(QPalette::Disabled, QPalette::Highlight, highlight); palette.setColor(QPalette::Disabled, QPalette::HighlightedText, highlightText); + + palette.setColor(QPalette::Inactive, QPalette::HighlightedText, inactiveHighlightedTExt); + palette.setColor(QPalette::Inactive, QPalette::Highlight, inactiveHighlight); + style = d->gtk_rc_get_style_by_paths(d->gtk_settings_get_default(), "gtk-tooltips", "GtkWindow", d->gtk_window_get_type()); if (style) { @@ -791,10 +803,13 @@ void QGtkStyle::drawPrimitive(PrimitiveElement element, // ### this mess should move to subcontrolrect QRect frameRect = option->rect.adjusted(1, 1, -1, -2); - if (qobject_cast<const QTabBar*>(widget)) - frameRect.adjust(-1, 1, 1, 1); - - gtkPainter.paintFocus(NULL, "tab", frameRect, GTK_STATE_ACTIVE, style); + if (qobject_cast<const QTabBar*>(widget)) { + GtkWidget *gtkNotebook = d->gtkWidget("GtkNotebook"); + style = gtkPainter.getStyle(gtkNotebook); + gtkPainter.paintFocus(gtkNotebook, "tab", frameRect.adjusted(-1, 1, 1, 1), GTK_STATE_ACTIVE, style); + } else { + gtkPainter.paintFocus(NULL, "tab", frameRect, GTK_STATE_ACTIVE, style); + } } break; diff --git a/src/gui/styles/qmacstyle_mac.mm b/src/gui/styles/qmacstyle_mac.mm index 671a888..fb31ae4 100644 --- a/src/gui/styles/qmacstyle_mac.mm +++ b/src/gui/styles/qmacstyle_mac.mm @@ -3336,6 +3336,8 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter if (needText) { QPalette pal = tb->palette; QPalette::ColorRole role = QPalette::NoRole; + if (!proxy()->styleHint(SH_UnderlineShortcut, tb, w)) + alignment |= Qt::TextHideMnemonic; if (down) cr.translate(shiftX, shiftY); if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_5 @@ -3353,13 +3355,13 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter role = QPalette::HighlightedText; } } - drawItemText(p, cr, alignment, pal, - tb->state & State_Enabled, tb->text, role); + proxy()->drawItemText(p, cr, alignment, pal, + tb->state & State_Enabled, tb->text, role); if (QSysInfo::MacintoshVersion < QSysInfo::MV_10_5 && (tb->state & State_Sunken)) { // Draw a "drop shadow" in earlier versions. - drawItemText(p, cr.adjusted(0, 1, 0, 1), alignment, - tb->palette, tb->state & State_Enabled, tb->text); + proxy()->drawItemText(p, cr.adjusted(0, 1, 0, 1), alignment, + tb->palette, tb->state & State_Enabled, tb->text); } } } else { diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp index 3a01f3f..1e32bd8 100644 --- a/src/gui/styles/qs60style.cpp +++ b/src/gui/styles/qs60style.cpp @@ -106,8 +106,8 @@ const short QS60StylePrivate::data[][MAX_PIXELMETRICS] = { // *** generated pixel metrics *** {5,0,-909,0,0,2,0,0,-1,7,12,22,15,15,7,198,-909,-909,-909,20,13,2,0,0,21,7,18,30,3,3,1,-909,-909,0,1,0,0,12,20,15,15,18,18,1,115,18,0,-909,-909,-909,-909,0,0,16,2,-909,0,0,-909,16,-909,-909,-909,-909,32,18,55,24,55,4,4,4,9,13,-909,5,51,11,5,0,3,3,6,8,3,3,-909,2,-909,-909,-909,-909,5,5,3,1,106}, {5,0,-909,0,0,1,0,0,-1,8,14,22,15,15,7,164,-909,-909,-909,19,15,2,0,0,21,8,27,28,4,4,1,-909,-909,0,7,6,0,13,23,17,17,21,21,7,115,21,0,-909,-909,-909,-909,0,0,15,1,-909,0,0,-909,15,-909,-909,-909,-909,32,21,65,27,65,3,3,5,10,15,-909,5,58,13,5,0,4,4,7,9,4,4,-909,2,-909,-909,-909,-909,6,6,3,1,106}, -{7,0,-909,0,0,2,0,0,-1,25,69,46,37,37,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,44,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,13,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135}, -{7,0,-909,0,0,2,0,0,-1,25,68,46,37,37,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,52,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,12,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135}, +{7,0,-909,0,0,2,0,0,-1,25,69,46,37,37,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,44,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,3,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135}, +{7,0,-909,0,0,2,0,0,-1,25,68,46,37,37,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,52,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,3,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1,135}, {7,0,-909,0,0,2,0,0,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,30,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1,106} // *** End of generated data *** }; @@ -2453,7 +2453,7 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti case PE_PanelItemViewRow: // ### Qt 5: remove #ifndef QT_NO_ITEMVIEWS if (const QStyleOptionViewItemV4 *vopt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(option)) { - if (QS60StylePrivate::equalToThemePalette(vopt->palette.base().texture().cacheKey(), QPalette::Base)) { + if (!QS60StylePrivate::equalToThemePalette(vopt->palette.base().texture().cacheKey(), QPalette::Base)) { //QPalette::Base has been changed, let commonstyle draw the item commonStyleDraws = true; } else { @@ -2530,11 +2530,6 @@ int QS60Style::pixelMetric(PixelMetric metric, const QStyleOption *option, const //without having to define custom pixel metric metricValue *= 2; - if (widget && (metric == PM_FocusFrameHMargin)) - if (qobject_cast<const QTableView *>(widget)) - //Halve the focus frame margin for table items - metricValue /= 2; - return metricValue; } diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp index 6affa36..d717214 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols.cpp +++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp @@ -333,7 +333,7 @@ static QStringList findAllLibSsl() paths = QString::fromLatin1(qgetenv("LD_LIBRARY_PATH")) .split(QLatin1Char(':'), QString::SkipEmptyParts); # endif - paths << QLatin1String("/usr/lib") << QLatin1String("/usr/local/lib"); + paths << QLatin1String("/lib") << QLatin1String("/usr/lib") << QLatin1String("/usr/local/lib"); QStringList foundSsls; foreach (const QString &path, paths) { diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index a81ed8e..a98d7cc 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -646,7 +646,7 @@ struct QGL2PEVectorPathCache GLuint ibo; #else float *vertices; - quint32 *indices; + void *indices; #endif int vertexCount; int indexCount; @@ -696,14 +696,6 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path) const QPointF* const points = reinterpret_cast<const QPointF*>(path.points()); - // ### Remove before release... -#ifdef Q_OS_SYMBIAN - // ### There are some unresolved issues in Symbian vector path caching. - static bool do_vectorpath_cache = false; -#else - static bool do_vectorpath_cache = true; -#endif - // Check to see if there's any hints if (path.shape() == QVectorPath::RectangleHint) { QGLRect rect(points[0].x(), points[0].y(), points[2].x(), points[2].y()); @@ -774,8 +766,7 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path) } else { // printf(" - Marking path as cachable...\n"); // Tag it for later so that if the same path is drawn twice, it is assumed to be static and thus cachable - if (do_vectorpath_cache) - path.makeCacheable(); + path.makeCacheable(); vertexCoordinateArray.clear(); vertexCoordinateArray.addPath(path, inverseScale, false); prepareForDraw(currentBrush.isOpaque()); @@ -828,13 +819,16 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path) cache->indexCount = polys.indices.size(); cache->primitiveType = GL_TRIANGLES; cache->iscale = inverseScale; - #ifdef QT_OPENGL_CACHE_AS_VBOS glGenBuffers(1, &cache->vbo); glGenBuffers(1, &cache->ibo); glBindBuffer(GL_ARRAY_BUFFER, cache->vbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint32) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW); + + if (glSupportsElementIndexUint) + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint32) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW); + else + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint16) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW); QVarLengthArray<float> vertices(polys.vertices.size()); for (int i = 0; i < polys.vertices.size(); ++i) @@ -842,8 +836,13 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path) glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), vertices.data(), GL_STATIC_DRAW); #else cache->vertices = (float *) qMalloc(sizeof(float) * polys.vertices.size()); - cache->indices = (quint32 *) qMalloc(sizeof(quint32) * polys.indices.size()); - memcpy(cache->indices, polys.indices.data(), sizeof(quint32) * polys.indices.size()); + if (glSupportsElementIndexUint) { + cache->indices = (quint32 *) qMalloc(sizeof(quint32) * polys.indices.size()); + memcpy(cache->indices, polys.indices.data(), sizeof(quint32) * polys.indices.size()); + } else { + cache->indices = (quint16 *) qMalloc(sizeof(quint16) * polys.indices.size()); + memcpy(cache->indices, polys.indices.data(), sizeof(quint16) * polys.indices.size()); + } for (int i = 0; i < polys.vertices.size(); ++i) cache->vertices[i] = float(inverseScale * polys.vertices.at(i)); #endif @@ -854,19 +853,24 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path) glBindBuffer(GL_ARRAY_BUFFER, cache->vbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo); setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, 0); - glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, 0); + if (glSupportsElementIndexUint) + glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, 0); + else + glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); #else setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, cache->vertices); - glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, cache->indices); + if (glSupportsElementIndexUint) + glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, (qint32 *)cache->indices); + else + glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, (qint16 *)cache->indices); #endif } else { // printf(" - Marking path as cachable...\n"); // Tag it for later so that if the same path is drawn twice, it is assumed to be static and thus cachable - if (do_vectorpath_cache) - path.makeCacheable(); + path.makeCacheable(); // The path is too complicated & needs the stencil technique vertexCoordinateArray.clear(); diff --git a/src/opengl/gl2paintengineex/qtriangulator.cpp b/src/opengl/gl2paintengineex/qtriangulator.cpp index f14b0a4..b839b00 100644 --- a/src/opengl/gl2paintengineex/qtriangulator.cpp +++ b/src/opengl/gl2paintengineex/qtriangulator.cpp @@ -57,6 +57,9 @@ #include <math.h> +#include <private/qgl_p.h> +#include <private/qglextensions_p.h> + QT_BEGIN_NAMESPACE //#define Q_TRIANGULATOR_DEBUG @@ -185,6 +188,18 @@ sort_loop_end: sort(array + low + 1, count - low - 1); } +template<typename T> +struct QVertexSet +{ + inline QVertexSet() { } + inline QVertexSet(const QVertexSet<T> &other) : vertices(other.vertices), indices(other.indices) { } + QVertexSet<T> &operator = (const QVertexSet<T> &other) {vertices = other.vertices; indices = other.indices; return *this;} + + // The vertices of a triangle are given by: (x[i[n]], y[i[n]]), (x[j[n]], y[j[n]]), (x[k[n]], y[k[n]]), n = 0, 1, ... + QVector<qreal> vertices; // [x[0], y[0], x[1], y[1], x[2], ...] + QVector<T> indices; // [i[0], j[0], k[0], i[1], j[1], k[1], i[2], ...] +}; + //============================================================================// // QFraction // //============================================================================// @@ -610,7 +625,7 @@ struct QRBTree // Return 1 if 'left' comes after 'right', 0 if equal, and -1 otherwise. // 'left' and 'right' cannot be null. int order(Node *left, Node *right); - inline bool verify() const; + inline bool validate() const; private: void rotateLeft(Node *node); @@ -1023,7 +1038,7 @@ bool QRBTree<T>::checkRedBlackProperty(Node *top) const } template <class T> -inline bool QRBTree<T>::verify() const +inline bool QRBTree<T>::validate() const { return checkRedBlackProperty(root) && blackDepth(root) != -1; } @@ -1295,7 +1310,7 @@ inline void QRingBuffer<T>::enqueue(const T &x) //============================================================================// // QTriangulator // //============================================================================// - +template<typename T> class QTriangulator { public: @@ -1308,7 +1323,7 @@ public: class ComplexToSimple { public: - inline ComplexToSimple(QTriangulator *parent) : m_parent(parent), + inline ComplexToSimple(QTriangulator<T> *parent) : m_parent(parent), m_edges(0), m_events(0), m_splits(0) { } void decompose(); private: @@ -1422,7 +1437,7 @@ public: class SimpleToMonotone { public: - inline SimpleToMonotone(QTriangulator *parent) : m_parent(parent), m_edges(0), m_upperVertex(0) { } + inline SimpleToMonotone(QTriangulator<T> *parent) : m_parent(parent), m_edges(0), m_upperVertex(0) { } void decompose(); private: enum VertexType {MergeVertex, EndVertex, RegularVertex, StartVertex, SplitVertex}; @@ -1431,7 +1446,7 @@ public: { QRBTree<int>::Node *node; int helper, twin, next, previous; - quint32 from, to; + T from, to; VertexType type; bool pointingUp; int upper() const {return (pointingUp ? to : from);} @@ -1478,20 +1493,20 @@ public: class MonotoneToTriangles { public: - inline MonotoneToTriangles(QTriangulator *parent) : m_parent(parent) { } + inline MonotoneToTriangles(QTriangulator<T> *parent) : m_parent(parent) { } void decompose(); private: - inline quint32 indices(int index) const {return m_parent->m_indices.at(index + m_first);} + inline T indices(int index) const {return m_parent->m_indices.at(index + m_first);} inline int next(int index) const {return (index + 1) % m_length;} inline int previous(int index) const {return (index + m_length - 1) % m_length;} - inline bool less(int i, int j) const {return m_parent->m_vertices.at(indices(i)) < m_parent->m_vertices.at(indices(j));} + inline bool less(int i, int j) const {return m_parent->m_vertices.at((qint32)indices(i)) < m_parent->m_vertices.at(indices(j));} inline bool leftOfEdge(int i, int j, int k) const { - return qPointIsLeftOfLine(m_parent->m_vertices.at(indices(i)), - m_parent->m_vertices.at(indices(j)), m_parent->m_vertices.at(indices(k))); + return qPointIsLeftOfLine(m_parent->m_vertices.at((qint32)indices(i)), + m_parent->m_vertices.at((qint32)indices(j)), m_parent->m_vertices.at((qint32)indices(k))); } - QTriangulator *m_parent; + QTriangulator<T> *m_parent; int m_first; int m_length; }; @@ -1505,11 +1520,11 @@ public: // Call this only once. void initialize(const QPainterPath &path, const QTransform &matrix, qreal lod); // Call either triangulate() or polyline() only once. - QTriangleSet triangulate(); - QPolylineSet polyline(); + QVertexSet<T> triangulate(); + QVertexSet<T> polyline(); private: QDataBuffer<QPodPoint> m_vertices; - QVector<quint32> m_indices; + QVector<T> m_indices; uint m_hint; }; @@ -1517,7 +1532,8 @@ private: // QTriangulator // //============================================================================// -QTriangleSet QTriangulator::triangulate() +template <typename T> +QVertexSet<T> QTriangulator<T>::triangulate() { for (int i = 0; i < m_vertices.size(); ++i) { Q_ASSERT(qAbs(m_vertices.at(i).x) < (1 << 21)); @@ -1536,7 +1552,7 @@ QTriangleSet QTriangulator::triangulate() MonotoneToTriangles m2t(this); m2t.decompose(); - QTriangleSet result; + QVertexSet<T> result; result.indices = m_indices; result.vertices.resize(2 * m_vertices.size()); for (int i = 0; i < m_vertices.size(); ++i) { @@ -1546,9 +1562,10 @@ QTriangleSet QTriangulator::triangulate() return result; } -QPolylineSet QTriangulator::polyline() +template <typename T> +QVertexSet<T> QTriangulator<T>::polyline() { - QPolylineSet result; + QVertexSet<T> result; result.indices = m_indices; result.vertices.resize(2 * m_vertices.size()); for (int i = 0; i < m_vertices.size(); ++i) { @@ -1558,7 +1575,8 @@ QPolylineSet QTriangulator::polyline() return result; } -void QTriangulator::initialize(const qreal *polygon, int count, uint hint, const QTransform &matrix) +template <typename T> +void QTriangulator<T>::initialize(const qreal *polygon, int count, uint hint, const QTransform &matrix) { m_hint = hint; m_vertices.resize(count); @@ -1570,10 +1588,11 @@ void QTriangulator::initialize(const qreal *polygon, int count, uint hint, const m_vertices.at(i).y = qRound(y * Q_FIXED_POINT_SCALE); m_indices[i] = i; } - m_indices[count] = Q_TRIANGULATE_END_OF_POLYGON; + m_indices[count] = T(-1); //Q_TRIANGULATE_END_OF_POLYGON } -void QTriangulator::initialize(const QVectorPath &path, const QTransform &matrix, qreal lod) +template <typename T> +void QTriangulator<T>::initialize(const QVectorPath &path, const QTransform &matrix, qreal lod) { m_hint = path.hints(); // Curved paths will be converted to complex polygons. @@ -1586,10 +1605,10 @@ void QTriangulator::initialize(const QVectorPath &path, const QTransform &matrix switch (*e) { case QPainterPath::MoveToElement: if (!m_indices.isEmpty()) - m_indices.push_back(Q_TRIANGULATE_END_OF_POLYGON); + m_indices.push_back(T(-1)); // Q_TRIANGULATE_END_OF_POLYGON // Fall through. case QPainterPath::LineToElement: - m_indices.push_back(quint32(m_vertices.size())); + m_indices.push_back(T(m_vertices.size())); m_vertices.resize(m_vertices.size() + 1); qreal x, y; matrix.map(p[0], p[1], &x, &y); @@ -1607,7 +1626,7 @@ void QTriangulator::initialize(const QVectorPath &path, const QTransform &matrix QPolygonF poly = bezier.toPolygon(); // Skip first point, it already exists in 'm_vertices'. for (int j = 1; j < poly.size(); ++j) { - m_indices.push_back(quint32(m_vertices.size())); + m_indices.push_back(T(m_vertices.size())); m_vertices.resize(m_vertices.size() + 1); m_vertices.last().x = qRound(poly.at(j).x() * Q_FIXED_POINT_SCALE / lod); m_vertices.last().y = qRound(poly.at(j).y() * Q_FIXED_POINT_SCALE / lod); @@ -1624,7 +1643,7 @@ void QTriangulator::initialize(const QVectorPath &path, const QTransform &matrix } } else { for (int i = 0; i < path.elementCount(); ++i, p += 2) { - m_indices.push_back(quint32(m_vertices.size())); + m_indices.push_back(T(m_vertices.size())); m_vertices.resize(m_vertices.size() + 1); qreal x, y; matrix.map(p[0], p[1], &x, &y); @@ -1632,10 +1651,11 @@ void QTriangulator::initialize(const QVectorPath &path, const QTransform &matrix m_vertices.last().y = qRound(y * Q_FIXED_POINT_SCALE); } } - m_indices.push_back(Q_TRIANGULATE_END_OF_POLYGON); + m_indices.push_back(T(-1)); // Q_TRIANGULATE_END_OF_POLYGON } -void QTriangulator::initialize(const QPainterPath &path, const QTransform &matrix, qreal lod) +template <typename T> +void QTriangulator<T>::initialize(const QPainterPath &path, const QTransform &matrix, qreal lod) { initialize(qtVectorPathForPath(path), matrix, lod); } @@ -1643,8 +1663,8 @@ void QTriangulator::initialize(const QPainterPath &path, const QTransform &matri //============================================================================// // QTriangulator::ComplexToSimple // //============================================================================// - -void QTriangulator::ComplexToSimple::decompose() +template <typename T> +void QTriangulator<T>::ComplexToSimple::decompose() { m_initialPointCount = m_parent->m_vertices.size(); initEdges(); @@ -1670,17 +1690,18 @@ void QTriangulator::ComplexToSimple::decompose() processed.setBit(i); i = m_edges.at(i).next; // CCW order } while (i != first); - m_parent->m_indices.push_back(Q_TRIANGULATE_END_OF_POLYGON); + m_parent->m_indices.push_back(T(-1)); // Q_TRIANGULATE_END_OF_POLYGON } } -void QTriangulator::ComplexToSimple::initEdges() +template <typename T> +void QTriangulator<T>::ComplexToSimple::initEdges() { // Initialize edge structure. // 'next' and 'previous' are not being initialized at this point. int first = 0; for (int i = 0; i < m_parent->m_indices.size(); ++i) { - if (m_parent->m_indices.at(i) == Q_TRIANGULATE_END_OF_POLYGON) { + if (m_parent->m_indices.at(i) == T(-1)) { // Q_TRIANGULATE_END_OF_POLYGON if (m_edges.size() != first) m_edges.last().to = m_edges.at(first).from; first = m_edges.size(); @@ -1700,15 +1721,16 @@ void QTriangulator::ComplexToSimple::initEdges() } // Return true if new intersection was found -bool QTriangulator::ComplexToSimple::calculateIntersection(int left, int right) +template <typename T> +bool QTriangulator<T>::ComplexToSimple::calculateIntersection(int left, int right) { const Edge &e1 = m_edges.at(left); const Edge &e2 = m_edges.at(right); - const QPodPoint &u1 = m_parent->m_vertices.at(e1.from); - const QPodPoint &u2 = m_parent->m_vertices.at(e1.to); - const QPodPoint &v1 = m_parent->m_vertices.at(e2.from); - const QPodPoint &v2 = m_parent->m_vertices.at(e2.to); + const QPodPoint &u1 = m_parent->m_vertices.at((qint32)e1.from); + const QPodPoint &u2 = m_parent->m_vertices.at((qint32)e1.to); + const QPodPoint &v1 = m_parent->m_vertices.at((qint32)e2.from); + const QPodPoint &v2 = m_parent->m_vertices.at((qint32)e2.to); if (qMax(u1.x, u2.x) <= qMin(v1.x, v2.x)) return false; @@ -1734,7 +1756,8 @@ bool QTriangulator::ComplexToSimple::calculateIntersection(int left, int right) return true; } -bool QTriangulator::ComplexToSimple::edgeIsLeftOfEdge(int leftEdgeIndex, int rightEdgeIndex) const +template <typename T> +bool QTriangulator<T>::ComplexToSimple::edgeIsLeftOfEdge(int leftEdgeIndex, int rightEdgeIndex) const { const Edge &leftEdge = m_edges.at(leftEdgeIndex); const Edge &rightEdge = m_edges.at(rightEdgeIndex); @@ -1752,7 +1775,8 @@ bool QTriangulator::ComplexToSimple::edgeIsLeftOfEdge(int leftEdgeIndex, int rig return d < 0; } -QRBTree<int>::Node *QTriangulator::ComplexToSimple::searchEdgeLeftOf(int edgeIndex) const +template <typename T> +QRBTree<int>::Node *QTriangulator<T>::ComplexToSimple::searchEdgeLeftOf(int edgeIndex) const { QRBTree<int>::Node *current = m_edgeList.root; QRBTree<int>::Node *result = 0; @@ -1767,7 +1791,8 @@ QRBTree<int>::Node *QTriangulator::ComplexToSimple::searchEdgeLeftOf(int edgeInd return result; } -QRBTree<int>::Node *QTriangulator::ComplexToSimple::searchEdgeLeftOf(int edgeIndex, QRBTree<int>::Node *after) const +template <typename T> +QRBTree<int>::Node *QTriangulator<T>::ComplexToSimple::searchEdgeLeftOf(int edgeIndex, QRBTree<int>::Node *after) const { if (!m_edgeList.root) return after; @@ -1782,7 +1807,8 @@ QRBTree<int>::Node *QTriangulator::ComplexToSimple::searchEdgeLeftOf(int edgeInd return result; } -QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator::ComplexToSimple::bounds(const QPodPoint &point) const +template <typename T> +QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSimple::bounds(const QPodPoint &point) const { QRBTree<int>::Node *current = m_edgeList.root; QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> result(0, 0); @@ -1830,7 +1856,8 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator::ComplexToSimple return result; } -QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator::ComplexToSimple::outerBounds(const QPodPoint &point) const +template <typename T> +QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator<T>::ComplexToSimple::outerBounds(const QPodPoint &point) const { QRBTree<int>::Node *current = m_edgeList.root; QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> result(0, 0); @@ -1886,7 +1913,8 @@ QPair<QRBTree<int>::Node *, QRBTree<int>::Node *> QTriangulator::ComplexToSimple return result; } -void QTriangulator::ComplexToSimple::splitEdgeListRange(QRBTree<int>::Node *leftmost, QRBTree<int>::Node *rightmost, int vertex, const QIntersectionPoint &intersectionPoint) +template <typename T> +void QTriangulator<T>::ComplexToSimple::splitEdgeListRange(QRBTree<int>::Node *leftmost, QRBTree<int>::Node *rightmost, int vertex, const QIntersectionPoint &intersectionPoint) { Q_ASSERT(leftmost && rightmost); @@ -1904,8 +1932,8 @@ void QTriangulator::ComplexToSimple::splitEdgeListRange(QRBTree<int>::Node *left } } - -void QTriangulator::ComplexToSimple::reorderEdgeListRange(QRBTree<int>::Node *leftmost, QRBTree<int>::Node *rightmost) +template <typename T> +void QTriangulator<T>::ComplexToSimple::reorderEdgeListRange(QRBTree<int>::Node *leftmost, QRBTree<int>::Node *rightmost) { Q_ASSERT(leftmost && rightmost); @@ -1932,7 +1960,8 @@ void QTriangulator::ComplexToSimple::reorderEdgeListRange(QRBTree<int>::Node *le calculateIntersection(storeRightmost->data, rightmost->data); } -void QTriangulator::ComplexToSimple::sortEdgeList(const QPodPoint eventPoint) +template <typename T> +void QTriangulator<T>::ComplexToSimple::sortEdgeList(const QPodPoint eventPoint) { QIntersectionPoint eventPoint2 = qIntersectionPoint(eventPoint); while (!m_topIntersection.isEmpty() && m_topIntersection.top().intersectionPoint < eventPoint2) { @@ -1949,8 +1978,8 @@ void QTriangulator::ComplexToSimple::sortEdgeList(const QPodPoint eventPoint) if (!previous) break; const Edge &edge = m_edges.at(previous->data); - const QPodPoint &u = m_parent->m_vertices.at(edge.from); - const QPodPoint &v = m_parent->m_vertices.at(edge.to); + const QPodPoint &u = m_parent->m_vertices.at((qint32)edge.from); + const QPodPoint &v = m_parent->m_vertices.at((qint32)edge.to); if (!currentIntersectionPoint.isOnLine(u, v)) { Q_ASSERT(!currentIntersectionPoint.isAccurate() || qCross(currentIntersectionPoint.upperLeft - u, v - u) != 0); break; @@ -1963,8 +1992,8 @@ void QTriangulator::ComplexToSimple::sortEdgeList(const QPodPoint eventPoint) if (!next) break; const Edge &edge = m_edges.at(next->data); - const QPodPoint &u = m_parent->m_vertices.at(edge.from); - const QPodPoint &v = m_parent->m_vertices.at(edge.to); + const QPodPoint &u = m_parent->m_vertices.at((qint32)edge.from); + const QPodPoint &v = m_parent->m_vertices.at((qint32)edge.to); if (!currentIntersectionPoint.isOnLine(u, v)) { Q_ASSERT(!currentIntersectionPoint.isAccurate() || qCross(currentIntersectionPoint.upperLeft - u, v - u) != 0); break; @@ -1987,7 +2016,8 @@ void QTriangulator::ComplexToSimple::sortEdgeList(const QPodPoint eventPoint) } } -void QTriangulator::ComplexToSimple::fillPriorityQueue() +template <typename T> +void QTriangulator<T>::ComplexToSimple::fillPriorityQueue() { m_events.reset(); m_events.reserve(m_edges.size() * 2); @@ -2010,7 +2040,8 @@ void QTriangulator::ComplexToSimple::fillPriorityQueue() sort(m_events.data(), m_events.size()); } -void QTriangulator::ComplexToSimple::calculateIntersections() +template <typename T> +void QTriangulator<T>::ComplexToSimple::calculateIntersections() { fillPriorityQueue(); @@ -2075,7 +2106,8 @@ void QTriangulator::ComplexToSimple::calculateIntersections() // The upper piece is pushed to the end of the 'm_edges' vector. // The lower piece replaces the old edge. // Return the edge whose 'from' is 'pointIndex'. -int QTriangulator::ComplexToSimple::splitEdge(int splitIndex) +template <typename T> +int QTriangulator<T>::ComplexToSimple::splitEdge(int splitIndex) { const Split &split = m_splits.at(splitIndex); Edge &lowerEdge = m_edges.at(split.edge); @@ -2105,7 +2137,8 @@ int QTriangulator::ComplexToSimple::splitEdge(int splitIndex) } } -bool QTriangulator::ComplexToSimple::splitEdgesAtIntersections() +template <typename T> +bool QTriangulator<T>::ComplexToSimple::splitEdgesAtIntersections() { for (int i = 0; i < m_edges.size(); ++i) m_edges.at(i).mayIntersect = false; @@ -2122,7 +2155,8 @@ bool QTriangulator::ComplexToSimple::splitEdgesAtIntersections() return checkForNewIntersections; } -void QTriangulator::ComplexToSimple::insertEdgeIntoVectorIfWanted(ShortArray &orderedEdges, int i) +template <typename T> +void QTriangulator<T>::ComplexToSimple::insertEdgeIntoVectorIfWanted(ShortArray &orderedEdges, int i) { // Edges with zero length should not reach this part. Q_ASSERT(m_parent->m_vertices.at(m_edges.at(i).from) != m_parent->m_vertices.at(m_edges.at(i).to)); @@ -2152,7 +2186,8 @@ void QTriangulator::ComplexToSimple::insertEdgeIntoVectorIfWanted(ShortArray &or orderedEdges.append(i); } -void QTriangulator::ComplexToSimple::removeUnwantedEdgesAndConnect() +template <typename T> +void QTriangulator<T>::ComplexToSimple::removeUnwantedEdgesAndConnect() { Q_ASSERT(m_edgeList.root == 0); // Initialize priority queue. @@ -2290,7 +2325,8 @@ void QTriangulator::ComplexToSimple::removeUnwantedEdgesAndConnect() } // end while } -void QTriangulator::ComplexToSimple::removeUnusedPoints() { +template <typename T> +void QTriangulator<T>::ComplexToSimple::removeUnusedPoints() { QBitArray used(m_parent->m_vertices.size(), false); for (int i = 0; i < m_edges.size(); ++i) { Q_ASSERT((m_edges.at(i).previous == -1) == (m_edges.at(i).next == -1)); @@ -2314,7 +2350,8 @@ void QTriangulator::ComplexToSimple::removeUnusedPoints() { } } -bool QTriangulator::ComplexToSimple::CompareEdges::operator () (int i, int j) const +template <typename T> +bool QTriangulator<T>::ComplexToSimple::CompareEdges::operator () (int i, int j) const { int cmp = comparePoints(m_parent->m_parent->m_vertices.at(m_parent->m_edges.at(i).from), m_parent->m_parent->m_vertices.at(m_parent->m_edges.at(j).from)); @@ -2325,7 +2362,8 @@ bool QTriangulator::ComplexToSimple::CompareEdges::operator () (int i, int j) co return cmp > 0; } -inline bool QTriangulator::ComplexToSimple::Event::operator < (const Event &other) const +template <typename T> +inline bool QTriangulator<T>::ComplexToSimple::Event::operator < (const Event &other) const { if (point == other.point) return type < other.type; // 'Lower' has higher priority than 'Upper'. @@ -2337,8 +2375,8 @@ inline bool QTriangulator::ComplexToSimple::Event::operator < (const Event &othe //============================================================================// #ifdef Q_TRIANGULATOR_DEBUG - -QTriangulator::ComplexToSimple::DebugDialog::DebugDialog(ComplexToSimple *parent, int currentVertex) +template <typename T> +QTriangulator<T>::ComplexToSimple::DebugDialog::DebugDialog(ComplexToSimple *parent, int currentVertex) : m_parent(parent), m_vertex(currentVertex) { QDataBuffer<QPodPoint> &vertices = m_parent->m_parent->m_vertices; @@ -2360,7 +2398,8 @@ QTriangulator::ComplexToSimple::DebugDialog::DebugDialog(ComplexToSimple *parent m_window = QRectF(minX - border, minY - border, (maxX - minX + 2 * border), (maxY - minY + 2 * border)); } -void QTriangulator::ComplexToSimple::DebugDialog::paintEvent(QPaintEvent *) +template <typename T> +void QTriangulator<T>::ComplexToSimple::DebugDialog::paintEvent(QPaintEvent *) { QPainter p(this); p.setRenderHint(QPainter::Antialiasing, true); @@ -2426,7 +2465,8 @@ void QTriangulator::ComplexToSimple::DebugDialog::paintEvent(QPaintEvent *) } } -void QTriangulator::ComplexToSimple::DebugDialog::wheelEvent(QWheelEvent *event) +template <typename T> +void QTriangulator<T>::ComplexToSimple::DebugDialog::wheelEvent(QWheelEvent *event) { qreal scale = exp(-0.001 * event->delta()); QPointF center = m_window.center(); @@ -2436,7 +2476,8 @@ void QTriangulator::ComplexToSimple::DebugDialog::wheelEvent(QWheelEvent *event) update(); } -void QTriangulator::ComplexToSimple::DebugDialog::mouseMoveEvent(QMouseEvent *event) +template <typename T> +void QTriangulator<T>::ComplexToSimple::DebugDialog::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { QPointF delta = event->pos() - m_lastMousePos; @@ -2449,7 +2490,8 @@ void QTriangulator::ComplexToSimple::DebugDialog::mouseMoveEvent(QMouseEvent *ev } } -void QTriangulator::ComplexToSimple::DebugDialog::mousePressEvent(QMouseEvent *event) +template <typename T> +void QTriangulator<T>::ComplexToSimple::DebugDialog::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) m_lastMousePos = event->pos(); @@ -2462,8 +2504,8 @@ void QTriangulator::ComplexToSimple::DebugDialog::mousePressEvent(QMouseEvent *e //============================================================================// // QTriangulator::SimpleToMonotone // //============================================================================// - -void QTriangulator::SimpleToMonotone::decompose() +template <typename T> +void QTriangulator<T>::SimpleToMonotone::decompose() { setupDataStructures(); removeZeroLengthEdges(); @@ -2482,12 +2524,13 @@ void QTriangulator::SimpleToMonotone::decompose() processed.setBit(i); i = m_edges.at(i).next; } while (i != first); - if (m_parent->m_indices.size() > 0 && m_parent->m_indices.back() != Q_TRIANGULATE_END_OF_POLYGON) - m_parent->m_indices.push_back(Q_TRIANGULATE_END_OF_POLYGON); + if (m_parent->m_indices.size() > 0 && m_parent->m_indices.back() != T(-1)) // Q_TRIANGULATE_END_OF_POLYGON + m_parent->m_indices.push_back(T(-1)); // Q_TRIANGULATE_END_OF_POLYGON } } -void QTriangulator::SimpleToMonotone::setupDataStructures() +template <typename T> +void QTriangulator<T>::SimpleToMonotone::setupDataStructures() { int i = 0; Edge e; @@ -2505,7 +2548,7 @@ void QTriangulator::SimpleToMonotone::setupDataStructures() m_edges.add(e); ++i; Q_ASSERT(i < m_parent->m_indices.size()); - } while (m_parent->m_indices.at(i) != Q_TRIANGULATE_END_OF_POLYGON); + } while (m_parent->m_indices.at(i) != T(-1)); // Q_TRIANGULATE_END_OF_POLYGON m_edges.last().next = start; m_edges.at(start).previous = m_edges.size() - 1; @@ -2519,7 +2562,8 @@ void QTriangulator::SimpleToMonotone::setupDataStructures() } } -void QTriangulator::SimpleToMonotone::removeZeroLengthEdges() +template <typename T> +void QTriangulator<T>::SimpleToMonotone::removeZeroLengthEdges() { for (int i = 0; i < m_edges.size(); ++i) { if (m_parent->m_vertices.at(m_edges.at(i).from) == m_parent->m_vertices.at(m_edges.at(i).to)) { @@ -2547,7 +2591,8 @@ void QTriangulator::SimpleToMonotone::removeZeroLengthEdges() } } -void QTriangulator::SimpleToMonotone::fillPriorityQueue() +template <typename T> +void QTriangulator<T>::SimpleToMonotone::fillPriorityQueue() { m_upperVertex.reset(); m_upperVertex.reserve(m_edges.size()); @@ -2561,7 +2606,8 @@ void QTriangulator::SimpleToMonotone::fillPriorityQueue() //} } -bool QTriangulator::SimpleToMonotone::edgeIsLeftOfEdge(int leftEdgeIndex, int rightEdgeIndex) const +template <typename T> +bool QTriangulator<T>::SimpleToMonotone::edgeIsLeftOfEdge(int leftEdgeIndex, int rightEdgeIndex) const { const Edge &leftEdge = m_edges.at(leftEdgeIndex); const Edge &rightEdge = m_edges.at(rightEdgeIndex); @@ -2575,7 +2621,8 @@ bool QTriangulator::SimpleToMonotone::edgeIsLeftOfEdge(int leftEdgeIndex, int ri } // Returns the rightmost edge not to the right of the given edge. -QRBTree<int>::Node *QTriangulator::SimpleToMonotone::searchEdgeLeftOfEdge(int edgeIndex) const +template <typename T> +QRBTree<int>::Node *QTriangulator<T>::SimpleToMonotone::searchEdgeLeftOfEdge(int edgeIndex) const { QRBTree<int>::Node *current = m_edgeList.root; QRBTree<int>::Node *result = 0; @@ -2591,7 +2638,8 @@ QRBTree<int>::Node *QTriangulator::SimpleToMonotone::searchEdgeLeftOfEdge(int ed } // Returns the rightmost edge left of the given point. -QRBTree<int>::Node *QTriangulator::SimpleToMonotone::searchEdgeLeftOfPoint(int pointIndex) const +template <typename T> +QRBTree<int>::Node *QTriangulator<T>::SimpleToMonotone::searchEdgeLeftOfPoint(int pointIndex) const { QRBTree<int>::Node *current = m_edgeList.root; QRBTree<int>::Node *result = 0; @@ -2609,7 +2657,8 @@ QRBTree<int>::Node *QTriangulator::SimpleToMonotone::searchEdgeLeftOfPoint(int p return result; } -void QTriangulator::SimpleToMonotone::classifyVertex(int i) +template <typename T> +void QTriangulator<T>::SimpleToMonotone::classifyVertex(int i) { Edge &e2 = m_edges.at(i); const Edge &e1 = m_edges.at(e2.previous); @@ -2638,13 +2687,15 @@ void QTriangulator::SimpleToMonotone::classifyVertex(int i) } } -void QTriangulator::SimpleToMonotone::classifyVertices() +template <typename T> +void QTriangulator<T>::SimpleToMonotone::classifyVertices() { for (int i = 0; i < m_edges.size(); ++i) classifyVertex(i); } -bool QTriangulator::SimpleToMonotone::pointIsInSector(const QPodPoint &p, const QPodPoint &v1, const QPodPoint &v2, const QPodPoint &v3) +template <typename T> +bool QTriangulator<T>::SimpleToMonotone::pointIsInSector(const QPodPoint &p, const QPodPoint &v1, const QPodPoint &v2, const QPodPoint &v3) { bool leftOfPreviousEdge = !qPointIsLeftOfLine(p, v2, v1); bool leftOfNextEdge = !qPointIsLeftOfLine(p, v3, v2); @@ -2655,7 +2706,8 @@ bool QTriangulator::SimpleToMonotone::pointIsInSector(const QPodPoint &p, const return leftOfPreviousEdge || leftOfNextEdge; } -bool QTriangulator::SimpleToMonotone::pointIsInSector(int vertex, int sector) +template <typename T> +bool QTriangulator<T>::SimpleToMonotone::pointIsInSector(int vertex, int sector) { const QPodPoint ¢er = m_parent->m_vertices.at(m_edges.at(sector).from); // Handle degenerate edges. @@ -2677,7 +2729,8 @@ bool QTriangulator::SimpleToMonotone::pointIsInSector(int vertex, int sector) return pointIsInSector(p, v1, center, v3); } -int QTriangulator::SimpleToMonotone::findSector(int edge, int vertex) +template <typename T> +int QTriangulator<T>::SimpleToMonotone::findSector(int edge, int vertex) { while (!pointIsInSector(vertex, edge)) { edge = m_edges.at(m_edges.at(edge).previous).twin; @@ -2686,7 +2739,8 @@ int QTriangulator::SimpleToMonotone::findSector(int edge, int vertex) return edge; } -void QTriangulator::SimpleToMonotone::createDiagonal(int lower, int upper) +template <typename T> +void QTriangulator<T>::SimpleToMonotone::createDiagonal(int lower, int upper) { lower = findSector(lower, upper); upper = findSector(upper, lower); @@ -2713,7 +2767,8 @@ void QTriangulator::SimpleToMonotone::createDiagonal(int lower, int upper) m_edges.add(e); } -void QTriangulator::SimpleToMonotone::monotoneDecomposition() +template <typename T> +void QTriangulator<T>::SimpleToMonotone::monotoneDecomposition() { if (m_edges.isEmpty()) return; @@ -2729,8 +2784,8 @@ void QTriangulator::SimpleToMonotone::monotoneDecomposition() Q_ASSERT(i < m_edges.size()); int j = m_edges.at(i).previous; Q_ASSERT(j < m_edges.size()); - m_clockwiseOrder = qPointIsLeftOfLine(m_parent->m_vertices.at(m_edges.at(i).from), - m_parent->m_vertices.at(m_edges.at(j).from), m_parent->m_vertices.at(m_edges.at(i).to)); + m_clockwiseOrder = qPointIsLeftOfLine(m_parent->m_vertices.at((quint32)m_edges.at(i).from), + m_parent->m_vertices.at((quint32)m_edges.at(j).from), m_parent->m_vertices.at((quint32)m_edges.at(i).to)); classifyVertices(); fillPriorityQueue(); @@ -2799,7 +2854,7 @@ void QTriangulator::SimpleToMonotone::monotoneDecomposition() m_edges.at(j).node = node; m_edges.at(j).helper = i; m_edgeList.attachAfter(leftEdgeNode, node); - Q_ASSERT(m_edgeList.verify()); + Q_ASSERT(m_edgeList.validate()); } else { leftEdgeNode = searchEdgeLeftOfEdge(i); QRBTree<int>::Node *node = m_edgeList.newNode(); @@ -2807,7 +2862,7 @@ void QTriangulator::SimpleToMonotone::monotoneDecomposition() m_edges.at(i).node = node; m_edges.at(i).helper = i; m_edgeList.attachAfter(leftEdgeNode, node); - Q_ASSERT(m_edgeList.verify()); + Q_ASSERT(m_edgeList.validate()); } break; case MergeVertex: @@ -2826,7 +2881,7 @@ void QTriangulator::SimpleToMonotone::monotoneDecomposition() diagonals.add(QPair<int, int>(i, m_edges.at(i).helper)); if (m_edges.at(i).node) { m_edgeList.deleteNode(m_edges.at(i).node); - Q_ASSERT(m_edgeList.verify()); + Q_ASSERT(m_edgeList.validate()); } else { qWarning("Inconsistent polygon. (#5)"); } @@ -2835,7 +2890,7 @@ void QTriangulator::SimpleToMonotone::monotoneDecomposition() diagonals.add(QPair<int, int>(i, m_edges.at(j).helper)); if (m_edges.at(j).node) { m_edgeList.deleteNode(m_edges.at(j).node); - Q_ASSERT(m_edgeList.verify()); + Q_ASSERT(m_edgeList.validate()); } else { qWarning("Inconsistent polygon. (#6)"); } @@ -2848,7 +2903,8 @@ void QTriangulator::SimpleToMonotone::monotoneDecomposition() createDiagonal(diagonals.at(i).first, diagonals.at(i).second); } -bool QTriangulator::SimpleToMonotone::CompareVertices::operator () (int i, int j) const +template <typename T> +bool QTriangulator<T>::SimpleToMonotone::CompareVertices::operator () (int i, int j) const { if (m_parent->m_edges.at(i).from == m_parent->m_edges.at(j).from) return m_parent->m_edges.at(i).type > m_parent->m_edges.at(j).type; @@ -2859,16 +2915,16 @@ bool QTriangulator::SimpleToMonotone::CompareVertices::operator () (int i, int j //============================================================================// // QTriangulator::MonotoneToTriangles // //============================================================================// - -void QTriangulator::MonotoneToTriangles::decompose() +template <typename T> +void QTriangulator<T>::MonotoneToTriangles::decompose() { - QVector<quint32> result; + QVector<T> result; QDataBuffer<int> stack(m_parent->m_indices.size()); m_first = 0; // Require at least three more indices. while (m_first + 3 <= m_parent->m_indices.size()) { m_length = 0; - while (m_parent->m_indices.at(m_first + m_length) != Q_TRIANGULATE_END_OF_POLYGON) { + while (m_parent->m_indices.at(m_first + m_length) != T(-1)) { // Q_TRIANGULATE_END_OF_POLYGON ++m_length; Q_ASSERT(m_first + m_length < m_parent->m_indices.size()); } @@ -2955,39 +3011,115 @@ void QTriangulator::MonotoneToTriangles::decompose() // qTriangulate // //============================================================================// -QTriangleSet qTriangulate(const qreal *polygon, int count, uint hint, const QTransform &matrix) +QTriangleSet qTriangulate(const qreal *polygon, + int count, uint hint, const QTransform &matrix) { - QTriangulator triangulator; - triangulator.initialize(polygon, count, hint, matrix); - return triangulator.triangulate(); + QGLContext *ctx = 0; // Not really used but needs to be introduced for glSupportsElementIndexUint + + QTriangleSet triangleSet; + if (glSupportsElementIndexUint) { + QTriangulator<quint32> triangulator; + triangulator.initialize(polygon, count, hint, matrix); + QVertexSet<quint32> vertexSet = triangulator.triangulate(); + triangleSet.vertices = vertexSet.vertices; + triangleSet.indices.setDataUint(vertexSet.indices); + + } else { + QTriangulator<quint16> triangulator; + triangulator.initialize(polygon, count, hint, matrix); + QVertexSet<quint16> vertexSet = triangulator.triangulate(); + triangleSet.vertices = vertexSet.vertices; + triangleSet.indices.setDataUshort(vertexSet.indices); + } + return triangleSet; } -QTriangleSet qTriangulate(const QVectorPath &path, const QTransform &matrix, qreal lod) +QTriangleSet qTriangulate(const QVectorPath &path, + const QTransform &matrix, qreal lod) { - QTriangulator triangulator; - triangulator.initialize(path, matrix, lod); - return triangulator.triangulate(); + QGLContext *ctx = 0; // Not really used but needs to be introduced for glSupportsElementIndexUint + + QTriangleSet triangleSet; + if (glSupportsElementIndexUint) { + QTriangulator<quint32> triangulator; + triangulator.initialize(path, matrix, lod); + QVertexSet<quint32> vertexSet = triangulator.triangulate(); + triangleSet.vertices = vertexSet.vertices; + triangleSet.indices.setDataUint(vertexSet.indices); + } else { + QTriangulator<quint16> triangulator; + triangulator.initialize(path, matrix, lod); + QVertexSet<quint16> vertexSet = triangulator.triangulate(); + triangleSet.vertices = vertexSet.vertices; + triangleSet.indices.setDataUshort(vertexSet.indices); + } + return triangleSet; } -QTriangleSet qTriangulate(const QPainterPath &path, const QTransform &matrix, qreal lod) +QTriangleSet qTriangulate(const QPainterPath &path, + const QTransform &matrix, qreal lod) { - QTriangulator triangulator; - triangulator.initialize(path, matrix, lod); - return triangulator.triangulate(); + QGLContext *ctx = 0; // Not really used but needs to be introduced for glSupportsElementIndexUint + + QTriangleSet triangleSet; + if (glSupportsElementIndexUint) { + QTriangulator<quint32> triangulator; + triangulator.initialize(path, matrix, lod); + QVertexSet<quint32> vertexSet = triangulator.triangulate(); + triangleSet.vertices = vertexSet.vertices; + triangleSet.indices.setDataUint(vertexSet.indices); + } else { + QTriangulator<quint16> triangulator; + triangulator.initialize(path, matrix, lod); + QVertexSet<quint16> vertexSet = triangulator.triangulate(); + triangleSet.vertices = vertexSet.vertices; + triangleSet.indices.setDataUshort(vertexSet.indices); + } + return triangleSet; } -QPolylineSet qPolyline(const QVectorPath &path, const QTransform &matrix, qreal lod) +QPolylineSet qPolyline(const QVectorPath &path, + const QTransform &matrix, qreal lod) { - QTriangulator triangulator; - triangulator.initialize(path, matrix, lod); - return triangulator.polyline(); + QGLContext *ctx = 0; // Not really used but needs to be introduced for glSupportsElementIndexUint + + QPolylineSet polyLineSet; + if (glSupportsElementIndexUint) { + QTriangulator<quint32> triangulator; + triangulator.initialize(path, matrix, lod); + QVertexSet<quint32> vertexSet = triangulator.polyline(); + polyLineSet.vertices = vertexSet.vertices; + polyLineSet.indices.setDataUint(vertexSet.indices); + } else { + QTriangulator<quint16> triangulator; + triangulator.initialize(path, matrix, lod); + QVertexSet<quint16> vertexSet = triangulator.triangulate(); + polyLineSet.vertices = vertexSet.vertices; + polyLineSet.indices.setDataUshort(vertexSet.indices); + } + return polyLineSet; } -QPolylineSet qPolyline(const QPainterPath &path, const QTransform &matrix, qreal lod) +QPolylineSet qPolyline(const QPainterPath &path, + const QTransform &matrix, qreal lod) { - QTriangulator triangulator; - triangulator.initialize(path, matrix, lod); - return triangulator.polyline(); + QGLContext *ctx = 0; // Not really used but needs to be introduced for glSupportsElementIndexUint + + QPolylineSet polyLineSet; + if (glSupportsElementIndexUint) { + QTriangulator<quint32> triangulator; + triangulator.initialize(path, matrix, lod); + QVertexSet<quint32> vertexSet = triangulator.polyline(); + polyLineSet.vertices = vertexSet.vertices; + polyLineSet.indices.setDataUint(vertexSet.indices); + } else { + QTriangulator<quint16> triangulator; + triangulator.initialize(path, matrix, lod); + QVertexSet<quint16> vertexSet = triangulator.triangulate(); + polyLineSet.vertices = vertexSet.vertices; + polyLineSet.indices.setDataUshort(vertexSet.indices); + } + return polyLineSet; } QT_END_NAMESPACE diff --git a/src/opengl/gl2paintengineex/qtriangulator_p.h b/src/opengl/gl2paintengineex/qtriangulator_p.h index e5eec39..8f96e9f 100644 --- a/src/opengl/gl2paintengineex/qtriangulator_p.h +++ b/src/opengl/gl2paintengineex/qtriangulator_p.h @@ -58,7 +58,58 @@ QT_BEGIN_NAMESPACE -#define Q_TRIANGULATE_END_OF_POLYGON quint32(-1) +class QVertexIndexVector +{ +public: + enum Type { + UnsignedInt, + UnsignedShort + }; + + inline Type type() const { return t; } + + inline void setDataUint(const QVector<quint32> &data) + { + t = UnsignedInt; + indices32 = data; + } + + inline void setDataUshort(const QVector<quint16> &data) + { + t = UnsignedShort; + indices16 = data; + } + + inline const void* data() const + { + if (t == UnsignedInt) + return indices32.data(); + return indices16.data(); + } + + inline int size() const + { + if (t == UnsignedInt) + return indices32.size(); + return indices16.size(); + } + + inline QVertexIndexVector &operator = (const QVertexIndexVector &other) + { + if (t == UnsignedInt) + indices32 = other.indices32; + else + indices16 = other.indices16; + + return *this; + } + +private: + + Type t; + QVector<quint32> indices32; + QVector<quint16> indices16; +}; struct QTriangleSet { @@ -68,7 +119,7 @@ struct QTriangleSet // The vertices of a triangle are given by: (x[i[n]], y[i[n]]), (x[j[n]], y[j[n]]), (x[k[n]], y[k[n]]), n = 0, 1, ... QVector<qreal> vertices; // [x[0], y[0], x[1], y[1], x[2], ...] - QVector<quint32> indices; // [i[0], j[0], k[0], i[1], j[1], k[1], i[2], ...] + QVertexIndexVector indices; // [i[0], j[0], k[0], i[1], j[1], k[1], i[2], ...] }; struct QPolylineSet @@ -78,8 +129,7 @@ struct QPolylineSet QPolylineSet &operator = (const QPolylineSet &other) {vertices = other.vertices; indices = other.indices; return *this;} QVector<qreal> vertices; // [x[0], y[0], x[1], y[1], x[2], ...] - QVector<quint32> indices; - + QVertexIndexVector indices; }; // The vertex coordinates of the returned triangle set will be rounded to a grid with a mesh size diff --git a/src/opengl/qglextensions_p.h b/src/opengl/qglextensions_p.h index 6259cca..e81e849 100644 --- a/src/opengl/qglextensions_p.h +++ b/src/opengl/qglextensions_p.h @@ -346,6 +346,17 @@ struct QGLExtensionFuncs qt_glEGLImageTargetTexture2DOES = 0; qt_glEGLImageTargetRenderbufferStorageOES = 0; #endif + + // OES_element_index_uint +#if !defined(QT_OPENGL_ES) + qt_glSupportsElementIndexUint = true; +#else + QString extensions = reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)); + if (extensions.contains("GL_OES_element_index_uint")) + qt_glSupportsElementIndexUint = true; + else + qt_glSupportsElementIndexUint = false; +#endif } @@ -473,6 +484,7 @@ struct QGLExtensionFuncs _glEGLImageTargetRenderbufferStorageOES qt_glEGLImageTargetRenderbufferStorageOES; #endif + bool qt_glSupportsElementIndexUint; }; @@ -871,6 +883,8 @@ struct QGLExtensionFuncs #define glEGLImageTargetRenderbufferStorageOES QGLContextPrivate::extensionFuncs(ctx).qt_glEGLImageTargetRenderbufferStorageOES #endif +#define glSupportsElementIndexUint QGLContextPrivate::extensionFuncs(ctx).qt_glSupportsElementIndexUint + extern bool qt_resolve_framebufferobject_extensions(QGLContext *ctx); bool qt_resolve_buffer_extensions(QGLContext *ctx); diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp index f98dcff..8157b2a 100644 --- a/src/opengl/qwindowsurface_gl.cpp +++ b/src/opengl/qwindowsurface_gl.cpp @@ -534,8 +534,9 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint & } } #endif - if (d_ptr->paintedRegion.boundingRect() != geometry() && - hasPartialUpdateSupport()) { + if (hasPartialUpdateSupport() && + d_ptr->paintedRegion.boundingRect().width() * d_ptr->paintedRegion.boundingRect().height() < + geometry().width() * geometry().height() * 0.2) { context()->d_func()->swapRegion(&d_ptr->paintedRegion); } else context()->swapBuffers(); diff --git a/src/openvg/openvg.pro b/src/openvg/openvg.pro index eb60331..c05af90 100644 --- a/src/openvg/openvg.pro +++ b/src/openvg/openvg.pro @@ -35,7 +35,7 @@ contains(QT_CONFIG, egl) { } symbian { - DEFINES += QVG_RECREATE_ON_SIZE_CHANGE QVG_BUFFER_SCROLLING + DEFINES += QVG_RECREATE_ON_SIZE_CHANGE QVG_BUFFER_SCROLLING QVG_SCISSOR_CLIP SOURCES += \ qvg_symbian.cpp } diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp index 74395a2..f6d2435 100644 --- a/src/openvg/qpaintengine_vg.cpp +++ b/src/openvg/qpaintengine_vg.cpp @@ -196,9 +196,7 @@ public: #endif QTransform transform; // Currently active transform. - bool affineTransform; // True if the transform is non-projective. - bool simpleTransform; // True if the transform is simple translate - // or 0, 90, 180, and 270 degree rotation + bool simpleTransform; // True if the transform is simple (non-projective). qreal penScale; // Pen scaling factor from "transform". QTransform pathTransform; // Calculated VG path transformation. @@ -379,7 +377,6 @@ void QVGPaintEnginePrivate::init() roundRectPath = 0; #endif - affineTransform = true; simpleTransform = true; pathTransformSet = false; penScale = 1.0; @@ -532,59 +529,12 @@ void QVGPaintEnginePrivate::setTransform vgLoadMatrix(mat); } -// Determine if a co-ordinate transform is simple enough to allow -// rectangle-based clipping with vgMask() and rounding translation -// to integers. Simple transforms most often result from origin translations. -static inline bool transformIsSimple(const QTransform& transform) -{ - QTransform::TransformationType type = transform.type(); - if (type == QTransform::TxNone || type == QTransform::TxTranslate) { - return true; - } else if (type == QTransform::TxScale) { - // Check for 0 and 180 degree rotations. - // (0 might happen after 4 rotations of 90 degrees). - qreal m11 = transform.m11(); - qreal m12 = transform.m12(); - qreal m21 = transform.m21(); - qreal m22 = transform.m22(); - if (m12 == 0.0f && m21 == 0.0f) { - if (m11 == 1.0f && m22 == 1.0f) - return true; // 0 degrees - else if (m11 == -1.0f && m22 == -1.0f) - return true; // 180 degrees. - if(m11 == 1.0f && m22 == -1.0f) - return true; // 0 degrees inverted y. - else if(m11 == -1.0f && m22 == 1.0f) - return true; // 180 degrees inverted y. - } - } else if (type == QTransform::TxRotate) { - // Check for 90, and 270 degree rotations. - qreal m11 = transform.m11(); - qreal m12 = transform.m12(); - qreal m21 = transform.m21(); - qreal m22 = transform.m22(); - if (m11 == 0.0f && m22 == 0.0f) { - if (m12 == 1.0f && m21 == -1.0f) - return true; // 90 degrees. - else if (m12 == -1.0f && m21 == 1.0f) - return true; // 270 degrees. - else if (m12 == -1.0f && m21 == -1.0f) - return true; // 90 degrees inverted y. - else if (m12 == 1.0f && m21 == 1.0f) - return true; // 270 degrees inverted y. - } - } - return false; -} - Q_DECL_IMPORT extern bool qt_scaleForTransform(const QTransform &transform, qreal *scale); void QVGPaintEnginePrivate::updateTransform(QPaintDevice *pdev) { VGfloat devh = pdev->height(); - simpleTransform = transformIsSimple(transform); - // Construct the VG transform by combining the Qt transform with // the following viewport transformation: // | 1 0 0 | @@ -607,9 +557,9 @@ void QVGPaintEnginePrivate::updateTransform(QPaintDevice *pdev) // so we will have to convert the co-ordinates ourselves. // Change the matrix to just the viewport transformation. pathTransform = viewport; - affineTransform = false; + simpleTransform = false; } else { - affineTransform = true; + simpleTransform = true; } pathTransformSet = false; @@ -638,7 +588,7 @@ VGPath QVGPaintEnginePrivate::vectorPathToVGPath(const QVectorPath& path) // Size is sufficient segments for drawRoundedRect() paths. QVarLengthArray<VGubyte, 20> segments; - if (sizeof(qreal) == sizeof(VGfloat) && elements && affineTransform) { + if (sizeof(qreal) == sizeof(VGfloat) && elements && simpleTransform) { // If Qt was compiled with qreal the same size as VGfloat, // then convert the segment types and use the incoming // points array directly. @@ -673,7 +623,7 @@ VGPath QVGPaintEnginePrivate::vectorPathToVGPath(const QVectorPath& path) int curvePos = 0; QPointF temp; - if (elements && affineTransform) { + if (elements && simpleTransform) { // Convert the members of the element array. for (int i = 0; i < count; ++i) { switch (elements[i]) { @@ -717,7 +667,7 @@ VGPath QVGPaintEnginePrivate::vectorPathToVGPath(const QVectorPath& path) } points += 2; } - } else if (elements && !affineTransform) { + } else if (elements && !simpleTransform) { // Convert the members of the element array after applying the // current transform to the path locally. for (int i = 0; i < count; ++i) { @@ -766,7 +716,7 @@ VGPath QVGPaintEnginePrivate::vectorPathToVGPath(const QVectorPath& path) } points += 2; } - } else if (count > 0 && affineTransform) { + } else if (count > 0 && simpleTransform) { // If there is no element array, then the path is assumed // to be a MoveTo followed by several LineTo's. coords.append(points[0]); @@ -779,7 +729,7 @@ VGPath QVGPaintEnginePrivate::vectorPathToVGPath(const QVectorPath& path) segments.append(VG_LINE_TO_ABS); --count; } - } else if (count > 0 && !affineTransform) { + } else if (count > 0 && !simpleTransform) { // Convert a simple path, and apply the transform locally. temp = transform.map(QPointF(points[0], points[1])); coords.append(temp.x()); @@ -840,7 +790,7 @@ VGPath QVGPaintEnginePrivate::painterPathToVGPath(const QPainterPath& path) bool haveStart = false; bool haveEnd = false; - if (affineTransform) { + if (simpleTransform) { // Convert the members of the element array. for (int i = 0; i < count; ++i) { switch (elements[i].type) { @@ -1615,6 +1565,36 @@ void QVGPaintEngine::stroke(const QVectorPath &path, const QPen &pen) vgDestroyPath(vgpath); } +// Determine if a co-ordinate transform is simple enough to allow +// rectangle-based clipping with vgMask(). Simple transforms most +// often result from origin translations. +static inline bool clipTransformIsSimple(const QTransform& transform) +{ + QTransform::TransformationType type = transform.type(); + if (type == QTransform::TxNone || type == QTransform::TxTranslate) + return true; + if (type == QTransform::TxRotate) { + // Check for 0, 90, 180, and 270 degree rotations. + // (0 might happen after 4 rotations of 90 degrees). + qreal m11 = transform.m11(); + qreal m12 = transform.m12(); + qreal m21 = transform.m21(); + qreal m22 = transform.m22(); + if (m11 == 0.0f && m22 == 0.0f) { + if (m12 == 1.0f && m21 == -1.0f) + return true; // 90 degrees. + else if (m12 == -1.0f && m21 == 1.0f) + return true; // 270 degrees. + } else if (m12 == 0.0f && m21 == 0.0f) { + if (m11 == -1.0f && m22 == -1.0f) + return true; // 180 degrees. + else if (m11 == 1.0f && m22 == 1.0f) + return true; // 0 degrees. + } + } + return false; +} + #if defined(QVG_SCISSOR_CLIP) void QVGPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op) @@ -1632,7 +1612,7 @@ void QVGPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op) // We aren't using masking, so handle simple QRectF's only. if (path.shape() == QVectorPath::RectangleHint && - path.elementCount() == 4 && d->simpleTransform) { + path.elementCount() == 4 && clipTransformIsSimple(d->transform)) { // Clipping region that resulted from QPainter::setClipRect(QRectF). // Convert it into a QRect and apply. const qreal *points = path.points(); @@ -1782,7 +1762,7 @@ void QVGPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op) // We don't have vgRenderToMask(), so handle simple QRectF's only. if (path.shape() == QVectorPath::RectangleHint && - path.elementCount() == 4 && d->simpleTransform) { + path.elementCount() == 4 && clipTransformIsSimple(d->transform)) { // Clipping region that resulted from QPainter::setClipRect(QRectF). // Convert it into a QRect and apply. const qreal *points = path.points(); @@ -1834,7 +1814,7 @@ void QVGPaintEngine::clip(const QRect &rect, Qt::ClipOperation op) d->dirty |= QPaintEngine::DirtyClipRegion; // If we have a non-simple transform, then use path-based clipping. - if (op != Qt::NoClip && !d->simpleTransform) { + if (op != Qt::NoClip && !clipTransformIsSimple(d->transform)) { QPaintEngineEx::clip(rect, op); return; } @@ -1953,7 +1933,7 @@ void QVGPaintEngine::clip(const QRegion ®ion, Qt::ClipOperation op) d->dirty |= QPaintEngine::DirtyClipRegion; // If we have a non-simple transform, then use path-based clipping. - if (op != Qt::NoClip && !d->simpleTransform) { + if (op != Qt::NoClip && !clipTransformIsSimple(d->transform)) { QPaintEngineEx::clip(region, op); return; } @@ -2530,14 +2510,14 @@ void QVGPaintEngine::fillRect(const QRectF &rect, const QBrush &brush) // Check to see if we can use vgClear() for faster filling. if (brush.style() == Qt::SolidPattern && brush.isOpaque() && - d->simpleTransform && d->opacity == 1.0f && + clipTransformIsSimple(d->transform) && d->opacity == 1.0f && clearRect(rect, brush.color())) { return; } #if !defined(QVG_NO_MODIFY_PATH) VGfloat coords[8]; - if (d->affineTransform) { + if (d->simpleTransform) { coords[0] = rect.x(); coords[1] = rect.y(); coords[2] = rect.x() + rect.width(); @@ -2572,14 +2552,14 @@ void QVGPaintEngine::fillRect(const QRectF &rect, const QColor &color) Q_D(QVGPaintEngine); // Check to see if we can use vgClear() for faster filling. - if (d->simpleTransform && d->opacity == 1.0f && color.alpha() == 255 && + if (clipTransformIsSimple(d->transform) && d->opacity == 1.0f && color.alpha() == 255 && clearRect(rect, color)) { return; } #if !defined(QVG_NO_MODIFY_PATH) VGfloat coords[8]; - if (d->affineTransform) { + if (d->simpleTransform) { coords[0] = rect.x(); coords[1] = rect.y(); coords[2] = rect.x() + rect.width(); @@ -2612,7 +2592,7 @@ void QVGPaintEngine::fillRect(const QRectF &rect, const QColor &color) void QVGPaintEngine::drawRoundedRect(const QRectF &rect, qreal xrad, qreal yrad, Qt::SizeMode mode) { Q_D(QVGPaintEngine); - if (d->affineTransform) { + if (d->simpleTransform) { QVGPainterState *s = state(); VGPath vgpath = d->roundedRectPath(rect, xrad, yrad, mode); d->draw(vgpath, s->pen, s->brush); @@ -2631,7 +2611,7 @@ void QVGPaintEngine::drawRects(const QRect *rects, int rectCount) QVGPainterState *s = state(); for (int i = 0; i < rectCount; ++i, ++rects) { VGfloat coords[8]; - if (d->affineTransform) { + if (d->simpleTransform) { coords[0] = rects->x(); coords[1] = rects->y(); coords[2] = rects->x() + rects->width(); @@ -2672,7 +2652,7 @@ void QVGPaintEngine::drawRects(const QRectF *rects, int rectCount) QVGPainterState *s = state(); for (int i = 0; i < rectCount; ++i, ++rects) { VGfloat coords[8]; - if (d->affineTransform) { + if (d->simpleTransform) { coords[0] = rects->x(); coords[1] = rects->y(); coords[2] = rects->x() + rects->width(); @@ -2710,7 +2690,7 @@ void QVGPaintEngine::drawLines(const QLine *lines, int lineCount) QVGPainterState *s = state(); for (int i = 0; i < lineCount; ++i, ++lines) { VGfloat coords[4]; - if (d->affineTransform) { + if (d->simpleTransform) { coords[0] = lines->x1(); coords[1] = lines->y1(); coords[2] = lines->x2(); @@ -2738,7 +2718,7 @@ void QVGPaintEngine::drawLines(const QLineF *lines, int lineCount) QVGPainterState *s = state(); for (int i = 0; i < lineCount; ++i, ++lines) { VGfloat coords[4]; - if (d->affineTransform) { + if (d->simpleTransform) { coords[0] = lines->x1(); coords[1] = lines->y1(); coords[2] = lines->x2(); @@ -2764,7 +2744,7 @@ void QVGPaintEngine::drawEllipse(const QRectF &r) // Based on the description of vguEllipse() in the OpenVG specification. // We don't use vguEllipse(), to avoid unnecessary library dependencies. Q_D(QVGPaintEngine); - if (d->affineTransform) { + if (d->simpleTransform) { QVGPainterState *s = state(); VGPath path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, @@ -2837,7 +2817,7 @@ void QVGPaintEngine::drawPoints(const QPointF *points, int pointCount) for (int i = 0; i < pointCount; ++i, ++points) { VGfloat coords[4]; - if (d->affineTransform) { + if (d->simpleTransform) { coords[0] = points->x(); coords[1] = points->y(); coords[2] = coords[0]; @@ -2871,7 +2851,7 @@ void QVGPaintEngine::drawPoints(const QPoint *points, int pointCount) for (int i = 0; i < pointCount; ++i, ++points) { VGfloat coords[4]; - if (d->affineTransform) { + if (d->simpleTransform) { coords[0] = points->x(); coords[1] = points->y(); coords[2] = coords[0]; @@ -2905,7 +2885,7 @@ void QVGPaintEngine::drawPolygon(const QPointF *points, int pointCount, PolygonD QVarLengthArray<VGfloat, 16> coords; QVarLengthArray<VGubyte, 10> segments; for (int i = 0; i < pointCount; ++i, ++points) { - if (d->affineTransform) { + if (d->simpleTransform) { coords.append(points->x()); coords.append(points->y()); } else { @@ -2952,7 +2932,7 @@ void QVGPaintEngine::drawPolygon(const QPoint *points, int pointCount, PolygonDr QVarLengthArray<VGfloat, 16> coords; QVarLengthArray<VGubyte, 10> segments; for (int i = 0; i < pointCount; ++i, ++points) { - if (d->affineTransform) { + if (d->simpleTransform) { coords.append(points->x()); coords.append(points->y()); } else { @@ -2987,7 +2967,7 @@ void QVGPaintEngine::drawPolygon(const QPoint *points, int pointCount, PolygonDr void QVGPaintEnginePrivate::setImageOptions() { - if (opacity != 1.0f && affineTransform) { + if (opacity != 1.0f && simpleTransform) { if (opacity != paintOpacity) { VGfloat values[4]; values[0] = 1.0f; @@ -3034,10 +3014,7 @@ static void drawVGImage(QVGPaintEnginePrivate *d, QTransform transform(d->imageTransform); VGfloat scaleX = sr.width() == 0.0f ? 0.0f : r.width() / sr.width(); VGfloat scaleY = sr.height() == 0.0f ? 0.0f : r.height() / sr.height(); - if (d->simpleTransform) - transform.translate(qRound(r.x()), qRound(r.y())); - else - transform.translate(r.x(), r.y()); + transform.translate(r.x(), r.y()); transform.scale(scaleX, scaleY); d->setTransform(VG_MATRIX_IMAGE_USER_TO_SURFACE, transform); @@ -3055,10 +3032,7 @@ static void drawVGImage(QVGPaintEnginePrivate *d, return; QTransform transform(d->imageTransform); - if(d->simpleTransform) - transform.translate(qRound(pos.x()), qRound(pos.y())); - else - transform.translate(pos.x(), pos.y()); + transform.translate(pos.x(), pos.y()); d->setTransform(VG_MATRIX_IMAGE_USER_TO_SURFACE, transform); d->setImageOptions(); @@ -3101,7 +3075,7 @@ void QVGPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF QVGPixmapData *vgpd = static_cast<QVGPixmapData *>(pd); if (!vgpd->isValid()) return; - if (d->affineTransform) + if (d->simpleTransform) drawVGImage(d, r, vgpd->toVGImage(), vgpd->size(), sr); else drawVGImage(d, r, vgpd->toVGImage(d->opacity), vgpd->size(), sr); @@ -3120,7 +3094,7 @@ void QVGPaintEngine::drawPixmap(const QPointF &pos, const QPixmap &pm) QVGPixmapData *vgpd = static_cast<QVGPixmapData *>(pd); if (!vgpd->isValid()) return; - if (d->affineTransform) + if (d->simpleTransform) drawVGImage(d, pos, vgpd->toVGImage()); else drawVGImage(d, pos, vgpd->toVGImage(d->opacity)); @@ -3135,7 +3109,7 @@ void QVGPaintEngine::drawImage { Q_D(QVGPaintEngine); VGImage vgImg; - if (d->affineTransform || d->opacity == 1.0f) + if (d->simpleTransform || d->opacity == 1.0f) vgImg = toVGImageSubRect(image, sr.toRect(), flags); else vgImg = toVGImageWithOpacitySubRect(image, d->opacity, sr.toRect()); @@ -3158,7 +3132,7 @@ void QVGPaintEngine::drawImage(const QPointF &pos, const QImage &image) { Q_D(QVGPaintEngine); VGImage vgImg; - if (d->affineTransform || d->opacity == 1.0f) + if (d->simpleTransform || d->opacity == 1.0f) vgImg = toVGImage(image); else vgImg = toVGImageWithOpacity(image, d->opacity); @@ -3191,7 +3165,7 @@ void QVGPaintEngine::drawPixmapFragments(const QPainter::PixmapFragment *drawing QPixmapData *pd = pixmap.pixmapData(); if (!pd) return; // null QPixmap - if (pd->classId() != QPixmapData::OpenVGClass || !d->affineTransform) { + if (pd->classId() != QPixmapData::OpenVGClass || !d->simpleTransform) { QPaintEngineEx::drawPixmapFragments(drawingData, dataCount, pixmap, hints); return; } @@ -3416,7 +3390,7 @@ void QVGPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textItem) // If we are not using a simple transform, then fall back // to the default Qt path stroking algorithm. - if (!d->affineTransform) { + if (!d->simpleTransform) { QPaintEngineEx::drawTextItem(p, textItem); return; } diff --git a/src/openvg/qwindowsurface_vgegl.cpp b/src/openvg/qwindowsurface_vgegl.cpp index e3f52f4e..37e5f40 100644 --- a/src/openvg/qwindowsurface_vgegl.cpp +++ b/src/openvg/qwindowsurface_vgegl.cpp @@ -709,10 +709,9 @@ QEglContext *QVGEGLWindowSurfaceDirect::ensureContext(QWidget *widget) #if !defined(QVG_NO_PRESERVED_SWAP) // Try to force the surface back buffer to preserve its contents. if (needToSwap) { - eglGetError(); // Clear error state first. - eglSurfaceAttrib(QEgl::display(), windowSurface, + bool succeeded = eglSurfaceAttrib(QEgl::display(), windowSurface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED); - if (eglGetError() != EGL_SUCCESS) { + if (!succeeded && eglGetError() != EGL_SUCCESS) { qWarning("QVG: could not enable preserved swap"); } } diff --git a/src/plugins/phonon/mmf/mmf.pro b/src/plugins/phonon/mmf/mmf.pro index 7a6fdf8..ac11188 100644 --- a/src/plugins/phonon/mmf/mmf.pro +++ b/src/plugins/phonon/mmf/mmf.pro @@ -75,25 +75,37 @@ symbian { $$PHONON_MMF_DIR/utils.cpp \ $$PHONON_MMF_DIR/videowidget.cpp - # Test for whether the build environment supports video rendering to graphics - # surfaces. - symbian:exists($${EPOCROOT}epoc32/include/platform/videoplayer2.h) { - HEADERS += \ - $$PHONON_MMF_DIR/videooutput_surface.h \ - $$PHONON_MMF_DIR/videoplayer_surface.h - SOURCES += \ - $$PHONON_MMF_DIR/videooutput_surface.cpp \ - $$PHONON_MMF_DIR/videoplayer_surface.cpp - DEFINES += PHONON_MMF_VIDEO_SURFACES - } else { - HEADERS += \ - $$PHONON_MMF_DIR/ancestormovemonitor.h \ - $$PHONON_MMF_DIR/videooutput_dsa.h \ - $$PHONON_MMF_DIR/videoplayer_dsa.h - SOURCES += \ - $$PHONON_MMF_DIR/ancestormovemonitor.cpp \ - $$PHONON_MMF_DIR/videooutput_dsa.cpp \ - $$PHONON_MMF_DIR/videoplayer_dsa.cpp \ + symbian { + # Test for whether the build environment supports video rendering to graphics + # surfaces. + exists($${EPOCROOT}epoc32/include/platform/videoplayer2.h) { + HEADERS += \ + $$PHONON_MMF_DIR/videooutput_surface.h \ + $$PHONON_MMF_DIR/videoplayer_surface.h + SOURCES += \ + $$PHONON_MMF_DIR/videooutput_surface.cpp \ + $$PHONON_MMF_DIR/videoplayer_surface.cpp + DEFINES += PHONON_MMF_VIDEO_SURFACES + } else { + HEADERS += \ + $$PHONON_MMF_DIR/ancestormovemonitor.h \ + $$PHONON_MMF_DIR/videooutput_dsa.h \ + $$PHONON_MMF_DIR/videoplayer_dsa.h + SOURCES += \ + $$PHONON_MMF_DIR/ancestormovemonitor.cpp \ + $$PHONON_MMF_DIR/videooutput_dsa.cpp \ + $$PHONON_MMF_DIR/videoplayer_dsa.cpp \ + } + + # Test whether the build environment includes support for the Download Manager + # API, required for Progressive Download + exists($${EPOCROOT}epoc32/include/downloadmgrclient.h) | \ + exists($${EPOCROOT}epoc32/include/mw/downloadmgrclient.h) { + HEADERS += $$PHONON_MMF_DIR/download.h + SOURCES += $$PHONON_MMF_DIR/download.cpp + LIBS += -ldownloadmgr + DEFINES += PHONON_MMF_PROGRESSIVE_DOWNLOAD + } } LIBS += -lcone diff --git a/src/qbase.pri b/src/qbase.pri index b431ade..e565e4a 100644 --- a/src/qbase.pri +++ b/src/qbase.pri @@ -185,18 +185,21 @@ include(qt_targets.pri) win32:DEFINES+=_USE_MATH_DEFINES symbian { - # Partial upgrade SIS file - vendorinfo = \ - "; Localised Vendor name" \ - "%{\"Nokia, Qt\"}" \ - " " \ - "; Unique Vendor name" \ - ":\"Nokia, Qt\"" \ - " " - pu_header = "; Partial upgrade package for testing $${TARGET} changes without reinstalling everything" \ - "$${LITERAL_HASH}{\"$${TARGET}\"}, (0x2001E61C), $${QT_MAJOR_VERSION},$${QT_MINOR_VERSION},$${QT_PATCH_VERSION}, TYPE=PU" - partial_upgrade.pkg_prerules = pu_header vendorinfo - partial_upgrade.sources = $$QMAKE_LIBDIR_QT/$${TARGET}.dll - partial_upgrade.path = c:/sys/bin - DEPLOYMENT += partial_upgrade + # Make partial upgrade SIS file for all dll's except webkit + !contains(TARGET.UID3, 0x200267C2):!contains(TARGET.UID3, 0xE00267C2) { + # Partial upgrade SIS file + vendorinfo = \ + "; Localised Vendor name" \ + "%{\"Nokia, Qt\"}" \ + " " \ + "; Unique Vendor name" \ + ":\"Nokia, Qt\"" \ + " " + pu_header = "; Partial upgrade package for testing $${TARGET} changes without reinstalling everything" \ + "$${LITERAL_HASH}{\"$${TARGET}\"}, (0x2001E61C), $${QT_MAJOR_VERSION},$${QT_MINOR_VERSION},$${QT_PATCH_VERSION}, TYPE=PU" + partial_upgrade.pkg_prerules = pu_header vendorinfo + partial_upgrade.sources = $$QMAKE_LIBDIR_QT/$${TARGET}.dll + partial_upgrade.path = c:/sys/bin + DEPLOYMENT += partial_upgrade + } } diff --git a/src/s60installs/bwins/QtGuiu.def b/src/s60installs/bwins/QtGuiu.def index 9a61523..7cc2752 100644 --- a/src/s60installs/bwins/QtGuiu.def +++ b/src/s60installs/bwins/QtGuiu.def @@ -12892,5 +12892,8 @@ EXPORTS ?setTimeout@QTapAndHoldGesture@@SAXH@Z @ 12891 NONAME ; void QTapAndHoldGesture::setTimeout(int) ?qmljsDebugArguments@QApplicationPrivate@@2VQString@@A @ 12892 NONAME ; class QString QApplicationPrivate::qmljsDebugArguments ?effectiveBoundingRect@QGraphicsItemPrivate@@QBE?AVQRectF@@PAVQGraphicsItem@@@Z @ 12893 NONAME ; class QRectF QGraphicsItemPrivate::effectiveBoundingRect(class QGraphicsItem *) const - ?lastResortFont@QFont@@QBE?AVQString@@XZ @ 12894 NONAME ; class QString QFont::lastResortFont(void) const + ?maxTextureHeight@QTextureGlyphCache@@UBEHXZ @ 12894 NONAME ; int QTextureGlyphCache::maxTextureHeight(void) const + ?maxTextureWidth@QTextureGlyphCache@@UBEHXZ @ 12895 NONAME ; int QTextureGlyphCache::maxTextureWidth(void) const + ?convertToPostscriptFontFamilyName@QFontEngine@@SA?AVQByteArray@@ABV2@@Z @ 12896 NONAME ; class QByteArray QFontEngine::convertToPostscriptFontFamilyName(class QByteArray const &) + ?lastResortFont@QFont@@QBE?AVQString@@XZ @ 12897 NONAME ; class QString QFont::lastResortFont(void) const diff --git a/src/s60installs/eabi/QtGuiu.def b/src/s60installs/eabi/QtGuiu.def index 634b7af..4e867a3 100644 --- a/src/s60installs/eabi/QtGuiu.def +++ b/src/s60installs/eabi/QtGuiu.def @@ -12098,4 +12098,5 @@ EXPORTS _ZN20QGraphicsItemPrivate26childrenBoundingRectHelperEP10QTransformP6QRectFP13QGraphicsItem @ 12097 NONAME _ZNK20QGraphicsItemPrivate21effectiveBoundingRectEP13QGraphicsItem @ 12098 NONAME _ZNK5QFont14lastResortFontEv @ 12099 NONAME + _ZN11QFontEngine33convertToPostscriptFontFamilyNameERK10QByteArray @ 12100 NONAME diff --git a/src/src.pro b/src/src.pro index 9a8b70fc..060f48b 100644 --- a/src/src.pro +++ b/src/src.pro @@ -119,7 +119,10 @@ src_webkit_declarative.target = sub-webkitdeclarative src_webkit.depends = src_gui src_sql src_network contains(QT_CONFIG, xmlpatterns): src_webkit.depends += src_xmlpatterns src_imports.depends += src_webkit - exists($$QT_SOURCE_TREE/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro): src_webkit.depends += src_javascriptcore + exists($$QT_SOURCE_TREE/src/3rdparty/webkit/JavaScriptCore/JavaScriptCore.pro) { + src_webkit.depends += src_javascriptcore + src_javascriptcore.depends = src_corelib + } } contains(QT_CONFIG, qt3support): src_plugins.depends += src_qt3support contains(QT_CONFIG, dbus):{ diff --git a/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.qml b/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.qml new file mode 100644 index 0000000..7944deb --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +QtObject { + id: root + + property alias aliasProperty: root.realProperty + onAliasPropertyChanged: root.test = true + + property int realProperty: 0 + + property bool test: false + + Component.onCompleted: { + root.realProperty = 10; + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp index 8609a7e..9a8c944 100644 --- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp +++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp @@ -119,6 +119,7 @@ private slots: void cppnamespace(); void aliasProperties(); void aliasPropertiesAndSignals(); + void aliasPropertyChangeSignals(); void componentCompositeType(); void i18n(); void i18n_data(); @@ -1816,6 +1817,19 @@ void tst_qdeclarativelanguage::initTestCase() out.write(in.readAll()); } +void tst_qdeclarativelanguage::aliasPropertyChangeSignals() +{ + QDeclarativeComponent component(&engine, TEST_FILE("aliasPropertyChangeSignals.qml")); + + VERIFY_ERRORS(0); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; +} + QTEST_MAIN(tst_qdeclarativelanguage) #include "tst_qdeclarativelanguage.moc" diff --git a/tests/auto/declarative/qdeclarativeloader/data/CreationContextLoader.qml b/tests/auto/declarative/qdeclarativeloader/data/CreationContextLoader.qml new file mode 100644 index 0000000..bfc9a8d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/CreationContextLoader.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 + +Loader { + id: myLoader + property int testProperty: 1912 + sourceComponent: loaderComponent + Component { + id: loaderComponent + Item { + Component.onCompleted: { + test = (myLoader.testProperty == 1912); + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/creationContext.qml b/tests/auto/declarative/qdeclarativeloader/data/creationContext.qml new file mode 100644 index 0000000..5297978 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/creationContext.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +Item { + property bool test: false + + CreationContextLoader { + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp b/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp index 8d04616..1bde55b 100644 --- a/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp +++ b/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp @@ -89,6 +89,7 @@ private slots: void deleteComponentCrash(); void nonItem(); void vmeErrors(); + void creationContext(); private: QDeclarativeEngine engine; @@ -562,6 +563,19 @@ void tst_QDeclarativeLoader::vmeErrors() delete loader; } +// QTBUG-13481 +void tst_QDeclarativeLoader::creationContext() +{ + QDeclarativeComponent component(&engine, TEST_FILE("creationContext.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; +} + QTEST_MAIN(tst_QDeclarativeLoader) #include "tst_qdeclarativeloader.moc" diff --git a/tests/auto/declarative/qdeclarativepathview/data/pathUpdate.qml b/tests/auto/declarative/qdeclarativepathview/data/pathUpdate.qml new file mode 100644 index 0000000..0c2ac0c --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/pathUpdate.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + + PathView { + id: view + objectName: "pathView" + anchors.fill: parent + model: 10 + delegate: Rectangle { objectName: "wrapper"; color: "green"; width: 100; height: 100 } + path: Path { + startX: view.width/2; startY: 0 + PathLine { x: view.width/2; y: view.height } + } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp index 65007a6..a2a5363 100644 --- a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp +++ b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp @@ -86,6 +86,7 @@ private slots: void package(); void emptyModel(); void closed(); + void pathUpdate(); private: QDeclarativeView *createView(); @@ -350,6 +351,10 @@ void tst_QDeclarativePathView::dataModel() model.addItem("yellow", "7"); model.addItem("thistle", "8"); model.addItem("cyan", "9"); + model.addItem("peachpuff", "10"); + model.addItem("powderblue", "11"); + model.addItem("gold", "12"); + model.addItem("sandybrown", "13"); ctxt->setContextProperty("testData", &model); @@ -370,7 +375,7 @@ void tst_QDeclarativePathView::dataModel() model.insertItem(4, "orange", "10"); QTest::qWait(100); - QTRY_COMPARE(findItems<QDeclarativeItem>(pathview, "wrapper").count(), 10); + QTRY_COMPARE(findItems<QDeclarativeItem>(pathview, "wrapper").count(), 14); QVERIFY(pathview->currentIndex() == 0); @@ -419,6 +424,11 @@ void tst_QDeclarativePathView::dataModel() QVERIFY(item->property("onPath").toBool()); } + // QTBUG-14199 + pathview->setOffset(7); + pathview->setOffset(0); + QCOMPARE(findItems<QDeclarativeItem>(pathview, "wrapper").count(), 5); + delete canvas; } @@ -808,6 +818,23 @@ void tst_QDeclarativePathView::closed() } } +// QTBUG-14239 +void tst_QDeclarativePathView::pathUpdate() +{ + QDeclarativeView *canvas = createView(); + QVERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathUpdate.qml")); + + QDeclarativePathView *pathView = canvas->rootObject()->findChild<QDeclarativePathView*>("pathView"); + QVERIFY(pathView); + + QDeclarativeItem *item = findItem<QDeclarativeItem>(pathView, "wrapper", 0); + QVERIFY(item); + QCOMPARE(item->x(), 150.0); + + delete canvas; +} + QDeclarativeView *tst_QDeclarativePathView::createView() { QDeclarativeView *canvas = new QDeclarativeView(0); diff --git a/tests/auto/qglthreads/tst_qglthreads.cpp b/tests/auto/qglthreads/tst_qglthreads.cpp index cce3161..06131bd 100644 --- a/tests/auto/qglthreads/tst_qglthreads.cpp +++ b/tests/auto/qglthreads/tst_qglthreads.cpp @@ -49,6 +49,10 @@ #include <private/qt_x11_p.h> #endif +#ifdef Q_OS_SYMBIAN +#include <unistd.h> // for usleep +#endif + #define RUNNING_TIME 5000 tst_QGLThreads::tst_QGLThreads(QObject *parent) @@ -209,6 +213,7 @@ public: p.drawText(image.rect(), Qt::AlignCenter, "This is an autotest"); p.end(); m_gl->bindTexture(image, GL_TEXTURE_2D, GL_RGBA, QGLContext::InternalBindOption); + createdAndUploaded(image); } } diff --git a/tests/auto/qstyle/tst_qstyle.cpp b/tests/auto/qstyle/tst_qstyle.cpp index a76c82d..ba24225 100644 --- a/tests/auto/qstyle/tst_qstyle.cpp +++ b/tests/auto/qstyle/tst_qstyle.cpp @@ -53,6 +53,7 @@ #include <qscrollbar.h> #include <qprogressbar.h> #include <qtoolbutton.h> +#include <qtoolbar.h> #include <qplastiquestyle.h> #include <qwindowsstyle.h> @@ -146,6 +147,7 @@ private slots: void pixelMetric(); void progressBarChangeStyle(); void defaultFont(); + void testDrawingShortcuts(); private: void lineUpLayoutTest(QStyle *); QWidget *testWidget; @@ -781,5 +783,54 @@ void tst_QStyle::defaultFont() qApp->setFont(defaultFont); } +class DrawTextStyle : public QProxyStyle +{ + Q_OBJECT +public: + DrawTextStyle(QStyle *base = 0) : QProxyStyle(), alignment(0) { setBaseStyle(base); } + void drawItemText(QPainter *painter, const QRect &rect, + int flags, const QPalette &pal, bool enabled, + const QString &text, QPalette::ColorRole textRole = QPalette::NoRole) const + { + DrawTextStyle *that = (DrawTextStyle *)this; + that->alignment = flags; + QProxyStyle::drawItemText(painter, rect, flags, pal, enabled, text, textRole); + } + int alignment; +}; + +void tst_QStyle::testDrawingShortcuts() +{ + { + QWidget w; + QToolButton *tb = new QToolButton(&w); + tb->setText("&abc"); + DrawTextStyle *dts = new DrawTextStyle; + w.show(); + tb->setStyle(dts); + QPixmap::grabWidget(tb); + QStyleOptionToolButton sotb; + sotb.initFrom(tb); + bool showMnemonic = dts->styleHint(QStyle::SH_UnderlineShortcut, &sotb, tb); + QVERIFY(dts->alignment & (showMnemonic ? Qt::TextShowMnemonic : Qt::TextHideMnemonic)); + delete dts; + } + { + QToolBar w; + QToolButton *tb = new QToolButton(&w); + tb->setText("&abc"); + DrawTextStyle *dts = new DrawTextStyle; + w.addWidget(tb); + w.show(); + tb->setStyle(dts); + QPixmap::grabWidget(tb); + QStyleOptionToolButton sotb; + sotb.initFrom(tb); + bool showMnemonic = dts->styleHint(QStyle::SH_UnderlineShortcut, &sotb, tb); + QVERIFY(dts->alignment & (showMnemonic ? Qt::TextShowMnemonic : Qt::TextHideMnemonic)); + delete dts; + } +} + QTEST_MAIN(tst_QStyle) #include "tst_qstyle.moc" diff --git a/tests/auto/qtcpserver/tst_qtcpserver.cpp b/tests/auto/qtcpserver/tst_qtcpserver.cpp index b2151b9..ab2a32d 100644 --- a/tests/auto/qtcpserver/tst_qtcpserver.cpp +++ b/tests/auto/qtcpserver/tst_qtcpserver.cpp @@ -105,6 +105,8 @@ private slots: void invalidProxy(); void proxyFactory_data(); void proxyFactory(); + + void qtbug14268_peek(); }; // Testing get/set functions @@ -662,5 +664,56 @@ void tst_QTcpServer::proxyFactory() QTEST(int(server.serverError()), "expectedError"); } +class Qtbug14268Helper : public QObject +{ + Q_OBJECT +public: + QByteArray lastDataPeeked; +public slots: + void newConnection() { + QTcpServer* server=static_cast<QTcpServer*>(sender()); + QTcpSocket* s=server->nextPendingConnection(); + connect(s,SIGNAL(readyRead()),this,SLOT(onServerReadyRead())); + } + void onServerReadyRead() { + QTcpSocket* clientSocket=static_cast<QTcpSocket*>(sender()); + lastDataPeeked = clientSocket->peek(128*1024).toHex(); + QTestEventLoop::instance().exitLoop(); + } +}; + +// there is a similar test inside tst_qtcpsocket that uses the waitFor* functions instead +void tst_QTcpServer::qtbug14268_peek() +{ + QFETCH_GLOBAL(bool, setProxy); + if (setProxy) + return; + + QTcpServer server; + server.listen(); + + Qtbug14268Helper helper; + QObject::connect(&server, SIGNAL(newConnection()), &helper, SLOT(newConnection())); + + QTcpSocket client; + client.connectToHost(QHostAddress::LocalHost, server.serverPort()); + QVERIFY(client.waitForConnected(2000)); + + client.write("abc\n"); + QTestEventLoop::instance().enterLoop(5); + QVERIFY(!QTestEventLoop::instance().timeout()); + QVERIFY(helper.lastDataPeeked == QByteArray("6162630a")); + + client.write("def\n"); + QTestEventLoop::instance().enterLoop(5); + QVERIFY(!QTestEventLoop::instance().timeout()); + QVERIFY(helper.lastDataPeeked == QByteArray("6162630a6465660a")); + + client.write("ghi\n"); + QTestEventLoop::instance().enterLoop(5); + QVERIFY(!QTestEventLoop::instance().timeout()); + QVERIFY(helper.lastDataPeeked == QByteArray("6162630a6465660a6768690a")); +} + QTEST_MAIN(tst_QTcpServer) #include "tst_qtcpserver.moc" diff --git a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp index 31cae40..2dbe5b7 100644 --- a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp +++ b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp @@ -201,6 +201,9 @@ private slots: void proxyFactory_data(); void proxyFactory(); + void qtbug14268_peek(); + + protected slots: void nonBlockingIMAP_hostFound(); void nonBlockingIMAP_connected(); @@ -251,6 +254,41 @@ enum ProxyTests { int tst_QTcpSocket::loopLevel = 0; +class SocketPair: public QObject +{ + Q_OBJECT +public: + QTcpSocket *endPoints[2]; + + SocketPair(QObject *parent = 0) + : QObject(parent) + { + endPoints[0] = endPoints[1] = 0; + } + + bool create() + { + QTcpServer server; + server.listen(); + + QTcpSocket *active = new QTcpSocket(this); + active->connectToHost("127.0.0.1", server.serverPort()); + + if (!active->waitForConnected(1000)) + return false; + + if (!server.waitForNewConnection(1000)) + return false; + + QTcpSocket *passive = server.nextPendingConnection(); + passive->setParent(this); + + endPoints[0] = active; + endPoints[1] = passive; + return true; + } +}; + tst_QTcpSocket::tst_QTcpSocket() { Q_SET_DEFAULT_IAP @@ -2467,6 +2505,40 @@ void tst_QTcpSocket::proxyFactory() delete socket; } +// there is a similar test inside tst_qtcpserver that uses the event loop instead +void tst_QTcpSocket::qtbug14268_peek() +{ + QFETCH_GLOBAL(bool, setProxy); + if (setProxy) + return; + + SocketPair socketPair; + QVERIFY(socketPair.create()); + QTcpSocket *outgoing = socketPair.endPoints[0]; + QTcpSocket *incoming = socketPair.endPoints[1]; + + QVERIFY(incoming->state() == QTcpSocket::ConnectedState); + QVERIFY(outgoing->state() == QTcpSocket::ConnectedState); + + outgoing->write("abc\n"); + QVERIFY(outgoing->waitForBytesWritten(2000)); + QVERIFY(incoming->waitForReadyRead(2000)); + QVERIFY(incoming->peek(128*1024) == QByteArray("abc\n")); + + outgoing->write("def\n"); + QVERIFY(outgoing->waitForBytesWritten(2000)); + QVERIFY(incoming->waitForReadyRead(2000)); + QVERIFY(incoming->peek(128*1024) == QByteArray("abc\ndef\n")); + + outgoing->write("ghi\n"); + QVERIFY(outgoing->waitForBytesWritten(2000)); + QVERIFY(incoming->waitForReadyRead(2000)); + QVERIFY(incoming->peek(128*1024) == QByteArray("abc\ndef\nghi\n")); + + QVERIFY(incoming->read(128*1024) == QByteArray("abc\ndef\nghi\n")); +} + + QTEST_MAIN(tst_QTcpSocket) #include "tst_qtcpsocket.moc" diff --git a/tests/auto/qthreadstorage/crashOnExit.cpp b/tests/auto/qthreadstorage/crashOnExit.cpp new file mode 100644 index 0000000..96515a0 --- /dev/null +++ b/tests/auto/qthreadstorage/crashOnExit.cpp @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtCore/QtCore> + +class Class +{ +public: + ~Class() + { + // trigger creation of a new QThreadStorage, after the previous QThreadStorage from main() was destructed + static QThreadStorage<int *> threadstorage; + threadstorage.setLocalData(new int); + threadstorage.setLocalData(new int); + } +}; + +int main() +{ + // instantiate the class that will use QThreadStorage from its destructor, it's destructor will be run last + static Class instance; + // instantiate QThreadStorage, it's destructor (and the global destructors for QThreadStorages internals) will run first + static QThreadStorage<int *> threadstorage; + threadstorage.setLocalData(new int); + threadstorage.setLocalData(new int); +} diff --git a/tests/auto/qthreadstorage/crashOnExit.pro b/tests/auto/qthreadstorage/crashOnExit.pro new file mode 100644 index 0000000..918ef39 --- /dev/null +++ b/tests/auto/qthreadstorage/crashOnExit.pro @@ -0,0 +1,4 @@ +SOURCES += crashOnExit.cpp +QT = core +CONFIG-=app_bundle +CONFIG+=console diff --git a/tests/auto/qthreadstorage/qthreadstorage.pro b/tests/auto/qthreadstorage/qthreadstorage.pro index 3071098..a06f89c 100644 --- a/tests/auto/qthreadstorage/qthreadstorage.pro +++ b/tests/auto/qthreadstorage/qthreadstorage.pro @@ -1,4 +1,4 @@ -load(qttest_p4) -SOURCES += tst_qthreadstorage.cpp -QT = core -symbian:LIBS += -llibpthread +TEMPLATE = subdirs +SUBDIRS = \ + tst_qthreadstorage.pro \ + crashOnExit.pro diff --git a/tests/auto/qthreadstorage/tst_qthreadstorage.cpp b/tests/auto/qthreadstorage/tst_qthreadstorage.cpp index d8b404f..ed86165 100644 --- a/tests/auto/qthreadstorage/tst_qthreadstorage.cpp +++ b/tests/auto/qthreadstorage/tst_qthreadstorage.cpp @@ -76,6 +76,7 @@ private slots: void autoDelete(); void adoptedThreads(); void ensureCleanupOrder(); + void QTBUG13877_crashOnExit(); }; class Pointer @@ -293,5 +294,21 @@ void tst_QThreadStorage::ensureCleanupOrder() QVERIFY(First::order < Second::order); } +void tst_QThreadStorage::QTBUG13877_crashOnExit() +{ + QProcess process; +#ifdef Q_OS_WIN +# ifdef QT_NO_DEBUG + process.start("release/crashOnExit"); +# else + process.start("debug/crashOnExit"); +# endif +#else + process.start("./crashOnExit"); +#endif + QVERIFY(process.waitForFinished()); + QVERIFY(process.exitStatus() != QProcess::CrashExit); +} + QTEST_MAIN(tst_QThreadStorage) #include "tst_qthreadstorage.moc" diff --git a/tests/auto/qthreadstorage/tst_qthreadstorage.pro b/tests/auto/qthreadstorage/tst_qthreadstorage.pro new file mode 100644 index 0000000..3071098 --- /dev/null +++ b/tests/auto/qthreadstorage/tst_qthreadstorage.pro @@ -0,0 +1,4 @@ +load(qttest_p4) +SOURCES += tst_qthreadstorage.cpp +QT = core +symbian:LIBS += -llibpthread diff --git a/tests/benchmarks/corelib/corelib.pro b/tests/benchmarks/corelib/corelib.pro index 7669e0a..8a6941b 100644 --- a/tests/benchmarks/corelib/corelib.pro +++ b/tests/benchmarks/corelib/corelib.pro @@ -4,4 +4,5 @@ SUBDIRS = \ kernel \ thread \ tools \ - codecs + codecs \ + plugin diff --git a/tests/benchmarks/corelib/plugin/plugin.pro b/tests/benchmarks/corelib/plugin/plugin.pro new file mode 100644 index 0000000..2afd7f3 --- /dev/null +++ b/tests/benchmarks/corelib/plugin/plugin.pro @@ -0,0 +1,2 @@ +TEMPLATE = subdirs +SUBDIRS = quuid diff --git a/tests/benchmarks/corelib/plugin/quuid/quuid.pro b/tests/benchmarks/corelib/plugin/quuid/quuid.pro new file mode 100644 index 0000000..4e502fc --- /dev/null +++ b/tests/benchmarks/corelib/plugin/quuid/quuid.pro @@ -0,0 +1,6 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = tst_bench_quuid + +SOURCES += tst_quuid.cpp +QT -= gui diff --git a/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp b/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp new file mode 100644 index 0000000..e9d4b44 --- /dev/null +++ b/tests/benchmarks/corelib/plugin/quuid/tst_quuid.cpp @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtCore/QCoreApplication> +#include <QtCore/QUuid> +#include <QtTest/QtTest> + +class tst_bench_QUuid : public QObject +{ + Q_OBJECT + +public: + tst_bench_QUuid() + { } + +private slots: + void createUuid(); +}; + +void tst_bench_QUuid::createUuid() +{ + QBENCHMARK { + QUuid::createUuid(); + } +} + +QTEST_MAIN(tst_bench_QUuid); +#include "tst_quuid.moc" diff --git a/tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp b/tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp index d9343e3..a259096 100644 --- a/tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp +++ b/tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp @@ -1130,11 +1130,11 @@ int main(int argc, char **argv) static code representing those interfaces, which can then be used to make calls to remote objects or implement said interfaces. - \c qdbusxml2dcpp has two modes of operation, that correspond to the two possible outputs it can + \c qdbusxml2cpp has two modes of operation, that correspond to the two possible outputs it can produce: the interface (proxy) class or the adaptor class. The latter consists of both a C++ header and a source file, which are meant to be edited and adapted to your needs. - The \c qdbusxml2dcpp tool is not meant to be run every time you compile your + The \c qdbusxml2cpp tool is not meant to be run every time you compile your application. Instead, it's meant to be used when developing the code or when the interface changes. diff --git a/tools/qdoc3/pagegenerator.cpp b/tools/qdoc3/pagegenerator.cpp index a187c2e..37dc191 100644 --- a/tools/qdoc3/pagegenerator.cpp +++ b/tools/qdoc3/pagegenerator.cpp @@ -310,10 +310,10 @@ PageGenerator::generateInnerNode(const InnerNode* node, CodeMarker* marker) const FakeNode *fakeNode = static_cast<const FakeNode *>(node); if (fakeNode->subType() == Node::ExternalPage) return; -#ifdef QDOC_QML + if (fakeNode->subType() == Node::Image) + return; if (fakeNode->subType() == Node::QmlPropertyGroup) return; -#endif if (fakeNode->subType() == Node::Page) { if (node->count() > 0) qDebug("PAGE %s HAS CHILDREN", qPrintable(fakeNode->title())); diff --git a/tools/qml/deviceorientation_harmattan.cpp b/tools/qml/deviceorientation_harmattan.cpp new file mode 100644 index 0000000..22f9f4c --- /dev/null +++ b/tools/qml/deviceorientation_harmattan.cpp @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "deviceorientation.h" +#include <QtDBus> +#include <QDebug> + +#define ORIENTATION_SERVICE "com.nokia.SensorService" +#define ORIENTATION_PATH "/org/maemo/contextkit/Screen/TopEdge" +#define CONTEXT_INTERFACE "org.maemo.contextkit.Property" +#define CONTEXT_CHANGED "ValueChanged" +#define CONTEXT_SUBSCRIBE "Subscribe" +#define CONTEXT_UNSUBSCRIBE "Unsubscribe" +#define CONTEXT_GET "Get" + + +class HarmattanOrientation : public DeviceOrientation +{ + Q_OBJECT +public: + HarmattanOrientation() + : o(UnknownOrientation), sensorEnabled(false) + { + resumeListening(); + // connect to the orientation change signal + bool ok = QDBusConnection::systemBus().connect(ORIENTATION_SERVICE, ORIENTATION_PATH, + CONTEXT_INTERFACE, + CONTEXT_CHANGED, + this, + SLOT(deviceOrientationChanged(QList<QVariant>,quint64))); +// qDebug() << "connection OK" << ok; + QDBusMessage reply = QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(ORIENTATION_SERVICE, ORIENTATION_PATH, + CONTEXT_INTERFACE, CONTEXT_GET)); + if (reply.type() != QDBusMessage::ErrorMessage) { + QList<QVariant> args; + qvariant_cast<QDBusArgument>(reply.arguments().at(0)) >> args; + deviceOrientationChanged(args, 0); + } + } + + ~HarmattanOrientation() + { + // unsubscribe from the orientation sensor + if (sensorEnabled) + QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(ORIENTATION_SERVICE, ORIENTATION_PATH, + CONTEXT_INTERFACE, CONTEXT_UNSUBSCRIBE)); + } + + inline Orientation orientation() const + { + return o; + } + + void setOrientation(Orientation) + { + } + + void pauseListening() { + if (sensorEnabled) { + // unsubscribe from the orientation sensor + QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(ORIENTATION_SERVICE, ORIENTATION_PATH, + CONTEXT_INTERFACE, CONTEXT_UNSUBSCRIBE)); + sensorEnabled = false; + } + } + + void resumeListening() { + if (!sensorEnabled) { + // subscribe to the orientation sensor + QDBusMessage reply = QDBusConnection::systemBus().call( + QDBusMessage::createMethodCall(ORIENTATION_SERVICE, ORIENTATION_PATH, + CONTEXT_INTERFACE, CONTEXT_SUBSCRIBE)); + + if (reply.type() == QDBusMessage::ErrorMessage) { + qWarning("Unable to retrieve device orientation: %s", qPrintable(reply.errorMessage())); + } else { + sensorEnabled = true; + } + } + } + +private Q_SLOTS: + void deviceOrientationChanged(QList<QVariant> args,quint64) + { + if (args.count() == 0) + return; + Orientation newOrientation = toOrientation(args.at(0).toString()); + if (newOrientation != o) { + o = newOrientation; + emit orientationChanged(); + } +// qDebug() << "orientation" << args.at(0).toString(); + } + +private: + static Orientation toOrientation(const QString &nativeOrientation) + { + if (nativeOrientation == "top") + return Landscape; + else if (nativeOrientation == "left") + return Portrait; + else if (nativeOrientation == "bottom") + return LandscapeInverted; + else if (nativeOrientation == "right") + return PortraitInverted; + return UnknownOrientation; + } + +private: + Orientation o; + bool sensorEnabled; +}; + +DeviceOrientation* DeviceOrientation::instance() +{ + static HarmattanOrientation *o = new HarmattanOrientation; + return o; +} + +#include "deviceorientation_harmattan.moc" diff --git a/tools/qml/qml.pri b/tools/qml/qml.pri index e5b2c7f..5db7678 100644 --- a/tools/qml/qml.pri +++ b/tools/qml/qml.pri @@ -29,6 +29,11 @@ symbian:!contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) { SOURCES += $$PWD/deviceorientation_maemo5.cpp FORMS = $$PWD/recopts_maemo5.ui \ $$PWD/proxysettings_maemo5.ui +} else:linux-g++-maemo { + QT += dbus + SOURCES += $$PWD/deviceorientation_harmattan.cpp + FORMS = $$PWD/recopts.ui \ + $$PWD/proxysettings.ui } else { SOURCES += $$PWD/deviceorientation.cpp FORMS = $$PWD/recopts.ui \ diff --git a/translations/assistant_ja.ts b/translations/assistant_ja.ts index afebc9a..c449e00 100644..100755 --- a/translations/assistant_ja.ts +++ b/translations/assistant_ja.ts @@ -69,15 +69,15 @@ Reason: </message> <message> <source>Error reading collection file '%1': %2.</source> - <translation>コレクションファイル '%1' の読み込み中にエラーが発生しました: %2</translation> + <translation>コレクションファイル '%1' の読み込み中にエラーが発生しました: %2。</translation> </message> <message> <source>Error creating collection file '%1': %2.</source> - <translation>コレクションファイル '%1' の作成中にエラーが発生しました: %2</translation> + <translation>コレクションファイル '%1' の作成中にエラーが発生しました: %2。</translation> </message> <message> <source>Error reading collection file '%1': %2</source> - <translation>コレクションファイル '%1' の読み込み中にエラーが発生しました: %2</translation> + <translation type="obsolete">コレクションファイル '%1' の読み込み中にエラーが発生しました: %2</translation> </message> <message> <source>Cannot load sqlite database driver!</source> @@ -120,6 +120,17 @@ Reason: </message> </context> <context> + <name>BookmarkItem</name> + <message> + <source>New Folder</source> + <translation>新しいフォルダ</translation> + </message> + <message> + <source>Untitled</source> + <translation>タイトルなし</translation> + </message> +</context> +<context> <name>BookmarkManager</name> <message> <source>Bookmarks</source> @@ -357,6 +368,60 @@ Reason: <context> <name>CmdLineParser</name> <message> + <source>Usage: assistant [Options] + +-collectionFile file Uses the specified collection + file instead of the default one +-showUrl url Shows the document with the + url. +-enableRemoteControl Enables Assistant to be + remotely controlled. +-show widget Shows the specified dockwidget + which can be "contents", "index", + "bookmarks" or "search". +-activate widget Activates the specified dockwidget + which can be "contents", "index", + "bookmarks" or "search". +-hide widget Hides the specified dockwidget + which can be "contents", "index" + "bookmarks" or "search". +-register helpFile Registers the specified help file + (.qch) in the given collection + file. +-unregister helpFile Unregisters the specified help file + (.qch) from the give collection + file. +-setCurrentFilter filter Set the filter as the active filter. +-remove-search-index Removes the full text search index. +-rebuild-search-index Re-builds the full text search index (potentially slow). +-quiet Does not display any error or + status message. +-help Displays this help. +</source> + <translation>使い方: assistant [オプション] + +-collectionFile file デフォルトのコレクションファイルの代わりに使用する + コレクションファイルを指定します。 +-showUrl url 表示するURLを指定します。 +-enableRemoteControl Assistant をリモートから制御できるようにします。 +-show widget 表示するウィジェット("contents"、"index"、 + "bookmarks"、"search")を指定します。 +-activate widget アクティブにするウィジェット("contents"、 + "index"、"bookmarks"、"search")を指定します。 +-hide widget 表示しないウィジェット("contents"、"index"、 + "bookmarks"、"search")を指定します。 +-register helpFile コレクションファイルに登録する + ヘルプファイル (.qch) を指定します。 +-unregister helpFile コレクションファイルから登録を解除する + ヘルプファイル (.qch) を指定します。 +-setCurrentFilter filter フィルタをアクティブなフィルタとして設定します。 +-remove-search-index 全文検索インデックスを削除します。 +-rebuild-search-index 全文検索インデックスをリビルドします。(時間を要する場合があります) +-quiet エラーやステータスメッセージを表示しません。 +-help このヘルプを表示します。 +</translation> + </message> + <message> <source>Unknown option: %1</source> <translation>不明なオプション: %1</translation> </message> @@ -417,6 +482,56 @@ Reason: </message> </context> <context> + <name>ConversionWizard</name> + <message> + <source>Help Conversion Wizard</source> + <translation>ヘルプ変換ウィザード</translation> + </message> + <message> + <source>Converting %1...</source> + <translation>%1 を変換中...</translation> + </message> + <message> + <source>Writing help collection file...</source> + <translation>ヘルプコレクションファイルに書き出し中...</translation> + </message> + <message> + <source>Done.</source> + <translation>完了.</translation> + </message> +</context> +<context> + <name>FilesPage</name> + <message> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <source>Files:</source> + <translation>ファイル:</translation> + </message> + <message> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <source>Remove All</source> + <translation>すべて削除</translation> + </message> + <message> + <source>Unreferenced Files</source> + <translation>参照していないファイル</translation> + </message> + <message> + <source>Remove files which are neither referenced by a keyword nor by the TOC.</source> + <translation>キーワードと目次のどちらからも参照されていないファイルを削除します。</translation> + </message> + <message> + <source><p><b>Warning:</b> When removing images or stylesheets, be aware that those files are not directly referenced by the .adp or .dcf file.</p></source> + <translation><p><b>警告:</b> 画像やスタイルシートを削除する時は、それらが .adp ファイルや .dcf ファイルから直接参照されていないか注意してください。</p></translation> + </message> +</context> +<context> <name>FilterNameDialogClass</name> <message> <source>Add Filter Name</source> @@ -428,6 +543,66 @@ Reason: </message> </context> <context> + <name>FilterPage</name> + <message> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <source>Filter attributes for current documentation (comma separated list):</source> + <translation>現在のドキュメントのフィルタ属性 (カンマ区切りリスト):</translation> + </message> + <message> + <source>Custom Filters</source> + <translation>カスタム フィルタ</translation> + </message> + <message> + <source>1</source> + <translation>1</translation> + </message> + <message> + <source>2</source> + <translation>2</translation> + </message> + <message> + <source>Add</source> + <translation>追加</translation> + </message> + <message> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <source>Filter Settings</source> + <translation>フィルタ設定</translation> + </message> + <message> + <source>Specify the filter attributes for the documentation. If filter attributes are used, also define a custom filter for it. Both the filter attributes and the custom filters are optional.</source> + <translation>ドキュメントのフィルタ属性を指定します。フィルタ属性を使用する場合、使用するカスタムフィルタもあわせて指定する必要があります。フィルタ属性もカスタムフィルタも必須ではありません。</translation> + </message> + <message> + <source>Filter Name</source> + <translation>フィルタ名</translation> + </message> + <message> + <source>Filter Attributes</source> + <translation>フィルタ属性</translation> + </message> + <message> + <source>The custom filter '%1' is defined multiple times.</source> + <translation>カスタムフィルタ '%1' が複数回定義されています。</translation> + </message> + <message> + <source>The attributes for custom filter '%1' are defined multiple times.</source> + <translation>カスタムフィルタ '%1' の属性が複数回定義されています。</translation> + </message> + <message> + <source>unfiltered</source> + <comment>list of available documentation</comment> + <translation>フィルタなし</translation> + </message> +</context> +<context> <name>FindWidget</name> <message> <source>Previous</source> @@ -451,6 +626,17 @@ Reason: </message> </context> <context> + <name>FinishPage</name> + <message> + <source>Converting File</source> + <translation>ファイルを変換中</translation> + </message> + <message> + <source>Creating the new Qt help files from the old ADP file.</source> + <translation>古い ADP ファイルから新しい Qt ヘルプファイルを作成しています。</translation> + </message> +</context> +<context> <name>FontPanel</name> <message> <source>Font</source> @@ -474,6 +660,59 @@ Reason: </message> </context> <context> + <name>GeneralPage</name> + <message> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <source>Namespace:</source> + <translation>名前空間:</translation> + </message> + <message> + <source>Virtual Folder:</source> + <translation>仮想フォルダ:</translation> + </message> + <message> + <source>General Settings</source> + <translation>概要設定</translation> + </message> + <message> + <source>Specify the namespace and the virtual folder for the documentation.</source> + <translation>ドキュメントの名前空間や仮想フォルダを指定します。</translation> + </message> + <message> + <source>Namespace Error</source> + <translation>名前空間エラー</translation> + </message> + <message> + <source>The namespace contains some invalid characters.</source> + <translation>名前空間にいくつか無効な文字が含まれています。</translation> + </message> + <message> + <source>Virtual Folder Error</source> + <translation>仮想フォルダ エラー</translation> + </message> + <message> + <source>The virtual folder contains some invalid characters.</source> + <translation>仮想フォルダにいくつか無効な文字が含まれています。</translation> + </message> +</context> +<context> + <name>HelpEngineWrapper</name> + <message> + <source>Unfiltered</source> + <translation>フィルタなし</translation> + </message> +</context> +<context> + <name>HelpGenerator</name> + <message> + <source>Warning: %1</source> + <translation>警告: %1</translation> + </message> +</context> +<context> <name>HelpViewer</name> <message> <source>Help</source> @@ -485,7 +724,7 @@ Reason: </message> <message> <source><title>about:blank</title></source> - <translation type="unfinished"></translation> + <translation><title>about:blank</title></translation> </message> <message> <source><title>Error 404...</title><div align="center"><br><br><h1>The page could not be found</h1><br><h3>'%1'</h3></div></source> @@ -511,6 +750,40 @@ Reason: </message> </context> <context> + <name>HelpWindow</name> + <message> + <source><center><b>Wizard Assistant</b></center></source> + <translation><center><b>ウィザード アシスタント</b></center></translation> + </message> +</context> +<context> + <name>IdentifierPage</name> + <message> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <source>Create identifiers</source> + <translation>IDを作成</translation> + </message> + <message> + <source>Global prefix:</source> + <translation>グローバルな接頭辞:</translation> + </message> + <message> + <source>Inherit prefix from file names</source> + <translation>ファイル名を受け継いだ接頭辞</translation> + </message> + <message> + <source>Identifiers</source> + <translation>ID</translation> + </message> + <message> + <source>This page allows you to create identifiers from the keywords found in the .adp or .dcf file.</source> + <translation>このページで .adp や .dcf ファイルに見つかったキーワードにIDを付与する事ができます。</translation> + </message> +</context> +<context> <name>IndexWindow</name> <message> <source>&Look for:</source> @@ -526,6 +799,53 @@ Reason: </message> </context> <context> + <name>InputPage</name> + <message> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <source>File name:</source> + <translation>ファイル名:</translation> + </message> + <message> + <source>...</source> + <translation>...</translation> + </message> + <message> + <source>Input File</source> + <translation>取り込むファイルの指定</translation> + </message> + <message> + <source>Specify the .adp or .dcf file you want to convert to the new Qt help project format and/or collection format.</source> + <translation>新たに Qt ヘルプ プロジェクト/コレクションフォーマットに変換したい .adp / .dcf ファイルを指定してください。</translation> + </message> + <message> + <source>Open file</source> + <translation>ファイルを開く</translation> + </message> + <message> + <source>Qt Help Files (*.adp *.dcf)</source> + <translation>Qt ヘルプ ファイル (*.adp *.dcf)</translation> + </message> + <message> + <source>File Open Error</source> + <translation>ファイル オープン エラー</translation> + </message> + <message> + <source>The specified file could not be opened!</source> + <translation>指定されたファイルを開く事ができません!</translation> + </message> + <message> + <source>File Parsing Error</source> + <translation>ファイル パース エラー</translation> + </message> + <message> + <source>Parsing error in line %1!</source> + <translation>%1 行目でパース エラーです!</translation> + </message> +</context> +<context> <name>InstallDialog</name> <message> <source>Install Documentation</source> @@ -713,6 +1033,10 @@ Reason: <translation>ホーム(&H)</translation> </message> <message> + <source><center><h3>%1</h3><p>Version %2</p></center><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p></source> + <translation><center><h3>%1</h3><p>バージョン %2</p></center><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p></translation> + </message> + <message> <source>Could not register file '%1': %2</source> <translation>ファイル '%1' を登録できませんでした: %2</translation> </message> @@ -854,6 +1178,92 @@ Reason: </message> </context> <context> + <name>OutputPage</name> + <message> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <source>Project file name:</source> + <translation>プロジェクト ファイル名:</translation> + </message> + <message> + <source>Collection file name:</source> + <translation>コレクション ファイル名:</translation> + </message> + <message> + <source>Output File Names</source> + <translation>出力するファイル名の指定</translation> + </message> + <message> + <source>Specify the file names for the output files.</source> + <translation>出力するファイルのファイル名を指定してください。</translation> + </message> + <message> + <source>Convert...</source> + <translation>変換...</translation> + </message> + <message> + <source>Qt Help Project File</source> + <translation>Qt ヘルプ プロジェクト ファイル</translation> + </message> + <message> + <source>Qt Help Collection Project File</source> + <translation>Qt ヘルプ コレクション プロジェクト ファイル</translation> + </message> + <message> + <source>The specified file %1 already exist. + +Do you want to remove it?</source> + <translation>指定されたファイル %1 は既に存在します。 + +元々あったファイルを削除しますか?</translation> + </message> + <message> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <source>Cancel</source> + <translation>キャンセル</translation> + </message> +</context> +<context> + <name>PathPage</name> + <message> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <source>File filters:</source> + <translation>ファイル フィルタ:</translation> + </message> + <message> + <source>Documentation source file paths:</source> + <translation>ドキュメントソースファイルパス:</translation> + </message> + <message> + <source>Add</source> + <translation>追加</translation> + </message> + <message> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <source>Source File Paths</source> + <translation>ソースファイルのパス</translation> + </message> + <message> + <source>Specify the paths where the sources files are located. By default, all files in those directories matched by the file filter will be included.</source> + <translation>ソースファイルが格納されているパスを指定してください。デフォルトではファイルフィルタに一致したディレクトリ内のすべてのファイルが含まれます。</translation> + </message> + <message> + <source>Source File Path</source> + <translation>ソースファイルのパス</translation> + </message> +</context> +<context> <name>PreferencesDialog</name> <message> <source>Add Documentation</source> @@ -988,6 +1398,175 @@ Reason: </message> </context> <context> + <name>QCollectionGenerator</name> + <message> + <source>Unknown token at line %1.</source> + <translation>%1 行目に未知のトークンがあります。</translation> + </message> + <message> + <source>Unknown token at line %1. Expected "QtHelpCollectionProject".</source> + <translation>%1 行目の "QtHelpCollectionProject" が期待される箇所に未知のトークンがあります。</translation> + </message> + <message> + <source>Missing end tags.</source> + <translation>終了タグが不明です。</translation> + </message> + <message> + <source>Missing input or output file for help file generation.</source> + <translation>ヘルプファイルを生成する為の入力ファイルまたは出力ファイルが不明です。</translation> + </message> + <message> + <source>Missing output file name.</source> + <translation>出力先ファイル名が不明です。</translation> + </message> + <message> + <source>Qt Collection Generator version 1.0 (Qt %1) +</source> + <translation>Qt コレクション ジェネレータ バージョン 1.0 (Qt %1) +</translation> + </message> + <message> + <source>Missing collection config file.</source> + <translation>コレクション設定ファイルが見つかりません。</translation> + </message> + <message> + <source> +Usage: + +qcollectiongenerator <collection-config-file> [options] + + -o <collection-file> Generates a collection file + called <collection-file>. If + this option is not specified + a default name will be used. + -v Displays the version of + qcollectiongenerator. + +</source> + <translation> +使い方: + +qcollectiongenerator <コレクション設定ファイル> [オプション] + + -o <コレクションファイル> <コレクションファイル> という名前で + コレクションファイルを生成します。 + このオプションが指定されていなかった場合は + デフォルトのファイル名が使用されます。 + -v qcollectiongenerator のバージョンを表示します。 + +</translation> + </message> + <message> + <source>Could not open %1. +</source> + <translation>%1 を開けませんでした。 +</translation> + </message> + <message> + <source>Reading collection config file... +</source> + <translation>コレクション設定ファイルを読み込んでいます... +</translation> + </message> + <message> + <source>Collection config file error: %1 +</source> + <translation>コレクション設定ファイル エラー: %1 +</translation> + </message> + <message> + <source>Generating help for %1... +</source> + <translation>%1 のヘルプを生成しています... +</translation> + </message> + <message> + <source>Creating collection file... +</source> + <translation>コレクションファイルを作成しています... +</translation> + </message> + <message> + <source>The file %1 cannot be overwritten. +</source> + <translation>ファイル %1 を上書きできません。 +</translation> + </message> + <message> + <source>Cannot open %1. +</source> + <translation>%1 を開けません。 +</translation> + </message> + <message> + <source>Cannot open referenced image file %1. +</source> + <translation>参照されている画像ファイル %1 を開けません。 +</translation> + </message> +</context> +<context> + <name>QHelpGenerator</name> + <message> + <source>Missing output file name.</source> + <translation>出力先ファイル名が不明です。</translation> + </message> + <message> + <source>Qt Help Generator version 1.0 (Qt %1) +</source> + <translation>Qt ヘルプ ジェネレータ バージョン 1.0 (Qt %1) +</translation> + </message> + <message> + <source>Missing Qt help project file.</source> + <translation>Qt ヘルプ プロジェクト ファイルが見つかりません。</translation> + </message> + <message> + <source> +Usage: + +qhelpgenerator <help-project-file> [options] + + -o <compressed-file> Generates a Qt compressed help + file called <compressed-file>. + If this option is not specified + a default name will be used. + -c Checks whether all links in HTML files + point to files in this help project. + -v Displays the version of + qhelpgenerator. + +</source> + <translation> +使い方: + +qhelpgenerator <ヘルププロジェクトファイル> [オプション] + + -o <圧縮ファイル> <圧縮ファイル> という名前で Qt 圧縮 ヘルプ + ファイルを生成します。 + このオプションが指定されていなかった場合は + デフォルトのファイル名が使用されます。 + -c HTML ファイル内のすべてのリンクがこのヘルプ + プロジェクト内のファイルを指しているかどうかを + チェックします。 + -v qhelpgenerator のバージョンを表示します。 + +</translation> + </message> + <message> + <source>Could not open %1. +</source> + <translation>%1 を開けませんでした。 +</translation> + </message> + <message> + <source>Could not create output directory: %1 +</source> + <translation>出力ディレクトリを作成できませんでした: %1 +</translation> + </message> +</context> +<context> <name>QObject</name> <message> <source>The specified collection file does not exist!</source> diff --git a/translations/designer_ja.ts b/translations/designer_ja.ts index 7e1696f..2eb6cd9 100644 --- a/translations/designer_ja.ts +++ b/translations/designer_ja.ts @@ -25,6 +25,49 @@ </message> </context> <context> + <name>AbstractItemEditor</name> + <message> + <source>Selectable</source> + <translation>選択可能</translation> + </message> + <message> + <source>Editable</source> + <translation>編集可能</translation> + </message> + <message> + <source>DragEnabled</source> + <translation>ドラッグ可能</translation> + </message> + <message> + <source>DropEnabled</source> + <translation>ドロップ可能</translation> + </message> + <message> + <source>UserCheckable</source> + <translation>チェック可能</translation> + </message> + <message> + <source>Enabled</source> + <translation>有効</translation> + </message> + <message> + <source>Tristate</source> + <translation>3択</translation> + </message> + <message> + <source>Unchecked</source> + <translation>チェックなし</translation> + </message> + <message> + <source>PartiallyChecked</source> + <translation>部分的にチェックあり</translation> + </message> + <message> + <source>Checked</source> + <translation>チェックあり</translation> + </message> +</context> +<context> <name>AddLinkDialog</name> <message> <source>Insert Link</source> @@ -844,6 +887,7 @@ Parsing grid layout minimum size values</extracomment> <name>FormEditorOptionsPage</name> <message> <source>%1 %</source> + <extracomment>Zoom percentage</extracomment> <translation>%1 %</translation> </message> <message> @@ -969,7 +1013,7 @@ Parsing grid layout minimum size values</extracomment> <message> <source>XX Icon Selected off</source> <extracomment>Sample string to determinate the width for the first column of the list item property browser</extracomment> - <translation type="unfinished"></translation> + <translation>XX Icon Selected off</translation> </message> </context> <context> @@ -2502,6 +2546,10 @@ Empty class name passed to widget factory method</extracomment> <context> <name>QtLocalePropertyManager</name> <message> + <source><Invalid></source> + <translation><無効></translation> + </message> + <message> <source>%1, %2</source> <translation>%1, %2</translation> </message> @@ -4720,6 +4768,14 @@ Please select another name.</source> <translation>新しくインストールされたカスタムウィジェットプラグインをスキャンします。</translation> </message> <message> + <source>Loaded Plugins</source> + <translation>ロード済みプラグイン</translation> + </message> + <message> + <source>Failed Plugins</source> + <translation>失敗したプラグイン</translation> + </message> + <message> <source>Qt Designer couldn't find any plugins</source> <translation>プラグインは見つかりませんでした</translation> </message> diff --git a/translations/linguist_ja.ts b/translations/linguist_ja.ts index abd32a0..2f948e8 100644..100755 --- a/translations/linguist_ja.ts +++ b/translations/linguist_ja.ts @@ -256,6 +256,186 @@ Will assume a single universal form.</source> </message> </context> <context> + <name>LConvert</name> + <message> + <source> +Usage: + lconvert [options] <infile> [<infile>...] + +lconvert is part of Qt's Linguist tool chain. It can be used as a +stand-alone tool to convert and filter translation data files. +The following file formats are supported: + +%1 +If multiple input files are specified, they are merged with +translations from later files taking precedence. + +Options: + -h + --help Display this information and exit. + + -i <infile> + --input-file <infile> + Specify input file. Use if <infile> might start with a dash. + This option can be used several times to merge inputs. + May be '-' (standard input) for use in a pipe. + + -o <outfile> + --output-file <outfile> + Specify output file. Default is '-' (standard output). + + -if <informat> + --input-format <format> + Specify input format for subsequent <infile>s. + The format is auto-detected from the file name and defaults to 'ts'. + + -of <outformat> + --output-format <outformat> + Specify output format. See -if. + + --input-codec <codec> + Specify encoding for QM and PO input files. Default is 'Latin1' + for QM and 'UTF-8' for PO files. UTF-8 is always tried as well for + QM, corresponding to the possible use of the trUtf8() function. + + --output-codec <codec> + Specify encoding for PO output files. Default is 'UTF-8'. + + --drop-tags <regexp> + Drop named extra tags when writing TS or XLIFF files. + May be specified repeatedly. + + --drop-translations + Drop existing translations and reset the status to 'unfinished'. + Note: this implies --no-obsolete. + + --source-language <language>[_<region>] + Specify/override the language of the source strings. Defaults to + POSIX if not specified and the file does not name it yet. + + --target-language <language>[_<region>] + Specify/override the language of the translation. + The target language is guessed from the file name if this option + is not specified and the file contents name no language yet. + + --no-obsolete + Drop obsolete messages. + + --no-finished + Drop finished messages. + + --sort-contexts + Sort contexts in output TS file alphabetically. + + --locations {absolute|relative|none} + Override how source code references are saved in TS files. + Default is absolute. + + --no-ui-lines + Drop line numbers from references to UI files. + + --verbose + be a bit more verbose + +Long options can be specified with only one leading dash, too. + +Return value: + 0 on success + 1 on command line parse failures + 2 on read failures + 3 on write failures +</source> + <translation type="unfinished"> +使い方: + lconvert [オプション] <入力ファイル> [<入力ファイル>...] + +lconvert は Qt Linguist ツールチェインの一部です。 +翻訳データファイルを変換したりフィルタリングしたりする事が +できるスタンドアロンのツールです。 +サポートしているファイル形式は以下の通りです: + +%1 +入力ファイルが複数個指定された場合、末尾のファイルほど +優先度が高いものとして翻訳データをマージします。 + +オプション: + -h + --help このヘルプを表示して終了します。 + + -i <入力ファイル> + --input-file <入力ファイル> + 入力ファイルを指定します。<入力ファイル> の指定はダッシュ記号で始まっていてもよいです。 + This option can be used several times to merge inputs. + May be '-' (標準入力) for use in a pipe. + + -o <出力ファイル> + --output-file <出力ファイル> + 出力ファイルを指定します。デフォルトは '-' (標準出力) です。 + + -if <入力形式> + --input-format <入力形式> + 後続の <入力ファイル> の入力形式を指定します。 + 形式はファイル名から自動検知され、デフォルトでは 'ts' となります。 + + -of <出力形式> + --output-format <出力形式> + 出力形式を指定します。-if を参照してください。 + + --input-codec <コーデック> + Specify encoding for QM and PO input files. Default is 'Latin1' + for QM and 'UTF-8' for PO files. UTF-8 is always tried as well for + QM, corresponding to the possible use of the trUtf8() function. + + --output-codec <コーデック> + Specify encoding for PO output files.デフォルトは 'UTF-8' です。 + + --drop-tags <正規表現> + Drop named extra tags when writing TS or XLIFF files. + May be specified repeatedly. + + --drop-translations + Drop existing translations and reset the status to 'unfinished'. + 注意: --no-obsolete と同等です。 + + --source-language <language>[_<region>] + Specify/override the language of the source strings. Defaults to + POSIX if not specified and the file does not name it yet. + + --target-language <language>[_<region>] + Specify/override the language of the translation. + The target language is guessed from the file name if this option + is not specified and the file contents name no language yet. + + --no-obsolete + 未使用のメッセージを取り除きます。 + + --no-finished + 完了しているメッセージを取り除きます。 + + --sort-contexts + 出力する TS ファイル内のコンテキストをアルファベット順にソートします。 + + --locations {absolute|relative|none} + Override how source code references are saved in TS files. + Default is absolute. + + --no-ui-lines + UI ファイルを参照している行番号を取り除きます。 + + --verbose + be a bit more verbose + +長すぎるオプションの指定はダッシュ記号で括る事で1つにできます。 + +戻り値: + 0 成功 + 1 コマンドラインパース失敗 + 2 読み込み失敗 + 3 書き込み失敗 +</translation> + </message> +</context> +<context> <name>LRelease</name> <message numerus="yes"> <source>Dropped %n message(s) which had no ID.</source> @@ -281,6 +461,735 @@ Will assume a single universal form.</source> <numerusform> %n 件の未翻訳のソーステキストを無視しました</numerusform> </translation> </message> + <message> + <source>Usage: + lrelease [options] project-file + lrelease [options] ts-files [-qm qm-file] + +lrelease is part of Qt's Linguist tool chain. It can be used as a +stand-alone tool to convert XML-based translations files in the TS +format into the 'compiled' QM format used by QTranslator objects. + +Options: + -help Display this information and exit + -idbased + Use IDs instead of source strings for message keying + -compress + Compress the QM files + -nounfinished + Do not include unfinished translations + -removeidentical + If the translated text is the same as + the source text, do not include the message + -markuntranslated <prefix> + If a message has no real translation, use the source text + prefixed with the given string instead + -silent + Do not explain what is being done + -version + Display the version of lrelease and exit +</source> + <translation type="unfinished">使い方: + lrelease [オプション] project-file + lrelease [オプション] ts-files [-qm qm-file] + +lrelease is part of Qt's Linguist tool chain. It can be used as a +stand-alone tool to convert XML-based translations files in the TS +format into the 'compiled' QM format used by QTranslator objects. + +オプション: + -help このヘルプを表示して終了します + -idbased + メッセージのキーとして、ソース中の文字列を使用する代わりにIDを使用します + -compress + QM ファイルを圧縮します + -nounfinished + 未完了の翻訳をインクルードしません + -removeidentical + If the translated text is the same as + the source text, do not include the message + -markuntranslated <プレフィクス> + If a message has no real translation, use the source text + prefixed with the given string instead + -silent + 完了した事を通知しません + -version + lrelease のバージョンを表示して終了します +</translation> + </message> + <message> + <source>lrelease error: %1</source> + <translation>lrelease エラー: %1</translation> + </message> + <message> + <source>Updating '%1'... +</source> + <translation>'%1' を更新しています... +</translation> + </message> + <message> + <source>Removing translations equal to source text in '%1'... +</source> + <translation>'%1' のソーステキストと等しい翻訳を削除しています... +</translation> + </message> + <message> + <source>lrelease error: cannot create '%1': %2 +</source> + <translation>lrelease エラー: '%1' を作成できません: %2 +</translation> + </message> + <message> + <source>lrelease error: cannot save '%1': %2</source> + <translation>lrelease エラー: '%1' を保存できません: %2</translation> + </message> + <message> + <source>lrelease version %1 +</source> + <translation>lrelease バージョン %1 +</translation> + </message> + <message> + <source>lrelease error: cannot read project file '%1'. +</source> + <translation>lrelease エラー: プロジェクトファイル '%1' が読めません。 +</translation> + </message> + <message> + <source>lrelease error: cannot process project file '%1'. +</source> + <translation>lrelease エラー: プロジェクトファイル '%1' を処理できません。 +</translation> + </message> + <message> + <source>lrelease warning: Met no 'TRANSLATIONS' entry in project file '%1' +</source> + <translation>lrelease 警告: プロジェクトファイル '%1' に 'TRANSLATIONS' エントリが見つかりません +</translation> + </message> +</context> +<context> + <name>LUpdate</name> + <message> + <source>Parenthesis/bracket/brace mismatch between #if and #else branches; using #if branch +</source> + <translation>#if を使っている部分で、#if 〜 #else の間の丸括弧/角括弧/中括弧の個数が一致していません +</translation> + </message> + <message> + <source>Parenthesis/brace mismatch between #if and #else branches; using #if branch +</source> + <translation>#if を使っている部分で、#if 〜 #else の間の丸括弧/中括弧の個数が一致していません +</translation> + </message> + <message> + <source>Unterminated C++ comment +</source> + <translation>終了していないC++ コメント +</translation> + </message> + <message> + <source>Unterminated C++ string +</source> + <translation>終了していない C++ 文字列 +</translation> + </message> + <message> + <source>Excess closing brace in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>C++ コード内で閉じ中括弧の数が一致していません (もしくは C++ プリプロセッサが乱用されています) +</translation> + </message> + <message> + <source>Excess closing parenthesis in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>C++ コード内で閉じ丸括弧の数が一致していません (もしくは C++ プリプロセッサが乱用されています) +</translation> + </message> + <message> + <source>Excess closing bracket in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>C++ コード内で閉じ角括弧の数が一致していません (もしくは C++ プリプロセッサが乱用されています) +</translation> + </message> + <message> + <source>circular inclusion of %1 +</source> + <translation>%1 を循環インクルードしています +</translation> + </message> + <message> + <source>Cannot open %1: %2 +</source> + <translation>%1 を開けません: %2 +</translation> + </message> + <message> + <source>//% cannot be used with tr() / QT_TR_NOOP(). Ignoring +</source> + <translation>//% は tr() または QT_TR_NOOP() と併用できません。無視します +</translation> + </message> + <message> + <source>Qualifying with unknown namespace/class %1::%2 +</source> + <translation>未知の名前空間またはクラス %1::%2 で修飾されています +</translation> + </message> + <message> + <source>tr() cannot be called without context +</source> + <translation>コンテキストなしで tr() は呼び出せません +</translation> + </message> + <message> + <source>Class '%1' lacks Q_OBJECT macro +</source> + <translation>クラス '%1' は Q_OBJECT マクロが不足しています +</translation> + </message> + <message> + <source>It is not recommended to call tr() from within a constructor '%1::%2' +</source> + <translation>コンストラクタ '%1::%2' 内での tr() 呼び出しは推奨されていません +</translation> + </message> + <message> + <source>//% cannot be used with translate() / QT_TRANSLATE_NOOP(). Ignoring +</source> + <translation>//% は translate() または QT_TRANSLATE_NOOP() と併用できません。無視します +</translation> + </message> + <message> + <source>//= cannot be used with qtTrId() / QT_TRID_NOOP(). Ignoring +</source> + <translation>//= は qtTrId() または QT_TRID_NOOP() と併用できません。無視します +</translation> + </message> + <message> + <source>Unexpected character in meta string +</source> + <translation>メタ文字列内に予期せぬ文字 +</translation> + </message> + <message> + <source>Unterminated meta string +</source> + <translation>終了していない メタ文字列 +</translation> + </message> + <message> + <source>Cannot invoke tr() like this +</source> + <translation>this のように tr() を呼び出す事はできません +</translation> + </message> + <message> + <source>Discarding unconsumed meta data +</source> + <translation>未使用のメタデータを破棄しています +</translation> + </message> + <message> + <source>Unbalanced opening brace in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>C++ コード内で開き中括弧の数が一致していません (もしくは C++ プリプロセッサが乱用されています) +</translation> + </message> + <message> + <source>Unbalanced opening parenthesis in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>C++ コード内で開き丸括弧の数が一致していません (もしくは C++ プリプロセッサが乱用されています) +</translation> + </message> + <message> + <source>Unbalanced opening bracket in C++ code (or abuse of the C++ preprocessor) +</source> + <translation>C++ コード内で開き角括弧の数が一致していません (もしくは C++ プリプロセッサが乱用されています) +</translation> + </message> + <message> + <source>Cannot open %1: %2</source> + <translation>%1 を開けません: %2</translation> + </message> + <message> + <source>Unterminated Java comment. +</source> + <translation>終了していない Java コメント。 +</translation> + </message> + <message> + <source>Invalid Unicode value. +</source> + <translation>不正な Unicode 値です。 +</translation> + </message> + <message> + <source>Unterminated string. +</source> + <translation>終了していない文字列。 +</translation> + </message> + <message> + <source>String used in translation can contain only literals concatenated with other literals, not expressions or numbers. +</source> + <translation>翻訳で使用される文字列は、式や数字以外の他のリテラルと連結されたリテラルだけを含む事ができます。 +</translation> + </message> + <message> + <source>'class' must be followed by a class name. +</source> + <translation>'class' に続くのはクラス名でなければなりません。 +</translation> + </message> + <message> + <source>Excess closing brace. +</source> + <translation>余分な閉じ括弧です。 +</translation> + </message> + <message> + <source>'package' must be followed by package name. +</source> + <translation>'package' に続くのはパッケージ名でなければなりません。 +</translation> + </message> + <message> + <source>Unbalanced opening brace. +</source> + <translation>開き括弧が一致していません。 +</translation> + </message> + <message> + <source>Unbalanced opening parenthesis. +</source> + <translation>開き丸括弧が一致していません。 +</translation> + </message> + <message> + <source>Usage: + lupdate [options] [project-file]... + lupdate [options] [source-file|path|@lst-file]... -ts ts-files|@lst-file + +lupdate is part of Qt's Linguist tool chain. It extracts translatable +messages from Qt UI files, C++, Java and JavaScript/QtScript source code. +Extracted messages are stored in textual translation source files (typically +Qt TS XML). New and modified messages can be merged into existing TS files. + +Options: + -help Display this information and exit. + -no-obsolete + Drop all obsolete strings. + -extensions <ext>[,<ext>]... + Process files with the given extensions only. + The extension list must be separated with commas, not with whitespace. + Default: '%1'. + -pluralonly + Only include plural form messages. + -silent + Do not explain what is being done. + -no-sort + Do not sort contexts in TS files. + -no-recursive + Do not recursively scan the following directories. + -recursive + Recursively scan the following directories (default). + -I <includepath> or -I<includepath> + Additional location to look for include files. + May be specified multiple times. + -locations {absolute|relative|none} + Specify/override how source code references are saved in TS files. + Default is absolute. + -no-ui-lines + Do not record line numbers in references to UI files. + -disable-heuristic {sametext|similartext|number} + Disable the named merge heuristic. Can be specified multiple times. + -pro <filename> + Name of a .pro file. Useful for files with .pro file syntax but + different file suffix. Projects are recursed into and merged. + -source-language <language>[_<region>] + Specify the language of the source strings for new files. + Defaults to POSIX if not specified. + -target-language <language>[_<region>] + Specify the language of the translations for new files. + Guessed from the file name if not specified. + -ts <ts-file>... + Specify the output file(s). This will override the TRANSLATIONS + and nullify the CODECFORTR from possibly specified project files. + -codecfortr <codec> + Specify the codec assumed for tr() calls. Effective only with -ts. + -version + Display the version of lupdate and exit. + @lst-file + Read additional file names (one per line) from lst-file. +</source> + <translation type="unfinished">使い方: + lupdate [オプション] [プロジェクトファイル]... + lupdate [オプション] [source-file|path|@lst-file]... -ts ts-files|@lst-file + +lupdate は Qt' Linguist ツールチェインの一部です。Qt UI ファイル、C++ 、Java、 +JavaScript/QtScript のソースコードからメッセージを抽出します。 +Extracted messages are stored in textual translation source files (typically +Qt TS XML). 新しく追加されたり変更されたメッセージは既存の TS ファイル内のメッセージから +マージされます。 + +オプション: + -help このヘルプを表示して終了します。 + -no-obsolete + すべての未使用の文字列を取り除きます。 + -extensions <ext>[,<ext>]... + 与えられた拡張子のファイルだけ処理します。 + 拡張子のリストはカンマで区切り、空白スペースを含んではいけません。 + デフォルト: '%1' + -pluralonly + 複数形のメッセージだけインクルードします。 + -silent + 完了した事を通知しません + -no-sort + TS ファイル内のコンテキストをソートしません。 + -no-recursive + ディレクトリ内を再帰的に処理しません。 + -recursive + ディレクトリ内を再帰的に処理します。(デフォルト) + -I <includepath> or -I<includepath> + Additional location to look for include files. + May be specified multiple times. + -locations {absolute|relative|none} + Specify/override how source code references are saved in TS files. + Default is absolute. + -no-ui-lines + UI ファイルを参照する行番号を記録しません。 + -disable-heuristic {sametext|similartext|number} + Disable the named merge heuristic. Can be specified multiple times. + -pro <ファイル名> + .pro ファイルの名前を指定します。Useful for files with .pro file syntax but + different file suffix. Projects are recursed into and merged. + -source-language <language>[_<region>] + Specify the language of the source strings for new files. + Defaults to POSIX if not specified. + -target-language <language>[_<region>] + Specify the language of the translations for new files. + Guessed from the file name if not specified. + -ts <ts-file>... + 出力ファイルを指定します。This will override the TRANSLATIONS + and nullify the CODECFORTR from possibly specified project files. + -codecfortr <codec> + Specify the codec assumed for tr() calls. Effective only with -ts. + -version + lupdate のバージョン情報を表示して終了します。 + @lst-file + Read additional file names (one per line) from lst-file. +</translation> + </message> + <message> + <source>lupdate warning: Codec for tr() '%1' disagrees with existing file's codec '%2'. Expect trouble. +</source> + <translation>lupdate 警告: tr() '%1' のコーデックと既存のファイルのコーデック '%2' が一致しません。問題が発生したようです。 +</translation> + </message> + <message> + <source>lupdate warning: Specified target language '%1' disagrees with existing file's language '%2'. Ignoring. +</source> + <translation>lupdate 警告: 指定されたターゲット言語 '%1' と既存のファイルの言語 '%2' が一致しません。無視されます。 +</translation> + </message> + <message> + <source>lupdate warning: Specified source language '%1' disagrees with existing file's language '%2'. Ignoring. +</source> + <translation>lupdate 警告: 指定されたソース言語 '%1' と既存のファイルの言語 '%2' が一致しません。無視されます。 +</translation> + </message> + <message> + <source>Updating '%1'... +</source> + <translation>'%1' を更新しています... +</translation> + </message> + <message> + <source>Stripping non plural forms in '%1'... +</source> + <translation>'%1' 内の複数形以外のメッセージを取り除いています... +</translation> + </message> + <message> + <source>lupdate warning: Codec for source '%1' is invalid. Falling back to codec for tr(). +</source> + <translation>lupdate 警告: ソース '%1' のコーデックは不正です。コーデックを元に戻します。 +</translation> + </message> + <message> + <source>lupdate warning: TS files from command line will override TRANSLATIONS in %1. +</source> + <translation>lupdate 警告: コマンドラインで指定された TS ファイルは %1 の TRANSLATIONS を上書きます。 +</translation> + </message> + <message> + <source>lupdate warning: TS files from command line prevent recursing into %1. +</source> + <translation>lupdate 警告: コマンドラインで指定された TS ファイルは %1 内で再起的に処理するのを妨げます。 +</translation> + </message> + <message> + <source>lupdate warning: no TS files specified. Only diagnostics will be produced for '%1'. +</source> + <translation>lupdate 警告: TS ファイルが指定されていません。'%1' は診断のみ行われます。 +</translation> + </message> + <message> + <source>The option -target-language requires a parameter. +</source> + <translation>パラメータに -target-language オプションが必要です。 +</translation> + </message> + <message> + <source>The option -source-language requires a parameter. +</source> + <translation>パラメータに -source-language オプションが必要です。 +</translation> + </message> + <message> + <source>The option -disable-heuristic requires a parameter. +</source> + <translation>パラメーターに -disable-heuristic オプションが必要です。 +</translation> + </message> + <message> + <source>Invalid heuristic name passed to -disable-heuristic. +</source> + <translation>-disable-heuristic に不正なヒューリスティック名が渡されています。 +</translation> + </message> + <message> + <source>The option -locations requires a parameter. +</source> + <translation>パラメータに -locations オプションが必要です。 +</translation> + </message> + <message> + <source>Invalid parameter passed to -locations. +</source> + <translation>-locations に不正なパラメータが渡されています。 +</translation> + </message> + <message> + <source>The -codecfortr option should be followed by a codec name. +</source> + <translation>-codecfortr オプションの後ろに続けてコーデック名があるべきです。 +</translation> + </message> + <message> + <source>The -extensions option should be followed by an extension list. +</source> + <translation>-extensions オプションの後ろに続けて拡張リストがあるべきです。 +</translation> + </message> + <message> + <source>The -pro option should be followed by a filename of .pro file. +</source> + <translation>-pro オプションの後ろに続けて .pro ファイルのファイル名があるべきです。 +</translation> + </message> + <message> + <source>The -I option should be followed by a path. +</source> + <translation>-l オプションの後ろに続けてパスがあるべきです。 +</translation> + </message> + <message> + <source>Unrecognized option '%1'. +</source> + <translation>'%1' は認識できないオプションです。 +</translation> + </message> + <message> + <source>lupdate error: List file '%1' is not readable. +</source> + <translation>lupdate エラー: リストファイル '%1' が読めません。 +</translation> + </message> + <message> + <source>lupdate warning: For some reason, '%1' is not writable. +</source> + <translation>lupdate 警告: いくつかの理由により '%1' は書き込みできません。 +</translation> + </message> + <message> + <source>lupdate error: File '%1' has no recognized extension. +</source> + <translation>lupdate エラー: ファイル '%1' は拡張として認識できません。 +</translation> + </message> + <message> + <source>lupdate error: File '%1' does not exist. +</source> + <translation>lupdate エラー: ファイル '%1' が存在しません。 +</translation> + </message> + <message> + <source>Scanning directory '%1'... +</source> + <translation>ディレクトリ '%1' をスキャンしています... +</translation> + </message> + <message> + <source>lupdate warning: -target-language usually only makes sense with exactly one TS file. +</source> + <translation>lupdate 警告: -target-language は通常1つの TS ファイルにだけ意味を持ちます。 +</translation> + </message> + <message> + <source>lupdate warning: -codecfortr has no effect without -ts. +</source> + <translation>lupdate 警告: -ts 指定なしでは -codecfortr は何の効果もありません。 +</translation> + </message> + <message> + <source>lupdate warning: no TS files specified. Only diagnostics will be produced. +</source> + <translation>lupdate 警告: TS ファイルが指定されていません。診断のみ行われます。 +</translation> + </message> + <message> + <source>lupdate error: Both project and source files / include paths specified. +</source> + <translation>lupdate エラー: プロジェクトとソースファイルまたはインクルードパスの両方が指定されています。 +</translation> + </message> + <message numerus="yes"> + <source> Found %n source text(s) (%1 new and %2 already existing) +</source> + <translation> + <numerusform> %n 件のソーステキストが見つかりました (新規: %1 件、既存: %2 件) +</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Removed %n obsolete entries +</source> + <translation> + <numerusform> %n 件の未使用のエントリを削除しました +</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Kept %n obsolete entries +</source> + <translation> + <numerusform> %n 件の未使用のエントリを残しました +</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Number heuristic provided %n translation(s) +</source> + <translation> + <numerusform> 数値ヒューリスティックは %n 件の翻訳を提供しました +</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Same-text heuristic provided %n translation(s) +</source> + <translation> + <numerusform> 同一テキスト ヒューリスティックは %n 件の翻訳を提供しました +</numerusform> + </translation> + </message> + <message numerus="yes"> + <source> Similar-text heuristic provided %n translation(s) +</source> + <translation> + <numerusform> 類似ヒューリスティックは %n 件の翻訳を提供しました +</numerusform> + </translation> + </message> + <message> + <source>Illegal character</source> + <translation>無効な文字</translation> + </message> + <message> + <source>Unclosed string at end of line</source> + <translation>ファイルの終端までに閉じられていない文字列</translation> + </message> + <message> + <source>Illegal escape squence</source> + <translation>無効なエスケープシーケンス</translation> + </message> + <message> + <source>Illegal unicode escape sequence</source> + <translation>無効な Unicode エスケープシーケンス</translation> + </message> + <message> + <source>Unclosed comment at end of file</source> + <translation>ファイルの終端までに閉じられていないコメント</translation> + </message> + <message> + <source>Illegal syntax for exponential number</source> + <translation>指数番号の構文が不正です</translation> + </message> + <message> + <source>Identifier cannot start with numeric literal</source> + <translation>識別子の先頭に数字を使用する事はできません</translation> + </message> + <message> + <source>Unterminated regular expression literal</source> + <translation>終了していない正規表現リテラル</translation> + </message> + <message> + <source>//% cannot be used with %1(). Ignoring +</source> + <translation>//% は %1() と併用できません。無視します +</translation> + </message> + <message> + <source>%1() requires at least two arguments. +</source> + <translation>%1() には最低でも2個の引数が必要です。 +</translation> + </message> + <message> + <source>%1(): both arguments must be literal strings. +</source> + <translation>%1(): 両方の引数は文字列リテラルである必要があります。 +</translation> + </message> + <message> + <source>%1() requires at least one argument. +</source> + <translation>%1() は最低でも1個の引数が必要です。 +</translation> + </message> + <message> + <source>%1(): text to translate must be a literal string. +</source> + <translation>%1(): 翻訳するテキストはリテラル文字列である必要があります。 +</translation> + </message> + <message> + <source>//= cannot be used with %1(). Ignoring +</source> + <translation>//= は %1() と併用できません。無視します +</translation> + </message> + <message> + <source>%1(): identifier must be a literal string. +</source> + <translation>%1(): 識別子は文字列リテラルである必要があります。 +</translation> + </message> + <message> + <source>Expected </source> + <extracomment>Beginning of the string that contains comma-separated list of expected tokens</extracomment> + <translation>期待されるトークン </translation> + </message> + <message> + <source>XML error: Parse error at line %1, column %2 (%3).</source> + <translation>XML エラー: %1 行目、%2 列目でパースエラー (%3)。</translation> + </message> + <message> + <source>Parse error in UI file</source> + <translation>UI ファイルでパースエラー</translation> + </message> </context> <context> <name>MainWindow</name> @@ -918,7 +1827,7 @@ All files (*)</source> </message> <message> <source>Save changes made to this Qt translation source file</source> - <translation>この Qt 翻訳ソースファイルに対して行われた変更を保存します。</translation> + <translation>この Qt 翻訳ソースファイルに対して行われた変更を保存します</translation> </message> <message> <source>Save changes made to this Qt translation source file into a new file.</source> @@ -1279,6 +2188,13 @@ Line: %2</source> </message> </context> <context> + <name>PhraseBook</name> + <message> + <source>Parse error at line %1, column %2 (%3).</source> + <translation>%1 行目、%2 列目でパースエラー (%3)。</translation> + </message> +</context> +<context> <name>PhraseBookBox</name> <message> <source>(New Entry)</source> @@ -1450,6 +2366,12 @@ Line: %2</source> <source>Qt Linguist 'Phrase Book'</source> <translation>Qt Linguist 'フレーズ ブック'</translation> </message> + <message> + <source>lupdate version %1 +</source> + <translation>lupdate バージョン %1 +</translation> + </message> </context> <context> <name>SourceCodeView</name> diff --git a/translations/qt_ja.ts b/translations/qt_ja.ts index 0812a64..095631e 100644..100755 --- a/translations/qt_ja.ts +++ b/translations/qt_ja.ts @@ -373,52 +373,52 @@ libgstreamer-plugins-base はインストールされていますか。</transla <message> <source>Decay HF ratio (%)</source> <extracomment>DecayHFRatio: Ratio of high-frequency decay time to the value specified by DecayTime.</extracomment> - <translation type="unfinished"></translation> + <translation>高周波減衰率 (%)</translation> </message> <message> <source>Decay time (ms)</source> <extracomment>DecayTime: Time over which reverberation is diminished.</extracomment> - <translation type="unfinished"></translation> + <translation>減衰時間 (ms)</translation> </message> <message> <source>Density (%)</source> <extracomment>Density Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Diffusion value.</extracomment> - <translation type="unfinished"></translation> + <translation>密度 (%)</translation> </message> <message> <source>Diffusion (%)</source> <extracomment>Diffusion: Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Density value.</extracomment> - <translation type="unfinished"></translation> + <translation>拡散度 (%)</translation> </message> <message> <source>Reflections delay (ms)</source> <extracomment>ReflectionsDelay: Amount of delay between the arrival the direct path from the source and the arrival of the first reflection.</extracomment> - <translation type="unfinished"></translation> + <translation>反射遅延 (ms)</translation> </message> <message> <source>Reflections level (mB)</source> <extracomment>ReflectionsLevel: Amplitude of reflections. This value is corrected by the RoomLevel to give the final reflection amplitude.</extracomment> - <translation type="unfinished"></translation> + <translation>反射レベル (mB)</translation> </message> <message> <source>Reverb delay (ms)</source> <extracomment>ReverbDelay: Amount of time between arrival of the first reflection and start of the late reverberation.</extracomment> - <translation type="unfinished"></translation> + <translation>リバーブ遅延 (ms)</translation> </message> <message> <source>Reverb level (mB)</source> <extracomment>ReverbLevel Amplitude of reverberations. This value is corrected by the RoomLevel to give the final reverberation amplitude.</extracomment> - <translation type="unfinished"></translation> + <translation>リバーブ レベル (mB)</translation> </message> <message> <source>Room HF level</source> <extracomment>RoomHFLevel: Amplitude of low-pass filter used to attenuate the high frequency component of reflected sound.</extracomment> - <translation type="unfinished"></translation> + <translation>高周波室内レベル</translation> </message> <message> <source>Room level (mB)</source> <extracomment>RoomLevel: Master volume control for all reflected sound.</extracomment> - <translation type="unfinished"></translation> + <translation>室内レベル (mB)</translation> </message> </context> <context> @@ -1531,7 +1531,7 @@ to </message> <message> <source>Invalid use of namespace</source> - <translation>無効なネームスペースの使用法です</translation> + <translation>無効な名前空間の使用法です</translation> </message> <message> <source>Not an attached property name</source> @@ -1701,19 +1701,19 @@ to <name>QDeclarativeCompositeTypeManager</name> <message> <source>Resource %1 unavailable</source> - <translation>リソース %1 が利用できません</translation> + <translation type="obsolete">リソース %1 が利用できません</translation> </message> <message> <source>Namespace %1 cannot be used as a type</source> - <translation>ネームスペース %1 を型として使用することはできません</translation> + <translation type="obsolete">名前空間 %1 を型として使用することはできません</translation> </message> <message> <source>%1 %2</source> - <translation>%1 %2</translation> + <translation type="obsolete">%1 %2</translation> </message> <message> <source>Type %1 unavailable</source> - <translation>型 %1 が利用できません</translation> + <translation type="obsolete">型 %1 が利用できません</translation> </message> </context> <context> @@ -1801,15 +1801,15 @@ to </message> <message> <source>import "%1" has no qmldir and no namespace</source> - <translation>import する "%1" に qmldir もネームスペースもありません</translation> + <translation>import する "%1" に qmldir も名前空間もありません</translation> </message> <message> <source>- %1 is not a namespace</source> - <translation>- %1 はネームスペースではありません</translation> + <translation>- %1 は名前空間ではありません</translation> </message> <message> <source>- nested namespaces not allowed</source> - <translation>- ネームスペースのネストは許可されていません</translation> + <translation>- 名前空間のネストは許可されていません</translation> </message> <message> <source>local directory</source> @@ -1878,7 +1878,7 @@ to </message> <message> <source>ListElement: cannot contain nested elements</source> - <translation>ListElement: ネストしたエレメントは保持できません</translation> + <translation>ListElement: ネストした要素は保持できません</translation> </message> <message> <source>ListElement: cannot use reserved "id" property</source> @@ -1998,19 +1998,19 @@ to </message> <message> <source>Invalid import qualifier ID</source> - <translation>import するネームスペースの ID が無効です</translation> + <translation>import する名前空間の ID が無効です</translation> </message> <message> <source>Reserved name "Qt" cannot be used as an qualifier</source> - <translation>予約語 "Qt" を import するネームスペースに使用することはできません</translation> + <translation>予約語 "Qt" を import する名前空間に使用することはできません</translation> </message> <message> <source>Script import qualifiers must be unique.</source> - <translation>スクリプトを import するネームスペースは一意である必要があります。</translation> + <translation>スクリプトを import する名前空間は一意である必要があります。</translation> </message> <message> <source>Script import requires a qualifier</source> - <translation>スクリプトを import する際にはネームスペースの指定が必要です</translation> + <translation>スクリプトを import する際には名前空間の指定が必要です</translation> </message> <message> <source>Library import requires a version</source> @@ -2097,6 +2097,44 @@ to </message> </context> <context> + <name>QDeclarativeTypeData</name> + <message> + <source>Script %1 unavailable</source> + <translation type="obsolete">スクリプト %1 が利用できません</translation> + </message> + <message> + <source>Type %1 unavailable</source> + <translation type="obsolete">型 %1 が利用できません</translation> + </message> + <message> + <source>Namespace %1 cannot be used as a type</source> + <translation type="obsolete">名前空間 %1 を型として使用することはできません</translation> + </message> + <message> + <source>%1 %2</source> + <translation type="obsolete">%1 %2</translation> + </message> +</context> +<context> + <name>QDeclarativeTypeLoader</name> + <message> + <source>Script %1 unavailable</source> + <translation>スクリプト %1 が利用できません</translation> + </message> + <message> + <source>Type %1 unavailable</source> + <translation>型 %1 が利用できません</translation> + </message> + <message> + <source>Namespace %1 cannot be used as a type</source> + <translation>名前空間 %1 を型として使用することはできません</translation> + </message> + <message> + <source>%1 %2</source> + <translation>%1 %2</translation> + </message> +</context> +<context> <name>QDeclarativeVME</name> <message> <source>Unable to create object of type %1</source> @@ -3316,7 +3354,7 @@ Do you want to delete it anyway?</source> <name>QLibrary</name> <message> <source>Could not mmap '%1': %2</source> - <translation>'%1' をメモリにマッピングできませんでした: %2</translation> + <translation type="obsolete">'%1' をメモリにマッピングできませんでした: %2</translation> </message> <message> <source>Plugin verification data mismatch in '%1'</source> @@ -3324,7 +3362,7 @@ Do you want to delete it anyway?</source> </message> <message> <source>Could not unmap '%1': %2</source> - <translation>'%1' のマッピングを解除できませんでした: %2</translation> + <translation type="obsolete">'%1' のマッピングを解除できませんでした: %2</translation> </message> <message> <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> @@ -3663,7 +3701,7 @@ Do you want to delete it anyway?</source> </message> <message> <source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> - <translation type="unfinished"></translation> + <translation><p>Qt はクロスプラットフォームアプリケーション開発用の C++ ツールキットです。</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Qt ライセンスについての概要は <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> をご覧ください。</p><p>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt は Nokia 社の製品です。詳しい情報は <a href="http://qt.nokia.com/">qt.nokia.com</a> をご覧ください。</p></translation> </message> </context> <context> @@ -5751,7 +5789,7 @@ Please choose a different file name.</source> </message> <message> <source>Hot Links</source> - <translation type="unfinished"></translation> + <translation>人気のリンク</translation> </message> <message> <source>Adjust Brightness</source> @@ -5771,15 +5809,15 @@ Please choose a different file name.</source> </message> <message> <source>Back Forward</source> - <translation type="unfinished"></translation> + <translation>戻る</translation> </message> <message> <source>Application Left</source> - <translation type="unfinished"></translation> + <translation>Application Left</translation> </message> <message> <source>Application Right</source> - <translation type="unfinished"></translation> + <translation>Application Right</translation> </message> <message> <source>Book</source> @@ -5799,7 +5837,7 @@ Please choose a different file name.</source> </message> <message> <source>Clear Grab</source> - <translation type="unfinished"></translation> + <translation>Clear Grab</translation> </message> <message> <source>Close</source> @@ -5839,11 +5877,11 @@ Please choose a different file name.</source> </message> <message> <source>Go</source> - <translation type="unfinished"></translation> + <translation>Go</translation> </message> <message> <source>iTouch</source> - <translation type="unfinished"></translation> + <translation>iTouch</translation> </message> <message> <source>Logoff</source> @@ -5863,7 +5901,7 @@ Please choose a different file name.</source> </message> <message> <source>Menu PB</source> - <translation type="unfinished"></translation> + <translation>Menu PB</translation> </message> <message> <source>My Sites</source> @@ -5899,15 +5937,15 @@ Please choose a different file name.</source> </message> <message> <source>Rotate Windows</source> - <translation type="unfinished"></translation> + <translation>Rotate Windows</translation> </message> <message> <source>Rotation PB</source> - <translation type="unfinished"></translation> + <translation>Rotation PB</translation> </message> <message> <source>Rotation KB</source> - <translation type="unfinished"></translation> + <translation>Rotation KB</translation> </message> <message> <source>Save</source> @@ -6023,7 +6061,7 @@ Please choose a different file name.</source> </message> <message> <source>Audio Cycle Track</source> - <translation type="unfinished"></translation> + <translation>Audio Cycle Track</translation> </message> <message> <source>Time</source> @@ -6130,7 +6168,7 @@ Please choose a different file name.</source> <message> <source>Toggle Call/Hangup</source> <extracomment>Button that will hang up if we're in call, or make a call if we're not.</extracomment> - <translation type="unfinished"></translation> + <translation>通話/終話の切替</translation> </message> <message> <source>Flip</source> @@ -6138,7 +6176,7 @@ Please choose a different file name.</source> </message> <message> <source>Voice Dial</source> - <extracomment>Button to trigger voice dialling</extracomment> + <extracomment>Button to trigger voice dialing</extracomment> <translation>ボイスダイアル</translation> </message> <message> @@ -6238,43 +6276,43 @@ Please choose a different file name.</source> </message> <message> <source>Hangul Start</source> - <translation type="unfinished"></translation> + <translation>Hangul Start</translation> </message> <message> <source>Hangul End</source> - <translation type="unfinished"></translation> + <translation>Hangul End</translation> </message> <message> <source>Hangul Hanja</source> - <translation type="unfinished"></translation> + <translation>ハングル 漢字</translation> </message> <message> <source>Hangul Jamo</source> - <translation type="unfinished"></translation> + <translation>ハングル 字母</translation> </message> <message> <source>Hangul Romaja</source> - <translation type="unfinished"></translation> + <translation>ハングル ローマ字入力</translation> </message> <message> <source>Hangul Jeonja</source> - <translation type="unfinished"></translation> + <translation>Hangul Jeonja</translation> </message> <message> <source>Hangul Banja</source> - <translation type="unfinished"></translation> + <translation>Hangul Banja</translation> </message> <message> <source>Hangul PreHanja</source> - <translation type="unfinished"></translation> + <translation>Hangul PreHanja</translation> </message> <message> <source>Hangul PostHanja</source> - <translation type="unfinished"></translation> + <translation>Hangul PostHanja</translation> </message> <message> <source>Hangul Special</source> - <translation type="unfinished"></translation> + <translation>Hangul Special</translation> </message> <message> <source>Ctrl</source> @@ -6469,7 +6507,7 @@ Please choose a different file name.</source> <name>QSslSocket</name> <message> <source>Error creating SSL context (%1)</source> - <translation>SSL content の作成に失敗しました (%1)</translation> + <translation>SSL context の作成に失敗しました (%1)</translation> </message> <message> <source>Invalid or empty cipher list (%1)</source> @@ -7223,12 +7261,12 @@ Please choose a different file name.</source> <message> <source>Seek quickly back</source> <comment>Media controller element</comment> - <translation type="unfinished"></translation> + <translation>少し戻る</translation> </message> <message> <source>Seek quickly forward</source> <comment>Media controller element</comment> - <translation type="unfinished"></translation> + <translation>少し進む</translation> </message> <message> <source>Indefinite time</source> @@ -7794,7 +7832,7 @@ Please choose a different file name.</source> </message> <message> <source>Sequence ']]>' not allowed in content.</source> - <translation>このコンテキストでは、']]>' は許可されていません。</translation> + <translation>このコンテンツでは、']]>' は許可されていません。</translation> </message> <message> <source>Encountered incorrectly encoded content.</source> @@ -7944,7 +7982,7 @@ Please choose a different file name.</source> </message> <message> <source>Element %1 can't be serialized because it appears outside the document element.</source> - <translation>エレメント %1 はシリアライズできません。このドキュメントの範囲を越えるエレメントを含んでいます。</translation> + <translation>要素 %1 はシリアライズできません。このドキュメントの範囲を越える要素を含んでいます。</translation> </message> <message> <source>Attribute %1 can't be serialized because it appears at the top level.</source> @@ -7952,7 +7990,7 @@ Please choose a different file name.</source> </message> <message> <source>Year %1 is invalid because it begins with %2.</source> - <translation>%1 年はむこうです。%2 で始まっています。</translation> + <translation>%1 年は無効です。%2 で始まっています。</translation> </message> <message> <source>Day %1 is outside the range %2..%3.</source> @@ -7992,7 +8030,7 @@ Please choose a different file name.</source> </message> <message> <source>%1 is not a valid value of type %2.</source> - <translation>%1 は、%2 の型に対して有効な値ではありません。</translation> + <translation>%1 は、型 %2 の値として無効です。</translation> </message> <message> <source>When casting to %1 from %2, the source value cannot be %3.</source> @@ -8044,7 +8082,7 @@ Please choose a different file name.</source> </message> <message> <source>%1 is not valid as a value of type %2.</source> - <translation>型 %2 に対して、値 %1 は有効ではありません。</translation> + <translation>値 %1 は、型 %2 の値として無効です。</translation> </message> <message> <source>Ambiguous rule match.</source> @@ -8084,7 +8122,7 @@ Please choose a different file name.</source> </message> <message> <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source> - <translation>名前空間のスントラクトにおいて、空白の文字列を名前空間の値として使用することはできません。</translation> + <translation>名前空間のコンストラクタにおいて、空白の文字列を名前空間の値として使用することはできません。</translation> </message> <message> <source>The prefix must be a valid %1, which %2 is not.</source> @@ -8136,11 +8174,11 @@ Please choose a different file name.</source> </message> <message> <source>No namespace binding exists for the prefix %1</source> - <translation>プレフィックス %1 にバインドされたネームスペースがありません</translation> + <translation>プレフィックス %1 にバインドされた名前空間がありません</translation> </message> <message> <source>No namespace binding exists for the prefix %1 in %2</source> - <translation>%2 におけるプレフィックス %1 にバインディングされたネームスペースが存在しません</translation> + <translation>%2 におけるプレフィックス %1 にバインディングされた名前空間が存在しません</translation> </message> <message> <source>%1 is an invalid %2</source> @@ -8180,7 +8218,7 @@ Please choose a different file name.</source> </message> <message> <source>%1 is not a valid XML 1.0 character.</source> - <translation>%1 は XML 1.0 において有効な文字ではありません。</translation> + <translation>%1 は、XML 1.0 文字として無効です。</translation> </message> <message> <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source> @@ -8224,7 +8262,7 @@ Please choose a different file name.</source> </message> <message> <source>%1 is an invalid regular expression pattern: %2</source> - <translation>%1 は有効な正規表現ではありません。: %2</translation> + <translation>%1 は有効な正規表現ではありません: %2</translation> </message> <message> <source>%1 is an invalid flag for regular expressions. Valid flags are:</source> @@ -8276,15 +8314,15 @@ Please choose a different file name.</source> </message> <message> <source>W3C XML Schema identity constraint selector</source> - <translation type="unfinished"></translation> + <translation>W3C XML スキーマ ID制約 selector</translation> </message> <message> <source>W3C XML Schema identity constraint field</source> - <translation type="unfinished"></translation> + <translation>W3C XML スキーマ ID制約 field</translation> </message> <message> <source>A construct was encountered which is disallowed in the current language(%1).</source> - <translation type="unfinished"></translation> + <translation>現在の言語 (%1) では許可されていない構造が検出されました。</translation> </message> <message> <source>%1 is an unknown schema type.</source> @@ -8488,11 +8526,11 @@ Please choose a different file name.</source> </message> <message> <source>An attribute with name %1 has already appeared on this element.</source> - <translation>属性名 '%1' は、すでにこのエレメントで使用されています。</translation> + <translation>属性名 '%1' は、すでにこの要素で使用されています。</translation> </message> <message> <source>A direct element constructor is not well-formed. %1 is ended with %2.</source> - <translation>直積的な指定のエレメントがwell formedではありません。'%1' が、'%2' で終わっています。</translation> + <translation>直積的な指定の要素がwell formedではありません。'%1' が、'%2' で終わっています。</translation> </message> <message> <source>The name %1 does not refer to any schema type.</source> @@ -8520,7 +8558,7 @@ Please choose a different file name.</source> </message> <message> <source>Element %1 is not allowed at this location.</source> - <translation>この場所にエレメント '%1' をおくことは許可されていません。</translation> + <translation>この場所に要素 %1 をおくことは許可されていません。</translation> </message> <message> <source>Text nodes are not allowed at this location.</source> @@ -8552,31 +8590,31 @@ Please choose a different file name.</source> </message> <message> <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source> - <translation>エレメント '%1' が属性 '%2' を持たない場合は、属性 '%3' や '%4' を使用することはできません。</translation> + <translation>要素 '%1' が属性 '%2' を持たない場合は、属性 '%3' や '%4' を使用することはできません。</translation> </message> <message> <source>Element %1 must have at least one of the attributes %2 or %3.</source> - <translation>エレメント '%1' は、属性 '%2' か '%3' のいずれかを持たなければなりません。</translation> + <translation>要素 '%1' は、属性 '%2' か '%3' のいずれかを持たなければなりません。</translation> </message> <message> <source>At least one mode must be specified in the %1-attribute on element %2.</source> - <translation>エレメント '%2' において、'%1' 属性は少くとも一つのモードを指定しなければなりません。</translation> + <translation>要素 '%2' において、'%1' 属性は少くとも一つのモードを指定しなければなりません。</translation> </message> <message> <source>Element %1 must come last.</source> - <translation>エレメント %1 は最後になければなりません。</translation> + <translation>要素 %1 は最後になければなりません。</translation> </message> <message> <source>At least one %1-element must occur before %2.</source> - <translation>%2 の前に、少くとも一つは %1 エレメントが存在しなければなりません。</translation> + <translation>%2 の前に、少くとも一つは %1 要素が存在しなければなりません。</translation> </message> <message> <source>Only one %1-element can appear.</source> - <translation>%1 エレメントは一つのみ存在しなければなりません。</translation> + <translation>%1 要素は一つのみ存在しなければなりません。</translation> </message> <message> <source>At least one %1-element must occur inside %2.</source> - <translation>%2 の内側には、少くとも一つの '%1' エレメントが存在しなければなりません。</translation> + <translation>%2 の内側には、少くとも一つの '%1' 要素が存在しなければなりません。</translation> </message> <message> <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source> @@ -8584,7 +8622,7 @@ Please choose a different file name.</source> </message> <message> <source>Element %1 must have either a %2-attribute or a sequence constructor.</source> - <translation>エレメント %1 には、%2 属性またはsequence constructorがなければなりません。</translation> + <translation>要素 %1 には、%2 属性またはsequence constructorがなければなりません。</translation> </message> <message> <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source> @@ -8592,11 +8630,11 @@ Please choose a different file name.</source> </message> <message> <source>Element %1 cannot have children.</source> - <translation>エレメント %1 は、子要素を持つことができません。</translation> + <translation>要素 %1 は、子要素を持つことができません。</translation> </message> <message> <source>Element %1 cannot have a sequence constructor.</source> - <translation>エレメント %1 は、sequence constructor を含むことができません。</translation> + <translation>要素 %1 は、sequence constructor を含むことができません。</translation> </message> <message> <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source> @@ -8612,11 +8650,11 @@ Please choose a different file name.</source> </message> <message> <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</source> - <translation>トップレベルのスタイルシートのエレメントは、non-nullな名前空間を持っていなければなりません。しかし、%1 はそうではありません。</translation> + <translation>トップレベルのスタイルシートの要素は、non-nullな名前空間を持っていなければなりません。しかし、%1 はそうではありません。</translation> </message> <message> <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source> - <translation>エレメント %2 の属性 %1 の値は、%3 または %4 でなければなりません。%5 は異なります。</translation> + <translation>要素 %2 の属性 %1 の値は、%3 または %4 でなければなりません。%5 は異なります。</translation> </message> <message> <source>Attribute %1 cannot have the value %2.</source> @@ -8624,1083 +8662,1083 @@ Please choose a different file name.</source> </message> <message> <source>The attribute %1 can only appear on the first %2 element.</source> - <translation>属性 %1 は、最初の %2 エレメントにのみ指定できます。</translation> + <translation>属性 %1 は、最初の %2 要素にのみ指定できます。</translation> </message> <message> <source>At least one %1 element must appear as child of %2.</source> - <translation>%2 の子要素としては、少くとも一つは %1 エレメントがなければなりません。</translation> + <translation>%2 の子要素としては、少くとも一つは %1 要素がなければなりません。</translation> </message> <message> <source>Empty particle cannot be derived from non-empty particle.</source> - <translation>空ではない particle から空の particle を得ることはできません。</translation> + <translation>空ではないパーティクルから空のパーティクルを派生させることはできません。</translation> </message> <message> <source>Derived particle is missing element %1.</source> - <translation>取得した particle に要素 %1 がありません。</translation> + <translation>派生パーティクル に要素 %1 がありません。</translation> </message> <message> <source>Derived element %1 is missing value constraint as defined in base particle.</source> - <translation type="unfinished"></translation> + <translation>派生要素 %1 は基底パーティクルで値制約が定義されていません。</translation> </message> <message> <source>Derived element %1 has weaker value constraint than base particle.</source> - <translation type="unfinished"></translation> + <translation>派生要素 %1 は基底パーティクルよりも弱い値制約を持っています。</translation> </message> <message> <source>Fixed value constraint of element %1 differs from value constraint in base particle.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 の固定値制約は基底パーティクルの値制約と異なっています。</translation> </message> <message> <source>Derived element %1 cannot be nillable as base element is not nillable.</source> - <translation type="unfinished"></translation> + <translation>基底要素が null を許可していない為、派生要素 %1 に null を許可させる事はできません。</translation> </message> <message> <source>Block constraints of derived element %1 must not be more weaker than in the base element.</source> - <translation type="unfinished"></translation> + <translation>派生要素 %1 の Block 制約は、基底要素よりも弱くできません。</translation> </message> <message> <source>Simple type of derived element %1 cannot be validly derived from base element.</source> - <translation type="unfinished"></translation> + <translation>派生要素 %1 の単純型は、基底要素から適切に派生できません。</translation> </message> <message> <source>Complex type of derived element %1 cannot be validly derived from base element.</source> - <translation type="unfinished"></translation> + <translation>派生要素 %1 の複合型は、基底要素から適切に派生できません。</translation> </message> <message> <source>Element %1 is missing in derived particle.</source> - <translation type="unfinished"></translation> + <translation>派生パーティクルに要素 %1 がありません。</translation> </message> <message> <source>Element %1 does not match namespace constraint of wildcard in base particle.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は基底パーティクルのワイルドカードの名前空間制約にマッチしません。</translation> </message> <message> <source>Wildcard in derived particle is not a valid subset of wildcard in base particle.</source> - <translation type="unfinished"></translation> + <translation>派生パーティクルにあるワイルドカードは、基底パーティクルのワイルドカードのサブセットとして無効です。</translation> </message> <message> <source>processContent of wildcard in derived particle is weaker than wildcard in base particle.</source> - <translation type="unfinished"></translation> + <translation>派生パーティクルのワイルドカードの processContent は基底パーティクルのワイルドカードよりも弱いです。</translation> </message> <message> <source>Derived particle allows content that is not allowed in the base particle.</source> - <translation type="unfinished"></translation> + <translation>派生パーティクルはコンテンツを許可していますが、基底パーティクルでは許可していません。</translation> </message> <message> <source>%1 has inheritance loop in its base type %2.</source> - <translation type="unfinished"></translation> + <translation>%1 は、基底型 %2 で継承ループしています。</translation> </message> <message> <source>Circular inheritance of base type %1.</source> - <translation type="unfinished"></translation> + <translation>基底型 %1 を循環継承しています。</translation> </message> <message> <source>Circular inheritance of union %1.</source> - <translation type="unfinished"></translation> + <translation>union %1 を循環継承しています。</translation> </message> <message> <source>%1 is not allowed to derive from %2 by restriction as the latter defines it as final.</source> - <translation type="unfinished"></translation> + <translation>%1 は最終的に定義される制約により %2 を派生する事は許可されていません。</translation> </message> <message> <source>%1 is not allowed to derive from %2 by extension as the latter defines it as final.</source> - <translation type="unfinished"></translation> + <translation>%1 は最終的に定義される拡張により %2 を派生する事は許可されていません。</translation> </message> <message> <source>Base type of simple type %1 cannot be complex type %2.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 の基底型は複合型 %2 にはできません。</translation> </message> <message> <source>Simple type %1 cannot have direct base type %2.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 は基底型 %2 を直接持つ事はできません。</translation> </message> <message> <source>Simple type %1 is not allowed to have base type %2.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 は基底型 %2 を持つ事は許可されていません。</translation> </message> <message> <source>Simple type %1 can only have simple atomic type as base type.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 は基底型として単純なアトミック型のみ持つ事ができます。</translation> </message> <message> <source>Simple type %1 cannot derive from %2 as the latter defines restriction as final.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 は最終的に定義される制約により %2 を派生できません。</translation> </message> <message> <source>Variety of item type of %1 must be either atomic or union.</source> - <translation type="unfinished"></translation> + <translation>%1 の各アイテム型は atomic か union である必要があります。</translation> </message> <message> <source>Variety of member types of %1 must be atomic.</source> - <translation type="unfinished"></translation> + <translation>%1 の各メンバーの型は atomic である必要があります。</translation> </message> <message> <source>%1 is not allowed to derive from %2 by list as the latter defines it as final.</source> - <translation type="unfinished"></translation> + <translation>%1 は最終的に定義されるリストにより %2 を派生する事は許可されていません。</translation> </message> <message> <source>Simple type %1 is only allowed to have %2 facet.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 は %2 ファセットのみ持つ事ができます。</translation> </message> <message> <source>Base type of simple type %1 must have variety of type list.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 の基底型は各型のリストを持っていなければなりません。</translation> </message> <message> <source>Base type of simple type %1 has defined derivation by restriction as final.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 の基底型は最終的に制約により派生として定義されています。</translation> </message> <message> <source>Item type of base type does not match item type of %1.</source> - <translation type="unfinished"></translation> + <translation>基底型のアイテム型が %1 のアイテム型にマッチしていません。</translation> </message> <message> <source>Simple type %1 contains not allowed facet type %2.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 がファセット型 %2 を含む事は許可されていません。</translation> </message> <message> <source>%1 is not allowed to derive from %2 by union as the latter defines it as final.</source> - <translation type="unfinished"></translation> + <translation>%1 は最終的に定義される union により %2 を派生する事は許可されていません。</translation> </message> <message> <source>%1 is not allowed to have any facets.</source> - <translation type="unfinished"></translation> + <translation>%1 はどんなファセットも持つ事を許可されていません。</translation> </message> <message> <source>Base type %1 of simple type %2 must have variety of union.</source> - <translation type="unfinished"></translation> + <translation>単純型 %2 の基底型 %1 は各型の uinon を持っていなければなりません。</translation> </message> <message> <source>Base type %1 of simple type %2 is not allowed to have restriction in %3 attribute.</source> - <translation type="unfinished"></translation> + <translation>単純型 %2 の基底型 %1 は %3 属性内に制約を持つ事を許可されていません。</translation> </message> <message> <source>Member type %1 cannot be derived from member type %2 of %3's base type %4.</source> - <translation type="unfinished"></translation> + <translation>メンバ型 %1 は %3 の基底型 %4 のメンバ型 %2 から派生する事はできません。</translation> </message> <message> <source>Derivation method of %1 must be extension because the base type %2 is a simple type.</source> - <translation type="unfinished"></translation> + <translation>%1 の派生メソッドは基底型 %2 が単純型の為、拡張でなければなりません。</translation> </message> <message> <source>Complex type %1 has duplicated element %2 in its content model.</source> - <translation type="unfinished"></translation> + <translation>複合形 %1 は自身のコンテンツ モデル内で要素 %2 を重複させています。</translation> </message> <message> <source>Complex type %1 has non-deterministic content.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 は非決定性コンテンツを所有しています。</translation> </message> <message> <source>Attributes of complex type %1 are not a valid extension of the attributes of base type %2: %3.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 の属性は、基底型 %2 の属性の拡張として無効です: %3。</translation> </message> <message> <source>Content model of complex type %1 is not a valid extension of content model of %2.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 のコンテンツ モデルは、%2 のコンテンツ モデルの拡張として無効です。</translation> </message> <message> <source>Complex type %1 must have simple content.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 は単純コンテンツを持たなければなりません。</translation> </message> <message> <source>Complex type %1 must have the same simple type as its base class %2.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 は基底クラス %2 のような単純型を持たなければなりません。</translation> </message> <message> <source>Complex type %1 cannot be derived from base type %2%3.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 は基底型 %2 から派生する事はできません %3。</translation> </message> <message> <source>Attributes of complex type %1 are not a valid restriction from the attributes of base type %2: %3.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 の属性は、基底型 %2 の属性の制約として無効です: %3。</translation> </message> <message> <source>Complex type %1 with simple content cannot be derived from complex base type %2.</source> - <translation type="unfinished"></translation> + <translation>単純コンテンツの複合型 %1 は複合基底型 %2 を派生する事はできません。</translation> </message> <message> <source>Item type of simple type %1 cannot be a complex type.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 のアイテム型を複合型にする事はできません。</translation> </message> <message> <source>Member type of simple type %1 cannot be a complex type.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 のメンバー型を複合型にする事はできません。</translation> </message> <message> <source>%1 is not allowed to have a member type with the same name as itself.</source> - <translation type="unfinished"></translation> + <translation>%1 は自身と同名のメンバー型を所有する事を許可していません。</translation> </message> <message> <source>%1 facet collides with %2 facet.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットと %2 ファセットが衝突しています。</translation> </message> <message> <source>%1 facet must have the same value as %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは基底型の %2 ファセットと同値を所有しなければなりません。</translation> </message> <message> <source>%1 facet must be equal or greater than %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは基底型の %2 ファセットと同じかそれ以上でなければなりません。</translation> </message> <message> <source>%1 facet must be less than or equal to %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは基底型の %2 ファセット以下でなければなりません。</translation> </message> <message> <source>%1 facet contains invalid regular expression</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは無効な正規表現を含んでいます</translation> </message> <message> <source>Unknown notation %1 used in %2 facet.</source> - <translation type="unfinished"></translation> + <translation>未知の表記法 %1 が %2 ファセットで使われています。</translation> </message> <message> <source>%1 facet contains invalid value %2: %3.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは無効な値 %2 を含んでいます: %3。</translation> </message> <message> <source>%1 facet cannot be %2 or %3 if %4 facet of base type is %5.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは、%4 ファセットの基底型が %5 の場合に %2 や %3 にする事はできません。</translation> </message> <message> <source>%1 facet cannot be %2 if %3 facet of base type is %4.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは、%3 ファセットの基底型が %4 の場合に %2 にする事はできません。</translation> </message> <message> <source>%1 facet must be less than or equal to %2 facet.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは %2 ファセット以下でなければなりません。</translation> </message> <message> <source>%1 facet must be less than %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは基底型の %2 ファセット以下でなければなりません。</translation> </message> <message> <source>%1 facet and %2 facet cannot appear together.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットと %2 ファセットを同時に現す事はできません。</translation> </message> <message> <source>%1 facet must be greater than %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは基底型の %2 ファセット以上でなければなりません。</translation> </message> <message> <source>%1 facet must be less than %2 facet.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは %2 ファセット以下でなければなりません。</translation> </message> <message> <source>%1 facet must be greater than or equal to %2 facet of base type.</source> - <translation type="unfinished"></translation> + <translation>%1 ファセットは基底型の %2 ファセット以上でなければなりません。</translation> </message> <message> <source>Simple type contains not allowed facet %1.</source> - <translation type="unfinished"></translation> + <translation>単純型がファセット %1 を含む事は許可されていません。</translation> </message> <message> <source>%1, %2, %3, %4, %5 and %6 facets are not allowed when derived by list.</source> - <translation type="unfinished"></translation> + <translation>list に派生される場合、%1, %2, %3, %4, %5, %6 ファセットは許可されていません。</translation> </message> <message> <source>Only %1 and %2 facets are allowed when derived by union.</source> - <translation type="unfinished"></translation> + <translation>union に派生される場合、%1 と %2 ファセットだけが許可されます。</translation> </message> <message> <source>%1 contains %2 facet with invalid data: %3.</source> - <translation type="unfinished"></translation> + <translation>%1 は無効なデータを含んだ %2 ファセットが含まれています: %3。</translation> </message> <message> <source>Attribute group %1 contains attribute %2 twice.</source> - <translation type="unfinished"></translation> + <translation>属性グループ %1 は属性 %2 を2重に含んでいます。</translation> </message> <message> <source>Attribute group %1 contains two different attributes that both have types derived from %2.</source> - <translation type="unfinished"></translation> + <translation>属性グループ %1 はどちらも %2 から派生した型を持つ2つの異なる属性を含んでいます。</translation> </message> <message> <source>Attribute group %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> - <translation type="unfinished"></translation> + <translation>属性グループ %1 は %3 を継承した型の値制約を持つ属性 %2 を含んでいます。</translation> </message> <message> <source>Complex type %1 contains attribute %2 twice.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 は属性 %2 を2回含んでいます。</translation> </message> <message> <source>Complex type %1 contains two different attributes that both have types derived from %2.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 はどちらも %2 から派生した型を持つ2つの異なる属性を含んでいます。</translation> </message> <message> <source>Complex type %1 contains attribute %2 that has value constraint but type that inherits from %3.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 は %3 を継承した型の値制約を持つ属性 %2 を含んでいます。</translation> </message> <message> <source>Element %1 is not allowed to have a value constraint if its base type is complex.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は自身の基底型が複合型の場合に値制約を持つ事を許可されていません。</translation> </message> <message> <source>Element %1 is not allowed to have a value constraint if its type is derived from %2.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は、自身が %2 を派生している場合に値制約を持つ事を許可されていません。</translation> </message> <message> <source>Value constraint of element %1 is not of elements type: %2.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 の値制約は要素型のものではありません: %2。</translation> </message> <message> <source>Element %1 is not allowed to have substitution group affiliation as it is no global element.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 はグローバル要素ではない代替グループ関係を持つ事を許可されていません。</translation> </message> <message> <source>Type of element %1 cannot be derived from type of substitution group affiliation.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 の型は代替グループ関係の型を派生する事はできません。</translation> </message> <message> <source>Value constraint of attribute %1 is not of attributes type: %2.</source> - <translation type="unfinished"></translation> + <translation>属性 %1 の値制約は属性型のものではありません: %2。</translation> </message> <message> <source>Attribute %1 has value constraint but has type derived from %2.</source> - <translation type="unfinished"></translation> + <translation>属性 %1 は %2 から派生した型を持つ値制約を持っています。</translation> </message> <message> <source>%1 attribute in derived complex type must be %2 like in base type.</source> - <translation type="unfinished"></translation> + <translation>派生複合型の %1 属性は基底型のように %2 でなければなりません。</translation> </message> <message> <source>Attribute %1 in derived complex type must have %2 value constraint like in base type.</source> - <translation type="unfinished"></translation> + <translation>派生複合型の属性 %1 は基底型のように %2 値制約を持たなければなりません。</translation> </message> <message> <source>Attribute %1 in derived complex type must have the same %2 value constraint like in base type.</source> - <translation type="unfinished"></translation> + <translation>派生複合型の属性 %1 は、基底型と同様に %2 値制約を持たなければなりません。</translation> </message> <message> <source>Attribute %1 in derived complex type must have %2 value constraint.</source> - <translation type="unfinished"></translation> + <translation>派生複合型の属性 %1 は %2 値制約を持たなければなりません。</translation> </message> <message> <source>processContent of base wildcard must be weaker than derived wildcard.</source> - <translation type="unfinished"></translation> + <translation>基底ワイルドカードの processContent は派生ワイルドカードよりも弱くなければなりません。</translation> </message> <message> <source>Element %1 exists twice with different types.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 が異なる型で2つ存在しています。</translation> </message> <message> <source>Particle contains non-deterministic wildcards.</source> - <translation type="unfinished"></translation> + <translation>パーティクルは非決定性ワイルドカードを含んでいます。</translation> </message> <message> <source>Base attribute %1 is required but derived attribute is not.</source> - <translation type="unfinished"></translation> + <translation>基底属性 %1 は必須ですが派生属性はそうなっていません。</translation> </message> <message> <source>Type of derived attribute %1 cannot be validly derived from type of base attribute.</source> - <translation type="unfinished"></translation> + <translation>派生属性 %1 の型は基底属性の型を有効に派生する事はできません。</translation> </message> <message> <source>Value constraint of derived attribute %1 does not match value constraint of base attribute.</source> - <translation type="unfinished"></translation> + <translation>派生属性 %1 の値制約は基底属性の値制約にマッチしません。</translation> </message> <message> <source>Derived attribute %1 does not exist in the base definition.</source> - <translation type="unfinished"></translation> + <translation>派生属性 %1 は基底定義の中に存在しません。</translation> </message> <message> <source>Derived attribute %1 does not match the wildcard in the base definition.</source> - <translation type="unfinished"></translation> + <translation>派生属性 %1 は基底定義のワイルドカードにマッチしません。</translation> </message> <message> <source>Base attribute %1 is required but missing in derived definition.</source> - <translation type="unfinished"></translation> + <translation>基底属性 %1 は必須ですが派生定義内に見つかりません。</translation> </message> <message> <source>Derived definition contains an %1 element that does not exists in the base definition</source> - <translation type="unfinished"></translation> + <translation>派生定義は %1 要素を含んでいますが基底定義内で存在していません</translation> </message> <message> <source>Derived wildcard is not a subset of the base wildcard.</source> - <translation type="unfinished"></translation> + <translation>派生ワイルドカードは基底ワイルドカードのサブセットではありません。</translation> </message> <message> <source>%1 of derived wildcard is not a valid restriction of %2 of base wildcard</source> - <translation type="unfinished"></translation> + <translation>派生ワイルドカードの %1 は、基底ワイルドカードの %2 の制約として無効です</translation> </message> <message> <source>Attribute %1 from base type is missing in derived type.</source> - <translation type="unfinished"></translation> + <translation>派生型で基底型の属性 %1 が見つかりません。</translation> </message> <message> <source>Type of derived attribute %1 differs from type of base attribute.</source> - <translation type="unfinished"></translation> + <translation>派生属性 %1 の型が基底属性の型と異なっています。</translation> </message> <message> <source>Base definition contains an %1 element that is missing in the derived definition</source> - <translation type="unfinished"></translation> + <translation>基底定義は %1 要素を含んでいますが派生定義内で見つかりません</translation> </message> <message> <source>Can not process unknown element %1, expected elements are: %2.</source> - <translation type="unfinished"></translation> + <translation>未知の要素 %1 を処理できません、期待する要素は以下のものです: %2。</translation> </message> <message> <source>Element %1 is not allowed in this scope, possible elements are: %2.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 はこのスコープ内で許可されていません、使用可能な要素は次のものです: %2。</translation> </message> <message> <source>Child element is missing in that scope, possible child elements are: %1.</source> - <translation type="unfinished"></translation> + <translation>子要素がそのスコープ内で見つかりません、使用可能な子要素は次のものです: %1。</translation> </message> <message> <source>Document is not a XML schema.</source> - <translation type="unfinished"></translation> + <translation>ドキュメントは XML スキーマではありません。</translation> </message> <message> <source>%1 attribute of %2 element contains invalid content: {%3} is not a value of type %4.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性は不正なコンテンツを含んでいます: {%3} は型 %4 の値ではありません。</translation> </message> <message> <source>%1 attribute of %2 element contains invalid content: {%3}.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性は不正なコンテンツを含んでいます: {%3}。</translation> </message> <message> <source>Target namespace %1 of included schema is different from the target namespace %2 as defined by the including schema.</source> - <translation type="unfinished"></translation> + <translation>インクルードしているスキーマの対象名前空間 %1 はインクルードしようとしているスキーマで定義されている対象名前空間 %2 と異なっています。</translation> </message> <message> <source>Target namespace %1 of imported schema is different from the target namespace %2 as defined by the importing schema.</source> - <translation type="unfinished"></translation> + <translation>インポートしているスキーマの対象名前空間 %1 はインポートしようとしているスキーマで定義されている対象名前空間 %2 と異なっています。</translation> </message> <message> <source>%1 element is not allowed to have the same %2 attribute value as the target namespace %3.</source> - <translation type="unfinished"></translation> + <translation>%1 要素は対象名前空間 %3 として %2 属性値を持つ事を許可されていません。</translation> </message> <message> <source>%1 element without %2 attribute is not allowed inside schema without target namespace.</source> - <translation type="unfinished"></translation> + <translation>%2 属性なし %1 要素は対象名前空間なしのスキーマ内にある事を許可されていません。</translation> </message> <message> <source>%1 element is not allowed inside %2 element if %3 attribute is present.</source> - <translation type="unfinished"></translation> + <translation>%3 属性が存在している場合、%2 要素内で %1 要素は許可されていません。</translation> </message> <message> <source>%1 element has neither %2 attribute nor %3 child element.</source> - <translation type="unfinished"></translation> + <translation>%1 要素は %2 属性も %3 子要素のどちらも持っていません。</translation> </message> <message> <source>%1 element with %2 child element must not have a %3 attribute.</source> - <translation type="unfinished"></translation> + <translation>%2 子要素付き %1 要素は %3 属性を持ってはいけません。</translation> </message> <message> <source>%1 attribute of %2 element must be %3 or %4.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性は %3 か %4 でなければなりません。</translation> </message> <message> <source>%1 attribute of %2 element must have a value of %3.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性の値は %3 でなければなりません。</translation> </message> <message> <source>%1 attribute of %2 element must have a value of %3 or %4.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性の値は %3 か %4 でなければなりません。</translation> </message> <message> <source>%1 element must not have %2 and %3 attribute together.</source> - <translation type="unfinished"></translation> + <translation>%1 要素は %2 と %3 属性を同時に持っていてはいけません。</translation> </message> <message> <source>Content of %1 attribute of %2 element must not be from namespace %3.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性のコンテンツは名前空間 %3 のものであってはいけません。</translation> </message> <message> <source>%1 attribute of %2 element must not be %3.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性は %3 であってはいけません。</translation> </message> <message> <source>%1 attribute of %2 element must have the value %3 because the %4 attribute is set.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性は %4 属性がセットされているので値 %3 を持たなければなりません。</translation> </message> <message> <source>Specifying use='prohibited' inside an attribute group has no effect.</source> - <translation type="unfinished"></translation> + <translation>属性グループ内で定義されている use = 'prohibited' は効果がありません。</translation> </message> <message> <source>%1 element must have either %2 or %3 attribute.</source> - <translation type="unfinished"></translation> + <translation>%1 要素は %2 か %3 属性のどちらかを持たなければなりません。</translation> </message> <message> <source>%1 element must have either %2 attribute or %3 or %4 as child element.</source> - <translation type="unfinished"></translation> + <translation>%1 要素は %2 属性や子要素として %3 や %4 のどちらも持っていてはいけません。</translation> </message> <message> <source>%1 element requires either %2 or %3 attribute.</source> - <translation type="unfinished"></translation> + <translation>%1 要素は %2 か %3 属性を必要とします。</translation> </message> <message> <source>Text or entity references not allowed inside %1 element</source> - <translation type="unfinished"></translation> + <translation>テキストまたはエンティティ参照は %1 要素内で許可されていません</translation> </message> <message> <source>%1 attribute of %2 element must contain %3, %4 or a list of URIs.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性は %3、%4 または URI のリストを含んでいなければなりません。</translation> </message> <message> <source>%1 element is not allowed in this context.</source> - <translation type="unfinished"></translation> + <translation>%1 要素はこのコンテキストで許可されていません。</translation> </message> <message> <source>%1 attribute of %2 element has larger value than %3 attribute.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性は %3 属性よりも大きな値になっています。</translation> </message> <message> <source>Prefix of qualified name %1 is not defined.</source> - <translation type="unfinished"></translation> + <translation>修飾名 %1 のプレフィックスが定義されていません。</translation> </message> <message> <source>%1 attribute of %2 element must either contain %3 or the other values.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の %1 属性は %3 や他の値を含んではいけません。</translation> </message> <message> <source>Component with ID %1 has been defined previously.</source> - <translation type="unfinished"></translation> + <translation>ID %1 のコンポーネントは以前に定義されています。</translation> </message> <message> <source>Element %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 はすでに定義されています。</translation> </message> <message> <source>Attribute %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>属性 %1 はすでに定義されています。</translation> </message> <message> <source>Type %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>型 %1 はすでに定義されています。</translation> </message> <message> <source>Attribute group %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>属性グループ %1 はすでに定義されています。</translation> </message> <message> <source>Element group %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>要素グループ %1 はすでに定義されています。</translation> </message> <message> <source>Notation %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>表記法 %1 はすでに定義されています。</translation> </message> <message> <source>Identity constraint %1 already defined.</source> - <translation type="unfinished"></translation> + <translation>ID制約 %1 はすでに定義されています。</translation> </message> <message> <source>Duplicated facets in simple type %1.</source> - <translation type="unfinished"></translation> + <translation>単純型 %1 内でファセットが重複しています。</translation> </message> <message> <source>%1 references unknown %2 or %3 element %4.</source> - <translation type="unfinished"></translation> + <translation>%1 は未知の %2 か %3 要素 %4 を参照しています。</translation> </message> <message> <source>%1 references identity constraint %2 that is no %3 or %4 element.</source> - <translation type="unfinished"></translation> + <translation>%1 は %3 でも %4 要素でもないID制約 %2 を参照しています。</translation> </message> <message> <source>%1 has a different number of fields from the identity constraint %2 that it references.</source> - <translation type="unfinished"></translation> + <translation>%1 のフィールド数が、自身が参照しているID制約 %2 のフィールド数と異なっています。</translation> </message> <message> <source>Base type %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の基底型 %1 を解決できませんでした。</translation> </message> <message> <source>Item type %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>%2 要素のアイテム型 %1 を解決できませんでした。</translation> </message> <message> <source>Member type %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>%2 要素のメンバー型 %1 を解決できませんでした。</translation> </message> <message> <source>Type %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の型 %1 を解決できませんでした。</translation> </message> <message> <source>Base type %1 of complex type cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>複合型の基底型 %1 を解決できませんでした。</translation> </message> <message> <source>%1 cannot have complex base type that has a %2.</source> - <translation type="unfinished"></translation> + <translation>%1 は %2 を持った複合基底型を持つ事はできません。</translation> </message> <message> <source>Content model of complex type %1 contains %2 element so it cannot be derived by extension from a non-empty type.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 のコンテンツモデルは %2 要素を含んでいますが非 empty 型を派生した拡張にする事はできません。</translation> </message> <message> <source>Complex type %1 cannot be derived by extension from %2 as the latter contains %3 element in its content model.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 は、%3 要素をコンテンツモデルに含んでいる %2 の拡張にする事はできません。</translation> </message> <message> <source>Type of %1 element must be a simple type, %2 is not.</source> - <translation type="unfinished"></translation> + <translation>%1 要素の型は %2 ではなく単純型にしなくてはいけません。</translation> </message> <message> <source>Substitution group %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の代替グループ %1 を解決できませんでした。</translation> </message> <message> <source>Substitution group %1 has circular definition.</source> - <translation type="unfinished"></translation> + <translation>代替グループ %1 が循環参照しています。</translation> </message> <message> <source>Duplicated element names %1 in %2 element.</source> - <translation type="unfinished"></translation> + <translation>%2 要素内で要素名 %1 が重複しています。</translation> </message> <message> <source>Reference %1 of %2 element cannot be resolved.</source> - <translation type="unfinished"></translation> + <translation>%2 要素の参照 %1 を解決できませんでした。</translation> </message> <message> <source>Circular group reference for %1.</source> - <translation type="unfinished"></translation> + <translation>グループ参照 %1 が循環しています。</translation> </message> <message> <source>%1 element is not allowed in this scope</source> - <translation type="unfinished"></translation> + <translation>%1 要素はこのスコープ内で許可されていません</translation> </message> <message> <source>%1 element cannot have %2 attribute with value other than %3.</source> - <translation type="unfinished"></translation> + <translation>%1 要素は %3 以外の値の %2 属性を持つ事はできません。</translation> </message> <message> <source>%1 element cannot have %2 attribute with value other than %3 or %4.</source> - <translation type="unfinished"></translation> + <translation>%1 要素は %3 や %4 以外の値の %2 属性を持つ事はできません。</translation> </message> <message> <source>%1 or %2 attribute of reference %3 does not match with the attribute declaration %4.</source> - <translation type="unfinished"></translation> + <translation>参照 %3 の %1 や %2 属性は属性宣言 %4 にマッチしません。</translation> </message> <message> <source>Attribute group %1 has circular reference.</source> - <translation type="unfinished"></translation> + <translation>属性グループ %1 が循環参照しています。</translation> </message> <message> <source>%1 attribute in %2 must have %3 use like in base type %4.</source> - <translation type="unfinished"></translation> + <translation>%2 の属性 %1 は基底型 %4 のように %3 を所有しなくてはいけません。</translation> </message> <message> <source>Attribute wildcard of %1 is not a valid restriction of attribute wildcard of base type %2.</source> - <translation type="unfinished"></translation> + <translation>%1 の属性ワイルドカードは、基底型 %2 の属性ワイルドカードの制約として無効です。</translation> </message> <message> <source>%1 has attribute wildcard but its base type %2 has not.</source> - <translation type="unfinished"></translation> + <translation>%1 はワイルドカードを使用した属性を所有していますが基底型 %2 は所有していません。</translation> </message> <message> <source>Union of attribute wildcard of type %1 and attribute wildcard of its base type %2 is not expressible.</source> - <translation type="unfinished"></translation> + <translation>型 %1 の属性ワイルドカードの union と基底型 %2 の属性ワイルドカードは表現可能ではありません。</translation> </message> <message> <source>Enumeration facet contains invalid content: {%1} is not a value of type %2.</source> - <translation type="unfinished"></translation> + <translation>列挙型ファセットが不正なコンテンツを含んでいます: {%1} は、型 %2 の値ではありません。</translation> </message> <message> <source>Namespace prefix of qualified name %1 is not defined.</source> - <translation type="unfinished"></translation> + <translation>修飾名 %1 の名前空間プレフィックスが定義されていません。</translation> </message> <message> <source>%1 element %2 is not a valid restriction of the %3 element it redefines: %4.</source> - <translation type="unfinished"></translation> + <translation>%1 要素 %2 は %3 要素が再定義している制約として無効です: %4。</translation> </message> <message> <source>%1 is not valid according to %2.</source> - <translation type="unfinished"></translation> + <translation>%2 によると %1 は妥当ではありません。</translation> </message> <message> <source>String content does not match the length facet.</source> - <translation type="unfinished"></translation> + <translation>string コンテンツが length ファセットにマッチしません。</translation> </message> <message> <source>String content does not match the minLength facet.</source> - <translation type="unfinished"></translation> + <translation>string コンテンツが minLength ファセットにマッチしません。</translation> </message> <message> <source>String content does not match the maxLength facet.</source> - <translation type="unfinished"></translation> + <translation>string コンテンツが maxLength ファセットにマッチしません。</translation> </message> <message> <source>String content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>string コンテンツがパターンファセットにマッチしません。</translation> </message> <message> <source>String content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>string コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>Signed integer content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>signed integer コンテンツが maxInclusive ファセットにマッチしません。</translation> </message> <message> <source>Signed integer content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>signed integer コンテンツが maxExclusive ファセットにマッチしません。</translation> </message> <message> <source>Signed integer content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>signed integer コンテンツが minInclusive ファセットにマッチしません。</translation> </message> <message> <source>Signed integer content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>signed integer コンテンツが minExclusive ファセットにマッチしません。</translation> </message> <message> <source>Signed integer content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>signed integer コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>Signed integer content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>signed integer コンテンツがパターンファセットにマッチしません。</translation> </message> <message> <source>Signed integer content does not match in the totalDigits facet.</source> - <translation type="unfinished"></translation> + <translation>signed integer コンテンツが totalDigits ファセットで指定される値の範囲にマッチしません。</translation> </message> <message> <source>Unsigned integer content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>unsigned integer コンテンツが maxInclusive ファセットにマッチしません。</translation> </message> <message> <source>Unsigned integer content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>unsigned integer コンテンツが maxExclusive ファセットにマッチしません。</translation> </message> <message> <source>Unsigned integer content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>unsigned integer コンテンツが minInclusive ファセットにマッチしません。</translation> </message> <message> <source>Unsigned integer content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>unsigned integer コンテンツが minExclusive ファセットにマッチしません。</translation> </message> <message> <source>Unsigned integer content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>unsigned integer コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>Unsigned integer content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>unsigned integer コンテンツがパターンファセットにマッチしません。</translation> </message> <message> <source>Unsigned integer content does not match in the totalDigits facet.</source> - <translation type="unfinished"></translation> + <translation>unsigned integer コンテンツが totalDigits ファセットで指定される値の範囲にマッチしません。</translation> </message> <message> <source>Double content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>double コンテンツが maxInclusive ファセットにマッチしません。</translation> </message> <message> <source>Double content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>double コンテンツが maxExclusive ファセットにマッチしません。</translation> </message> <message> <source>Double content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>double コンテンツが minInclusive ファセットにマッチしません。</translation> </message> <message> <source>Double content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>double コンテンツが minExclusive ファセットにマッチしません。</translation> </message> <message> <source>Double content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>double コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>Double content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>double コンテンツがパターンファセットにマッチしません。</translation> </message> <message> <source>Decimal content does not match in the fractionDigits facet.</source> - <translation type="unfinished"></translation> + <translation>decimal コンテンツが fractionDigits ファセットで指定される値の範囲にマッチしません。</translation> </message> <message> <source>Decimal content does not match in the totalDigits facet.</source> - <translation type="unfinished"></translation> + <translation>decimal コンテンツが totalDigits ファセットで指定される値の範囲にマッチしません。</translation> </message> <message> <source>Date time content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>date time コンテンツが maxInclusive ファセットにマッチしません。</translation> </message> <message> <source>Date time content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>date time コンテンツが maxExclusive ファセットにマッチしません。</translation> </message> <message> <source>Date time content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>date time コンテンツが minInclusive ファセットにマッチしません。</translation> </message> <message> <source>Date time content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>date time コンテンツが minExclusive ファセットにマッチしません。</translation> </message> <message> <source>Date time content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>date time コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>Date time content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>date time コンテンツがパターンファセットにマッチしません。</translation> </message> <message> <source>Duration content does not match the maxInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>duration コンテンツが maxInclusive ファセットにマッチしません。</translation> </message> <message> <source>Duration content does not match the maxExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>duration コンテンツが maxExclusive ファセットにマッチしません。</translation> </message> <message> <source>Duration content does not match the minInclusive facet.</source> - <translation type="unfinished"></translation> + <translation>duration コンテンツが minInclusive ファセットにマッチしません。</translation> </message> <message> <source>Duration content does not match the minExclusive facet.</source> - <translation type="unfinished"></translation> + <translation>duration コンテンツが minExclusive ファセットにマッチしません。</translation> </message> <message> <source>Duration content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>duration コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>Duration content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>duration コンテンツがパターンファセットにマッチしません。</translation> </message> <message> <source>Boolean content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>boolean コンテンツがパターンファセットにマッチしません。</translation> </message> <message> <source>Binary content does not match the length facet.</source> - <translation type="unfinished"></translation> + <translation>binary コンテンツが length ファセットにマッチしません。</translation> </message> <message> <source>Binary content does not match the minLength facet.</source> - <translation type="unfinished"></translation> + <translation>binary コンテンツが minLength ファセットにマッチしません。</translation> </message> <message> <source>Binary content does not match the maxLength facet.</source> - <translation type="unfinished"></translation> + <translation>binary コンテンツが maxLength ファセットにマッチしません。</translation> </message> <message> <source>Binary content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>binary コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>Invalid QName content: %1.</source> - <translation type="unfinished"></translation> + <translation>無効な QName コンテンツ: %1。</translation> </message> <message> <source>QName content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>QName コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>QName content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>QName コンテンツがパターンファセットにマッチしません。</translation> </message> <message> <source>Notation content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>notation コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>List content does not match length facet.</source> - <translation type="unfinished"></translation> + <translation>list コンテンツが length ファセットにマッチしません。</translation> </message> <message> <source>List content does not match minLength facet.</source> - <translation type="unfinished"></translation> + <translation>list コンテンツが minLength ファセットにマッチしません。</translation> </message> <message> <source>List content does not match maxLength facet.</source> - <translation type="unfinished"></translation> + <translation>list コンテンツが maxLength ファセットにマッチしません。</translation> </message> <message> <source>List content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>list コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>List content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>list コンテンツがパターンファセットにマッチしません。</translation> </message> <message> <source>Union content is not listed in the enumeration facet.</source> - <translation type="unfinished"></translation> + <translation>union コンテンツが列挙型ファセット内の一覧にありません。</translation> </message> <message> <source>Union content does not match pattern facet.</source> - <translation type="unfinished"></translation> + <translation>union コンテンツがパターンファセットにマッチしません。</translation> </message> <message> <source>Data of type %1 are not allowed to be empty.</source> - <translation type="unfinished"></translation> + <translation>型 %1 のデータは空にする事を許容されていません。</translation> </message> <message> <source>Element %1 is missing child element.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 に子要素がありません。</translation> </message> <message> <source>There is one IDREF value with no corresponding ID: %1.</source> - <translation type="unfinished"></translation> + <translation>ID %1 に対応するIDREFがありません。</translation> </message> <message> <source>Loaded schema file is invalid.</source> - <translation type="unfinished"></translation> + <translation>読み込まれているスキーマファイルは無効です。</translation> </message> <message> <source>%1 contains invalid data.</source> - <translation type="unfinished"></translation> + <translation>%1 は無効なデータを含んでいます。</translation> </message> <message> <source>xsi:schemaLocation namespace %1 has already appeared earlier in the instance document.</source> - <translation type="unfinished"></translation> + <translation>xsi:schemaLocation 名前空間 %1 はインスタンスドキュメントの前に既に現れています。</translation> </message> <message> <source>xsi:noNamespaceSchemaLocation cannot appear after the first no-namespace element or attribute.</source> - <translation type="unfinished"></translation> + <translation>先頭の namespace ではない要素または属性の後に xsi:noNamespaceSchemaLocation を使用できません。</translation> </message> <message> <source>No schema defined for validation.</source> - <translation type="unfinished"></translation> + <translation>妥当性検証の為のスキーマが定義されていません。</translation> </message> <message> <source>No definition for element %1 available.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は使用できるように定義されていません。</translation> </message> <message> <source>Specified type %1 is not known to the schema.</source> - <translation type="unfinished"></translation> + <translation>指定された型 %1 はスキーマで未知です。</translation> </message> <message> <source>Element %1 is not defined in this scope.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 がこのスコープ内で定義されていません。</translation> </message> <message> <source>Declaration for element %1 does not exist.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 の宣言が存在しません。</translation> </message> <message> <source>Element %1 contains invalid content.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は不正な内容を含んでいます。</translation> </message> <message> <source>Element %1 is declared as abstract.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は抽象型として宣言されています。</translation> </message> <message> <source>Element %1 is not nillable.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は null を許可していません。</translation> </message> <message> <source>Attribute %1 contains invalid data: %2</source> - <translation type="unfinished"></translation> + <translation>属性 %1 は不正なデータを含んでいます: %2</translation> </message> <message> <source>Element contains content although it is nillable.</source> - <translation type="unfinished"></translation> + <translation>要素は null が許容されていますが内容を含んでいます。</translation> </message> <message> <source>Fixed value constraint not allowed if element is nillable.</source> - <translation type="unfinished"></translation> + <translation>null が許容されている要素への固定値制約は許容されていません。</translation> </message> <message> <source>Specified type %1 is not validly substitutable with element type %2.</source> - <translation type="unfinished"></translation> + <translation>指定された型 %1 は有効に置換できる要素型 %2 ではありません。</translation> </message> <message> <source>Complex type %1 is not allowed to be abstract.</source> - <translation type="unfinished"></translation> + <translation>複合型 %1 を抽象化する事は許可されていません。</translation> </message> <message> <source>Element %1 contains not allowed attributes.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は属性を含む事を許可されていません。</translation> </message> <message> <source>Element %1 contains not allowed child element.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は子要素を含む事を許可されていません。</translation> </message> <message> <source>Content of element %1 does not match its type definition: %2.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 の内容が自身の型の定義とマッチしていません: %2。</translation> </message> <message> <source>Content of element %1 does not match defined value constraint.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 の内容が定義されている値制約にマッチしていません。</translation> </message> <message> <source>Element %1 contains not allowed child content.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は子の内容を含む事を許可されていません。</translation> </message> <message> <source>Element %1 contains not allowed text content.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 はテキストを含む事を許可されていません。</translation> </message> <message> <source>Element %1 cannot contain other elements, as it has a fixed content.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は固定値を持った他の要素を含む事はできません。</translation> </message> <message> <source>Element %1 is missing required attribute %2.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 に要求された属性 %2 がありません。</translation> </message> <message> <source>Attribute %1 does not match the attribute wildcard.</source> - <translation type="unfinished"></translation> + <translation>属性 %1 は属性ワイルドカードにマッチしていません。</translation> </message> <message> <source>Declaration for attribute %1 does not exist.</source> - <translation type="unfinished"></translation> + <translation>属性 %1 の宣言が存在していません。</translation> </message> <message> <source>Element %1 contains two attributes of type %2.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 が型 %2 の属性を2個含んでいます。</translation> </message> <message> <source>Attribute %1 contains invalid content.</source> - <translation type="unfinished"></translation> + <translation>属性 %1 は不正な内容を含んでいます。</translation> </message> <message> <source>Element %1 contains unknown attribute %2.</source> - <translation type="unfinished"></translation> + <translation>要素 %1 は未知の属性 %2 を含んでいます。</translation> </message> <message> <source>Content of attribute %1 does not match its type definition: %2.</source> - <translation type="unfinished"></translation> + <translation>属性 %1 の内容が自身の型の定義にマッチしていません: %2。</translation> </message> <message> <source>Content of attribute %1 does not match defined value constraint.</source> - <translation type="unfinished"></translation> + <translation>属性 %1 の内容が値制約の定義にマッチしていません。</translation> </message> <message> <source>Non-unique value found for constraint %1.</source> - <translation type="unfinished"></translation> + <translation>制約 %1 に一意ではない値が見つかりました。</translation> </message> <message> <source>Key constraint %1 contains absent fields.</source> - <translation type="unfinished"></translation> + <translation>キー制約 %1 は欠落したフィールドを含んでいます。</translation> </message> <message> <source>Key constraint %1 contains references nillable element %2.</source> - <translation type="unfinished"></translation> + <translation>キー制約 %1 は null を許容する要素 %2 の参照を含んでいます。</translation> </message> <message> <source>No referenced value found for key reference %1.</source> - <translation type="unfinished"></translation> + <translation>キー参照 %1 によって参照される値が見つかりません。</translation> </message> <message> <source>More than one value found for field %1.</source> - <translation type="unfinished"></translation> + <translation>フィールド %1 に2個以上の値があります。</translation> </message> <message> <source>Field %1 has no simple type.</source> - <translation type="unfinished"></translation> + <translation>フィールド %1 が単純型を持っていません。</translation> </message> <message> <source>ID value '%1' is not unique.</source> - <translation type="unfinished"></translation> + <translation>ID 値 '%1' が一意ではありません。</translation> </message> <message> <source>'%1' attribute contains invalid QName content: %2.</source> - <translation type="unfinished"></translation> + <translation>'%1' 属性は不正な QName の内容を含んでいます: %2。</translation> </message> <message> <source>empty</source> diff --git a/translations/qtconfig_ja.ts b/translations/qtconfig_ja.ts index e92a7d1..2c3c248 100644 --- a/translations/qtconfig_ja.ts +++ b/translations/qtconfig_ja.ts @@ -4,151 +4,114 @@ <context> <name>MainWindow</name> <message> - <location filename="../tools/qtconfig/mainwindow.cpp" line="+204"/> <source>Desktop Settings (Default)</source> <translation>デスクトップの設定(デフォルト)</translation> </message> <message> - <location line="+5"/> <source>Choose style and palette based on your desktop settings.</source> <translation>デスクトップの設定に応じてスタイルとパレットを選択します。</translation> </message> <message> - <location line="+144"/> <source>On The Spot</source> <translation>On The Spot</translation> </message> <message> - <location line="+33"/> - <location line="+1"/> - <location line="+40"/> - <location line="+1"/> <source>Auto (default)</source> <translation>自動(デフォルト)</translation> </message> <message> - <location line="-40"/> <source>Choose audio output automatically.</source> <translation>オーディオ出力を自動的に選択します。</translation> </message> <message> - <location line="+1"/> - <location line="+1"/> <source>aRts</source> <translation>aRts</translation> </message> <message> - <location line="+1"/> <source>Experimental aRts support for GStreamer.</source> <translation>Gstreamer での aRts のサポート(Experimental)。</translation> </message> <message> - <location line="+33"/> <source>Phonon GStreamer backend not available.</source> <translation>Phonon の GStreamer バックエンドが見つかりません。</translation> </message> <message> - <location line="+4"/> <source>Choose render method automatically</source> <translation>描画メソッドを自動的に選択します</translation> </message> <message> - <location line="+2"/> - <location line="+1"/> <source>X11</source> <translation>X11</translation> </message> <message> - <location line="+0"/> <source>Use X11 Overlays</source> <translation>X11 のオーバーレイを使用</translation> </message> <message> - <location line="+3"/> - <location line="+1"/> <source>OpenGL</source> <translation>OpenGL</translation> </message> <message> - <location line="+0"/> <source>Use OpenGL if available</source> <translation>OpenGL が使用可能な場合は使用</translation> </message> <message> - <location line="+2"/> - <location line="+1"/> <source>Software</source> <translation>ソフトウェア</translation> </message> <message> - <location line="+0"/> <source>Use simple software rendering</source> <translation>ソフトウェアでの描画を使用</translation> </message> <message> - <location line="+27"/> <source>No changes to be saved.</source> <translation>内容が変更されていません。</translation> </message> <message> - <location line="+4"/> <source>Saving changes...</source> <translation>保存中…</translation> </message> <message> - <location line="+48"/> <source>Over The Spot</source> <translation>Over The Spot</translation> </message> <message> - <location line="+2"/> <source>Off The Spot</source> <translation>Off The Spot</translation> </message> <message> - <location line="+2"/> <source>Root</source> <translation>Root</translation> </message> <message> - <location line="+466"/> <source>Select a Directory</source> <translation>ディレクトリの選択</translation> </message> <message> - <location line="+17"/> <source><h3>%1</h3><br/>Version %2<br/><br/>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</source> <translation><h3>%1</h3><br/>バージョン %2<br/><br/>Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).</translation> </message> <message> - <location line="+3"/> - <location line="+1"/> - <location line="+8"/> <source>Qt Configuration</source> <translation>Qt 設定ツール</translation> </message> <message> - <location line="+22"/> <source>Save Changes</source> <translation>変更の保存</translation> </message> <message> - <location line="+1"/> <source>Save changes to settings?</source> <translation>変更内容を設定に保存しますか?</translation> </message> <message> - <location line="+1"/> <source>&Yes</source> <translation>はい(&Y)</translation> </message> <message> - <location line="+0"/> <source>&No</source> <translation>いいえ(&N)</translation> </message> <message> - <location line="+0"/> <source>&Cancel</source> <translation>キャンセル(&C)</translation> </message> @@ -156,363 +119,278 @@ <context> <name>MainWindowBase</name> <message> - <location filename="../tools/qtconfig/mainwindowbase.ui" line="+54"/> <source>Qt Configuration</source> <translation>Qt 設定ツール</translation> </message> <message> - <location line="+35"/> <source>Appearance</source> <translation>外観</translation> </message> <message> - <location line="+18"/> <source>GUI Style</source> <translation>GUI スタイル</translation> </message> <message> - <location line="+18"/> <source>Select GUI &Style:</source> <translation>GUI スタイルの選択(&S):</translation> </message> <message> - <location line="+22"/> <source>Preview</source> <translation>プレビュー</translation> </message> <message> - <location line="+6"/> <source>Select &Palette:</source> <translation>パレットの選択(&P):</translation> </message> <message> - <location line="+11"/> <source>Active Palette</source> <translation>アクティブなパレット</translation> </message> <message> - <location line="+5"/> <source>Inactive Palette</source> <translation>アクティブではないパレット</translation> </message> <message> - <location line="+5"/> <source>Disabled Palette</source> <translation>無効時のパレット</translation> </message> <message> - <location line="+39"/> <source>Build Palette</source> <translation>パレットの設定</translation> </message> <message> - <location line="+12"/> <source>&3-D Effects:</source> <translation>&3D エフェクト:</translation> </message> <message> - <location line="+31"/> <source>Window Back&ground:</source> <translation>ウィンドウのバックグラウンド(&G):</translation> </message> <message> - <location line="+35"/> <source>&Tune Palette...</source> <translation>パレットを調整(&T)...</translation> </message> <message> - <location line="+10"/> <source>Please use the KDE Control Center to set the palette.</source> <translation>KDE のコントロールセンターでパレットの設定をしてください。</translation> </message> <message> - <location line="+11"/> <source>Fonts</source> <translation>フォント</translation> </message> <message> - <location line="+6"/> <source>Default Font</source> <translation>デフォルトのフォント</translation> </message> <message> - <location line="+45"/> <source>&Style:</source> <translation>スタイル(&S):</translation> </message> <message> - <location line="+10"/> <source>&Point Size:</source> <translation>ポイントサイズ(&P):</translation> </message> <message> - <location line="+10"/> <source>F&amily:</source> <translation>ファミリー(&F):</translation> </message> <message> - <location line="+10"/> <source>Sample Text</source> <translation>テキストのサンプル</translation> </message> <message> - <location line="+13"/> <source>Font Substitution</source> <translation>フォントの置換</translation> </message> <message> - <location line="+20"/> <source>S&elect or Enter a Family:</source> <translation>ファミリーを選択するか入力してください(&E):</translation> </message> <message> - <location line="+38"/> <source>Current Substitutions:</source> <translation>現在の置換定義:</translation> </message> <message> - <location line="+18"/> - <location line="+501"/> <source>Up</source> <translation>上へ</translation> </message> <message> - <location line="-494"/> - <location line="+508"/> <source>Down</source> <translation>下へ</translation> </message> <message> - <location line="-501"/> - <location line="+494"/> <source>Remove</source> <translation>削除</translation> </message> <message> - <location line="-464"/> <source>Select s&ubstitute Family:</source> <translation>置換するファミリーの選択(&U):</translation> </message> <message> - <location line="+20"/> - <location line="+487"/> <source>Add</source> <translation>追加</translation> </message> <message> - <location line="-474"/> <source>Interface</source> <translation>インターフェース</translation> </message> <message> - <location line="+6"/> <source>Feel Settings</source> <translation>一般的な設定</translation> </message> <message> - <location line="+12"/> - <location line="+26"/> <source> ms</source> <translation>ミリ秒</translation> </message> <message> - <location line="-13"/> <source>&Double Click Interval:</source> <translation>ダブルクリックの間隔(&D):</translation> </message> <message> - <location line="+10"/> <source>No blinking</source> <translation>点滅しない</translation> </message> <message> - <location line="+16"/> <source>&Cursor Flash Time:</source> <translation>カーソルの点滅の間隔(&C):</translation> </message> <message> - <location line="+10"/> <source> lines</source> <translation>行</translation> </message> <message> - <location line="+13"/> <source>Wheel &Scroll Lines:</source> <translation>マウスホイールでのスクロール行数(&S):</translation> </message> <message> - <location line="+10"/> <source>Resolve symlinks in URLs</source> <translation>URL のシンボリックリンクの解決</translation> </message> <message> - <location line="+10"/> <source>GUI Effects</source> <translation>GUI のエフェクト</translation> </message> <message> - <location line="+12"/> <source>&Enable</source> <translation>有効(&E)</translation> </message> <message> - <location line="+3"/> <source>Alt+E</source> <translation>Alt+E</translation> </message> <message> - <location line="+22"/> <source>&Menu Effect:</source> <translation>メニューのエフェクト(&E):</translation> </message> <message> - <location line="+10"/> <source>C&omboBox Effect:</source> <translation>コンボボックスのエフェクト(&O):</translation> </message> <message> - <location line="+10"/> <source>&ToolTip Effect:</source> <translation>ツールチップのエフェクト(&T):</translation> </message> <message> - <location line="+10"/> <source>Tool&Box Effect:</source> <translation>ツールボックスのエフェクト(&B):</translation> </message> <message> - <location line="+17"/> - <location line="+19"/> - <location line="+14"/> - <location line="+19"/> <source>Disable</source> <translation>無効</translation> </message> <message> - <location line="-47"/> - <location line="+19"/> - <location line="+14"/> - <location line="+19"/> <source>Animate</source> <translation>アニメーション</translation> </message> <message> - <location line="-47"/> - <location line="+33"/> <source>Fade</source> <translation>フェード</translation> </message> <message> - <location line="+28"/> <source>Global Strut</source> <translation>Global Strut</translation> </message> <message> - <location line="+12"/> <source>Minimum &Width:</source> <translation>幅の最小値(&W):</translation> </message> <message> - <location line="+10"/> <source>Minimum Hei&ght:</source> <translation>高さの最小値(&G):</translation> </message> <message> - <location line="+10"/> - <location line="+10"/> <source> pixels</source> <translation>ピクセル</translation> </message> <message> - <location line="+13"/> <source>Enhanced support for languages written right-to-left</source> <translation>右から左に書かれる言語のサポートの強化</translation> </message> <message> - <location line="+7"/> <source>XIM Input Style:</source> <translation>XIM のインプットスタイル:</translation> </message> <message> - <location line="+11"/> <source>On The Spot</source> <translation>On The Spot</translation> </message> <message> - <location line="+5"/> <source>Over The Spot</source> <translation>Over The Spot</translation> </message> <message> - <location line="+5"/> <source>Off The Spot</source> <translation>Off The Spot</translation> </message> <message> - <location line="+5"/> <source>Root</source> <translation>Root</translation> </message> <message> - <location line="+8"/> <source>Default Input Method:</source> <translation>デフォルトのインプットメソッド:</translation> </message> <message> - <location line="+31"/> <source>Printer</source> <translation>プリンタ</translation> </message> <message> - <location line="+6"/> <source>Enable Font embedding</source> <translation>フォントを埋め込む</translation> </message> <message> - <location line="+16"/> <source>Font Paths</source> <translation>フォントのパス</translation> </message> <message> - <location line="+77"/> <source>Browse...</source> <translation>ブラウズ...</translation> </message> <message> - <location line="+7"/> <source>Press the <b>Browse</b> button or enter a directory and press Enter to add them to the list.</source> <translation><b>ブラウズ</b>ボタンを押すかディレクトリを入力し、エンターキーか追加ボタンでリストに追加してください。</translation> </message> <message> - <location line="+16"/> <source>Phonon</source> <translation>Phonon</translation> </message> <message> - <location line="+6"/> <source>About Phonon</source> <translation>Phonon について</translation> </message> <message> - <location line="+6"/> - <location line="+44"/> <source>Current Version:</source> <translation>現在のバージョン:</translation> </message> <message> - <location line="-37"/> - <location line="+44"/> <source>Not available</source> <translation>使用不可能</translation> </message> <message> - <location line="-37"/> - <location line="+44"/> <source>Website:</source> <translation>ウェブサイト:</translation> </message> <message> - <location line="-37"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -525,12 +403,10 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://phonon.kde.org"><span style=" text-decoration: underline; color:#0000ff;">http://phonon.kde.org</span></a></p></body></html></translation> </message> <message> - <location line="+17"/> <source>About GStreamer</source> <translation>GStreamer について</translation> </message> <message> - <location line="+27"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -543,22 +419,18 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://gstreamer.freedesktop.org/"><span style=" text-decoration: underline; color:#0000ff;">http://gstreamer.freedesktop.org/</span></a></p></body></html></translation> </message> <message> - <location line="+17"/> <source>GStreamer backend settings</source> <translation>GStreamer のバックエンドの設定</translation> </message> <message> - <location line="+6"/> <source>Preferred audio sink:</source> <translation>優先するオーディオシンク:</translation> </message> <message> - <location line="+13"/> <source>Preferred render method:</source> <translation>優先する描画方法:</translation> </message> <message> - <location line="+13"/> <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -571,57 +443,46 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">注: これらの設定の変更によりアプリケーションが正常に起動しなくなる場合があります。</span></p></body></html></translation> </message> <message> - <location line="+68"/> <source>&File</source> <translation>ファイル(&F)</translation> </message> <message> - <location line="+19"/> <source>&Help</source> <translation>ヘルプ(&H)</translation> </message> <message> - <location line="+14"/> <source>&Save</source> <translation>保存(&S)</translation> </message> <message> - <location line="+3"/> <source>Save</source> <translation>保存</translation> </message> <message> - <location line="+3"/> <source>Ctrl+S</source> <translation>Ctrl+S</translation> </message> <message> - <location line="+5"/> <source>E&xit</source> <translation>終了(&X)</translation> </message> <message> - <location line="+3"/> <source>Exit</source> <translation>終了</translation> </message> <message> - <location line="+8"/> <source>&About</source> <translation>Qt 設定ツールについて(&A)</translation> </message> <message> - <location line="+3"/> <source>About</source> <translation>Qt 設定ツールについて</translation> </message> <message> - <location line="+8"/> <source>About &Qt</source> <translation>&Qt について</translation> </message> <message> - <location line="+3"/> <source>About Qt</source> <translation>Qt について</translation> </message> @@ -629,208 +490,166 @@ p, li { white-space: pre-wrap; } <context> <name>PaletteEditorAdvancedBase</name> <message> - <location filename="../tools/qtconfig/paletteeditoradvancedbase.ui" line="+61"/> <source>Tune Palette</source> <translation>パレットの調整</translation> </message> <message> - <location line="+6"/> <source><b>Edit Palette</b><p>Change the palette of the current widget or form.</p><p>Use a generated palette or select colors for each color group and each color role.</p><p>The palette can be tested with different widget layouts in the preview section.</p></source> <translation><b>パレットの編集</b><p>現在のウィジェットやフォームのパレットを変更してください。</p><p>自動生成されたパレットを使用するか、それぞれのグループ/役割に対して色を選択してください。</p><p>パレットの内容のプレビューセクションにある様々なウィジェットのレイアウトで確認できます。</p></translation> </message> <message> - <location line="+29"/> <source>Select &Palette:</source> <translation>パレットの選択(&P):</translation> </message> <message> - <location line="+14"/> <source>Active Palette</source> <translation>アクティブなパレット</translation> </message> <message> - <location line="+5"/> <source>Inactive Palette</source> <translation>アクティブではないパレット</translation> </message> <message> - <location line="+5"/> <source>Disabled Palette</source> <translation>無効時のパレット</translation> </message> <message> - <location line="+21"/> <source>Auto</source> <translation>自動</translation> </message> <message> - <location line="+18"/> <source>Build inactive palette from active</source> <translation>アクティブなパレットからアクティブではないパレットを構築</translation> </message> <message> - <location line="+13"/> <source>Build disabled palette from active</source> <translation>アクティブなパレットから無効時のパレットを構築</translation> </message> <message> - <location line="+16"/> <source>Central color &roles</source> <translation>中央部の色の役割(&R)</translation> </message> <message> - <location line="+18"/> <source>Choose central color role</source> <translation>中央部の色の役割を選択してください</translation> </message> <message> - <location line="+3"/> <source><b>Select a color role.</b><p>Available central roles are: <ul> <li>Window - general background color.</li> <li>WindowText - general foreground color. </li> <li>Base - used as background color for e.g. text entry widgets, usually white or another light color. </li> <li>Text - the foreground color used with Base. Usually this is the same as WindowText, in what case it must provide good contrast both with Window and Base. </li> <li>Button - general button background color, where buttons need a background different from Window, as in the Macintosh style. </li> <li>ButtonText - a foreground color used with the Button color. </li> <li>Highlight - a color to indicate a selected or highlighted item. </li> <li>HighlightedText - a text color that contrasts to Highlight. </li> <li>BrightText - a text color that is very different from WindowText and contrasts well with e.g. black. </li> </ul> </p></source> <translation><b>色の役割の選択。</b><p>選択可能な中央部の役割: <ul> <li>ウィンドウ - 一般的な背景色。</li> <li>ウィンドウテキスト - 一般的な前景色。 </li> <li>ベース - テキスト入力ウィジェット等の背景色。通常は白などの明るい色。 </li> <li>テキスト - ベースと共に用いられる前景色。通常はウィンドウテキストと同じだが、ウィンドウとベースに対してよりよいコントラストが必要な場合に使用される。 </li> <li>ボタン - 一般的なボタンの背景色。Macintosh スタイルのようにウィンドウと異なる背景色を使用する場合に使用される。 </li> <li>ボタンテキスト - ボタンと共に用いられる前景色 </li> <li>ハイライト - アイテムが選択されていたり、ハイライトされていることを示すために使用される色。 </li> <li>ハイライトのテキスト - ハイライト時のテキストの色。 </li> <li>明るいテキスト - 黒などの背景色に対して使用されるテキストの色。ウィンドウテキストの反対の色。 </li> </ul> </p></translation> </message> <message> - <location line="+4"/> <source>Window</source> <translation>ウィンドウ</translation> </message> <message> - <location line="+5"/> <source>WindowText</source> <translation>ウィンドウテキスト</translation> </message> <message> - <location line="+5"/> <source>Button</source> <translation>ボタン</translation> </message> <message> - <location line="+5"/> <source>Base</source> <translation>ベース</translation> </message> <message> - <location line="+5"/> <source>Text</source> <translation>テキスト</translation> </message> <message> - <location line="+5"/> <source>BrightText</source> <translation>明るいテキスト</translation> </message> <message> - <location line="+5"/> <source>ButtonText</source> <translation>ボタンテキスト</translation> </message> <message> - <location line="+5"/> <source>Highlight</source> <translation>ハイライト</translation> </message> <message> - <location line="+5"/> <source>HighlightedText</source> <translation>ハイライトのテキスト</translation> </message> <message> - <location line="+52"/> <source>&Select Color:</source> <translation>色の選択(&S):</translation> </message> <message> - <location line="+24"/> - <location line="+171"/> <source>Choose a color</source> <translation>色を選択してください</translation> </message> <message> - <location line="-168"/> <source>Choose a color for the selected central color role.</source> <translation>選択された中央部の色の役割に使用する色を選択してください。</translation> </message> <message> - <location line="+15"/> <source>3-D shadow &effects</source> <translation>3Dの影の効果(&E)</translation> </message> <message> - <location line="+29"/> <source>Build &from button color</source> <translation>ボタンの色から構築する(&F)</translation> </message> <message> - <location line="+6"/> <source>Generate shadings</source> <translation>影を生成する</translation> </message> <message> - <location line="+3"/> <source>Check to let 3D-effect colors be calculated from button-color.</source> <translation>3D効果の色をボタンの色から計算するにはチェックしてください。</translation> </message> <message> - <location line="+10"/> <source>Choose 3D-effect color role</source> <translation>3D効果の色の役割の選択</translation> </message> <message> - <location line="+3"/> <source><b>Select a color role.</b><p>Available effect roles are: <ul> <li>Light - lighter than Button color. </li> <li>Midlight - between Button and Light. </li> <li>Mid - between Button and Dark. </li> <li>Dark - darker than Button. </li> <li>Shadow - a very dark color. </li> </ul></source> <translation><b>色の役割の選択。</b><p>選択可能な中央部の役割: <ul> <li>ライト - ボタンの色より明るい。 </li> <li>ミッドライト - ボタンとライトの間。 </li> <li>ミッド - ボタンとダークの間。 </li> <li>ダーク - ボタンより暗い。 </li> <li>シャドウ - とても暗い色。 </li> </ul></translation> </message> <message> - <location line="+4"/> <source>Light</source> <translation>ライト</translation> </message> <message> - <location line="+5"/> <source>Midlight</source> <translation>ミッドライト</translation> </message> <message> - <location line="+5"/> <source>Mid</source> <translation>ミッド</translation> </message> <message> - <location line="+5"/> <source>Dark</source> <translation>ダーク</translation> </message> <message> - <location line="+5"/> <source>Shadow</source> <translation>シャドウ</translation> </message> <message> - <location line="+54"/> <source>Select Co&lor:</source> <translation>色の選択(&L):</translation> </message> <message> - <location line="+27"/> <source>Choose a color for the selected effect color role.</source> <translation>選択の効果の色の役割に使用する色を選択してください。</translation> </message> <message> - <location line="+42"/> <source>OK</source> <translation>OK</translation> </message> <message> - <location line="+9"/> <source>Close dialog and apply all changes.</source> <translation>全ての変更を適用してダイアログを閉じる。</translation> </message> <message> - <location line="+10"/> <source>Cancel</source> <translation>キャンセル</translation> </message> <message> - <location line="+6"/> <source>Close dialog and discard all changes.</source> <translation>全ての変更を破棄してダイアログを閉じる。</translation> </message> @@ -838,7 +657,6 @@ p, li { white-space: pre-wrap; } <context> <name>PreviewFrame</name> <message> - <location filename="../tools/qtconfig/previewframe.cpp" line="+81"/> <source>Desktop settings will only take effect after an application restart.</source> <translation>デスクトップの設定はアプリケーションの再起動後に反映されます。</translation> </message> @@ -846,62 +664,50 @@ p, li { white-space: pre-wrap; } <context> <name>PreviewWidgetBase</name> <message> - <location filename="../tools/qtconfig/previewwidgetbase.ui" line="+66"/> <source>Preview Window</source> <translation>プレビューウィンドウ</translation> </message> <message> - <location line="+40"/> <source>ButtonGroup</source> <translation>ボタングループ</translation> </message> <message> - <location line="+18"/> <source>RadioButton1</source> <translation>ラジオボタン1</translation> </message> <message> - <location line="+13"/> <source>RadioButton2</source> <translation>ラジオボタン2</translation> </message> <message> - <location line="+10"/> <source>RadioButton3</source> <translation>ラジオボタン3</translation> </message> <message> - <location line="+13"/> <source>ButtonGroup2</source> <translation>ボタングループ2</translation> </message> <message> - <location line="+18"/> <source>CheckBox1</source> <translation>チェックボックス1</translation> </message> <message> - <location line="+13"/> <source>CheckBox2</source> <translation>チェックボックス2</translation> </message> <message> - <location line="+36"/> <source>LineEdit</source> <translation>ラインエディタ</translation> </message> <message> - <location line="+11"/> <source>ComboBox</source> <translation>コンボボックス</translation> </message> <message> - <location line="+29"/> <source>PushButton</source> <translation>プッシュボタン</translation> </message> <message> - <location line="+41"/> <source><p> <a href="http://qt.nokia.com">http://qt.nokia.com</a> </p> diff --git a/translations/qvfb_ja.ts b/translations/qvfb_ja.ts index cdf95c1..5dcfbc4 100644 --- a/translations/qvfb_ja.ts +++ b/translations/qvfb_ja.ts @@ -4,71 +4,54 @@ <context> <name>AnimationSaveWidget</name> <message> - <location filename="../tools/qvfb/qvfb.cpp" line="+868"/> - <location line="+204"/> <source>Record</source> <translation>録画</translation> </message> <message> - <location line="-202"/> <source>Reset</source> <translation>リセット</translation> </message> <message> - <location line="+2"/> <source>Save</source> <translation>保存</translation> </message> <message> - <location line="+18"/> <source>Save in MPEG format (requires netpbm package installed)</source> <translation>MPEG形式で保存(netpbmパッケージのインストールが必要)</translation> </message> <message> - <location line="+8"/> - <location line="+206"/> <source>Click record to begin recording.</source> <translation>録画を開始するには「録画」をクリックしてください。</translation> </message> <message> - <location line="-115"/> - <location line="+147"/> <source>Finished saving.</source> <translation>保存が完了しました。</translation> </message> <message> - <location line="-63"/> <source>Paused. Click record to resume, or save if done.</source> <translation>一時停止中。「録画」をクリック再開するか、保存をしてください。</translation> </message> <message> - <location line="+6"/> <source>Pause</source> <translation>一時停止</translation> </message> <message> - <location line="+1"/> <source>Recording...</source> <translation>録画中...</translation> </message> <message> - <location line="+40"/> <source>Saving... </source> <translation>保存中...</translation> </message> <message> - <location line="+4"/> - <location line="+4"/> <source>Save animation...</source> <translation>動画を保存中...</translation> </message> <message> - <location line="+2"/> <source>Save canceled.</source> <translation>保存がキャンセルされました。</translation> </message> <message> - <location line="+9"/> <source>Save failed!</source> <translation>保存に失敗しました!</translation> </message> @@ -76,195 +59,154 @@ <context> <name>Config</name> <message> - <location filename="../tools/qvfb/config.ui" line="+54"/> <source>Configure</source> <translation>設定</translation> </message> <message> - <location line="+29"/> <source>Size</source> <translation>サイズ</translation> </message> <message> - <location line="+12"/> <source>176x220 "SmartPhone"</source> <translation>176x220 "スマートフォン"</translation> </message> <message> - <location line="+7"/> <source>240x320 "PDA"</source> <translation>240x320 "PDA"</translation> </message> <message> - <location line="+7"/> <source>320x240 "TV" / "QVGA"</source> <translation>320x240 "TV" / "QVGA"</translation> </message> <message> - <location line="+7"/> <source>640x480 "VGA"</source> <translation>640x480 "VGA"</translation> </message> <message> - <location line="+7"/> <source>800x480</source> <translation>800x480</translation> </message> <message> - <location line="+7"/> <source>800x600</source> <translation>800x600</translation> </message> <message> - <location line="+7"/> <source>1024x768</source> <translation>1024x768</translation> </message> <message> - <location line="+21"/> <source>Custom</source> <translation>それ以外</translation> </message> <message> - <location line="+44"/> <source>Depth</source> <translation>色深度</translation> </message> <message> - <location line="+6"/> <source>1 bit monochrome</source> <translation>1 bit モノクロ</translation> </message> <message> - <location line="+7"/> <source>2 bit grayscale</source> <translation>2 bit グレイスケール</translation> </message> <message> - <location line="+7"/> <source>4 bit grayscale</source> <translation>4 bit グレイスケール</translation> </message> <message> - <location line="+7"/> <source>8 bit</source> <translation>8 bit</translation> </message> <message> - <location line="+7"/> <source>12 (16) bit</source> <translation>12(16) bit</translation> </message> <message> - <location line="+7"/> <source>15 bit</source> <translation>15 bit</translation> </message> <message> - <location line="+7"/> <source>16 bit</source> <translation>16 bit</translation> </message> <message> - <location line="+7"/> <source>18 bit</source> <translation>18 bit</translation> </message> <message> - <location line="+7"/> <source>24 bit</source> <translation>24 bit</translation> </message> <message> - <location line="+7"/> <source>32 bit</source> <translation>32 bit</translation> </message> <message> - <location line="+7"/> <source>32 bit ARGB</source> <translation>32 bit ARGB</translation> </message> <message> - <location line="+7"/> <source>Swap red and blue channels</source> <translation>赤と青のチャンネルを入れ替える</translation> </message> <message> - <location line="+3"/> <source>BGR format</source> <translation>BGR フォーマット</translation> </message> <message> - <location line="+20"/> <source>Skin</source> <translation>スキン</translation> </message> <message> - <location line="+14"/> <source>None</source> <translation>なし</translation> </message> <message> - <location line="+10"/> <source>Emulate touch screen (no mouse move)</source> <translation>タッチスクリーンのエミュレート(マウスムーブが無効になります)</translation> </message> <message> - <location line="+7"/> <source>Emulate LCD screen (Only with fixed zoom of 3.0 times magnification)</source> <translation>LCDスクリーンのエミュレート(3倍固定の拡大ズーム)</translation> </message> <message> - <location line="+26"/> <source><p>Note that any applications using the virtual framebuffer will be terminated if you change the Size or Depth <i>above</i>. You may freely modify the Gamma <i>below</i>.</source> <translation><p><i>以上の</i>サイズや色深度を変更した場合、ヴァーチャルフレームバッファ上で動作しているアプリケーションは終了します。<i>以下の</i>ガンマ値の変更の場合はアプリケーションは終了しません。</translation> </message> <message> - <location line="+10"/> <source>Gamma</source> <translation>ガンマ</translation> </message> <message> - <location line="+12"/> <source>Blue</source> <translation>青</translation> </message> <message> - <location line="+489"/> - <location line="+496"/> - <location line="+14"/> - <location line="+496"/> <source>1.0</source> <translation>1.0</translation> </message> <message> - <location line="-999"/> <source>Green</source> <translation>緑</translation> </message> <message> - <location line="+496"/> <source>All</source> <translation>全て</translation> </message> <message> - <location line="+496"/> <source>Red</source> <translation>赤</translation> </message> <message> - <location line="+496"/> <source>Set all to 1.0</source> <translation>全て1.0にする</translation> </message> <message> - <location line="+34"/> <source>&OK</source> <translation>&OK</translation> </message> <message> - <location line="+13"/> <source>&Cancel</source> <translation>キャンセル(&C)</translation> </message> @@ -272,57 +214,46 @@ <context> <name>DeviceSkin</name> <message> - <location filename="../tools/shared/deviceskin/deviceskin.cpp" line="+79"/> <source>The image file '%1' could not be loaded.</source> <translation>画像ファイル "%1" を読み込めません。</translation> </message> <message> - <location line="+64"/> <source>The skin directory '%1' does not contain a configuration file.</source> <translation>スキンのディレクトリ "%1" に設定ファイルがありません。</translation> </message> <message> - <location line="+5"/> <source>The skin configuration file '%1' could not be opened.</source> <translation>スキンの設定ファイル "%1" が開けません。</translation> </message> <message> - <location line="+6"/> <source>The skin configuration file '%1' could not be read: %2</source> <translation>スキンの設定ファイル "%1" が読み込めません: %2</translation> </message> <message> - <location line="+70"/> <source>Syntax error: %1</source> <translation>シンタックスエラー: %1</translation> </message> <message> - <location line="+21"/> <source>The skin "up" image file '%1' does not exist.</source> <translation>スキンの "up" の画像ファイル "%1" がありません。</translation> </message> <message> - <location line="+10"/> <source>The skin "down" image file '%1' does not exist.</source> <translation>スキンの "down" の画像ファイル "%1" がありません。</translation> </message> <message> - <location line="+11"/> <source>The skin "closed" image file '%1' does not exist.</source> <translation>スキンの "closed" の画像ファイル "%1" がありません。</translation> </message> <message> - <location line="+12"/> <source>The skin cursor image file '%1' does not exist.</source> <translation>スキンのカーソルの画像ファイル "%1" がありません。</translation> </message> <message> - <location line="+25"/> <source>Syntax error in area definition: %1</source> <translation>エリア定義のシンタックスエラー: %1</translation> </message> <message> - <location line="+38"/> <source>Mismatch in number of areas, expected %1, got %2.</source> <translation>エリア数が正しくありません。%2 となってありますが %1 であるべきです。</translation> </message> @@ -330,170 +261,134 @@ <context> <name>QVFb</name> <message> - <location filename="../tools/qvfb/qvfb.cpp" line="-735"/> <source>&Save image...</source> <translation>画像の保存(&S)...</translation> </message> <message> - <location line="+1"/> <source>&Animation...</source> <translation>動画の保存(&A)...</translation> </message> <message> - <location line="+2"/> <source>&Quit</source> <translation>終了(&Q)</translation> </message> <message> - <location line="+7"/> <source>Show &Cursor</source> <translation>カーソルの表示(&C)</translation> </message> <message> - <location line="+5"/> <source>&Refresh Rate...</source> <translation>リフレッシュレート(&R)...</translation> </message> <message> - <location line="+7"/> <source>Zoom scale &0.5</source> <translation>ズームスケール &0.5</translation> </message> <message> - <location line="+2"/> <source>Zoom scale &1</source> <translation>ズームスケール &1</translation> </message> <message> - <location line="+1"/> <source>Zoom scale &2</source> <translation>ズームスケール &2</translation> </message> <message> - <location line="+1"/> <source>Zoom scale &3</source> <translation>ズームスケール &3</translation> </message> <message> - <location line="+1"/> <source>Zoom scale &4</source> <translation>ズームスケール &4</translation> </message> <message> - <location line="-30"/> <source>&File</source> <translation>ファイル(&F)</translation> </message> <message> - <location line="+1"/> <source>&Configure...</source> <translation>設定の変更(&C)...</translation> </message> <message> - <location line="+11"/> <source>&View</source> <translation>表示(&V)</translation> </message> <message> - <location line="+8"/> <source>&No rotation</source> <translation>ローテーションなし(&N)</translation> </message> <message> - <location line="+1"/> <source>&90° rotation</source> <translation>&90° ローテーション</translation> </message> <message> - <location line="+1"/> <source>1&80° rotation</source> <translation>1&80° ローテーション</translation> </message> <message> - <location line="+1"/> <source>2&70° rotation</source> <translation>2&70° ローテーション</translation> </message> <message> - <location line="+3"/> <source>Zoom scale 0.7&5</source> <translation>ズームスケール 0.7&5</translation> </message> <message> - <location line="+6"/> <source>Zoom &scale...</source> <translation>ズームスケール(&S)...</translation> </message> <message> - <location line="+7"/> <source>&Help</source> <translation>ヘルプ(&H)</translation> </message> <message> - <location line="+1"/> <source>&About...</source> <translation>QVFB について(&A)...</translation> </message> <message> - <location line="+87"/> <source>Save Main Screen image</source> <translation>メインスクリーンの画像の保存</translation> </message> <message> - <location line="+0"/> - <location line="+7"/> <source>snapshot.png</source> <translation>スナップショット.png</translation> </message> <message> - <location line="-7"/> - <location line="+7"/> <source>Portable Network Graphics (*.png)</source> <translation></translation> </message> <message> - <location line="-4"/> <source>Save Main Screen Image</source> <translation>メインスクリーンの画像の保存</translation> </message> <message> - <location line="+0"/> - <location line="+7"/> <source>Save failed. Check that you have permission to write to the target directory.</source> <translation>保存に失敗しました。保存先のディレクトリn書き込み権限があるかを確認してください。</translation> </message> <message> - <location line="-3"/> <source>Save Second Screen image</source> <translation>サブスクリーンの画像の保存</translation> </message> <message> - <location line="+3"/> <source>Save Second Screen Image</source> <translation>サブスクリーンの画像の保存</translation> </message> <message> - <location line="+42"/> <source>About QVFB</source> <translation>QVFB について</translation> </message> <message> - <location line="+0"/> <source><h2>The Qt for Embedded Linux Virtual X11 Framebuffer</h2><p>This application runs under Qt for X11, emulating a simple framebuffer, which the Qt for Embedded Linux server and clients can attach to just as if it was a hardware Linux framebuffer. <p>With the aid of this development tool, you can develop Qt for Embedded Linux applications under X11 without having to switch to a virtual console. This means you can comfortably use your other development tools such as GUI profilers and debuggers.</source> <translation><h2>The Qt for Embedded Linux Virtual X11 Framebuffer</h2><p>このアプリケーションは Qt for X11 上で動作し、Qt for Embedded Linux のサーバーとクライアントがハードウェアの Linux フレームバッファのように接続可能なシンプルなフレームバッファをエミュレートします。 <p>この開発ツールを使用すると Qt for Embedded Linux 向けのアプリケーションが X11 上でヴァーチャルコンソールへ切り替える事なく開発できるようになります。GUI のプロファイラやデバッガなどの他のツールを一緒に使用する時に便利でしょう。</translation> </message> <message> - <location line="+55"/> <source>Browse...</source> <translation>他のスキンを参照...</translation> </message> <message> - <location line="+143"/> <source>Load Custom Skin...</source> <translation>カスタムスキンを開く...</translation> </message> <message> - <location line="+1"/> <source>All QVFB Skins (*.skin)</source> <translation>QVFB のスキン(*.skin)</translation> </message> @@ -501,23 +396,18 @@ <context> <name>QVFbRateDialog</name> <message> - <location filename="../tools/qvfb/qvfbratedlg.cpp" line="+58"/> <source>Target frame rate:</source> <translation>ターゲットのフレームレート:</translation> </message> <message> - <location line="+12"/> - <location line="+17"/> <source>%1fps</source> <translation>%1fps</translation> </message> <message> - <location line="-12"/> <source>OK</source> <translation>OK</translation> </message> <message> - <location line="+3"/> <source>Cancel</source> <translation>キャンセル</translation> </message> |