diff options
author | Kent Hansen <kent.hansen@nokia.com> | 2012-03-27 16:19:29 +0200 |
---|---|---|
committer | Kent Hansen <kent.hansen@nokia.com> | 2012-03-27 19:22:48 +0200 |
commit | d236fe2214340164bec4f34cb27dea4a634ee0de (patch) | |
tree | cda4ebbcc91717b37e5a2dbccb9ee46c2a1d3885 | |
parent | 2b17b0235b70f89d15d3b91a14c3297d38377f94 (diff) | |
parent | cbc883da6910b3357a4e03d0e2dfa841da1a03e8 (diff) |
Merge master into api_changes
Conflicts:
src/corelib/global/qisenum.h
src/dbus/qdbusconnection_p.h
src/widgets/kernel/qwidget.cpp
tests/auto/other/qaccessibility/tst_qaccessibility.cpp
Change-Id: I85102515d5fec835832cc20ffdc5c1ba578bd01d
128 files changed, 1803 insertions, 2042 deletions
diff --git a/.gitignore b/.gitignore index f4013fd98a..7c98265f57 100644 --- a/.gitignore +++ b/.gitignore @@ -97,6 +97,7 @@ configure.cache config.status mkspecs/default mkspecs/qconfig.pri +mkspecs/qdevice.pri moc_*.cpp qmake/qmake.exe qmake/Makefile.bak diff --git a/config.tests/unix/compile.test b/config.tests/unix/compile.test index f4a7f29b1a..f82fbf9024 100755 --- a/config.tests/unix/compile.test +++ b/config.tests/unix/compile.test @@ -68,7 +68,7 @@ test -r Makefile && $MAKE distclean >/dev/null 2>&1 # Make sure output from possible previous tests is gone rm -f "$EXE" "${EXE}.exe" -"$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "CONFIG-=debug_and_release" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" "QT_BUILD_TREE=$OUTDIR" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile" +OUTDIR=$OUTDIR "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "CONFIG-=debug_and_release" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" "QT_BUILD_TREE=$OUTDIR" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile" if [ "$VERBOSE" = "yes" ]; then $MAKE @@ -71,8 +71,10 @@ QTCONFIG_CONFIG= QT_CONFIG= SUPPORTED= QMAKE_VARS_FILE=.qmake.vars +DEVICE_VARS_FILE=.device.vars :> "$QMAKE_VARS_FILE" +:> "$DEVICE_VARS_FILE" #------------------------------------------------------------------------------- # utility functions @@ -224,6 +226,23 @@ linkerSupportsFlag() } #------------------------------------------------------------------------------- +# device options +#------------------------------------------------------------------------------- +DeviceVar() +{ + case "$1" in + set) + eq="=" + ;; + *) + echo >&2 "BUG: wrong command to QMakeVar: $1" + ;; + esac + + echo "$2" "$eq" "$3" >> "$DEVICE_VARS_FILE" +} + +#------------------------------------------------------------------------------- # operating system detection #------------------------------------------------------------------------------- @@ -733,7 +752,6 @@ CFG_SSE4_2=auto CFG_AVX=auto CFG_AVX2=auto CFG_REDUCE_RELOCATIONS=auto -CFG_NAS=no CFG_ACCESSIBILITY=auto CFG_IWMMXT=no CFG_NEON=auto @@ -909,7 +927,7 @@ while [ "$#" -gt 0 ]; do shift VAL=$1 ;; - -prefix|-docdir|-headerdir|-plugindir|-importdir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-testsdir|-depths|-make|-nomake|-platform|-xplatform|-sdk|-arch|-host-arch|-mysql_config|-sysroot|-hostdatadir|-hostbindir) + -prefix|-docdir|-headerdir|-plugindir|-importdir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-testsdir|-depths|-make|-nomake|-platform|-xplatform|-device|-device-option|-sdk|-arch|-host-arch|-mysql_config|-sysroot|-hostdatadir|-hostbindir) VAR=`echo $1 | sed "s,^-\(.*\),\1,"` shift VAL="$1" @@ -1305,6 +1323,14 @@ while [ "$#" -gt 0 ]; do XPLATFORM="$VAL" case `basename "$XPLATFORM"` in win32-g++*) XPLATFORM_MINGW=yes;; esac ;; + device) + XPLATFORM="devices/$VAL" + ;; + device-option) + DEV_VAR=`echo $VAL | sed "s,^\(.*\)=.*,\1,"` + DEV_VAL=`echo $VAL | sed "s,^.*=\(.*\),\1,"` + DeviceVar set $DEV_VAR $DEV_VAL + ;; debug-and-release) if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then CFG_DEBUG_RELEASE="$VAL" @@ -1582,13 +1608,6 @@ while [ "$#" -gt 0 ]; do UNKNOWN_OPT=yes fi ;; - nas-sound) - if [ "$VAL" = "system" ] || [ "$VAL" = "no" ]; then - CFG_NAS="$VAL" - else - UNKNOWN_OPT=yes - fi - ;; xcursor) if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ] || [ "$VAL" = "runtime" ]; then CFG_XCURSOR="$VAL" @@ -2449,6 +2468,15 @@ if [ "$CFG_RTOS_ENABLED" = "no" ]; then fi #------------------------------------------------------------------------------- +# write out device config before we run the test. +#------------------------------------------------------------------------------- +if cmp -s "$DEVICE_VARS_FILE" "$outpath/mkspecs/qdevice.pri"; then + rm -f "$DEVICE_VARS_FILE" +else + mv -f $DEVICE_VARS_FILE "$outpath/mkspecs/qdevice.pri" +fi + +#------------------------------------------------------------------------------- # tests that don't need qmake (must be run before displaying help) #------------------------------------------------------------------------------- @@ -2921,6 +2949,7 @@ Usage: $relconf [-h] [-prefix <dir>] [-prefix-install] [-bindir <dir>] [-libdir [-no-openssl] [-openssl] [-openssl-linked] [-no-gtkstyle] [-gtkstyle] [-qt-pcre] [-system-pcre] + [-device <name>] [-device-option <key=value>] [additional platform specific options (see below)] @@ -3182,6 +3211,10 @@ Additional options: -force-asserts ........ Force Q_ASSERT to be enabled even in release builds. + -device <name> ............... Cross-compile for device <name> (experimental) + -device-option <key=value> ... Add device specific options for the device mkspec + (experimental) + EOF if [ "$CFG_SEPARATE_DEBUG_INFO" = "auto" ]; then @@ -3915,12 +3948,12 @@ fi # Build qmake #------------------------------------------------------------------------------- # Use config.tests/arch/arch.pro to has the compiler tell us what the target architecture is -CFG_ARCH=`"$outpath/bin/qmake" -spec "$XQMAKESPEC" -o /dev/null "$relpath/config.tests/arch/arch.pro" 2>&1 | sed -n -e 's,^Project MESSAGE:.*Architecture: \([a-zA-Z0-9_]*\).*,\1,p'` +CFG_ARCH=`OUTDIR="$outpath" "$outpath/bin/qmake" -spec "$XQMAKESPEC" -o /dev/null "$relpath/config.tests/arch/arch.pro" 2>&1 | sed -n -e 's,^Project MESSAGE:.*Architecture: \([a-zA-Z0-9_]*\).*,\1,p'` [ -z "$CFG_ARCH" ] && CFG_ARCH="unknown" if [ "$QMAKESPEC" != "$XQMAKESPEC" ]; then # Do the same test again, using the host compiler - CFG_HOST_ARCH=`"$outpath/bin/qmake" -spec "$QMAKESPEC" -o /dev/null "$relpath/config.tests/arch/arch.pro" 2>&1 | sed -n -e 's,^Project MESSAGE:.*Architecture: \([a-zA-Z0-9]*\).*,\1,p'` + CFG_HOST_ARCH=`OUTDIR="$outpath" "$outpath/bin/qmake" -spec "$QMAKESPEC" -o /dev/null "$relpath/config.tests/arch/arch.pro" 2>&1 | sed -n -e 's,^Project MESSAGE:.*Architecture: \([a-zA-Z0-9_]*\).*,\1,p'` [ -z "$CFG_HOST_ARCH" ] && CFG_HOST_ARCH="unknown" else # not cross compiling, host == target @@ -5667,7 +5700,6 @@ fi [ "$CFG_GSTREAMER" = "yes" ] && QT_CONFIG="$QT_CONFIG gstreamer" [ "$CFG_DBUS" = "yes" ] && QT_CONFIG="$QT_CONFIG dbus" [ "$CFG_DBUS" = "linked" ] && QT_CONFIG="$QT_CONFIG dbus dbus-linked" -[ "$CFG_NAS" = "system" ] && QT_CONFIG="$QT_CONFIG nas" [ "$CFG_OPENSSL" = "yes" ] && QT_CONFIG="$QT_CONFIG openssl" [ "$CFG_OPENSSL" = "linked" ] && QT_CONFIG="$QT_CONFIG openssl-linked" [ "$CFG_MAC_HARFBUZZ" = "yes" ] && QT_CONFIG="$QT_CONFIG harfbuzz" @@ -6150,7 +6182,6 @@ QMakeVar set sql-plugins "$SQL_PLUGINS" [ "$CFG_IPV6IFNAME" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_IPV6IFNAME" [ "$CFG_GETIFADDRS" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_GETIFADDRS" [ "$CFG_INOTIFY" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_INOTIFY" -[ "$CFG_NAS" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_NAS" [ "$CFG_NIS" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_NIS" [ "$CFG_OPENSSL" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_OPENSSL QT_NO_SSL" [ "$CFG_OPENSSL" = "linked" ]&& QCONFIG_FLAGS="$QCONFIG_FLAGS QT_LINKED_OPENSSL" diff --git a/doc/src/snippets/code/src_corelib_global_qglobal.cpp b/doc/src/snippets/code/src_corelib_global_qglobal.cpp index 21bea7aef8..16f6783a52 100644 --- a/doc/src/snippets/code/src_corelib_global_qglobal.cpp +++ b/doc/src/snippets/code/src_corelib_global_qglobal.cpp @@ -560,3 +560,26 @@ bool readConfiguration(const QFile &file) return true; } //! [qunlikely] + +//! [qunreachable-enum] + enum Shapes { + Rectangle, + Triangle, + Circle, + NumShapes + }; +//! [qunreachable-enum] + +//! [qunreachable-switch] + switch (shape) { + case Rectangle: + return rectangle(); + case Triangle: + return triangle(); + case Circle: + return circle(); + case NumShapes: + Q_UNREACHABLE(); + break; + } +//! [qunreachable-switch] diff --git a/mkspecs/features/device_config.prf b/mkspecs/features/device_config.prf new file mode 100644 index 0000000000..56059e13cf --- /dev/null +++ b/mkspecs/features/device_config.prf @@ -0,0 +1,27 @@ +# Load generated qdevice.pri +exists($$_QMAKE_CACHE_) { + # set in default_pre, so it's the first place to check for qdevice.pri + DIR = $$fromfile($$_QMAKE_CACHE_, QT_BUILD_TREE) + !isEmpty(DIR):DEVICE_PRI = $$DIR/mkspecs/qdevice.pri +} + +isEmpty(DEVICE_PRI) { + # OUTDIR environ is set by configure (arch detection) and compile.test + DIR = $$(OUTDIR) + !isEmpty(DIR):DEVICE_PRI = $$DIR/mkspecs/qdevice.pri +} + +isEmpty(DEVICE_PRI) { + DIR = $$[QT_HOST_DATA] + !isEmpty(DIR):DEVICE_PRI = $$DIR/mkspecs/qdevice.pri +} + +isEmpty(DEVICE_PRI) { + error(Could not locate qdevice.pri) +} + +exists($$DEVICE_PRI):include($$DEVICE_PRI) + +unset(DEVICE_PRI) +unset(DIR) + diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf index 474a414003..ee1647f481 100644 --- a/mkspecs/features/qt_functions.prf +++ b/mkspecs/features/qt_functions.prf @@ -180,7 +180,13 @@ defineTest(qtPrepareTool) { } else { $$1 = $$eval($$1).exe } + } else:contains(QMAKE_HOST.os, Darwin) { + BUNDLENAME = $$eval($$1).app/Contents/MacOS/$$2 + exists($$BUNDLENAME) { + $$1 = $$BUNDLENAME + } } + export($$1) } diff --git a/mkspecs/features/qt_module_config.prf b/mkspecs/features/qt_module_config.prf index cae5f47387..75156a1f44 100644 --- a/mkspecs/features/qt_module_config.prf +++ b/mkspecs/features/qt_module_config.prf @@ -42,7 +42,7 @@ CONFIG -= fix_output_dirs win32|mac:!macx-xcode:CONFIG += debug_and_release linux*:QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF -CONFIG += create_cmake +!isEmpty(MODULE):CONFIG += create_cmake contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols unix:contains(QT_CONFIG, reduce_relocations):CONFIG += bsymbolic_functions diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf index 36c3d5611b..90c5f41e92 100644 --- a/mkspecs/linux-icc/qmake.conf +++ b/mkspecs/linux-icc/qmake.conf @@ -15,7 +15,7 @@ QMAKE_YACC = yacc QMAKE_YACCFLAGS = -d QMAKE_CFLAGS = -falign-stack=maintain-16-byte QMAKE_CFLAGS_DEPS = -M -QMAKE_CFLAGS_WARN_ON = -w1 -Wcheck -wd654,1572,411,873,1125,2259 +QMAKE_CFLAGS_WARN_ON = -w1 -Wcheck -wd654,1572,411,873,1125,2259,2261 QMAKE_CFLAGS_WARN_OFF = -w QMAKE_CFLAGS_RELEASE = -O2 -falign-functions=16 -ansi-alias -fstrict-aliasing QMAKE_CFLAGS_DEBUG = -O0 -g diff --git a/mkspecs/unsupported/blackberry-armv7le-qcc/qmake.conf b/mkspecs/unsupported/blackberry-armv7le-qcc/qmake.conf new file mode 100644 index 0000000000..df9961b107 --- /dev/null +++ b/mkspecs/unsupported/blackberry-armv7le-qcc/qmake.conf @@ -0,0 +1,9 @@ +# +# qmake configuration for blackberry x86 systems +# + +DEFINES += Q_OS_BLACKBERRY +CONFIG += blackberry +LIBS += -lbps + +include(../qnx-armv7le-qcc/qmake.conf) diff --git a/mkspecs/unsupported/blackberry-armv7le-qcc/qplatformdefs.h b/mkspecs/unsupported/blackberry-armv7le-qcc/qplatformdefs.h new file mode 100644 index 0000000000..964c34bb99 --- /dev/null +++ b/mkspecs/unsupported/blackberry-armv7le-qcc/qplatformdefs.h @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Research In Motion Limited. <blackberry-qt@qnx.com> +** Contact: http://www.qt-project.org/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../qnx-armv7le-qcc/qplatformdefs.h" diff --git a/mkspecs/unsupported/blackberry-x86-qcc/qmake.conf b/mkspecs/unsupported/blackberry-x86-qcc/qmake.conf new file mode 100644 index 0000000000..2cb405cd51 --- /dev/null +++ b/mkspecs/unsupported/blackberry-x86-qcc/qmake.conf @@ -0,0 +1,9 @@ +# +# qmake configuration for blackberry x86 systems +# + +DEFINES += Q_OS_BLACKBERRY +CONFIG += blackberry +LIBS += -lbps + +include(../qnx-x86-qcc/qmake.conf) diff --git a/mkspecs/unsupported/blackberry-x86-qcc/qplatformdefs.h b/mkspecs/unsupported/blackberry-x86-qcc/qplatformdefs.h new file mode 100644 index 0000000000..f134e76665 --- /dev/null +++ b/mkspecs/unsupported/blackberry-x86-qcc/qplatformdefs.h @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Research In Motion Limited. <blackberry-qt@qnx.com> +** Contact: http://www.qt-project.org/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../qnx-x86-qcc/qplatformdefs.h" diff --git a/qtbase.pro b/qtbase.pro index 7648a63826..ec3b0b2e9f 100644 --- a/qtbase.pro +++ b/qtbase.pro @@ -72,6 +72,7 @@ unix { $(DEL_FILE) src/corelib/global/qconfig.h; \ $(DEL_FILE) src/corelib/global/qconfig.cpp; \ $(DEL_FILE) mkspecs/qconfig.pri; \ + $(DEL_FILE) mkspecs/qdevice.pri; \ $(DEL_FILE) mkspecs/qmodule.pri; \ $(DEL_FILE) .qmake.cache; \ (cd qmake && $(MAKE) distclean); @@ -80,6 +81,7 @@ win32 { confclean.commands += -$(DEL_FILE) src\\corelib\\global\\qconfig.h $$escape_expand(\\n\\t) \ -$(DEL_FILE) src\\corelib\\global\\qconfig.cpp $$escape_expand(\\n\\t) \ -$(DEL_FILE) mkspecs\\qconfig.pri $$escape_expand(\\n\\t) \ + -$(DEL_FILE) mkspecs\\qdevice.pri $$escape_expand(\\n\\t) \ -$(DEL_FILE) mkspecs\\qmodule.pri $$escape_expand(\\n\\t) \ -$(DEL_FILE) .qmake.cache $$escape_expand(\\n\\t) \ (cd qmake && $(MAKE) distclean) @@ -115,7 +117,7 @@ INSTALLS += configtests #mkspecs mkspecs.path = $$[QT_HOST_DATA]/mkspecs -mkspecs.files = $$OUT_PWD/mkspecs/qconfig.pri $$OUT_PWD/mkspecs/qmodule.pri $$files($$PWD/mkspecs/*) +mkspecs.files = $$OUT_PWD/mkspecs/qconfig.pri $$OUT_PWD/mkspecs/qmodule.pri $$OUT_PWD/mkspecs/qdevice.pri $$files($$PWD/mkspecs/*) mkspecs.files -= $$PWD/mkspecs/modules unix { DEFAULT_QMAKESPEC = $$QMAKESPEC diff --git a/src/corelib/arch/qatomic_armv6.h b/src/corelib/arch/qatomic_armv6.h index 41f145ad0d..b290a6a008 100644 --- a/src/corelib/arch/qatomic_armv6.h +++ b/src/corelib/arch/qatomic_armv6.h @@ -387,6 +387,7 @@ bool QBasicAtomicOps<2>::testAndSetRelaxed(T &_q_value, T expectedValue, T newVa asm volatile("0:\n" "ldrexh %[result], [%[_q_value]]\n" "eors %[result], %[result], %[expectedValue]\n" + "itt eq\n" "strexheq %[result], %[newValue], [%[_q_value]]\n" "teqeq %[result], #1\n" "beq 0b\n" @@ -497,6 +498,7 @@ bool QBasicAtomicOps<8>::testAndSetRelaxed(T &_q_value, T expectedValue, T newVa "eor %[result], %[result], %[expectedValue]\n" "eor %H[result], %H[result], %H[expectedValue]\n" "orrs %[result], %[result], %H[result]\n" + "itt eq\n" "strexdeq %[result], %[newValue], %H[newValue], [%[_q_value]]\n" "teqeq %[result], #1\n" "beq 0b\n" diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h index b3787261be..c9f59454b2 100644 --- a/src/corelib/global/qcompilerdetection.h +++ b/src/corelib/global/qcompilerdetection.h @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Intel Corporation ** Contact: http://www.qt-project.org/ ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -87,6 +88,8 @@ # define Q_NO_TEMPLATE_FRIENDS # define Q_ALIGNOF(type) __alignof(type) # define Q_DECL_ALIGN(n) __declspec(align(n)) +# define Q_ASSUME(expr) __assume(expr) +# define Q_UNREACHABLE() __assume(0) /* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */ # if defined(__INTEL_COMPILER) # define Q_CC_INTEL @@ -140,11 +143,19 @@ # if defined(__INTEL_COMPILER) /* Intel C++ also masquerades as GCC */ # define Q_CC_INTEL -# endif -# if defined(__clang__) +# define Q_ASSUME(expr) __assume(expr) +# define Q_UNREACHABLE() __assume(0) +# elif defined(__clang__) /* Clang also masquerades as GCC */ # define Q_CC_CLANG +# define Q_ASSUME(expr) if (expr){} else __builtin_unreachable() +# define Q_UNREACHABLE() __builtin_unreachable() +# else +/* Plain GCC */ +# define Q_ASSUME(expr) if (expr){} else __builtin_unreachable() +# define Q_UNREACHABLE() __builtin_unreachable() # endif + # define Q_ALIGNOF(type) __alignof__(type) # define Q_TYPEOF(expr) __typeof__(expr) # define Q_DECL_ALIGN(n) __attribute__((__aligned__(n))) @@ -157,45 +168,9 @@ # define QT_NO_ARM_EABI # endif # endif -# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403 +# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403 && !defined(Q_CC_CLANG) # define Q_ALLOC_SIZE(x) __attribute__((alloc_size(x))) # endif -# if defined(__GXX_EXPERIMENTAL_CXX0X__) && !defined(__clang__) /* clang C++11 enablers are found below, don't do them here */ -# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403 - /* C++0x features supported in GCC 4.3: */ -# define Q_COMPILER_VARIADIC_MACROS -# define Q_COMPILER_RVALUE_REFS -# define Q_COMPILER_DECLTYPE -# define Q_COMPILER_STATIC_ASSERT -# endif -# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 - /* C++0x features supported in GCC 4.4: */ -# define Q_COMPILER_UNICODE_STRINGS -# define Q_COMPILER_VARIADIC_TEMPLATES -# define Q_COMPILER_AUTO_TYPE -# define Q_COMPILER_EXTERN_TEMPLATES -# define Q_COMPILER_DEFAULT_DELETE_MEMBERS -# define Q_COMPILER_CLASS_ENUM -# define Q_COMPILER_INITIALIZER_LISTS -# define Q_COMPILER_ATOMICS -# endif -# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 - /* C++0x features supported in GCC 4.5: */ -# define Q_COMPILER_LAMBDA -# endif -# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 - /* C++0x features supported in GCC 4.6: */ -# define Q_COMPILER_NULLPTR -# define Q_COMPILER_CONSTEXPR -# define Q_COMPILER_UNRESTRICTED_UNIONS -# define Q_COMPILER_RANGE_FOR -# endif -# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 - /* C++0x features supported in GCC 4.7: */ -# define Q_COMPILER_EXPLICIT_OVERRIDES -# endif - -# endif /* IBM compiler versions are a bit messy. There are actually two products: the C product, and the C++ product. The C++ compiler is always packaged @@ -420,22 +395,66 @@ # error "Qt has not been tested with this compiler - see http://www.qt-project.org/" #endif +/* + * C++11 support + * + * Paper Macro + * N2341 Q_COMPILER_ALIGNAS + * N2341 Q_COMPILER_ALIGNOF + * N2427 Q_COMPILER_ATOMICS + * N2761 Q_COMPILER_ATTRIBUTES + * N2541 Q_COMPILER_AUTO_FUNCTION + * N1984 N2546 Q_COMPILER_AUTO_TYPE + * N2437 Q_COMPILER_CLASS_ENUM + * N2235 N3276 Q_COMPILER_DECLTYPE + * N2346 Q_COMPILER_DEFAULT_DELETE_MEMBERS + * N1986 Q_COMPILER_DELEGATING_CONSTRUCTORS + * N3206 N3272 Q_COMPILER_EXPLICIT_OVERRIDES (v0.9 and above only) + * N1987 Q_COMPILER_EXTERN_TEMPLATES + * N2540 Q_COMPILER_INHERITING_CONSTRUCTORS + * N2672 Q_COMPILER_INITIALIZER_LISTS + * N2658 N2927 Q_COMPILER_LAMBDA (v1.0 and above only) + * N2756 Q_COMPILER_NONSTATIC_MEMBER_INIT + * N2431 Q_COMPILER_NULLPTR + * N2930 Q_COMPILER_RANGE_FOR + * N2442 Q_COMPILER_RAW_STRINGS + * N2439 Q_COMPILER_REF_QUALIFIERS + * N2118 N2844 N3053 Q_COMPILER_RVALUE_REFS (Note: GCC 4.3 implements only the oldest) + * N1720 Q_COMPILER_STATIC_ASSERT + * N2258 Q_COMPILER_TEMPLATE_ALIAS + * N2659 Q_COMPILER_THREAD_LOCAL + * N2756 Q_COMPILER_UDL + * N2442 Q_COMPILER_UNICODE_STRINGS + * N2544 Q_COMPILER_UNRESTRICTED_UNIONS + * N1653 Q_COMPILER_VARIADIC_MACROS + * N2242 N2555 Q_COMPILER_VARIADIC_TEMPLATES + */ #ifdef Q_CC_INTEL # if __INTEL_COMPILER < 1200 # define Q_NO_TEMPLATE_FRIENDS # endif -# if defined(__GXX_EXPERIMENTAL_CXX0X__) || defined(__GXX_EXPERIMENTAL_CPP0X__) +# if defined(_CHAR16T) || __cplusplus >= 201103L +# define Q_COMPILER_VARIADIC_MACROS # if __INTEL_COMPILER >= 1200 -# define Q_COMPILER_RVALUE_REFS -# define Q_COMPILER_EXTERN_TEMPLATES -# define Q_COMPILER_DECLTYPE -# define Q_COMPILER_VARIADIC_TEMPLATES # define Q_COMPILER_AUTO_TYPE -# define Q_COMPILER_DEFAULT_DELETE_MEMBERS # define Q_COMPILER_CLASS_ENUM +# define Q_COMPILER_DECLTYPE +# define Q_COMPILER_DEFAULT_DELETE_MEMBERS +# define Q_COMPILER_EXTERN_TEMPLATES # define Q_COMPILER_LAMBDA +# define Q_COMPILER_RVALUE_REFS # define Q_COMPILER_STATIC_ASSERT +# define Q_COMPILER_THREAD_LOCAL +# define Q_COMPILER_VARIADIC_MACROS +# endif +# if __INTEL_COMPILER >= 1210 +# define Q_COMPILER_ATTRIBUTES +# define Q_COMPILER_AUTO_FUNCTION +# define Q_COMPILER_NULLPTR +# define Q_COMPILER_TEMPLATE_ALIAS +# define Q_COMPILER_UNICODE_STRINGS +# define Q_COMPILER_VARIADIC_TEMPLATES # endif # endif #endif @@ -463,6 +482,7 @@ # define Q_COMPILER_CLASS_ENUM /* defaulted members in 3.0, deleted members in 2.9 */ # define Q_COMPILER_DEFAULT_DELETE_MEMBERS +# define Q_COMPILER_DELEGATING_CONSTRUCTORS # define Q_COMPILER_EXPLICIT_OVERRIDES # define Q_COMPILER_NULLPTR # define Q_COMPILER_RANGE_FOR @@ -487,6 +507,60 @@ # endif #endif // Q_CC_CLANG +#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG) +# if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L +# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403 + /* C++11 features supported in GCC 4.3: */ +# define Q_COMPILER_DECLTYPE +# define Q_COMPILER_RVALUE_REFS +# define Q_COMPILER_STATIC_ASSERT +# define Q_COMPILER_VARIADIC_MACROS +# endif +# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 + /* C++11 features supported in GCC 4.4: */ +# define Q_COMPILER_ATOMICS +# define Q_COMPILER_AUTO_FUNCTION +# define Q_COMPILER_AUTO_TYPE +# define Q_COMPILER_CLASS_ENUM +# define Q_COMPILER_DEFAULT_DELETE_MEMBERS +# define Q_COMPILER_EXTERN_TEMPLATES +# define Q_COMPILER_INITIALIZER_LISTS +# define Q_COMPILER_UNICODE_STRINGS +# define Q_COMPILER_VARIADIC_TEMPLATES +# endif +# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 + /* C++11 features supported in GCC 4.5: */ +# define Q_COMPILER_LAMBDA +# define Q_COMPILER_RAW_STRINGS +# endif +# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 + /* C++11 features supported in GCC 4.6: */ +# define Q_COMPILER_CONSTEXPR +# define Q_COMPILER_NULLPTR +# define Q_COMPILER_UNRESTRICTED_UNIONS +# define Q_COMPILER_RANGE_FOR +# endif +# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 + /* C++11 features supported in GCC 4.7: */ +# define Q_COMPILER_NONSTATIC_MEMBER_INIT +# define Q_COMPILER_DELEGATING_CONSTRUCTORS +# define Q_COMPILER_EXPLICIT_OVERRIDES +# define Q_COMPILER_TEMPLATE_ALIAS +# define Q_COMPILER_UDL +# endif +# endif +#endif + +#if defined(Q_CC_MSVC) && _MSC_VER >= 1600 && !defined(Q_CC_INTEL) +# define Q_COMPILER_AUTO_TYPE +# define Q_COMPILER_LAMBDA +# define Q_COMPILER_DECLTYPE +# define Q_COMPILER_RVALUE_REFS +# define Q_COMPILER_STATIC_ASSERT +// MSVC has std::initilizer_list, but does not support the braces initialization +//# define Q_COMPILER_INITIALIZER_LISTS +#endif + #ifndef Q_COMPILER_MANGLES_RETURN_TYPE # if defined(Q_CC_MSVC) # define Q_COMPILER_MANGLES_RETURN_TYPE diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 09d178639d..f89b0b3421 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -1799,6 +1799,63 @@ const QSysInfo::WinVersion QSysInfo::WindowsVersion = QSysInfo::windowsVersion() */ /*! + \macro void Q_ASSUME(bool expr) + \relates <QtGlobal> + \since 5.0 + + Causes the compiler to assume that \a expr is true. This macro is useful + for improving code generation, by providing the compiler with hints about + conditions that it would not otherwise know about. However, there is no + guarantee that the compiler will actually use those hints. + + This macro could be considered a "lighter" version of \ref Q_ASSERT. While + Q_ASSERT will abort the program's execution if the condition is false, + Q_ASSUME will tell the compiler not to generate code for those conditions. + Therefore, it is important that the assumptions always hold, otherwise + undefined behaviour may occur. + + If \a expr is a constantly false condition, Q_ASSUME will tell the compiler + that the current code execution cannot be reached. That is, Q_ASSUME(false) + is equivalent to Q_UNREACHABLE(). + + \note Q_LIKELY() tells the compiler that the expression is likely, but not + the only possibility. Q_ASSUME tells the compiler that it is the only + possibility. + + \sa Q_ASSERT(), Q_UNREACHABLE(), Q_LIKELY() +*/ + +/*! + \macro void Q_UNREACHABLE() + \relates <QtGlobal> + \since 5.0 + + Tells the compiler that the current point cannot be reached by any + execution, so it may optimise any code paths leading here as dead code, as + well as code continuing from here. + + This macro is useful to mark impossible conditions. For example, given the + following enum: + + \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp qunreachable-enum + + One can write a switch table like so: + + \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp qunreachable-switch + + The advantage of inserting Q_UNREACHABLE() at that point is that the + compiler is told not to generate code for a shape variable containing that + value. If the macro is missing, the compiler will still generate the + necessary comparisons for that value. If the case label were removed, some + compilers could produce a warning that some enum values were not checked. + + By using this macro in impossible conditions, code coverage may be improved + as dead code paths may be eliminated. + + \sa Q_ASSERT(), Q_ASSUME(), qFatal() +*/ + +/*! \macro void Q_CHECK_PTR(void *pointer) \relates <QtGlobal> diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index ee577a7563..24e05fc72c 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -163,6 +163,12 @@ namespace QT_NAMESPACE {} #ifndef Q_UNLIKELY # define Q_UNLIKELY(x) (x) #endif +#ifndef Q_ASSUME +# define Q_ASSUME(expr) +#endif +#ifndef Q_UNREACHABLE +# define Q_UNREACHABLE() +#endif #ifndef Q_ALLOC_SIZE # define Q_ALLOC_SIZE(x) @@ -476,6 +482,10 @@ QT_END_INCLUDE_NAMESPACE # define Q_DECL_FINAL_CLASS #endif +#if defined(Q_COMPILER_ALIGNOF) && !defined(Q_ALIGNOF) +# define Q_ALIGNOF(x) alignof(x) +#endif + //defines the type for the WNDPROC on windows //the alignment needs to be forced for sse2 to not crash with mingw #if defined(Q_OS_WIN) @@ -866,7 +876,7 @@ Q_CORE_EXPORT bool qSharedBuild(); Avoid "unused parameter" warnings */ -#if defined(Q_CC_INTEL) && !defined(Q_OS_WIN) || defined(Q_CC_RVCT) +#if defined(Q_CC_RVCT) template <typename T> inline void qUnused(T &x) { (void)x; } # define Q_UNUSED(x) qUnused(x); @@ -1355,20 +1365,7 @@ template <typename T> inline const QForeachContainer<T> *qForeachContainer(const QForeachContainerBase *base, const T *) { return static_cast<const QForeachContainer<T> *>(base); } -#if defined(Q_CC_MIPS) -/* - Proper for-scoping in MIPSpro CC -*/ -# define Q_FOREACH(variable,container) \ - if(0){}else \ - for (const QForeachContainerBase &_container_ = qForeachContainerNew(container); \ - qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->condition(); \ - ++qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->i) \ - for (variable = *qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->i; \ - qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->brk; \ - --qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->brk) - -#elif defined(Q_CC_DIAB) +#if defined(Q_CC_DIAB) // VxWorks DIAB generates unresolvable symbols, if container is a function call # define Q_FOREACH(variable,container) \ if(0){}else \ diff --git a/src/corelib/global/qisenum.h b/src/corelib/global/qisenum.h index ef1ccc81a8..53b856e1c2 100644 --- a/src/corelib/global/qisenum.h +++ b/src/corelib/global/qisenum.h @@ -44,9 +44,6 @@ #ifndef QISENUM_H #define QISENUM_H -QT_BEGIN_HEADER -QT_BEGIN_NAMESPACE - #ifndef Q_IS_ENUM # if defined(Q_CC_GNU) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) # define Q_IS_ENUM(x) __is_enum(x) @@ -64,7 +61,4 @@ QT_BEGIN_NAMESPACE # define Q_IS_ENUM(x) QtPrivate::is_enum<x>::value #endif -QT_END_HEADER -QT_END_NAMESPACE - #endif // QISENUM_H diff --git a/src/corelib/thread/qatomic.h b/src/corelib/thread/qatomic.h index 94cef790db..a8e321b46a 100644 --- a/src/corelib/thread/qatomic.h +++ b/src/corelib/thread/qatomic.h @@ -51,7 +51,7 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) && !defined(Q_CC_INTEL) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wextra" #endif @@ -157,7 +157,7 @@ public: #endif }; -#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) && !defined(Q_CC_INTEL) # pragma GCC diagnostic pop #endif diff --git a/src/corelib/thread/qmutex_linux.cpp b/src/corelib/thread/qmutex_linux.cpp index b1618f7fc9..1bb5e77e77 100644 --- a/src/corelib/thread/qmutex_linux.cpp +++ b/src/corelib/thread/qmutex_linux.cpp @@ -45,15 +45,47 @@ #ifndef QT_NO_THREAD #include "qatomic.h" #include "qmutex_p.h" -# include "qelapsedtimer.h" +#include "qelapsedtimer.h" #include <linux/futex.h> #include <sys/syscall.h> #include <unistd.h> #include <errno.h> +#ifndef QT_LINUX_FUTEX +# error "Qt build is broken: qmutex_linux.cpp is being built but futex support is not wanted" +#endif + QT_BEGIN_NAMESPACE +static inline int futexFlags() +{ + int value = 0; +#if defined(FUTEX_PRIVATE_FLAG) + // check if the kernel supports extra futex flags + // FUTEX_PRIVATE_FLAG appeared in v2.6.22 + static QBasicAtomicInt futexFlagSupport = Q_BASIC_ATOMIC_INITIALIZER(-1); + + value = futexFlagSupport.load(); + if (value == -1) { + // try an operation that has no side-effects: wake up 42 threads + // futex will return -1 (errno==ENOSYS) if the flag isn't supported + // there should be no other error conditions + value = syscall(SYS_futex, &futexFlagSupport, + FUTEX_WAKE | FUTEX_PRIVATE_FLAG, + 42, 0, 0, 0); + if (value != -1) { + value = FUTEX_PRIVATE_FLAG; + futexFlagSupport.store(value); + return value; + } + value = 0; + futexFlagSupport.store(value); + } +#endif + return value; +} + static inline int _q_futex(void *addr, int op, int val, const struct timespec *timeout) { volatile int *int_addr = reinterpret_cast<volatile int *>(addr); @@ -62,7 +94,8 @@ static inline int _q_futex(void *addr, int op, int val, const struct timespec *t #endif int *addr2 = 0; int val2 = 0; - return syscall(SYS_futex, int_addr, op, val, timeout, addr2, val2); + + return syscall(SYS_futex, int_addr, op | futexFlags(), val, timeout, addr2, val2); } static inline QMutexData *dummyFutexValue() diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index e40917c5d8..2d1444c315 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -2080,7 +2080,7 @@ QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const for (int i = 0; i < ImperialMeasurementSystemsCount; ++i) { if (ImperialMeasurementSystems[i].languageId == m_language_id && ImperialMeasurementSystems[i].countryId == m_country_id) { - return QLocale::ImperialSystem; + return ImperialMeasurementSystems[i].system; } } return QLocale::MetricSystem; diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h index c029f627b2..6c97a05ba8 100644 --- a/src/corelib/tools/qlocale.h +++ b/src/corelib/tools/qlocale.h @@ -565,7 +565,12 @@ public: }; // GENERATED PART ENDS HERE - enum MeasurementSystem { MetricSystem, ImperialSystem }; + enum MeasurementSystem { + MetricSystem, + ImperialUSSystem, + ImperialUKSystem, + ImperialSystem = ImperialUSSystem // Qt 4 compatibility + }; enum FormatType { LongFormat, ShortFormat, NarrowFormat }; enum NumberOption { diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc index ff994ca2f3..32822c2e6e 100644 --- a/src/corelib/tools/qlocale.qdoc +++ b/src/corelib/tools/qlocale.qdoc @@ -672,9 +672,11 @@ \value MetricSystem This value indicates metric units, such as meters, centimeters and millimeters. - \value ImperialSystem This value indicates imperial units, such as inches and - miles. There are several distinct imperial systems in the world; this - value stands for the official United States imperial units. + \value ImperialUSSystem This value indicates imperial units, such as inches and + miles as they are used in the United States. + \value ImperialUKSystem This value indicates imperial units, such as inches and + miles as they are used in the United Kingdom. + \value ImperialSystem Provided for compatibility. Same as ImperialUSSystem \since 4.4 */ diff --git a/src/corelib/tools/qlocale_data_p.h b/src/corelib/tools/qlocale_data_p.h index 7841b0aaff..977f54f151 100644 --- a/src/corelib/tools/qlocale_data_p.h +++ b/src/corelib/tools/qlocale_data_p.h @@ -62,12 +62,14 @@ struct CountryLanguage { quint16 languageId; quint16 countryId; + QLocale::MeasurementSystem system; }; static const CountryLanguage ImperialMeasurementSystems[] = { - { 31, 225 }, - { 31, 226 }, - { 111, 225 }, - { 163, 225 } + { QLocale::English, QLocale::UnitedStates, QLocale::ImperialUSSystem }, + { QLocale::English, QLocale::UnitedStatesMinorOutlyingIslands, QLocale::ImperialUSSystem }, + { QLocale::Spanish, QLocale::UnitedStates, QLocale::ImperialUSSystem }, + { QLocale::Hawaiian, QLocale::UnitedStates, QLocale::ImperialUSSystem }, + { QLocale::English, QLocale::UnitedKingdom, QLocale::ImperialUKSystem } }; static const int ImperialMeasurementSystemsCount = sizeof(ImperialMeasurementSystems)/sizeof(ImperialMeasurementSystems[0]); diff --git a/src/corelib/tools/qlocale_icu.cpp b/src/corelib/tools/qlocale_icu.cpp index ee2e5f436a..b3b8836f11 100644 --- a/src/corelib/tools/qlocale_icu.cpp +++ b/src/corelib/tools/qlocale_icu.cpp @@ -81,9 +81,19 @@ bool qt_initIcu(const QString &localeString) if (status == NotLoaded) { // resolve libicui18n - QLibrary lib(QLatin1String("icui18n"), QLatin1String(U_ICU_VERSION_SHORT)); + const QString version = QString::fromLatin1(U_ICU_VERSION_SHORT); +#ifdef Q_OS_WIN + // QLibrary on Windows does not use the version number, the libraries + // are named "icuin<version>.dll", though. + QString libName = QStringLiteral("icuin") + version; +#else + QString libName = QStringLiteral("icui18n"); +#endif + QLibrary lib(libName, version); if (!lib.load()) { - qWarning() << "Unable to load library icui18n" << lib.errorString(); + qWarning("Unable to load library '%s' version %s: %s", + qPrintable(libName), qPrintable(version), + qPrintable(lib.errorString())); status = ErrorLoading; return false; } @@ -104,15 +114,22 @@ bool qt_initIcu(const QString &localeString) ptr_ucol_close = 0; ptr_ucol_strcoll = 0; - qWarning("Unable to find symbols in icui18n"); + qWarning("Unable to find symbols in '%s'.", qPrintable(libName)); status = ErrorLoading; return false; } // resolve libicuuc - QLibrary ucLib(QLatin1String("icuuc"), QLatin1String(U_ICU_VERSION_SHORT)); +#ifdef Q_OS_WIN + libName = QStringLiteral("icuuc") + version; +#else + libName = QStringLiteral("icuuc"); +#endif + QLibrary ucLib(libName, version); if (!ucLib.load()) { - qWarning() << "Unable to load library icuuc" << ucLib.errorString(); + qWarning("Unable to load library '%s' version %s: %s", + qPrintable(libName), qPrintable(version), + qPrintable(ucLib.errorString())); status = ErrorLoading; return false; } @@ -129,7 +146,7 @@ bool qt_initIcu(const QString &localeString) ptr_u_strToUpper = 0; ptr_u_strToLower = 0; - qWarning("Unable to find symbols in icuuc"); + qWarning("Unable to find symbols in '%s'", qPrintable(libName)); status = ErrorLoading; return false; } diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h index baf697a6f5..88ac7597e2 100644 --- a/src/corelib/tools/qsimd_p.h +++ b/src/corelib/tools/qsimd_p.h @@ -44,24 +44,8 @@ #include <qglobal.h> - QT_BEGIN_HEADER - -#if defined(QT_NO_MAC_XARCH) || (defined(Q_OS_DARWIN) && (defined(__ppc__) || defined(__ppc64__))) -// Disable MMX and SSE on Mac/PPC builds, or if the compiler -// does not support -Xarch argument passing -#undef QT_HAVE_SSE -#undef QT_HAVE_SSE2 -#undef QT_HAVE_SSE3 -#undef QT_HAVE_SSSE3 -#undef QT_HAVE_SSE4_1 -#undef QT_HAVE_SSE4_2 -#undef QT_HAVE_AVX -#undef QT_HAVE_3DNOW -#undef QT_HAVE_MMX -#endif - #ifdef __MINGW64_VERSION_MAJOR #include <intrin.h> #endif diff --git a/src/dbus/dbus.pro b/src/dbus/dbus.pro index 6fd48de48d..100736252e 100644 --- a/src/dbus/dbus.pro +++ b/src/dbus/dbus.pro @@ -51,7 +51,9 @@ PUB_HEADERS = qdbusargument.h \ qdbuspendingcall.h \ qdbuspendingreply.h \ qdbuscontext.h \ - qdbusvirtualobject.h + qdbusvirtualobject.h \ + qdbusservicewatcher.h \ + qdbusunixfiledescriptor.h HEADERS += $$PUB_HEADERS \ qdbusconnection_p.h \ qdbusmessage_p.h \ @@ -66,8 +68,7 @@ HEADERS += $$PUB_HEADERS \ qdbusintegrator_p.h \ qdbuspendingcall_p.h \ qdbus_symbols_p.h \ - qdbusservicewatcher.h \ - qdbusunixfiledescriptor.h + qdbusintrospection_p.h SOURCES += qdbusconnection.cpp \ qdbusconnectioninterface.cpp \ qdbuserror.cpp \ diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp index bacf93bac8..cc2712297d 100644 --- a/src/dbus/qdbusabstractadaptor.cpp +++ b/src/dbus/qdbusabstractadaptor.cpp @@ -296,7 +296,7 @@ void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void ** realObject = realObject->parent(); // break down the parameter list - QList<int> types; + QVector<int> types; int inputCount = qDBusParametersForMethod(mm, types); if (inputCount == -1) // invalid signal signature diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h index caeb116b31..fb53f3efba 100644 --- a/src/dbus/qdbusconnection_p.h +++ b/src/dbus/qdbusconnection_p.h @@ -126,7 +126,7 @@ public: QString service, path, signature; QObject* obj; int midx; - QList<int> params; + QVector<int> params; QStringList argumentMatch; QByteArray matchRule; }; @@ -243,7 +243,7 @@ private: void sendError(const QDBusMessage &msg, QDBusError::ErrorType code); void deliverCall(QObject *object, int flags, const QDBusMessage &msg, - const QList<int> &metaTypes, int slotIdx); + const QVector<int> &metaTypes, int slotIdx); bool isServiceRegisteredByThread(const QString &serviceName) const; @@ -311,7 +311,7 @@ public: public: // static methods - static int findSlot(QObject *obj, const QByteArray &normalizedName, QList<int>& params); + static int findSlot(QObject *obj, const QByteArray &normalizedName, QVector<int> ¶ms); static bool prepareHook(QDBusConnectionPrivate::SignalHook &hook, QString &key, const QString &service, const QString &path, const QString &interface, const QString &name, @@ -323,7 +323,7 @@ public: int idx, const QList<int> &metaTypes, const QDBusMessage &msg); static QDBusCallDeliveryEvent *prepareReply(QDBusConnectionPrivate *target, QObject *object, - int idx, const QList<int> &metaTypes, + int idx, const QVector<int> &metaTypes, const QDBusMessage &msg); static void processFinishedCall(QDBusPendingCallPrivate *call); @@ -337,9 +337,9 @@ public: }; // in qdbusmisc.cpp -extern int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes); +extern int qDBusParametersForMethod(const QMetaMethod &mm, QVector<int> &metaTypes); #endif // QT_BOOTSTRAPPED -extern int qDBusParametersForMethod(const QList<QByteArray> ¶meters, QList<int>& metaTypes); +extern int qDBusParametersForMethod(const QList<QByteArray> ¶meters, QVector<int>& metaTypes); extern bool qDBusCheckAsyncTag(const char *tag); #ifndef QT_BOOTSTRAPPED extern bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name); diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index c36c1efb71..5bdd0ee8d8 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -624,7 +624,7 @@ static void huntAndEmit(DBusConnection *connection, DBusMessage *msg, } static int findSlot(const QMetaObject *mo, const QByteArray &name, int flags, - const QString &signature_, QList<int>& metaTypes) + const QString &signature_, QVector<int> &metaTypes) { QByteArray msgSignature = signature_.toLatin1(); @@ -722,7 +722,7 @@ static QDBusCallDeliveryEvent * const DIRECT_DELIVERY = (QDBusCallDeliveryEvent QDBusCallDeliveryEvent* QDBusConnectionPrivate::prepareReply(QDBusConnectionPrivate *target, QObject *object, int idx, - const QList<int> &metaTypes, + const QVector<int> &metaTypes, const QDBusMessage &msg) { Q_ASSERT(object); @@ -860,7 +860,7 @@ bool QDBusConnectionPrivate::activateCall(QObject* object, int flags, const QDBu } void QDBusConnectionPrivate::deliverCall(QObject *object, int /*flags*/, const QDBusMessage &msg, - const QList<int> &metaTypes, int slotIdx) + const QVector<int> &metaTypes, int slotIdx) { Q_ASSERT_X(!object || QThread::currentThread() == object->thread(), "QDBusConnection: internal threading error", @@ -1235,7 +1235,7 @@ void QDBusConnectionPrivate::serviceOwnerChangedNoLock(const QString &name, } int QDBusConnectionPrivate::findSlot(QObject* obj, const QByteArray &normalizedName, - QList<int> ¶ms) + QVector<int> ¶ms) { int midx = obj->metaObject()->indexOfMethod(normalizedName); if (midx == -1) diff --git a/src/dbus/qdbusintegrator_p.h b/src/dbus/qdbusintegrator_p.h index c9a2efc57d..f910d2d009 100644 --- a/src/dbus/qdbusintegrator_p.h +++ b/src/dbus/qdbusintegrator_p.h @@ -84,7 +84,7 @@ struct QDBusSlotCache { int flags; int slotIdx; - QList<int> metaTypes; + QVector<int> metaTypes; }; typedef QMultiHash<QString, Data> Hash; Hash hash; @@ -94,7 +94,7 @@ class QDBusCallDeliveryEvent: public QMetaCallEvent { public: QDBusCallDeliveryEvent(const QDBusConnection &c, int id, QObject *sender, - const QDBusMessage &msg, const QList<int> &types, int f = 0) + const QDBusMessage &msg, const QVector<int> &types, int f = 0) : QMetaCallEvent(0, id, 0, sender, -1), connection(c), message(msg), metaTypes(types), flags(f) { } @@ -106,7 +106,7 @@ public: private: QDBusConnection connection; // just for refcounting QDBusMessage message; - QList<int> metaTypes; + QVector<int> metaTypes; int flags; }; diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp index fa9b74199e..30f2adc8b3 100644 --- a/src/dbus/qdbusmisc.cpp +++ b/src/dbus/qdbusmisc.cpp @@ -50,6 +50,7 @@ #include "qdbusconnection_p.h" #include "qdbusabstractadaptor_p.h" // for QCLASSINFO_DBUS_* #endif +#include <QtCore/qvector.h> #include "qdbusmetatype_p.h" #ifndef QT_NO_DBUS @@ -130,14 +131,14 @@ bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name) // metaTypes.count() >= retval + 1 in all cases // // sig must be the normalised signature for the method -int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes) +int qDBusParametersForMethod(const QMetaMethod &mm, QVector<int> &metaTypes) { return qDBusParametersForMethod(mm.parameterTypes(), metaTypes); } #endif // QT_BOOTSTRAPPED -int qDBusParametersForMethod(const QList<QByteArray> ¶meterTypes, QList<int>& metaTypes) +int qDBusParametersForMethod(const QList<QByteArray> ¶meterTypes, QVector<int>& metaTypes) { QDBusMetaTypeId::init(); metaTypes.clear(); diff --git a/src/dbus/qdbuspendingcall.cpp b/src/dbus/qdbuspendingcall.cpp index bb1bb76801..9659afa2e5 100644 --- a/src/dbus/qdbuspendingcall.cpp +++ b/src/dbus/qdbuspendingcall.cpp @@ -180,12 +180,7 @@ bool QDBusPendingCallPrivate::setReplyCallback(QObject *target, const char *memb if (metaTypes.at(count) == QDBusMetaTypeId::message) --count; - if (count == 0) { - setMetaTypes(count, 0); - } else { - QVector<int> types = QVector<int>::fromList(metaTypes); - setMetaTypes(count, types.constData() + 1); - } + setMetaTypes(count, count ? metaTypes.constData() + 1 : 0); return true; } diff --git a/src/dbus/qdbuspendingcall_p.h b/src/dbus/qdbuspendingcall_p.h index eb0d9b6a11..20e8b15660 100644 --- a/src/dbus/qdbuspendingcall_p.h +++ b/src/dbus/qdbuspendingcall_p.h @@ -56,7 +56,7 @@ #include <qshareddata.h> #include <qpointer.h> -#include <qlist.h> +#include <qvector.h> #include <qmutex.h> #include <qwaitcondition.h> @@ -82,7 +82,7 @@ public: // for the callback mechanism (see setReplyCallback and QDBusConnectionPrivate::sendWithReplyAsync) QPointer<QObject> receiver; - QList<int> metaTypes; + QVector<int> metaTypes; int methodIdx; bool autoDelete; diff --git a/src/dbus/qdbusxmlgenerator.cpp b/src/dbus/qdbusxmlgenerator.cpp index a158600f42..d97258d514 100644 --- a/src/dbus/qdbusxmlgenerator.cpp +++ b/src/dbus/qdbusxmlgenerator.cpp @@ -166,7 +166,7 @@ static QString generateInterfaceXml(const QMetaObject *mo, int flags, int method continue; // wasn't a valid type QList<QByteArray> names = mm.parameterNames(); - QList<int> types; + QVector<int> types; int inputCount = qDBusParametersForMethod(mm, types); if (inputCount == -1) continue; // invalid form diff --git a/src/gui/accessible/qaccessible2.h b/src/gui/accessible/qaccessible2.h index 56a39b640d..dcac22e5bb 100644 --- a/src/gui/accessible/qaccessible2.h +++ b/src/gui/accessible/qaccessible2.h @@ -56,12 +56,6 @@ class QModelIndex; namespace QAccessible2 { - enum CoordinateType - { - RelativeToScreen = 0, - RelativeToParent = 1 - }; - enum BoundaryType { CharBoundary, WordBoundary, @@ -80,9 +74,9 @@ public: virtual void addSelection(int startOffset, int endOffset) = 0; virtual QString attributes(int offset, int *startOffset, int *endOffset) const = 0; virtual int cursorPosition() const = 0; - virtual QRect characterRect(int offset, QAccessible2::CoordinateType coordType) const = 0; + virtual QRect characterRect(int offset) const = 0; virtual int selectionCount() const = 0; - virtual int offsetAtPoint(const QPoint &point, QAccessible2::CoordinateType coordType) const = 0; + virtual int offsetAtPoint(const QPoint &point) const = 0; virtual void selection(int selectionIndex, int *startOffset, int *endOffset) const = 0; virtual QString text(int startOffset, int endOffset) const = 0; virtual QString textBeforeOffset (int offset, QAccessible2::BoundaryType boundaryType, @@ -249,7 +243,7 @@ public: virtual QString imageDescription() const = 0; virtual QSize imageSize() const = 0; - virtual QRect imagePosition(QAccessible2::CoordinateType coordType) const = 0; + virtual QRect imagePosition() const = 0; }; #endif // QT_NO_ACCESSIBILITY diff --git a/src/gui/image/qimage.h b/src/gui/image/qimage.h index e9192f1031..6acc03f4bd 100644 --- a/src/gui/image/qimage.h +++ b/src/gui/image/qimage.h @@ -70,10 +70,10 @@ struct QImageData; class QImageDataMisc; // internal #ifndef QT_NO_IMAGE_TEXT #if QT_DEPRECATED_SINCE(5, 0) -class QT_DEPRECATED QImageTextKeyLang { +class QImageTextKeyLang { public: - QImageTextKeyLang(const char* k, const char* l) : key(k), lang(l) { } - QImageTextKeyLang() { } + QT_DEPRECATED QImageTextKeyLang(const char* k, const char* l) : key(k), lang(l) { } + QT_DEPRECATED QImageTextKeyLang() { } QByteArray key; QByteArray lang; @@ -315,6 +315,14 @@ Q_GUI_EXPORT_INLINE void QImage::setPixel(const QPoint &pt, uint index_or_rgb) { #if QT_DEPRECATED_SINCE(5, 0) #ifndef QT_NO_IMAGE_TEXT + +#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#elif defined(Q_CC_MSVC) +# pragma warning(disable: 4996) +#endif + inline QString QImage::text(const char* key, const char* lang) const { if (!d) @@ -384,6 +392,13 @@ inline void QImage::setText(const char* key, const char* lang, const QString &s) k += QLatin1Char('/') + QString::fromAscii(lang); setText(k, s); } + +#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) +# pragma GCC diagnostic pop +#elif defined(Q_CC_MSVC) +# pragma warning(default: 4996) +#endif + #endif inline int QImage::numColors() const diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 9b0973afb2..57238f362f 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -996,6 +996,7 @@ void QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::Mo } QWindow *window = e->window.data(); + modifier_buttons = e->modifiers; if (!window) window = QGuiApplication::topLevelAt(e->globalPos.toPoint()); @@ -1098,6 +1099,7 @@ void QGuiApplicationPrivate::processWheelEvent(QWindowSystemInterfacePrivate::Wh QPointF globalPoint = e->globalPos; QGuiApplicationPrivate::lastCursorPosition = globalPoint; + modifier_buttons = e->modifiers; QWindow *window = e->window.data(); @@ -1114,6 +1116,7 @@ void QGuiApplicationPrivate::processWheelEvent(QWindowSystemInterfacePrivate::Wh void QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyEvent *e) { QWindow *window = e->window.data(); + modifier_buttons = e->modifiers; if (e->nullWindow) window = QGuiApplication::activeWindow(); if (!window) @@ -1271,6 +1274,7 @@ Q_GUI_EXPORT bool operator==(const QGuiApplicationPrivate::ActiveTouchPointsKey void QGuiApplicationPrivate::processTouchEvent(QWindowSystemInterfacePrivate::TouchEvent *e) { QGuiApplicationPrivate *d = self; + modifier_buttons = e->modifiers; if (e->touchType == QEvent::TouchCancel) { // The touch sequence has been canceled (e.g. by the compositor). diff --git a/src/gui/kernel/qplatformintegration_qpa.cpp b/src/gui/kernel/qplatformintegration_qpa.cpp index 786e915a19..6879f0517e 100644 --- a/src/gui/kernel/qplatformintegration_qpa.cpp +++ b/src/gui/kernel/qplatformintegration_qpa.cpp @@ -291,6 +291,8 @@ QVariant QPlatformIntegration::styleHint(StyleHint hint) const return 500; case ShowIsFullScreen: return false; + case PasswordMaskDelay: + return 0; } return 0; diff --git a/src/gui/kernel/qplatformintegration_qpa.h b/src/gui/kernel/qplatformintegration_qpa.h index 632b3af613..68dfc21833 100644 --- a/src/gui/kernel/qplatformintegration_qpa.h +++ b/src/gui/kernel/qplatformintegration_qpa.h @@ -121,7 +121,8 @@ public: StartDragDistance, StartDragTime, KeyboardAutoRepeatRate, - ShowIsFullScreen + ShowIsFullScreen, + PasswordMaskDelay }; virtual QVariant styleHint(StyleHint hint) const; diff --git a/src/gui/kernel/qplatformwindow_qpa.cpp b/src/gui/kernel/qplatformwindow_qpa.cpp index c8e2776366..227059e24e 100644 --- a/src/gui/kernel/qplatformwindow_qpa.cpp +++ b/src/gui/kernel/qplatformwindow_qpa.cpp @@ -170,7 +170,7 @@ Qt::WindowFlags QPlatformWindow::setWindowFlags(Qt::WindowFlags flags) bool QPlatformWindow::isExposed() const { Q_D(const QPlatformWindow); - return d->window->visible(); + return d->window->isVisible(); } /*! diff --git a/src/gui/kernel/qstylehints.cpp b/src/gui/kernel/qstylehints.cpp index 15fcec21d8..4970f6a26b 100644 --- a/src/gui/kernel/qstylehints.cpp +++ b/src/gui/kernel/qstylehints.cpp @@ -96,4 +96,9 @@ bool QStyleHints::showIsFullScreen() const return hint(QPlatformIntegration::ShowIsFullScreen).toBool(); } +int QStyleHints::passwordMaskDelay() const +{ + return hint(QPlatformIntegration::PasswordMaskDelay).toInt(); +} + QT_END_NAMESPACE diff --git a/src/gui/kernel/qstylehints.h b/src/gui/kernel/qstylehints.h index 0fc7e776b5..ae51ebc052 100644 --- a/src/gui/kernel/qstylehints.h +++ b/src/gui/kernel/qstylehints.h @@ -62,6 +62,8 @@ public: int keyboardAutoRepeatRate() const; int cursorFlashTime() const; bool showIsFullScreen() const; + int passwordMaskDelay() const; + private: friend class QGuiApplication; QStyleHints(); diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index d72cc991d7..85f619db31 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -52,6 +52,7 @@ #include "qwindow_p.h" #include "qguiapplication_p.h" +#include "qaccessible.h" #include <private/qevent_p.h> @@ -746,9 +747,6 @@ void QWindow::setWindowState(Qt::WindowState state) void QWindow::setTransientParent(QWindow *parent) { Q_D(QWindow); - - QWindow *previousParent = d->transientParent; - d->transientParent = parent; } @@ -1454,13 +1452,25 @@ bool QWindow::event(QEvent *ev) keyReleaseEvent(static_cast<QKeyEvent *>(ev)); break; - case QEvent::FocusIn: + case QEvent::FocusIn: { focusInEvent(static_cast<QFocusEvent *>(ev)); - break; +#ifndef QT_NO_ACCESSIBILITY + QAccessible::State state; + state.active = true; + QAccessibleStateChangeEvent event(this, state); + QAccessible::updateAccessibility(&event); +#endif + break; } - case QEvent::FocusOut: + case QEvent::FocusOut: { focusOutEvent(static_cast<QFocusEvent *>(ev)); - break; +#ifndef QT_NO_ACCESSIBILITY + QAccessible::State state; + state.active = true; + QAccessibleStateChangeEvent event(this, state); + QAccessible::updateAccessibility(&event); +#endif + break; } #ifndef QT_NO_WHEELEVENT case QEvent::Wheel: diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.cpp b/src/gui/kernel/qwindowsysteminterface_qpa.cpp index bcbf96b2c0..e49edf0b98 100644 --- a/src/gui/kernel/qwindowsysteminterface_qpa.cpp +++ b/src/gui/kernel/qwindowsysteminterface_qpa.cpp @@ -159,6 +159,8 @@ bool QWindowSystemInterface::tryHandleSynchronousShortcutEvent(QWindow *w, int k bool QWindowSystemInterface::tryHandleSynchronousShortcutEvent(QWindow *w, ulong timestamp, int k, Qt::KeyboardModifiers mods, const QString & text, bool autorep, ushort count) { + QGuiApplicationPrivate::modifier_buttons = mods; + QKeyEvent qevent(QEvent::ShortcutOverride, k, mods, text, autorep, count); qevent.setTimestamp(timestamp); return QGuiApplicationPrivate::instance()->shortcutMap.tryShortcutEvent(w, &qevent); @@ -176,6 +178,8 @@ bool QWindowSystemInterface::tryHandleSynchronousExtendedShortcutEvent(QWindow * quint32 nativeScanCode, quint32 nativeVirtualKey, quint32 nativeModifiers, const QString &text, bool autorep, ushort count) { + QGuiApplicationPrivate::modifier_buttons = mods; + QKeyEventEx qevent(QEvent::ShortcutOverride, k, mods, text, autorep, count, nativeScanCode, nativeVirtualKey, nativeModifiers); qevent.setTimestamp(timestamp); return QGuiApplicationPrivate::instance()->shortcutMap.tryShortcutEvent(w, &qevent); diff --git a/src/gui/opengl/qopenglpaintengine_p.h b/src/gui/opengl/qopenglpaintengine_p.h index 1b3dfbae28..8b49ec250f 100644 --- a/src/gui/opengl/qopenglpaintengine_p.h +++ b/src/gui/opengl/qopenglpaintengine_p.h @@ -199,7 +199,7 @@ public: void updateBrushUniforms(); void updateMatrix(); void updateCompositionMode(); - void updateTextureFilter(GLenum target, GLenum wrapMode, bool smoothPixmapTransform, GLuint id = -1); + void updateTextureFilter(GLenum target, GLenum wrapMode, bool smoothPixmapTransform, GLuint id = GLuint(-1)); void resetGLState(); diff --git a/src/gui/painting/qblittable_p.h b/src/gui/painting/qblittable_p.h index 0d2f6983d4..c36de8fa08 100644 --- a/src/gui/painting/qblittable_p.h +++ b/src/gui/painting/qblittable_p.h @@ -64,7 +64,7 @@ public: SourceOverScaledPixmapCapability = 0x0008, // Internal ones - OutlineCapability = 0x0001000, + OutlineCapability = 0x0001000 }; Q_DECLARE_FLAGS (Capabilities, Capability); diff --git a/src/gui/painting/qcosmeticstroker_p.h b/src/gui/painting/qcosmeticstroker_p.h index 86e811c5f6..7a1221c1a7 100644 --- a/src/gui/painting/qcosmeticstroker_p.h +++ b/src/gui/painting/qcosmeticstroker_p.h @@ -72,7 +72,7 @@ public: enum Caps { NoCaps = 0, CapBegin = 0x1, - CapEnd = 0x2, + CapEnd = 0x2 }; // used to avoid drop outs or duplicated points diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 035f56b35e..7571d81a36 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -814,7 +814,6 @@ template<TextureBlendType blendType> void fetchTransformedBilinear_pixelBounds(int max, int l1, int l2, int &v1, int &v2); template<> -Q_STATIC_TEMPLATE_SPECIALIZATION inline void fetchTransformedBilinear_pixelBounds<BlendTransformedBilinearTiled>(int max, int, int, int &v1, int &v2) { v1 %= max; @@ -828,7 +827,6 @@ inline void fetchTransformedBilinear_pixelBounds<BlendTransformedBilinearTiled>( } template<> -Q_STATIC_TEMPLATE_SPECIALIZATION inline void fetchTransformedBilinear_pixelBounds<BlendTransformedBilinear>(int, int l1, int l2, int &v1, int &v2) { if (v1 < l1) diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h index 2e88fe718a..442fd8bcd7 100644 --- a/src/gui/painting/qdrawhelper_p.h +++ b/src/gui/painting/qdrawhelper_p.h @@ -67,12 +67,6 @@ QT_BEGIN_NAMESPACE -#if defined(Q_CC_MSVC) && _MSCVER <= 1300 && !defined(Q_CC_INTEL) -#define Q_STATIC_TEMPLATE_SPECIALIZATION static -#else -#define Q_STATIC_TEMPLATE_SPECIALIZATION -#endif - #if defined(Q_CC_RVCT) // RVCT doesn't like static template functions # define Q_STATIC_TEMPLATE_FUNCTION diff --git a/src/gui/painting/qmemrotate.cpp b/src/gui/painting/qmemrotate.cpp index e6fcc3e5dd..6f4dc5b358 100644 --- a/src/gui/painting/qmemrotate.cpp +++ b/src/gui/painting/qmemrotate.cpp @@ -423,7 +423,6 @@ inline void qt_memrotate270_template(const T *src, int srcWidth, int srcHeight, } template <> -Q_STATIC_TEMPLATE_SPECIALIZATION inline void qt_memrotate90_template<quint24>(const quint24 *src, int srcWidth, int srcHeight, int srcStride, quint24 *dest, int dstStride) { diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h index 03581eb6a2..aac2390943 100644 --- a/src/gui/text/qtextengine_p.h +++ b/src/gui/text/qtextengine_p.h @@ -425,7 +425,7 @@ public: enum LayoutState { LayoutEmpty, InLayout, - LayoutFailed, + LayoutFailed }; struct Q_GUI_EXPORT LayoutData { LayoutData(const QString &str, void **stack_memory, int mem_size); diff --git a/src/gui/util/qdesktopservices.cpp b/src/gui/util/qdesktopservices.cpp index 25fb08f532..1a6661440c 100644 --- a/src/gui/util/qdesktopservices.cpp +++ b/src/gui/util/qdesktopservices.cpp @@ -54,6 +54,7 @@ #include <qmutex.h> #include <qplatformservices_qpa.h> #include <qplatformintegration_qpa.h> +#include <qdir.h> QT_BEGIN_NAMESPACE @@ -283,6 +284,23 @@ void QDesktopServices::unsetUrlHandler(const QString &scheme) Use QStandardPaths::displayName() */ + +QString QDesktopServices::storageLocationImpl(StandardLocation type) +{ +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) + if (type == DataLocation) { + QString xdgDataHome = QLatin1String(qgetenv("XDG_DATA_HOME")); + if (xdgDataHome.isEmpty()) + xdgDataHome = QDir::homePath() + QLatin1String("/.local/share"); + xdgDataHome += QLatin1String("/data/") + + QCoreApplication::organizationName() + QLatin1Char('/') + + QCoreApplication::applicationName(); + return xdgDataHome; + } +#endif + return QStandardPaths::writableLocation(static_cast<QStandardPaths::StandardLocation>(type)); +} + QT_END_NAMESPACE #include "qdesktopservices.moc" diff --git a/src/gui/util/qdesktopservices.h b/src/gui/util/qdesktopservices.h index 04a639437e..280acaf277 100644 --- a/src/gui/util/qdesktopservices.h +++ b/src/gui/util/qdesktopservices.h @@ -79,12 +79,14 @@ public: }; QT_DEPRECATED static QString storageLocation(StandardLocation type) { - return QStandardPaths::writableLocation(static_cast<QStandardPaths::StandardLocation>(type)); + return storageLocationImpl(type); } QT_DEPRECATED static QString displayName(StandardLocation type) { return QStandardPaths::displayName(static_cast<QStandardPaths::StandardLocation>(type)); } #endif +private: + static QString storageLocationImpl(StandardLocation type); }; #endif // QT_NO_DESKTOPSERVICES diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp index eef2a7fa76..43b3618ea2 100644 --- a/src/network/kernel/qauthenticator.cpp +++ b/src/network/kernel/qauthenticator.cpp @@ -380,6 +380,8 @@ void QAuthenticatorPrivate::parseHttpResponse(const QList<QPair<QByteArray, QByt break; case Ntlm: // #### extract from header + if (user.isEmpty() && password.isEmpty()) + phase = Done; break; case DigestMd5: { this->options[QLatin1String("realm")] = realm = QString::fromLatin1(options.value("realm")); diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp index 279a1fbc22..bf05433b22 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -641,17 +641,15 @@ QStringList QFontconfigDatabase::fallbacksForFamily(const QString family, const FcPatternDestroy(pattern); if (fontSet) { - if (result == FcResultMatch) { - for (int i = 0; i < fontSet->nfont; i++) { - FcChar8 *value = 0; - if (FcPatternGetString(fontSet->fonts[i], FC_FAMILY, 0, &value) != FcResultMatch) - continue; - // capitalize(value); - QString familyName = QString::fromUtf8((const char *)value); - if (!fallbackFamilies.contains(familyName,Qt::CaseInsensitive) && - familyName.compare(family, Qt::CaseInsensitive)) { - fallbackFamilies << familyName; - } + for (int i = 0; i < fontSet->nfont; i++) { + FcChar8 *value = 0; + if (FcPatternGetString(fontSet->fonts[i], FC_FAMILY, 0, &value) != FcResultMatch) + continue; + // capitalize(value); + QString familyName = QString::fromUtf8((const char *)value); + if (!fallbackFamilies.contains(familyName,Qt::CaseInsensitive) && + familyName.compare(family, Qt::CaseInsensitive)) { + fallbackFamilies << familyName; } } FcFontSetDestroy(fontSet); diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h index 02c8d926fd..3d286c8625 100644 --- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h +++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h @@ -98,7 +98,7 @@ public: virtual QFixed emSquareSize() const; virtual QFontEngine *cloneWithSize(qreal pixelSize) const; - virtual int glyphMargin(QFontEngineGlyphCache::Type type) { return 0; } + virtual int glyphMargin(QFontEngineGlyphCache::Type type) { Q_UNUSED(type); return 0; } static int antialiasingThreshold; static QFontEngineGlyphCache::Type defaultGlyphFormat; diff --git a/src/plugins/accessible/widgets/main.cpp b/src/plugins/accessible/widgets/main.cpp index 10a9aa8f47..d180be6d2a 100644 --- a/src/plugins/accessible/widgets/main.cpp +++ b/src/plugins/accessible/widgets/main.cpp @@ -234,8 +234,10 @@ QAccessibleInterface *AccessibleFactory::create(const QString &classname, QObjec #endif } else if (classname == QLatin1String("QLabel") || classname == QLatin1String("QLCDNumber")) { iface = new QAccessibleDisplay(widget); +#ifndef QT_NO_GROUPBOX } else if (classname == QLatin1String("QGroupBox")) { - iface = new QAccessibleDisplay(widget, QAccessible::Grouping); + iface = new QAccessibleGroupBox(widget); +#endif } else if (classname == QLatin1String("QStatusBar")) { iface = new QAccessibleWidget(widget, QAccessible::StatusBar); #ifndef QT_NO_PROGRESSBAR diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp index 222d838642..a002b8bf26 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp @@ -271,7 +271,7 @@ int QAccessibleTextEdit::cursorPosition() const return textEdit()->textCursor().position(); } -QRect QAccessibleTextEdit::characterRect(int offset, CoordinateType coordType) const +QRect QAccessibleTextEdit::characterRect(int offset) const { QTextEdit *edit = textEdit(); QTextCursor cursor(edit->document()); @@ -292,14 +292,7 @@ QRect QAccessibleTextEdit::characterRect(int offset, CoordinateType coordType) c r.setWidth(averageCharWidth); } - switch (coordType) { - case RelativeToScreen: - r.moveTo(edit->viewport()->mapToGlobal(r.topLeft())); - break; - case RelativeToParent: - break; - } - + r.moveTo(edit->viewport()->mapToGlobal(r.topLeft())); return r; } @@ -308,13 +301,11 @@ int QAccessibleTextEdit::selectionCount() const return textEdit()->textCursor().hasSelection() ? 1 : 0; } -int QAccessibleTextEdit::offsetAtPoint(const QPoint &point, CoordinateType coordType) const +int QAccessibleTextEdit::offsetAtPoint(const QPoint &point) const { QTextEdit *edit = textEdit(); - QPoint p = point; - if (coordType == RelativeToScreen) - p = edit->viewport()->mapFromGlobal(p); + QPoint p = edit->viewport()->mapFromGlobal(point); // convert to document coordinates p += QPoint(edit->horizontalScrollBar()->value(), edit->verticalScrollBar()->value()); diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h index f161c52561..79ac5ae7b5 100644 --- a/src/plugins/accessible/widgets/qaccessiblewidgets.h +++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h @@ -80,9 +80,9 @@ public: void addSelection(int startOffset, int endOffset); QString attributes(int offset, int *startOffset, int *endOffset) const; int cursorPosition() const; - QRect characterRect(int offset, QAccessible2::CoordinateType coordType) const; + QRect characterRect(int offset) const; int selectionCount() const; - int offsetAtPoint(const QPoint &point, QAccessible2::CoordinateType coordType) const; + int offsetAtPoint(const QPoint &point) const; void selection(int selectionIndex, int *startOffset, int *endOffset) const; QString text(int startOffset, int endOffset) const; QString textBeforeOffset (int offset, QAccessible2::BoundaryType boundaryType, diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp index 39d7e03a1b..af0c211cca 100644 --- a/src/plugins/accessible/widgets/simplewidgets.cpp +++ b/src/plugins/accessible/widgets/simplewidgets.cpp @@ -399,10 +399,6 @@ QString QAccessibleDisplay::text(QAccessible::Text t) const if (str.isEmpty()) { if (qobject_cast<QLabel*>(object())) { str = qobject_cast<QLabel*>(object())->text(); -#ifndef QT_NO_GROUPBOX - } else if (qobject_cast<QGroupBox*>(object())) { - str = qobject_cast<QGroupBox*>(object())->title(); -#endif #ifndef QT_NO_LCDNUMBER } else if (qobject_cast<QLCDNumber*>(object())) { QLCDNumber *l = qobject_cast<QLCDNumber*>(object()); @@ -440,15 +436,6 @@ QAccessibleDisplay::relations(QAccessible::Relation match /*= QAccessible::AllRe if (QLabel *label = qobject_cast<QLabel*>(object())) { relatedObjects.append(label->buddy()); #endif -#ifndef QT_NO_GROUPBOX - } else if (QGroupBox *groupbox = qobject_cast<QGroupBox*>(object())) { - if (!groupbox->title().isEmpty()) { - const QList<QWidget*> kids = childWidgets(widget()); - for (int i = 0; i < kids.count(); ++i) { - relatedObjects.append(kids.at(i)); - } - } -#endif } for (int i = 0; i < relatedObjects.count(); ++i) { const QAccessible::Relation rel = QAccessible::Labelled; @@ -490,7 +477,7 @@ QSize QAccessibleDisplay::imageSize() const } /*! \internal */ -QRect QAccessibleDisplay::imagePosition(QAccessible2::CoordinateType coordType) const +QRect QAccessibleDisplay::imagePosition() const { QLabel *label = qobject_cast<QLabel *>(widget()); if (!label) @@ -499,16 +486,90 @@ QRect QAccessibleDisplay::imagePosition(QAccessible2::CoordinateType coordType) if (!pixmap) return QRect(); - switch (coordType) { - case QAccessible2::RelativeToScreen: - return QRect(label->mapToGlobal(label->pos()), label->size()); - case QAccessible2::RelativeToParent: - return label->geometry(); + return QRect(label->mapToGlobal(label->pos()), label->size()); +} + +#ifndef QT_NO_GROUPBOX +QAccessibleGroupBox::QAccessibleGroupBox(QWidget *w) +: QAccessibleWidget(w) +{ +} + +QGroupBox* QAccessibleGroupBox::groupBox() const +{ + return static_cast<QGroupBox *>(widget()); +} + +QString QAccessibleGroupBox::text(QAccessible::Text t) const +{ + QString txt = QAccessibleWidget::text(t); + + if (txt.isEmpty()) { + switch (t) { + case QAccessible::Name: + txt = qt_accStripAmp(groupBox()->title()); + case QAccessible::Description: + txt = qt_accStripAmp(groupBox()->title()); + default: + break; + } } - return QRect(); + return txt; +} + +QAccessible::State QAccessibleGroupBox::state() const +{ + QAccessible::State st = QAccessibleWidget::state(); + st.checkable = groupBox()->isCheckable(); + st.checked = groupBox()->isChecked(); + return st; +} + +QAccessible::Role QAccessibleGroupBox::role() const +{ + return groupBox()->isCheckable() ? QAccessible::CheckBox : QAccessible::Grouping; +} + +QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > +QAccessibleGroupBox::relations(QAccessible::Relation match /*= QAccessible::AllRelations*/) const +{ + QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > rels = QAccessibleWidget::relations(match); + + if ((match & QAccessible::Labelled) && (!groupBox()->title().isEmpty())) { + const QList<QWidget*> kids = childWidgets(widget()); + for (int i = 0; i < kids.count(); ++i) { + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(kids.at(i)); + if (iface) + rels.append(qMakePair(iface, QAccessible::Relation(QAccessible::Labelled))); + } + } + return rels; +} + +QStringList QAccessibleGroupBox::actionNames() const +{ + QStringList actions = QAccessibleWidget::actionNames(); + + if (groupBox()->isCheckable()) { + actions.prepend(QAccessibleActionInterface::checkAction()); + } + return actions; +} + +void QAccessibleGroupBox::doAction(const QString &actionName) +{ + if (actionName == QAccessibleActionInterface::checkAction()) + groupBox()->setChecked(!groupBox()->isChecked()); } +QStringList QAccessibleGroupBox::keyBindingsForAction(const QString &) const +{ + return QStringList(); +} + +#endif + #ifndef QT_NO_LINEEDIT /*! \class QAccessibleLineEdit @@ -613,7 +674,7 @@ int QAccessibleLineEdit::cursorPosition() const return lineEdit()->cursorPosition(); } -QRect QAccessibleLineEdit::characterRect(int /*offset*/, CoordinateType /*coordType*/) const +QRect QAccessibleLineEdit::characterRect(int /*offset*/) const { // QLineEdit doesn't hand out character rects return QRect(); @@ -624,11 +685,9 @@ int QAccessibleLineEdit::selectionCount() const return lineEdit()->hasSelectedText() ? 1 : 0; } -int QAccessibleLineEdit::offsetAtPoint(const QPoint &point, CoordinateType coordType) const +int QAccessibleLineEdit::offsetAtPoint(const QPoint &point) const { - QPoint p = point; - if (coordType == RelativeToScreen) - p = lineEdit()->mapFromGlobal(p); + QPoint p = lineEdit()->mapFromGlobal(point); return lineEdit()->cursorPositionAt(p); } diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h index c228775421..74c1da405d 100644 --- a/src/plugins/accessible/widgets/simplewidgets.h +++ b/src/plugins/accessible/widgets/simplewidgets.h @@ -53,6 +53,7 @@ QT_BEGIN_NAMESPACE class QAbstractButton; class QLineEdit; class QToolButton; +class QGroupBox; class QProgressBar; class QAccessibleButton : public QAccessibleWidget @@ -110,9 +111,31 @@ public: // QAccessibleImageInterface QString imageDescription() const; QSize imageSize() const; - QRect imagePosition(QAccessible2::CoordinateType coordType) const; + QRect imagePosition() const; }; +#ifndef QT_NO_GROUPBOX +class QAccessibleGroupBox : public QAccessibleWidget +{ +public: + explicit QAccessibleGroupBox(QWidget *w); + + QAccessible::State state() const; + QAccessible::Role role() const; + QString text(QAccessible::Text t) const; + + QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >relations(QAccessible::Relation match = QAccessible::AllRelations) const; + + //QAccessibleActionInterface + QStringList actionNames() const; + void doAction(const QString &actionName); + QStringList keyBindingsForAction(const QString &) const; + +private: + QGroupBox *groupBox() const; +}; +#endif + #ifndef QT_NO_LINEEDIT class QAccessibleLineEdit : public QAccessibleWidget, public QAccessibleTextInterface, public QAccessibleSimpleEditableTextInterface @@ -129,9 +152,9 @@ public: void addSelection(int startOffset, int endOffset); QString attributes(int offset, int *startOffset, int *endOffset) const; int cursorPosition() const; - QRect characterRect(int offset, QAccessible2::CoordinateType coordType) const; + QRect characterRect(int offset) const; int selectionCount() const; - int offsetAtPoint(const QPoint &point, QAccessible2::CoordinateType coordType) const; + int offsetAtPoint(const QPoint &point) const; void selection(int selectionIndex, int *startOffset, int *endOffset) const; QString text(int startOffset, int endOffset) const; QString textBeforeOffset (int offset, QAccessible2::BoundaryType boundaryType, diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm index e405c81726..947d91005d 100644 --- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm +++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm @@ -172,8 +172,8 @@ static void cleanupCocoaApplicationDelegate() // QApplicationPrivate::globalAppleEventProcessor in qapplication_mac.mm - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { -/* Q_UNUSED(sender); +/* // The reflection delegate gets precedence if (reflectionDelegate && [reflectionDelegate respondsToSelector:@selector(applicationShouldTerminate:)]) { diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h index 794693627b..489938c4b3 100644 --- a/src/plugins/platforms/cocoa/qcocoabackingstore.h +++ b/src/plugins/platforms/cocoa/qcocoabackingstore.h @@ -60,6 +60,7 @@ public: QPaintDevice *paintDevice(); void flush(QWindow *widget, const QRegion ®ion, const QPoint &offset); void resize (const QSize &size, const QRegion &); + bool scroll(const QRegion &area, int dx, int dy); private: QCocoaWindow *m_cocoaWindow; diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm index 5e221ffd8b..f0ff7ba0d6 100644 --- a/src/plugins/platforms/cocoa/qcocoabackingstore.mm +++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm @@ -47,23 +47,10 @@ QT_BEGIN_NAMESPACE -QRect flipedRect(const QRect &sourceRect,int height) -{ - if (!sourceRect.isValid()) - return QRect(); - QRect flippedRect = sourceRect; - flippedRect.moveTop(height - sourceRect.y()); - return flippedRect; -} - QCocoaBackingStore::QCocoaBackingStore(QWindow *window) : QPlatformBackingStore(window) { m_cocoaWindow = static_cast<QCocoaWindow *>(window->handle()); - - const QRect geo = window->geometry(); - NSRect rect = NSMakeRect(geo.x(),geo.y(),geo.width(),geo.height()); - m_image = new QImage(window->geometry().size(),QImage::Format_ARGB32_Premultiplied); } @@ -84,7 +71,6 @@ void QCocoaBackingStore::flush(QWindow *widget, const QRegion ®ion, const QPo QCocoaAutoReleasePool pool; QRect geo = region.boundingRect(); - NSRect rect = NSMakeRect(geo.x(), geo.y(), geo.width(), geo.height()); [m_cocoaWindow->m_contentView displayRect:rect]; } @@ -92,9 +78,20 @@ void QCocoaBackingStore::flush(QWindow *widget, const QRegion ®ion, const QPo void QCocoaBackingStore::resize(const QSize &size, const QRegion &) { delete m_image; - m_image = new QImage(size,QImage::Format_ARGB32_Premultiplied); - NSSize newSize = NSMakeSize(size.width(),size.height()); + m_image = new QImage(size, QImage::Format_ARGB32_Premultiplied); [static_cast<QNSView *>(m_cocoaWindow->m_contentView) setImage:m_image]; } +bool QCocoaBackingStore::scroll(const QRegion &area, int dx, int dy) +{ + extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset); + QPoint qpoint(dx, dy); + const QVector<QRect> qrects = area.rects(); + for (int i = 0; i < qrects.count(); ++i) { + const QRect &qrect = qrects.at(i); + qt_scrollRectInImage(*m_image, qrect, qpoint); + } + return true; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoaclipboard.mm b/src/plugins/platforms/cocoa/qcocoaclipboard.mm index 87c085457f..f76174e085 100644 --- a/src/plugins/platforms/cocoa/qcocoaclipboard.mm +++ b/src/plugins/platforms/cocoa/qcocoaclipboard.mm @@ -81,6 +81,7 @@ bool QCocoaClipboard::supportsMode(QClipboard::Mode mode) const bool QCocoaClipboard::ownsMode(QClipboard::Mode mode) const { + Q_UNUSED(mode); return false; } diff --git a/src/plugins/platforms/cocoa/qcocoacursor.mm b/src/plugins/platforms/cocoa/qcocoacursor.mm index 56f0dcf72e..bd8d32b07e 100644 --- a/src/plugins/platforms/cocoa/qcocoacursor.mm +++ b/src/plugins/platforms/cocoa/qcocoacursor.mm @@ -59,6 +59,8 @@ QCocoaCursor::QCocoaCursor() void QCocoaCursor::changeCursor(QCursor *cursor, QWindow *window) { + Q_UNUSED(window); + // Check for a suitable built-in NSCursor first: switch (cursor->shape()) { case Qt::ArrowCursor: diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm index 305a8ddc95..77cccac0b4 100644 --- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm +++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm @@ -895,6 +895,7 @@ QCocoaEventDispatcherPrivate::QCocoaEventDispatcherPrivate() nsAppRunCalledByQt(false), cleanupModalSessionsNeeded(false), currentModalSessionCached(0), + lastSerial(-1), interrupt(false) { } diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm index ecb732c9da..c333e3ac1f 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm @@ -504,17 +504,6 @@ typedef QSharedPointer<QFileDialogOptions> SharedPointerFileDialogOptions; QT_BEGIN_NAMESPACE -static bool qt_mac_is_macsheet(const QWidget *w) -{ - if (!w) - return false; - - Qt::WindowModality modality = w->windowModality(); - if (modality == Qt::ApplicationModal) - return false; - return w->parentWidget() && (modality == Qt::WindowModal || w->windowType() == Qt::Sheet); -} - QCocoaFileDialogHelper::QCocoaFileDialogHelper() :mDelegate(0) { diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.h b/src/plugins/platforms/cocoa/qcocoanativeinterface.h index 8856e90cf3..bb4d0f9f6c 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h @@ -45,6 +45,8 @@ #include <QtGui/QPlatformNativeInterface> #include <QtPrintSupport/QPlatformPrinterSupport> +QT_BEGIN_NAMESPACE + class QWidget; class QCocoaNativeInterface : public QPlatformNativeInterface @@ -74,3 +76,5 @@ private: }; #endif // QCOCOANATIVEINTERFACE_H + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm index 29c2e58959..ca15b6bbfb 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm @@ -54,6 +54,8 @@ #include "qprintengine_mac_p.h" +QT_BEGIN_NAMESPACE + void *QCocoaNativeInterface::nativeResourceForWindow(const QByteArray &resourceString, QWindow *window) { if (!window->handle()) { @@ -81,3 +83,5 @@ void *QCocoaNativeInterface::NSPrintInfoForPrintEngine(QPrintEngine *printEngine QMacPrintEngine *macPrintEngine = static_cast<QMacPrintEngine *>(printEngine); return macPrintEngine->d_func()->printInfo; } + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 90c5a050d0..184422a04a 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -49,7 +49,7 @@ #include "qcocoaglcontext.h" #include "qnsview.h" -class QCocoaWindow; +class QT_PREPEND_NAMESPACE(QCocoaWindow); @interface QNSWindow : NSWindow { @public QCocoaWindow *m_cocoaPlatformWindow; @@ -59,7 +59,7 @@ class QCocoaWindow; @end @interface QNSPanel : NSPanel { - @public QCocoaWindow *m_cocoaPlatformWindow; + @public QT_PREPEND_NAMESPACE(QCocoaWindow) *m_cocoaPlatformWindow; } - (BOOL)canBecomeKeyWindow; @end @@ -99,6 +99,7 @@ public: void raise(); void lower(); void propagateSizeHints(); + void setOpacity(qreal level); bool setKeyboardGrabEnabled(bool grab); bool setMouseGrabEnabled(bool grab); @@ -133,7 +134,7 @@ public: // for QNSView friend class QCocoaNativeInterface; QNSView *m_contentView; - QNSWindow *m_nsWindow; + NSWindow *m_nsWindow; Qt::WindowFlags m_windowFlags; QPointer<QWindow> m_activePopupWindow; diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index b5e8ff2246..4f95489798 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -111,8 +111,8 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw) QCocoaWindow::~QCocoaWindow() { - [m_contentView release]; clearNSWindow(m_nsWindow); + [m_contentView release]; [m_nsWindow release]; } @@ -198,13 +198,17 @@ void QCocoaWindow::raise() { //qDebug() << "raise" << this; // ### handle spaces (see Qt 4 raise_sys in qwidget_mac.mm) - if (m_nsWindow) + if (!m_nsWindow) + return; + if ([m_nsWindow isVisible]) [m_nsWindow orderFront: m_nsWindow]; } void QCocoaWindow::lower() { - if (m_nsWindow) + if (!m_nsWindow) + return; + if ([m_nsWindow isVisible]) [m_nsWindow orderBack: m_nsWindow]; } @@ -233,6 +237,12 @@ void QCocoaWindow::propagateSizeHints() } } +void QCocoaWindow::setOpacity(qreal level) +{ + if (m_nsWindow) + [m_nsWindow setAlphaValue:level]; +} + bool QCocoaWindow::setKeyboardGrabEnabled(bool grab) { if (!m_nsWindow) @@ -439,7 +449,9 @@ void QCocoaWindow::setNSWindow(NSWindow *window) void QCocoaWindow::clearNSWindow(NSWindow *window) { + [window setDelegate:nil]; [[NSNotificationCenter defaultCenter] removeObserver:m_contentView]; + [m_contentView removeFromSuperviewWithoutNeedingDisplay]; } // Returns the current global screen geometry for the nswindow associated with this window. diff --git a/src/plugins/platforms/cocoa/qmacclipboard.h b/src/plugins/platforms/cocoa/qmacclipboard.h index 9371aca459..634d29a60f 100644 --- a/src/plugins/platforms/cocoa/qmacclipboard.h +++ b/src/plugins/platforms/cocoa/qmacclipboard.h @@ -49,6 +49,8 @@ #import <Cocoa/Cocoa.h> +QT_BEGIN_NAMESPACE + class QMacPasteboard { struct Promise { @@ -90,4 +92,6 @@ public: QString qt_mac_get_pasteboardString(PasteboardRef paste); +QT_END_NAMESPACE + #endif diff --git a/src/plugins/platforms/cocoa/qmacclipboard.mm b/src/plugins/platforms/cocoa/qmacclipboard.mm index eff2c5b07a..73abd8945c 100644 --- a/src/plugins/platforms/cocoa/qmacclipboard.mm +++ b/src/plugins/platforms/cocoa/qmacclipboard.mm @@ -56,8 +56,6 @@ QT_BEGIN_NAMESPACE -QT_USE_NAMESPACE - /***************************************************************************** QClipboard debug facilities *****************************************************************************/ @@ -548,6 +546,4 @@ QString qt_mac_get_pasteboardString(PasteboardRef paste) return QString(); } - - QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qmacmime.h b/src/plugins/platforms/cocoa/qmacmime.h index 7226caef28..12c9aff039 100644 --- a/src/plugins/platforms/cocoa/qmacmime.h +++ b/src/plugins/platforms/cocoa/qmacmime.h @@ -46,6 +46,8 @@ #include <CoreFoundation/CoreFoundation.h> +QT_BEGIN_NAMESPACE + class Q_GUI_EXPORT QMacPasteboardMime { char type; public: @@ -74,5 +76,7 @@ public: virtual QList<QByteArray> convertFromMime(const QString &mime, QVariant data, QString flav) = 0; }; +QT_END_NAMESPACE + #endif diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index d249158db3..e76c02704f 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -238,6 +238,7 @@ static QTouchDevice *touchDevice = 0; - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent { + Q_UNUSED(theEvent); return YES; } @@ -638,6 +639,43 @@ static QTouchDevice *touchDevice = 0; [self handleKeyEvent:nsevent eventType:int(QEvent::KeyRelease)]; } +- (void)flagsChanged:(NSEvent *)nsevent +{ + ulong timestamp = [nsevent timestamp] * 1000; + ulong modifiers = [nsevent modifierFlags]; + Qt::KeyboardModifiers qmodifiers = [self convertKeyModifiers:modifiers]; + + // calculate the delta and remember the current modifiers for next time + static ulong m_lastKnownModifiers; + ulong lastKnownModifiers = m_lastKnownModifiers; + ulong delta = lastKnownModifiers ^ modifiers; + m_lastKnownModifiers = modifiers; + + struct qt_mac_enum_mapper + { + ulong mac_mask; + Qt::Key qt_code; + }; + static qt_mac_enum_mapper modifier_key_symbols[] = { + { NSShiftKeyMask, Qt::Key_Shift }, + { NSControlKeyMask, Qt::Key_Meta }, + { NSCommandKeyMask, Qt::Key_Control }, + { NSAlternateKeyMask, Qt::Key_Alt }, + { NSAlphaShiftKeyMask, Qt::Key_CapsLock }, + { 0ul, Qt::Key_unknown } }; + for (int i = 0; modifier_key_symbols[i].mac_mask != 0u; ++i) { + uint mac_mask = modifier_key_symbols[i].mac_mask; + if ((delta & mac_mask) == 0u) + continue; + + QWindowSystemInterface::handleKeyEvent(m_window, + timestamp, + (lastKnownModifiers & mac_mask) ? QEvent::KeyRelease : QEvent::KeyPress, + modifier_key_symbols[i].qt_code, + qmodifiers); + } +} + - (void) doCommandBySelector:(SEL)aSelector { [self tryToPerform:aSelector with:self]; diff --git a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm index d20246d292..205a52c204 100644 --- a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm +++ b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm @@ -87,7 +87,6 @@ - (id)accessibilityHitTest:(NSPoint)point { if (!m_accessibleRoot) return [super accessibilityHitTest:point]; - NSPoint windowPoint = [[self window] convertScreenToBase:point]; QAccessibleInterface *childInterface = m_accessibleRoot->childAt(point.x, qt_mac_flipYCoordinate(point.y)); // No child found, meaning we hit the NSView diff --git a/src/plugins/platforms/eglfs/eglfs.pro b/src/plugins/platforms/eglfs/eglfs.pro index 86a1b8239c..c12d612c98 100644 --- a/src/plugins/platforms/eglfs/eglfs.pro +++ b/src/plugins/platforms/eglfs/eglfs.pro @@ -3,10 +3,6 @@ load(qt_plugin) QT += core-private gui-private platformsupport-private -!contains(QT_CONFIG, no-widgets) { - QT += opengl opengl-private widgets-private -} - DESTDIR = $$QT.gui.plugins/platforms #DEFINES += QEGL_EXTRA_DEBUG diff --git a/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp b/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp index d2e4a47e56..8e9e5f76e0 100644 --- a/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp +++ b/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp @@ -41,67 +41,54 @@ #include "qeglfsbackingstore.h" -#ifndef QT_NO_WIDGETS -#include <QtOpenGL/private/qgl_p.h> -#include <QtOpenGL/private/qglpaintdevice_p.h> -#endif //QT_NO_WIDGETS - -#include <QtGui/QPlatformOpenGLContext> -#include <QtGui/QScreen> +#include <QtGui/QOpenGLContext> +#include <QtGui/QOpenGLPaintDevice> QT_BEGIN_NAMESPACE -#ifndef QT_NO_WIDGETS -class QEglFSPaintDevice : public QGLPaintDevice +QEglFSBackingStore::QEglFSBackingStore(QWindow *window) + : QPlatformBackingStore(window) + , m_context(new QOpenGLContext) { -public: - QEglFSPaintDevice(QEglFSScreen *screen) - :QGLPaintDevice(), m_screen(screen) - { - #ifdef QEGL_EXTRA_DEBUG - qWarning("QEglPaintDevice %p, %p",this, screen); - #endif - } - - QSize size() const { return m_screen->geometry().size(); } - QGLContext* context() const { return QGLContext::fromOpenGLContext(m_screen->platformContext()->context()); } - - QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); } + m_context->setFormat(window->requestedFormat()); + m_context->setScreen(window->screen()); + m_context->create(); +} - void beginPaint(){ - QGLPaintDevice::beginPaint(); - } -private: - QEglFSScreen *m_screen; - QGLContext *m_context; -}; -#endif //QT_NO_WIDGETS +QEglFSBackingStore::~QEglFSBackingStore() +{ + delete m_context; +} -QEglFSBackingStore::QEglFSBackingStore(QWindow *window) - : QPlatformBackingStore(window), - m_paintDevice(0) +QPaintDevice *QEglFSBackingStore::paintDevice() { -#ifdef QEGL_EXTRA_DEBUG - qWarning("QEglBackingStore %p, %p", window, window->screen()); -#endif -#ifdef QT_NO_WIDGETS - m_paintDevice = new QImage(0,0); -#else - m_paintDevice = new QEglFSPaintDevice(static_cast<QEglFSScreen *>(window->screen()->handle())); -#endif //QT_NO_WIDGETS + return m_device; } void QEglFSBackingStore::flush(QWindow *window, const QRegion ®ion, const QPoint &offset) { - Q_UNUSED(window); Q_UNUSED(region); Q_UNUSED(offset); + #ifdef QEGL_EXTRA_DEBUG qWarning("QEglBackingStore::flush %p", window); #endif -#ifndef QT_NO_WIDGETS - static_cast<QEglFSPaintDevice *>(m_paintDevice)->context()->swapBuffers(); -#endif //QT_NO_WIDGETS + + m_context->swapBuffers(window); +} + +void QEglFSBackingStore::beginPaint(const QRegion &) +{ + // needed to prevent QOpenGLContext::makeCurrent() from failing + window()->setSurfaceType(QSurface::OpenGLSurface); + + m_context->makeCurrent(window()); + m_device = new QOpenGLPaintDevice(window()->size()); +} + +void QEglFSBackingStore::endPaint() +{ + delete m_device; } void QEglFSBackingStore::resize(const QSize &size, const QRegion &staticContents) diff --git a/src/plugins/platforms/eglfs/qeglfsbackingstore.h b/src/plugins/platforms/eglfs/qeglfsbackingstore.h index 1ae3ecdc61..1eb4d8d79a 100644 --- a/src/plugins/platforms/eglfs/qeglfsbackingstore.h +++ b/src/plugins/platforms/eglfs/qeglfsbackingstore.h @@ -42,25 +42,30 @@ #ifndef QEGLWINDOWSURFACE_H #define QEGLWINDOWSURFACE_H -#include "qeglfsintegration.h" -#include "qeglfswindow.h" - #include <QtGui/qplatformbackingstore_qpa.h> QT_BEGIN_NAMESPACE +class QOpenGLContext; +class QOpenGLPaintDevice; + class QEglFSBackingStore : public QPlatformBackingStore { public: QEglFSBackingStore(QWindow *window); - ~QEglFSBackingStore() { delete m_paintDevice; } + ~QEglFSBackingStore(); + + QPaintDevice *paintDevice(); + + void beginPaint(const QRegion &); + void endPaint(); - QPaintDevice *paintDevice() { return m_paintDevice; } void flush(QWindow *window, const QRegion ®ion, const QPoint &offset); void resize(const QSize &size, const QRegion &staticContents); private: - QPaintDevice *m_paintDevice; + QOpenGLContext *m_context; + QOpenGLPaintDevice *m_device; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/qnx/qnx.pro b/src/plugins/platforms/qnx/qnx.pro index cf82084de0..588464fc47 100644 --- a/src/plugins/platforms/qnx/qnx.pro +++ b/src/plugins/platforms/qnx/qnx.pro @@ -37,6 +37,7 @@ SOURCES = main.cpp \ qqnxclipboard.cpp \ qqnxrootwindow.cpp + HEADERS = qqnxbuffer.h \ qqnxeventthread.h \ qqnxkeytranslator.h \ @@ -51,6 +52,11 @@ HEADERS = qqnxbuffer.h \ qqnxclipboard.h \ qqnxrootwindow.h +CONFIG(blackberry) { + SOURCES += qqnxservices.cpp + HEADERS += qqnxservices.h +} + CONFIG(qqnx_imf) { DEFINES += QQNX_IMF HEADERS += qqnxinputcontext_imf.h @@ -64,6 +70,10 @@ QMAKE_CXXFLAGS += -I./private LIBS += -lpps -lscreen -lEGL -lclipboard +CONFIG(blackberry) { + LIBS += -lbps +} + include (../../../platformsupport/eglconvenience/eglconvenience.pri) include (../../../platformsupport/fontdatabases/fontdatabases.pri) diff --git a/src/plugins/platforms/qnx/qqnxintegration.cpp b/src/plugins/platforms/qnx/qqnxintegration.cpp index cb7f14f963..5ef34f3aea 100644 --- a/src/plugins/platforms/qnx/qqnxintegration.cpp +++ b/src/plugins/platforms/qnx/qqnxintegration.cpp @@ -50,6 +50,7 @@ #include "qqnxvirtualkeyboard.h" #include "qqnxclipboard.h" #include "qqnxglcontext.h" +#include "qqnxservices.h" #if defined(QQnx_IMF) #include "qqnxinputcontext_imf.h" @@ -82,6 +83,7 @@ QQnxIntegration::QQnxIntegration() , m_fontDatabase(new QGenericUnixFontDatabase()) , m_paintUsingOpenGL(false) , m_eventDispatcher(createUnixEventDispatcher()) + , m_services(0) #ifndef QT_NO_CLIPBOARD , m_clipboard(0) #endif @@ -124,6 +126,11 @@ QQnxIntegration::QQnxIntegration() // Set up the input context m_inputContext = new QQnxInputContext; + + // Create services handling class +#ifdef Q_OS_BLACKBERRY + m_services = new QQnxServices; +#endif } QQnxIntegration::~QQnxIntegration() @@ -154,6 +161,11 @@ QQnxIntegration::~QQnxIntegration() // Cleanup global OpenGL resources QQnxGLContext::shutdown(); + // Destroy services class +#ifdef Q_OS_BLACKBERRY + delete m_services; +#endif + #if defined(QQNXINTEGRATION_DEBUG) qDebug() << "QQnx: platform plugin shutdown end"; #endif @@ -266,6 +278,11 @@ QVariant QQnxIntegration::styleHint(QPlatformIntegration::StyleHint hint) const return QPlatformIntegration::styleHint(hint); } +QPlatformServices * QQnxIntegration::services() const +{ + return m_services; +} + QWindow *QQnxIntegration::window(screen_window_t qnxWindow) { #if defined(QQNXINTEGRATION_DEBUG) diff --git a/src/plugins/platforms/qnx/qqnxintegration.h b/src/plugins/platforms/qnx/qqnxintegration.h index 892bb6e16f..6aa16100ad 100644 --- a/src/plugins/platforms/qnx/qqnxintegration.h +++ b/src/plugins/platforms/qnx/qqnxintegration.h @@ -54,6 +54,7 @@ class QQnxEventThread; class QQnxInputContext; class QQnxNavigatorEventHandler; class QQnxWindow; +class QQnxServices; #ifndef QT_NO_CLIPBOARD class QQnxClipboard; @@ -91,6 +92,8 @@ public: bool paintUsingOpenGL() const { return m_paintUsingOpenGL; } + virtual QPlatformServices *services() const; + static QWindow *window(screen_window_t qnxWindow); private: @@ -104,6 +107,7 @@ private: QPlatformFontDatabase *m_fontDatabase; bool m_paintUsingOpenGL; QAbstractEventDispatcher *m_eventDispatcher; + QQnxServices *m_services; #ifndef QT_NO_CLIPBOARD mutable QQnxClipboard* m_clipboard; #endif diff --git a/src/plugins/platforms/qnx/qqnxservices.cpp b/src/plugins/platforms/qnx/qqnxservices.cpp new file mode 100644 index 0000000000..a1a27906ae --- /dev/null +++ b/src/plugins/platforms/qnx/qqnxservices.cpp @@ -0,0 +1,81 @@ +/*************************************************************************** +** +** Copyright (C) 2011 - 2012 Research In Motion +** Contact: http://www.qt-project.org/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qqnxservices.h" + +#include <bps/navigator.h> +#include <stdbool.h> +#include <sys/platform.h> +#include <QUrl> + +QT_BEGIN_NAMESPACE + +QQnxServices::QQnxServices() +{ + bps_initialize(); +} + +QQnxServices::~QQnxServices() +{ + bps_shutdown(); +} + +bool QQnxServices::openUrl(const QUrl &url) +{ + return navigatorInvoke(url); +} + +bool QQnxServices::openDocument(const QUrl &url) +{ + return navigatorInvoke(url); +} + +bool QQnxServices::navigatorInvoke(const QUrl &url) +{ + if (!url.isValid() || url.isRelative()) + return false; + + int ret = navigator_invoke(url.toString().toUtf8(), 0); + + return (ret == BPS_SUCCESS); +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/xcb/qxcbsharedgraphicscache.h b/src/plugins/platforms/qnx/qqnxservices.h index e565556463..36eb8edf65 100644 --- a/src/plugins/platforms/xcb/qxcbsharedgraphicscache.h +++ b/src/plugins/platforms/qnx/qqnxservices.h @@ -1,6 +1,6 @@ -/**************************************************************************** +/*************************************************************************** ** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2011 - 2012 Research In Motion ** Contact: http://www.qt-project.org/ ** ** This file is part of the plugins of the Qt Toolkit. @@ -39,53 +39,26 @@ ** ****************************************************************************/ -#ifndef QXCBSHAREDGRAPHICSCACHE -#define QXCBSHAREDGRAPHICSCACHE +#ifndef QQNXSERVICES_H +#define QQNXSERVICES_H -#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE) - -#include <QtGui/qplatformsharedgraphicscache_qpa.h> - -QT_BEGIN_HEADER +#include <QtGui/QPlatformServices> QT_BEGIN_NAMESPACE -class QXcbSharedBufferManager; -class QXcbSharedGraphicsCache : public QPlatformSharedGraphicsCache +class QQnxServices : public QPlatformServices { - Q_OBJECT public: - explicit QXcbSharedGraphicsCache(QObject *parent = 0); - - virtual void ensureCacheInitialized(const QByteArray &cacheId, BufferType bufferType, - PixelFormat pixelFormat); - - virtual void requestItems(const QByteArray &cacheId, const QVector<quint32> &itemIds); - virtual void insertItems(const QByteArray &cacheId, - const QVector<quint32> &itemIds, - const QVector<QImage> &items); - virtual void releaseItems(const QByteArray &cacheId, const QVector<quint32> &itemIds); + QQnxServices(); + ~QQnxServices(); - virtual void serializeBuffer(void *bufferId, QByteArray *serializedData, int *fileDescriptor) const; - virtual uint textureIdForBuffer(void *bufferId); - virtual void referenceBuffer(void *bufferId); - virtual bool dereferenceBuffer(void *bufferId); + bool openUrl(const QUrl &url); + bool openDocument(const QUrl &url); private: - struct ReadyItem { - QVector<quint32> itemIds; - QVector<QPoint> positions; - }; - - void processPendingItems(); - - QXcbSharedBufferManager *m_bufferManager; + bool navigatorInvoke(const QUrl &url); }; QT_END_NAMESPACE -QT_END_HEADER - -#endif // QT_USE_XCB_SHARED_GRAPHICS_CACHE - -#endif // QXCBSHAREDGRAPHICSCACHE +#endif // QQNXSERVICES_H diff --git a/src/plugins/platforms/windows/accessible/accessible.pri b/src/plugins/platforms/windows/accessible/accessible.pri index 1671c67d17..3069c2dda3 100644 --- a/src/plugins/platforms/windows/accessible/accessible.pri +++ b/src/plugins/platforms/windows/accessible/accessible.pri @@ -1,19 +1,16 @@ SOURCES += \ - $$PWD/qwindowsaccessibility.cpp + $$PWD/qwindowsmsaaaccessible.cpp \ + $$PWD/qwindowsaccessibility.cpp \ + $$PWD/comutils.cpp HEADERS += \ - $$PWD/qwindowsaccessibility.h - -!*g++* { - SOURCES += \ - $$PWD/qwindowsmsaaaccessible.cpp \ - $$PWD/iaccessible2.cpp \ - $$PWD/comutils.cpp - - HEADERS += \ - $$PWD/qwindowsmsaaaccessible.h \ - $$PWD/iaccessible2.h \ - $$PWD/comutils.h + $$PWD/qwindowsmsaaaccessible.h \ + $$PWD/qwindowsaccessibility.h \ + $$PWD/comutils.h +!*g++: { + SOURCES += $$PWD/iaccessible2.cpp + HEADERS += $$PWD/iaccessible2.h include(../../../../3rdparty/iaccessible2/iaccessible2.pri) -} # !g++ +} + diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.cpp b/src/plugins/platforms/windows/accessible/iaccessible2.cpp index f22349714f..c3d5c543cf 100644 --- a/src/plugins/platforms/windows/accessible/iaccessible2.cpp +++ b/src/plugins/platforms/windows/accessible/iaccessible2.cpp @@ -167,81 +167,62 @@ HRESULT STDMETHODCALLTYPE AccessibleRelation::get_targets( **************************************************************/ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::QueryInterface(REFIID id, LPVOID *iface) { - *iface = 0; - - QByteArray strIID = IIDToString(id); - if (!strIID.isEmpty()) { - QString ss; QDebug dbg(&ss); dbg << accessible; - accessibleDebug("QWindowsIA2Accessible::QI() - IID:%s, iface:%s ", strIID.constData(), qPrintable(ss)); - } - if (id == IID_IUnknown) { - *iface = (IUnknown*)(IDispatch*)this; - } else if (id == IID_IDispatch) { - *iface = (IDispatch*)this; - } else if (id == IID_IAccessible) { - *iface = (IAccessible*)this; - } else if (id == IID_IOleWindow) { - *iface = (IOleWindow*)this; - } else if (id == IID_IServiceProvider) { - *iface = (IServiceProvider*)this; - } else if (id == IID_IAccessible2) { - *iface = (IAccessible2*)this; - } else if (id == IID_IAccessibleAction) { - if (accessible->actionInterface()) - *iface = (IAccessibleAction*)this; - } else if (id == IID_IAccessibleComponent) { - *iface = (IAccessibleComponent*)this; - } else if (id == IID_IAccessibleEditableText) { - //if (accessible->editableTextInterface()) { - //*iface = (IAccessibleEditableText*)this; - //} - } else if (id == IID_IAccessibleHyperlink) { - //*iface = (IAccessibleHyperlink*)this; - } else if (id == IID_IAccessibleHypertext) { - //*iface = (IAccessibleHypertext*)this; - } else if (id == IID_IAccessibleImage) { - //*iface = (IAccessibleImage*)this; - } else if (id == IID_IAccessibleRelation) { - *iface = (IAccessibleRelation*)this; - } else if (id == IID_IAccessibleTable) { - //*iface = (IAccessibleTable*)this; // not supported - } else if (id == IID_IAccessibleTable2) { - if (accessible->tableInterface()) - *iface = (IAccessibleTable2*)this; - } else if (id == IID_IAccessibleTableCell) { - if (accessible->tableCellInterface()) - *iface = (IAccessibleTableCell*)this; - } else if (id == IID_IAccessibleText) { - if (accessible->textInterface()) - *iface = (IAccessibleText*)this; - } else if (id == IID_IAccessibleValue) { - if (accessible->valueInterface()) - *iface = (IAccessibleValue*)this; - } - if (*iface) { - AddRef(); - return S_OK; + HRESULT hr = QWindowsMsaaAccessible::QueryInterface(id, iface); + if (!SUCCEEDED(hr)) { + if (id == IID_IAccessible2) { + *iface = (IAccessible2*)this; + } else if (id == IID_IAccessibleAction) { + if (accessible->actionInterface()) + *iface = (IAccessibleAction*)this; + } else if (id == IID_IAccessibleComponent) { + *iface = (IAccessibleComponent*)this; + } else if (id == IID_IAccessibleEditableText) { + //if (accessible->editableTextInterface()) { + //*iface = (IAccessibleEditableText*)this; + //} + } else if (id == IID_IAccessibleHyperlink) { + //*iface = (IAccessibleHyperlink*)this; + } else if (id == IID_IAccessibleHypertext) { + //*iface = (IAccessibleHypertext*)this; + } else if (id == IID_IAccessibleImage) { + //*iface = (IAccessibleImage*)this; + } else if (id == IID_IAccessibleRelation) { + *iface = (IAccessibleRelation*)this; + } else if (id == IID_IAccessibleTable) { + //*iface = (IAccessibleTable*)this; // not supported + } else if (id == IID_IAccessibleTable2) { + if (accessible->tableInterface()) + *iface = (IAccessibleTable2*)this; + } else if (id == IID_IAccessibleTableCell) { + if (accessible->tableCellInterface()) + *iface = (IAccessibleTableCell*)this; + } else if (id == IID_IAccessibleText) { + if (accessible->textInterface()) + *iface = (IAccessibleText*)this; + } else if (id == IID_IAccessibleValue) { + if (accessible->valueInterface()) + *iface = (IAccessibleValue*)this; + } + if (*iface) { + AddRef(); + hr = S_OK; + } else { + hr = E_NOINTERFACE; + } } - - return E_NOINTERFACE; + return hr; } ULONG STDMETHODCALLTYPE QWindowsIA2Accessible::AddRef() { - return ++ref; + return QWindowsMsaaAccessible::AddRef(); } ULONG STDMETHODCALLTYPE QWindowsIA2Accessible::Release() { - if (!--ref) { - delete this; - return 0; - } - return ref; + return QWindowsMsaaAccessible::Release(); } - - /**************************************************************\ * * * IAccessible2 * @@ -1028,6 +1009,7 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_caretOffset(long *offset) return E_FAIL; } + HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_characterExtents(long offset, enum IA2CoordinateType coordType, long *x, @@ -1037,9 +1019,8 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_characterExtents(long offse { accessibleDebugClientCalls(accessible); if (QAccessibleTextInterface *text = textInterface()) { - const QRect rect = text->characterRect(offset, (QAccessible2::CoordinateType)coordType); - *x = rect.x(); - *y = rect.y(); + QRect rect = text->characterRect(offset); + mapFromScreenPos(coordType, rect.topLeft(), x, y); *width = rect.width(); *height = rect.height(); return S_OK; @@ -1064,7 +1045,8 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_offsetAtPoint(long x, { accessibleDebugClientCalls(accessible); if (QAccessibleTextInterface *text = textInterface()) { - *offset = text->offsetAtPoint(QPoint(x,y), (QAccessible2::CoordinateType)coordType); + QPoint screenPos = mapToScreenPos(coordType, x, y); + *offset = text->offsetAtPoint(screenPos); return (*offset >=0 ? S_OK : S_FALSE); } return E_FAIL; @@ -1429,6 +1411,10 @@ uint QWindowsIA2Accessible::uniqueID() const QByteArray QWindowsIA2Accessible::IIDToString(REFIID id) { + QByteArray strGuid = QWindowsMsaaAccessible::IIDToString(id); + if (!strGuid.isEmpty()) + return strGuid; + IF_EQUAL_RETURN_IIDSTRING(id, IID_IUnknown); IF_EQUAL_RETURN_IIDSTRING(id, IID_IDispatch); IF_EQUAL_RETURN_IIDSTRING(id, IID_IAccessible); @@ -1450,7 +1436,6 @@ QByteArray QWindowsIA2Accessible::IIDToString(REFIID id) IF_EQUAL_RETURN_IIDSTRING(id, IID_IAccessibleValue); // else... - QByteArray strGuid; #if 0 // Can be useful for debugging, but normally we'd like to reduce the noise a bit... OLECHAR szGuid[39]={0}; ::StringFromGUID2(id, szGuid, 39); diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.h b/src/plugins/platforms/windows/accessible/iaccessible2.h index a59263fba1..9b8a1ad3a6 100644 --- a/src/plugins/platforms/windows/accessible/iaccessible2.h +++ b/src/plugins/platforms/windows/accessible/iaccessible2.h @@ -66,9 +66,7 @@ #include "AccessibleRole.h" #include "AccessibleStates.h" -#ifdef Q_CC_MINGW -# include <servprov.h> -#endif +#include <servprov.h> QT_BEGIN_NAMESPACE @@ -229,14 +227,45 @@ private: return accessible->tableCellInterface(); } + /*! + \internal + \a screenPos is in screen relative position + \a x and \y (out) is in parent relative position if coordType == IA2_COORDTYPE_PARENT_RELATIVE + */ + void mapFromScreenPos(enum IA2CoordinateType coordType, const QPoint &screenPos, long *x, long *y) const { + if (coordType == IA2_COORDTYPE_PARENT_RELATIVE) { + // caller wants relative to parent + if (QAccessibleInterface *parent = accessible->parent()) { + const QRect parentScreenRect = parent->rect(); + *x = parentScreenRect.x() - screenPos.x(); + *y = parentScreenRect.y() - screenPos.y(); + return; + } + } + *x = screenPos.x(); + *y = screenPos.y(); + } + + /*! + \internal + \a x and \y is in parent relative position if coordType == IA2_COORDTYPE_PARENT_RELATIVE + \return a screen relative position + */ + QPoint mapToScreenPos(enum IA2CoordinateType coordType, long x, long y) const { + if (coordType == IA2_COORDTYPE_PARENT_RELATIVE) { + if (QAccessibleInterface *parent = accessible->parent()) { + const QRect parentScreenRect = parent->rect(); + return QPoint(parentScreenRect.x() + x, parentScreenRect.y() + y); + } + } + return QPoint(x,y); + } + HRESULT getRelationsHelper(IAccessibleRelation **relations, int startIndex, long maxRelations, long *nRelations = 0); HRESULT wrapListOfCells(const QList<QAccessibleInterface*> &inputCells, IUnknown ***outputAccessibles, long *nCellCount); uint uniqueID() const; QByteArray IIDToString(REFIID id); -private: - ULONG ref; - }; /**************************************************************\ diff --git a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp index 4f92b910b2..bd928399c8 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp +++ b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp @@ -56,11 +56,11 @@ #include <QtGui/qguiapplication.h> #include "qwindowsaccessibility.h" - -#ifndef Q_CC_MINGW -# include "iaccessible2.h" -#endif // !Q_CC_MINGW - +#ifdef Q_CC_MINGW +# include "qwindowsmsaaaccessible.h" +#else +# include "iaccessible2.h" +#endif #include "comutils.h" #include <oleacc.h> @@ -237,7 +237,11 @@ IAccessible *QWindowsAccessibility::wrap(QAccessibleInterface *acc) #else if (!acc) return 0; +#ifdef Q_CC_MINGW + QWindowsMsaaAccessible *wacc = new QWindowsMsaaAccessible(acc); +#else QWindowsIA2Accessible *wacc = new QWindowsIA2Accessible(acc); +#endif IAccessible *iacc = 0; wacc->QueryInterface(IID_IAccessible, (void**)&iacc); return iacc; diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp index 8791bbdcfb..6c4d217cb4 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp +++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp @@ -224,6 +224,53 @@ void accessibleDebugClientCalls_helper(const char* funcName, const QAccessibleIn } #endif +/**************************************************************\ + * * + * IUnknown * + * * + **************************************************************/ +HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::QueryInterface(REFIID id, LPVOID *iface) +{ + *iface = 0; + + QByteArray strIID = IIDToString(id); + if (!strIID.isEmpty()) { + QString ss; QDebug dbg(&ss); dbg << accessible; + accessibleDebug("QWindowsIA2Accessible::QI() - IID:%s, iface:%s ", strIID.constData(), qPrintable(ss)); + } + if (id == IID_IUnknown) { + *iface = (IUnknown*)(IDispatch*)this; + } else if (id == IID_IDispatch) { + *iface = (IDispatch*)this; + } else if (id == IID_IAccessible) { + *iface = (IAccessible*)this; + } else if (id == IID_IOleWindow) { + *iface = (IOleWindow*)this; + } + + if (*iface) { + AddRef(); + return S_OK; + } + + return E_NOINTERFACE; +} + +ULONG STDMETHODCALLTYPE QWindowsMsaaAccessible::AddRef() +{ + return ++ref; +} + +ULONG STDMETHODCALLTYPE QWindowsMsaaAccessible::Release() +{ + if (!--ref) { + delete this; + return 0; + } + return ref; +} + + /* IDispatch */ @@ -1208,6 +1255,17 @@ HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::ContextSensitiveHelp(BOOL) return S_OK; } +#define IF_EQUAL_RETURN_IIDSTRING(id, iid) if (id == iid) return QByteArray(#iid) +QByteArray QWindowsMsaaAccessible::IIDToString(REFIID id) +{ + IF_EQUAL_RETURN_IIDSTRING(id, IID_IUnknown); + IF_EQUAL_RETURN_IIDSTRING(id, IID_IDispatch); + IF_EQUAL_RETURN_IIDSTRING(id, IID_IAccessible); + IF_EQUAL_RETURN_IIDSTRING(id, IID_IOleWindow); + + return QByteArray(); +} + QT_END_NAMESPACE #endif //QT_NO_ACCESSIBILITY diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h index 9cb56c954c..d7dda6b3e2 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h +++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h @@ -43,12 +43,19 @@ #include <QtCore/QtConfig> #ifndef QT_NO_ACCESSIBILITY +#include <QtCore/qglobal.h> #include "../qtwindows_additional.h" -#include <oleacc.h> -#include "Accessible2.h" #include <QtCore/qsharedpointer.h> #include <QtGui/qaccessible.h> +#ifndef Q_CC_MINGW +# include <oleacc.h> +# include "Accessible2.h" // IAccessible2 inherits from IAccessible +#else + // MinGW +# include <basetyps.h> +# include <oleacc.h> +#endif QT_BEGIN_NAMESPACE @@ -74,7 +81,13 @@ QWindow *window_helper(const QAccessibleInterface *iface); /**************************************************************\ * QWindowsAccessible * **************************************************************/ -class QWindowsMsaaAccessible : public IAccessible2, public IOleWindow +class QWindowsMsaaAccessible : public +#ifdef Q_CC_MINGW + IAccessible +#else + IAccessible2 +#endif + , public IOleWindow { public: QWindowsMsaaAccessible(QAccessibleInterface *a) @@ -87,6 +100,10 @@ public: delete accessible; } + /* IUnknown */ + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, LPVOID *); + ULONG STDMETHODCALLTYPE AddRef(); + ULONG STDMETHODCALLTYPE Release(); /* IDispatch */ HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int *); @@ -124,12 +141,18 @@ public: HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); protected: + virtual QByteArray IIDToString(REFIID id); + QAccessibleInterface *accessible; QAIPointer childPointer(VARIANT varID) { return QAIPointer(accessible->child(varID.lVal - 1)); } + +private: + ULONG ref; + }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index 50d3c4f1b5..255c49fb46 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -47,7 +47,6 @@ #include "qxcbnativeinterface.h" #include "qxcbclipboard.h" #include "qxcbdrag.h" -#include "qxcbsharedgraphicscache.h" #include <xcb/xcb.h> @@ -118,10 +117,6 @@ QXcbIntegration::QXcbIntegration(const QStringList ¶meters) #ifndef QT_NO_ACCESSIBILITY m_accessibility.reset(new QPlatformAccessibility()); #endif - -#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE) - m_sharedGraphicsCache.reset(new QXcbSharedGraphicsCache); -#endif } QXcbIntegration::~QXcbIntegration() @@ -203,10 +198,6 @@ QPlatformBackingStore *QXcbIntegration::createPlatformBackingStore(QWindow *wind bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const { switch (cap) { -#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE) - case SharedGraphicsCache: return true; -#endif - case ThreadedPixmaps: return true; case OpenGL: return true; case ThreadedOpenGL: return false; @@ -257,26 +248,6 @@ QPlatformAccessibility *QXcbIntegration::accessibility() const } #endif -#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE) -static bool sharedGraphicsCacheDisabled() -{ - static const char *environmentVariable = "QT_DISABLE_SHARED_CACHE"; - static bool cacheDisabled = !qgetenv(environmentVariable).isEmpty() - && qgetenv(environmentVariable).toInt() != 0; - return cacheDisabled; -} - -QPlatformSharedGraphicsCache *QXcbIntegration::createPlatformSharedGraphicsCache(const char *cacheId) const -{ - Q_UNUSED(cacheId); - - if (sharedGraphicsCacheDisabled()) - return 0; - - return m_sharedGraphicsCache.data(); -} -#endif - QPlatformServices *QXcbIntegration::services() const { return m_services.data(); diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h index 58eebfe716..6170232d1e 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.h +++ b/src/plugins/platforms/xcb/qxcbintegration.h @@ -81,10 +81,6 @@ public: QPlatformAccessibility *accessibility() const; #endif -#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE) - QPlatformSharedGraphicsCache *createPlatformSharedGraphicsCache(const char *cacheId) const; -#endif - QPlatformServices *services() const; QStringList themeNames() const; @@ -103,10 +99,6 @@ private: QScopedPointer<QPlatformAccessibility> m_accessibility; #endif -#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE) - QScopedPointer<QPlatformSharedGraphicsCache> m_sharedGraphicsCache; -#endif - QScopedPointer<QPlatformServices> m_services; }; diff --git a/src/plugins/platforms/xcb/qxcbsharedbuffermanager.cpp b/src/plugins/platforms/xcb/qxcbsharedbuffermanager.cpp deleted file mode 100644 index 8bd3aea259..0000000000 --- a/src/plugins/platforms/xcb/qxcbsharedbuffermanager.cpp +++ /dev/null @@ -1,640 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** 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. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE) - -#include "qxcbsharedbuffermanager.h" - -#include <QtCore/quuid.h> -#include <QtGui/qimage.h> - -#include <stdio.h> - -#if !defined(SHAREDGRAPHICSCACHE_MAX_MEMORY_USED) -# define SHAREDGRAPHICSCACHE_MAX_MEMORY_USED 16 * 1024 * 1024 // 16 MB limit -#endif - -#if !defined(SHAREDGRAPHICSCACHE_MAX_TEXTURES_PER_CACHE) -# define SHAREDGRAPHICSCACHE_MAX_TEXTURES_PER_CACHE 1 -#endif - -#if !defined(SHAREDGRAPHICSCACHE_TEXTURE_SIZE) -# define SHAREDGRAPHICSCACHE_TEXTURE_SIZE 2048 -#endif - -#define SHAREDBUFFERMANAGER_DEBUG 1 - -QT_BEGIN_NAMESPACE - -QXcbSharedBufferManager::QXcbSharedBufferManager() - : m_memoryUsed(0) - , m_mostRecentlyUsed(0) - , m_leastRecentlyUsed(0) -{ -} - -QXcbSharedBufferManager::~QXcbSharedBufferManager() -{ - { - QHash<QByteArray, Buffer *>::const_iterator it = m_buffers.constBegin(); - while (it != m_buffers.constEnd()) { - Buffer *buffer = it.value(); - delete buffer; - ++it; - } - } - - { - QHash<QByteArray, Items *>::const_iterator it = m_items.constBegin(); - while (it != m_items.constEnd()) { - Items *items = it.value(); - QHash<quint32, Item *>::const_iterator itemIt = items->items.constBegin(); - while (itemIt != items->items.constEnd()) { - delete itemIt.value(); - ++itemIt; - } - delete it.value(); - ++it; - } - } -} - -void QXcbSharedBufferManager::getBufferForItem(const QByteArray &cacheId, quint32 itemId, - Buffer **buffer, int *x, int *y) const -{ - Q_ASSERT_X(m_currentCacheId.isEmpty(), Q_FUNC_INFO, - "Call endSharedBufferAction before accessing data"); - - Q_ASSERT(buffer != 0); - Q_ASSERT(x != 0); - Q_ASSERT(y != 0); - - Items *items = itemsForCache(cacheId); - Item *item = items->items.value(itemId); - if (item != 0) { - *buffer = item->buffer; - *x = item->x; - *y = item->y; - } else { - *buffer = 0; - *x = -1; - *y = -1; - } -} - -QPair<QByteArray, int> QXcbSharedBufferManager::serializeBuffer(QSharedMemory *buffer) const -{ - Q_ASSERT_X(m_currentCacheId.isEmpty(), Q_FUNC_INFO, - "Call endSharedBufferAction before accessing data"); - - return qMakePair(buffer->key().toLatin1(), 0); -} - -void QXcbSharedBufferManager::beginSharedBufferAction(const QByteArray &cacheId) -{ -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::beginSharedBufferAction() called for %s", cacheId.constData()); -#endif - - Q_ASSERT(m_currentCacheId.isEmpty()); - Q_ASSERT(!cacheId.isEmpty()); - - m_pendingInvalidatedItems.clear(); - m_pendingReadyItems.clear(); - m_pendingMissingItems.clear(); - - m_currentCacheId = cacheId; -} - -void QXcbSharedBufferManager::requestItems(const QSet<quint32> &itemIds) -{ -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::requestItems for %d items", itemIds.size()); -#endif - - Q_ASSERT_X(!m_currentCacheId.isEmpty(), Q_FUNC_INFO, - "Call beginSharedBufferAction before requesting items"); - Items *items = itemsForCache(m_currentCacheId); - - QSet<quint32>::const_iterator it = itemIds.constBegin(); - while (it != itemIds.constEnd()) { - if (items->items.contains(*it)) - m_pendingReadyItems[m_currentCacheId].insert(*it); - else - m_pendingMissingItems[m_currentCacheId].insert(*it); - ++it; - } -} - -void QXcbSharedBufferManager::releaseItems(const QSet<quint32> &itemIds) -{ -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::releaseItems for %d items", itemIds.size()); -#endif - - Items *items = itemsForCache(m_currentCacheId); - - QSet<quint32>::const_iterator it; - for (it = itemIds.constBegin(); it != itemIds.constEnd(); ++it) { - Item *item = items->items.value(*it); - if (item != 0) - pushItemToBack(items, item); - - m_pendingReadyItems[m_currentCacheId].remove(*it); - m_pendingMissingItems[m_currentCacheId].remove(*it); - } -} - -void QXcbSharedBufferManager::insertItem(quint32 itemId, uchar *data, - int itemWidth, int itemHeight) -{ - Q_ASSERT_X(!m_currentCacheId.isEmpty(), Q_FUNC_INFO, - "Call beginSharedBufferAction before inserting items"); - Items *items = itemsForCache(m_currentCacheId); - - if (!items->items.contains(itemId)) { - Buffer *sharedBuffer = 0; - int x = 0; - int y = 0; - - findAvailableBuffer(itemWidth, itemHeight, &sharedBuffer, &x, &y); - copyIntoBuffer(sharedBuffer, x, y, itemWidth, itemHeight, data); - -// static int counter=0; -// QString fileName = QString::fromLatin1("buffer%1.png").arg(counter++); -// saveBuffer(sharedBuffer, fileName); - - Item *item = new Item; - item->itemId = itemId; - item->buffer = sharedBuffer; - item->x = x; - item->y = y; - - items->items[itemId] = item; - - touchItem(items, item); - } -} - -void QXcbSharedBufferManager::endSharedBufferAction() -{ -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::endSharedBufferAction() called for %s", - m_currentCacheId.constData()); -#endif - - Q_ASSERT(!m_currentCacheId.isEmpty()); - - // Do an extra validation pass on the invalidated items since they may have been re-inserted - // after they were invalidated - if (m_pendingInvalidatedItems.contains(m_currentCacheId)) { - QSet<quint32> &invalidatedItems = m_pendingInvalidatedItems[m_currentCacheId]; - QSet<quint32>::iterator it = invalidatedItems.begin(); - while (it != invalidatedItems.end()) { - Items *items = m_items.value(m_currentCacheId); - - if (items->items.contains(*it)) { - m_pendingReadyItems[m_currentCacheId].insert(*it); - it = invalidatedItems.erase(it); - } else { - ++it; - } - } - } - - m_currentCacheId.clear(); -} - -void QXcbSharedBufferManager::pushItemToBack(Items *items, Item *item) -{ - if (items->leastRecentlyUsed == item) - return; - - if (item->next != 0) - item->next->prev = item->prev; - if (item->prev != 0) - item->prev->next = item->next; - - if (items->mostRecentlyUsed == item) - items->mostRecentlyUsed = item->prev; - - if (items->leastRecentlyUsed != 0) - items->leastRecentlyUsed->prev = item; - - item->prev = 0; - item->next = items->leastRecentlyUsed; - items->leastRecentlyUsed = item; - if (items->mostRecentlyUsed == 0) - items->mostRecentlyUsed = item; -} - -void QXcbSharedBufferManager::touchItem(Items *items, Item *item) -{ - if (items->mostRecentlyUsed == item) - return; - - if (item->next != 0) - item->next->prev = item->prev; - if (item->prev != 0) - item->prev->next = item->next; - - if (items->leastRecentlyUsed == item) - items->leastRecentlyUsed = item->next; - - if (items->mostRecentlyUsed != 0) - items->mostRecentlyUsed->next = item; - - item->next = 0; - item->prev = items->mostRecentlyUsed; - items->mostRecentlyUsed = item; - if (items->leastRecentlyUsed == 0) - items->leastRecentlyUsed = item; -} - -void QXcbSharedBufferManager::deleteItem(Items *items, Item *item) -{ - Q_ASSERT(items != 0); - Q_ASSERT(item != 0); - - if (items->mostRecentlyUsed == item) - items->mostRecentlyUsed = item->prev; - if (items->leastRecentlyUsed == item) - items->leastRecentlyUsed = item->next; - - if (item->next != 0) - item->next->prev = item->prev; - if (item->prev != 0) - item->prev->next = item->next; - - m_pendingInvalidatedItems[items->cacheId].insert(item->itemId); - - { - QHash<quint32, Item *>::iterator it = items->items.find(item->itemId); - while (it != items->items.end() && it.value()->itemId == item->itemId) - it = items->items.erase(it); - } - - delete item; -} - -void QXcbSharedBufferManager::recycleItem(Buffer **sharedBuffer, int *glyphX, int *glyphY) -{ -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::recycleItem() called for %s", m_currentCacheId.constData()); -#endif - - Items *items = itemsForCache(m_currentCacheId); - - Item *recycledItem = items->leastRecentlyUsed; - Q_ASSERT(recycledItem != 0); - - *sharedBuffer = recycledItem->buffer; - *glyphX = recycledItem->x; - *glyphY = recycledItem->y; - - deleteItem(items, recycledItem); -} - -void QXcbSharedBufferManager::touchBuffer(Buffer *buffer) -{ -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::touchBuffer() called for %s", buffer->cacheId.constData()); -#endif - - if (buffer == m_mostRecentlyUsed) - return; - - if (buffer->next != 0) - buffer->next->prev = buffer->prev; - if (buffer->prev != 0) - buffer->prev->next = buffer->next; - - if (m_leastRecentlyUsed == buffer) - m_leastRecentlyUsed = buffer->next; - - buffer->next = 0; - buffer->prev = m_mostRecentlyUsed; - if (m_mostRecentlyUsed != 0) - m_mostRecentlyUsed->next = buffer; - if (m_leastRecentlyUsed == 0) - m_leastRecentlyUsed = buffer; - m_mostRecentlyUsed = buffer; -} - -void QXcbSharedBufferManager::deleteLeastRecentlyUsed() -{ -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::deleteLeastRecentlyUsed() called"); -#endif - - if (m_leastRecentlyUsed == 0) - return; - - Buffer *old = m_leastRecentlyUsed; - m_leastRecentlyUsed = old->next; - m_leastRecentlyUsed->prev = 0; - - QByteArray cacheId = old->cacheId; - Items *items = itemsForCache(cacheId); - - QHash<quint32, Item *>::iterator it = items->items.begin(); - while (it != items->items.end()) { - Item *item = it.value(); - if (item->buffer == old) { - deleteItem(items, item); - it = items->items.erase(it); - } else { - ++it; - } - } - - m_buffers.remove(cacheId, old); - m_memoryUsed -= old->width * old->height * old->bytesPerPixel; - -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::deleteLeastRecentlyUsed: Memory used: %d / %d (%6.2f %%)", - m_memoryUsed, SHAREDGRAPHICSCACHE_MAX_MEMORY_USED, - 100.0f * float(m_memoryUsed) / float(SHAREDGRAPHICSCACHE_MAX_MEMORY_USED)); -#endif - - delete old; -} - -QXcbSharedBufferManager::Buffer *QXcbSharedBufferManager::createNewBuffer(const QByteArray &cacheId, - int heightRequired) -{ -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::createNewBuffer() called for %s", cacheId.constData()); -#endif - - // ### - // if (bufferCount of cacheId == SHAREDGRAPHICACHE_MAX_TEXTURES_PER_CACHE) - // deleteLeastRecentlyUsedBufferForCache(cacheId); - - // ### Take pixel format into account - while (m_memoryUsed + SHAREDGRAPHICSCACHE_TEXTURE_SIZE * heightRequired >= SHAREDGRAPHICSCACHE_MAX_MEMORY_USED) - deleteLeastRecentlyUsed(); - - Buffer *buffer = allocateBuffer(SHAREDGRAPHICSCACHE_TEXTURE_SIZE, heightRequired); - buffer->cacheId = cacheId; - - buffer->currentLineMaxHeight = 0; - m_buffers.insert(cacheId, buffer); - - return buffer; -} - -static inline int qt_next_power_of_two(int v) -{ - v--; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - ++v; - return v; -} - -QXcbSharedBufferManager::Buffer *QXcbSharedBufferManager::resizeBuffer(Buffer *oldBuffer, const QSize &newSize) -{ -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::resizeBuffer() called for %s (current size: %dx%d, new size: %dx%d)", - oldBuffer->cacheId.constData(), oldBuffer->width, oldBuffer->height, - newSize.width(), newSize.height()); -#endif - - // Remove old buffer from lists to avoid deleting it under our feet - if (m_leastRecentlyUsed == oldBuffer) - m_leastRecentlyUsed = oldBuffer->next; - if (m_mostRecentlyUsed == oldBuffer) - m_mostRecentlyUsed = oldBuffer->prev; - - if (oldBuffer->prev != 0) - oldBuffer->prev->next = oldBuffer->next; - if (oldBuffer->next != 0) - oldBuffer->next->prev = oldBuffer->prev; - - m_memoryUsed -= oldBuffer->width * oldBuffer->height * oldBuffer->bytesPerPixel; - m_buffers.remove(oldBuffer->cacheId, oldBuffer); - -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::resizeBuffer: Memory used: %d / %d (%6.2f %%)", - m_memoryUsed, SHAREDGRAPHICSCACHE_MAX_MEMORY_USED, - 100.0f * float(m_memoryUsed) / float(SHAREDGRAPHICSCACHE_MAX_MEMORY_USED)); -#endif - - Buffer *resizedBuffer = createNewBuffer(oldBuffer->cacheId, newSize.height()); - copyIntoBuffer(resizedBuffer, 0, 0, oldBuffer->width, oldBuffer->height, - reinterpret_cast<uchar *>(oldBuffer->buffer->data())); - - resizedBuffer->currentLineMaxHeight = oldBuffer->currentLineMaxHeight; - - Items *items = itemsForCache(oldBuffer->cacheId); - QHash<quint32, Item *>::const_iterator it = items->items.constBegin(); - while (it != items->items.constEnd()) { - Item *item = it.value(); - if (item->buffer == oldBuffer) { - m_pendingReadyItems[oldBuffer->cacheId].insert(item->itemId); - item->buffer = resizedBuffer; - } - ++it; - } - - resizedBuffer->nextX = oldBuffer->nextX; - resizedBuffer->nextY = oldBuffer->nextY; - resizedBuffer->currentLineMaxHeight = oldBuffer->currentLineMaxHeight; - - delete oldBuffer; - return resizedBuffer; -} - -void QXcbSharedBufferManager::findAvailableBuffer(int itemWidth, int itemHeight, - Buffer **sharedBuffer, int *glyphX, int *glyphY) -{ - Q_ASSERT(sharedBuffer != 0); - Q_ASSERT(glyphX != 0); - Q_ASSERT(glyphY != 0); - - QMultiHash<QByteArray, Buffer *>::iterator it = m_buffers.find(m_currentCacheId); - - int bufferCount = 0; - while (it != m_buffers.end() && it.key() == m_currentCacheId) { - Buffer *buffer = it.value(); - - int x = buffer->nextX; - int y = buffer->nextY; - int width = buffer->width; - int height = buffer->height; - - if (x + itemWidth <= width && y + itemHeight <= height) { - // There is space on the current line, put the item there - buffer->currentLineMaxHeight = qMax(buffer->currentLineMaxHeight, itemHeight); - *sharedBuffer = buffer; - *glyphX = x; - *glyphY = y; - - buffer->nextX += itemWidth; - - return; - } else if (itemWidth <= width && y + buffer->currentLineMaxHeight + itemHeight <= height) { - // There is space for a new line, put the item on the new line - buffer->nextX = 0; - buffer->nextY += buffer->currentLineMaxHeight; - buffer->currentLineMaxHeight = 0; - - *sharedBuffer = buffer; - *glyphX = buffer->nextX; - *glyphY = buffer->nextY; - - buffer->nextX += itemWidth; - - return; - } else if (y + buffer->currentLineMaxHeight + itemHeight <= SHAREDGRAPHICSCACHE_TEXTURE_SIZE) { - // There is space if we resize the buffer, so we do that - int newHeight = qt_next_power_of_two(y + buffer->currentLineMaxHeight + itemHeight); - buffer = resizeBuffer(buffer, QSize(width, newHeight)); - - buffer->nextX = 0; - buffer->nextY += buffer->currentLineMaxHeight; - buffer->currentLineMaxHeight = 0; - - *sharedBuffer = buffer; - *glyphX = buffer->nextX; - *glyphY = buffer->nextY; - - buffer->nextX += itemWidth; - return; - } - - bufferCount++; - ++it; - } - - if (bufferCount == SHAREDGRAPHICSCACHE_MAX_TEXTURES_PER_CACHE) { - // There is no space in any buffer, and there is no space for a new buffer - // recycle an old item - recycleItem(sharedBuffer, glyphX, glyphY); - } else { - // Create a new buffer for the item - *sharedBuffer = createNewBuffer(m_currentCacheId, qt_next_power_of_two(itemHeight)); - if (*sharedBuffer == 0) { - Q_ASSERT(false); - return; - } - - *glyphX = (*sharedBuffer)->nextX; - *glyphY = (*sharedBuffer)->nextY; - - (*sharedBuffer)->nextX += itemWidth; - } -} - -QXcbSharedBufferManager::Buffer *QXcbSharedBufferManager::allocateBuffer(int width, int height) -{ - Buffer *buffer = new Buffer; - buffer->nextX = 0; - buffer->nextY = 0; - buffer->width = width; - buffer->height = height; - buffer->bytesPerPixel = 1; // ### Use pixel format here - - buffer->buffer = new QSharedMemory(QUuid::createUuid().toString()); - bool ok = buffer->buffer->create(buffer->width * buffer->height * buffer->bytesPerPixel, - QSharedMemory::ReadWrite); - if (!ok) { - qWarning("QXcbSharedBufferManager::findAvailableBuffer: Can't create new buffer (%s)", - qPrintable(buffer->buffer->errorString())); - delete buffer; - return 0; - } - qMemSet(buffer->buffer->data(), 0, buffer->buffer->size()); - - m_memoryUsed += buffer->width * buffer->height * buffer->bytesPerPixel; - -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::allocateBuffer: Memory used: %d / %d (%6.2f %%)", - int(m_memoryUsed), int(SHAREDGRAPHICSCACHE_MAX_MEMORY_USED), - 100.0f * float(m_memoryUsed) / float(SHAREDGRAPHICSCACHE_MAX_MEMORY_USED)); -#endif - - return buffer; -} - -void QXcbSharedBufferManager::copyIntoBuffer(Buffer *buffer, - int bufferX, int bufferY, int width, int height, - uchar *data) -{ -#if defined(SHAREDBUFFERMANAGER_DEBUG) - qDebug("QXcbSharedBufferManager::copyIntoBuffer() called for %s (coords: %d, %d)", - buffer->cacheId.constData(), bufferX, bufferY); -#endif - - Q_ASSERT(bufferX >= 0); - Q_ASSERT(bufferX + width <= buffer->width); - Q_ASSERT(bufferY >= 0); - Q_ASSERT(bufferY + height <= buffer->height); - - uchar *dest = reinterpret_cast<uchar *>(buffer->buffer->data()); - dest += bufferX + bufferY * buffer->width; - for (int y=0; y<height; ++y) { - qMemCopy(dest, data, width); - - data += width; - dest += buffer->width; - } -} - -QXcbSharedBufferManager::Items *QXcbSharedBufferManager::itemsForCache(const QByteArray &cacheId) const -{ - Items *items = m_items.value(cacheId); - if (items == 0) { - items = new Items; - items->cacheId = cacheId; - m_items[cacheId] = items; - } - - return items; -} - -QT_END_NAMESPACE - -#endif // QT_USE_XCB_SHARED_GRAPHICS_CACHE diff --git a/src/plugins/platforms/xcb/qxcbsharedbuffermanager.h b/src/plugins/platforms/xcb/qxcbsharedbuffermanager.h deleted file mode 100644 index ca79b502c2..0000000000 --- a/src/plugins/platforms/xcb/qxcbsharedbuffermanager.h +++ /dev/null @@ -1,215 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** 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. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef XCBSHAREDBUFFERMANAGER_H -#define XCBSHAREDBUFFERMANAGER_H - -#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE) - -#include <QtCore/qset.h> -#include <QtCore/qhash.h> -#include <QtCore/qsharedmemory.h> - -#include <GLES2/gl2.h> - -#include <EGL/egl.h> - -#include <EGL/eglext.h> - -class wl_resource; - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -class QXcbSharedBufferManager -{ -public: - struct Buffer { - Buffer() - : width(-1) - , height(-1) - , bytesPerPixel(1) - , nextX(-1) - , nextY(-1) - , currentLineMaxHeight(0) - , next(0) - , prev(0) - , buffer(0) - , textureId(0) - { - } - - ~Buffer() - { - delete buffer; - - if (textureId != 0) - glDeleteTextures(1, &textureId); - } - - QByteArray cacheId; - int width; - int height; - int bytesPerPixel; - int nextX; - int nextY; - int currentLineMaxHeight; - - Buffer *next; - Buffer *prev; - - QSharedMemory *buffer; - - GLuint textureId; - - QAtomicInt ref; - }; - - typedef QHash<QByteArray, QSet<quint32> > PendingItemIds; - - QXcbSharedBufferManager(); - ~QXcbSharedBufferManager(); - - void beginSharedBufferAction(const QByteArray &cacheId); - void insertItem(quint32 itemId, uchar *data, int itemWidth, int itemHeight); - void requestItems(const QSet<quint32> &itemIds); - void releaseItems(const QSet<quint32> &itemIds); - void endSharedBufferAction(); - - void getBufferForItem(const QByteArray &cacheId, quint32 itemId, Buffer **buffer, - int *x, int *y) const; - QPair<QByteArray, int> serializeBuffer(QSharedMemory *buffer) const; - - PendingItemIds pendingItemsInvalidated() const - { - Q_ASSERT_X(m_currentCacheId.isEmpty(), Q_FUNC_INFO, - "Call endSharedBufferAction() before accessing data"); - return m_pendingInvalidatedItems; - } - - PendingItemIds pendingItemsReady() const - { - Q_ASSERT_X(m_currentCacheId.isEmpty(), Q_FUNC_INFO, - "Call endSharedBufferAction() before accessing data"); - return m_pendingReadyItems; - } - - PendingItemIds pendingItemsMissing() const - { - Q_ASSERT_X(m_currentCacheId.isEmpty(), Q_FUNC_INFO, - "Call endSharedBufferAction() before accessing data"); - return m_pendingMissingItems; - } - -private: - struct Item { - Item() - : next(0) - , prev(0) - , buffer(0) - , itemId(0) - , x(-1) - , y(-1) - , width(-1) - , height(-1) - { - } - - Item *next; - Item *prev; - - Buffer *buffer; - quint32 itemId; - int x; - int y; - int width; - int height; - }; - - struct Items - { - Items() : leastRecentlyUsed(0), mostRecentlyUsed(0) {} - - Item *leastRecentlyUsed; - Item *mostRecentlyUsed; - - QByteArray cacheId; - QHash<quint32, Item *> items; - }; - - void findAvailableBuffer(int itemWidth, int itemHeight, Buffer **buffer, int *x, int *y); - void recycleItem(Buffer **buffer, int *x, int *y); - void copyIntoBuffer(Buffer *buffer, int x, int y, int itemWidth, int itemHeight, uchar *data); - void touchBuffer(Buffer *buffer); - void deleteLeastRecentlyUsed(); - - Buffer *createNewBuffer(const QByteArray &cacheId, int heightRequired); - Buffer *resizeBuffer(Buffer *buffer, const QSize &newSize); - Buffer *allocateBuffer(int width, int height); - - Items *itemsForCache(const QByteArray &cacheId) const; - void pushItemToBack(Items *items, Item *item); - void touchItem(Items *items, Item *item); - void deleteItem(Items *items, Item *item); - void recycleItem(const QByteArray &cacheId, Buffer **sharedBuffer, int *glyphX, int *glyphY); - - QByteArray m_currentCacheId; - - quint32 m_memoryUsed; - Buffer *m_mostRecentlyUsed; - Buffer *m_leastRecentlyUsed; - - mutable QHash<QByteArray, Items *> m_items; - QMultiHash<QByteArray, Buffer *> m_buffers; - - PendingItemIds m_pendingInvalidatedItems; - PendingItemIds m_pendingReadyItems; - PendingItemIds m_pendingMissingItems; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QT_USE_XCB_SHARED_GRAPHICS_CACHE - -#endif // XCBSHAREDBUFFERMANAGER_H diff --git a/src/plugins/platforms/xcb/qxcbsharedgraphicscache.cpp b/src/plugins/platforms/xcb/qxcbsharedgraphicscache.cpp deleted file mode 100644 index fa937504ad..0000000000 --- a/src/plugins/platforms/xcb/qxcbsharedgraphicscache.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** 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. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE) - -#include "qxcbsharedgraphicscache.h" -#include "qxcbsharedbuffermanager.h" - -#include <QtCore/qsharedmemory.h> - -#include <QtGui/qopenglcontext.h> -#include <QtGui/qscreen.h> - -#define GL_GLEXT_PROTOTYPES -#include <GLES2/gl2ext.h> - -#define SHAREDGRAPHICSCACHE_DEBUG 1 - -QT_BEGIN_NAMESPACE - -QXcbSharedGraphicsCache::QXcbSharedGraphicsCache(QObject *parent) - : QPlatformSharedGraphicsCache(parent) - , m_bufferManager(new QXcbSharedBufferManager) -{ -} - -void QXcbSharedGraphicsCache::requestItems(const QByteArray &cacheId, - const QVector<quint32> &itemIds) -{ - m_bufferManager->beginSharedBufferAction(cacheId); - - QSet<quint32> itemsForRequest; - for (int i=0; i<itemIds.size(); ++i) - itemsForRequest.insert(itemIds.at(i)); - - m_bufferManager->requestItems(itemsForRequest); - m_bufferManager->endSharedBufferAction(); - - processPendingItems(); -} - -void QXcbSharedGraphicsCache::insertItems(const QByteArray &cacheId, - const QVector<quint32> &itemIds, - const QVector<QImage> &items) -{ - m_bufferManager->beginSharedBufferAction(cacheId); - - QSet<quint32> itemsForRequest; - for (int i=0; i<itemIds.size(); ++i) { - QImage image = items.at(i); - m_bufferManager->insertItem(itemIds.at(i), image.bits(), image.width(), image.height()); - itemsForRequest.insert(itemIds.at(i)); - } - - // ### To avoid loops, we could check missing items here and notify the client - m_bufferManager->requestItems(itemsForRequest); - - m_bufferManager->endSharedBufferAction(); - - processPendingItems(); -} - -void QXcbSharedGraphicsCache::ensureCacheInitialized(const QByteArray &cacheId, - BufferType bufferType, - PixelFormat pixelFormat) -{ - Q_UNUSED(cacheId); - Q_UNUSED(bufferType); - Q_UNUSED(pixelFormat); -} - - -void QXcbSharedGraphicsCache::releaseItems(const QByteArray &cacheId, - const QVector<quint32> &itemIds) -{ - m_bufferManager->beginSharedBufferAction(cacheId); - - QSet<quint32> itemsToRelease; - for (int i=0; i<itemIds.size(); ++i) - itemsToRelease.insert(itemIds.at(i)); - - m_bufferManager->releaseItems(itemsToRelease); - - m_bufferManager->endSharedBufferAction(); - - processPendingItems(); -} - -void QXcbSharedGraphicsCache::serializeBuffer(void *bufferId, - QByteArray *serializedData, - int *fileDescriptor) const -{ - QXcbSharedBufferManager::Buffer *buffer = - reinterpret_cast<QXcbSharedBufferManager::Buffer *>(bufferId); - - QPair<QByteArray, int> bufferName = m_bufferManager->serializeBuffer(buffer->buffer); - - *serializedData = bufferName.first; - *fileDescriptor = bufferName.second; -} - -GLuint QXcbSharedGraphicsCache::textureIdForBuffer(void *bufferId) -{ -# if defined(SHAREDGRAPHICSCACHE_DEBUG) - qDebug("QXcbSharedGraphicsCache::textureIdForBuffer"); -# endif - - QXcbSharedBufferManager::Buffer *buffer = - reinterpret_cast<QXcbSharedBufferManager::Buffer *>(bufferId); - - if (buffer->textureId == 0) { - glGenTextures(1, &buffer->textureId); - if (buffer->textureId == 0) { - qWarning("QXcbSharedGraphicsCache::textureIdForBuffer: Failed to generate texture (gl error: 0x%x)", - glGetError()); - return 0; - } - - glBindTexture(GL_TEXTURE_2D, buffer->textureId); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - } - - glBindTexture(GL_TEXTURE_2D, buffer->textureId); - glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, buffer->width, buffer->height, 0, GL_ALPHA, - GL_UNSIGNED_BYTE, buffer->buffer->data()); - glBindTexture(GL_TEXTURE_2D, 0); - - return buffer->textureId; -} - -void QXcbSharedGraphicsCache::referenceBuffer(void *bufferId) -{ - QXcbSharedBufferManager::Buffer *buffer = - reinterpret_cast<QXcbSharedBufferManager::Buffer *>(bufferId); - - buffer->ref.ref(); -} - -bool QXcbSharedGraphicsCache::dereferenceBuffer(void *bufferId) -{ - QXcbSharedBufferManager::Buffer *buffer = - reinterpret_cast<QXcbSharedBufferManager::Buffer *>(bufferId); - - if (buffer->ref.deref()) - return true; - - if (buffer->textureId != 0) { - glDeleteTextures(1, &buffer->textureId); - buffer->textureId = 0; - } - - return false; -} - -void QXcbSharedGraphicsCache::processPendingItems() -{ -# if defined(SHAREDGRAPHICSCACHE_DEBUG) - qDebug("QXcbSharedGraphicsCache::processPendingItems"); -# endif - - { - QXcbSharedBufferManager::PendingItemIds pendingMissingItems = m_bufferManager->pendingItemsMissing(); - QXcbSharedBufferManager::PendingItemIds::const_iterator it; - - - for (it = pendingMissingItems.constBegin(); it != pendingMissingItems.constEnd(); ++it) { - QVector<quint32> missingItems; - - const QSet<quint32> &items = it.value(); - QSet<quint32>::const_iterator itemIt; - for (itemIt = items.constBegin(); itemIt != items.constEnd(); ++itemIt) - missingItems.append(*itemIt); - -# if defined(SHAREDGRAPHICSCACHE_DEBUG) - qDebug("QXcbSharedGraphicsCache::processPendingItems: %d missing items", - missingItems.size()); -# endif - - if (!missingItems.isEmpty()) - emit itemsMissing(it.key(), missingItems); - } - } - - { - QXcbSharedBufferManager::PendingItemIds pendingInvalidatedItems = m_bufferManager->pendingItemsInvalidated(); - QXcbSharedBufferManager::PendingItemIds::const_iterator it; - - for (it = pendingInvalidatedItems.constBegin(); it != pendingInvalidatedItems.constEnd(); ++it) { - QVector<quint32> invalidatedItems; - - const QSet<quint32> &items = it.value(); - QSet<quint32>::const_iterator itemIt; - for (itemIt = items.constBegin(); itemIt != items.constEnd(); ++itemIt) - invalidatedItems.append(*itemIt); - -# if defined(SHAREDGRAPHICSCACHE_DEBUG) - qDebug("QXcbSharedGraphicsCache::processPendingItems: %d invalidated items", - invalidatedItems.size()); -# endif - - if (!invalidatedItems.isEmpty()) - emit itemsInvalidated(it.key(), invalidatedItems); - } - } - - { - QXcbSharedBufferManager::PendingItemIds pendingReadyItems = m_bufferManager->pendingItemsReady(); - QXcbSharedBufferManager::PendingItemIds::const_iterator it; - - for (it = pendingReadyItems.constBegin(); it != pendingReadyItems.constEnd(); ++it) { - QHash<QXcbSharedBufferManager::Buffer *, ReadyItem> readyItemsForBuffer; - const QSet<quint32> &items = it.value(); - - QByteArray cacheId = it.key(); - - QSet<quint32>::const_iterator itemIt; - for (itemIt = items.constBegin(); itemIt != items.constEnd(); ++itemIt) { - QXcbSharedBufferManager::Buffer *buffer; - int x = -1; - int y = -1; - - m_bufferManager->getBufferForItem(cacheId, *itemIt, &buffer, &x, &y); - - readyItemsForBuffer[buffer].itemIds.append(*itemIt); - readyItemsForBuffer[buffer].positions.append(QPoint(x, y)); - } - - QHash<QXcbSharedBufferManager::Buffer*, ReadyItem>::iterator readyItemIt - = readyItemsForBuffer.begin(); - while (readyItemIt != readyItemsForBuffer.end()) { - QXcbSharedBufferManager::Buffer *buffer = readyItemIt.key(); - if (!readyItemIt.value().itemIds.isEmpty()) { -# if defined(SHAREDGRAPHICSCACHE_DEBUG) - qDebug("QXcbSharedGraphicsCache::processPendingItems: %d ready items", - readyItemIt.value().itemIds.size()); -# endif - - emit itemsAvailable(cacheId, buffer, QSize(buffer->width, buffer->height), - readyItemIt.value().itemIds, readyItemIt.value().positions); - } - ++readyItemIt; - } - } - } -} - -QT_END_NAMESPACE - -#endif // QT_USE_XCB_SHARED_GRAPHICS_CACHE diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 3e63ab0f27..458ba8f07f 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -398,12 +398,14 @@ void QXcbWindow::setGeometry(const QRect &rect) propagateSizeHints(); const quint32 mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT; - const quint32 values[] = { rect.x(), - rect.y(), - qBound(1, rect.width(), XCOORD_MAX), - qBound(1, rect.height(), XCOORD_MAX) }; + const qint32 values[] = { + qBound<qint32>(-XCOORD_MAX, rect.x(), XCOORD_MAX), + qBound<qint32>(-XCOORD_MAX, rect.y(), XCOORD_MAX), + qBound<qint32>(1, rect.width(), XCOORD_MAX), + qBound<qint32>(1, rect.height(), XCOORD_MAX), + }; - Q_XCB_CALL(xcb_configure_window(xcb_connection(), m_window, mask, values)); + Q_XCB_CALL(xcb_configure_window(xcb_connection(), m_window, mask, reinterpret_cast<const quint32*>(values))); xcb_flush(xcb_connection()); } @@ -551,7 +553,7 @@ void QXcbWindow::show() updateNetWmStateBeforeMap(); } - if (connection()->time() != CurrentTime) + if (connection()->time() != XCB_TIME_CURRENT_TIME) updateNetWmUserTime(connection()->time()); Q_XCB_CALL(xcb_map_window(xcb_connection(), m_window)); @@ -1300,6 +1302,7 @@ void QXcbWindow::handleClientMessageEvent(const xcb_client_message_event_t *even connection()->drag()->handleLeave(window(), event); } else if (event->type == atom(QXcbAtom::XdndDrop)) { connection()->drag()->handleDrop(window(), event); + } else if (event->type == atom(QXcbAtom::_XEMBED)) { // QSystemTrayIcon } else { qWarning() << "QXcbWindow: Unhandled client message:" << connection()->atomName(event->type); } diff --git a/src/plugins/platforms/xcb/xcb.pro b/src/plugins/platforms/xcb/xcb.pro index d220766be0..0da5fb1674 100644 --- a/src/plugins/platforms/xcb/xcb.pro +++ b/src/plugins/platforms/xcb/xcb.pro @@ -20,9 +20,7 @@ SOURCES = \ main.cpp \ qxcbnativeinterface.cpp \ qxcbcursor.cpp \ - qxcbimage.cpp \ - qxcbsharedbuffermanager.cpp \ - qxcbsharedgraphicscache.cpp + qxcbimage.cpp HEADERS = \ qxcbclipboard.h \ @@ -38,9 +36,7 @@ HEADERS = \ qxcbwmsupport.h \ qxcbnativeinterface.h \ qxcbcursor.h \ - qxcbimage.h \ - qxcbsharedbuffermanager.h \ - qxcbsharedgraphicscache.h + qxcbimage.h contains(QT_CONFIG, xcb-poll-for-queued-event) { DEFINES += XCB_POLL_FOR_QUEUED_EVENT @@ -91,10 +87,11 @@ contains(DEFINES, XCB_USE_DRI2) { DEFINES += XCB_USE_GLX HEADERS += qglxintegration.h SOURCES += qglxintegration.cpp + LIBS += $$QMAKE_LIBS_DYNLOAD } } -LIBS += -lxcb -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-sync -lxcb-xfixes -lxcb-shape +LIBS += -lxcb -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-sync -lxcb-xfixes -lxcb-shape -lxcb-shm DEFINES += $$QMAKE_DEFINES_XCB LIBS += $$QMAKE_LIBS_XCB diff --git a/src/plugins/printsupport/windows/qwindowsprintersupport.cpp b/src/plugins/printsupport/windows/qwindowsprintersupport.cpp index c5c60ae5cc..476889890d 100644 --- a/src/plugins/printsupport/windows/qwindowsprintersupport.cpp +++ b/src/plugins/printsupport/windows/qwindowsprintersupport.cpp @@ -59,7 +59,9 @@ QWindowsPrinterSupport::QWindowsPrinterSupport() if (EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, buffer, needed, &needed, &returned)) { PPRINTER_INFO_4 infoList = reinterpret_cast<PPRINTER_INFO_4>(buffer); QString defaultPrinterName; - QWin32PrintEngine::queryDefaultPrinter(defaultPrinterName, QString(), QString()); + QString program; + QString port; + QWin32PrintEngine::queryDefaultPrinter(defaultPrinterName, program, port); for (uint i = 0; i < returned; ++i) { QString printerName(QString::fromWCharArray(infoList[i].pPrinterName)); diff --git a/src/printsupport/kernel/qprinterinfo_unix.cpp b/src/printsupport/kernel/qprinterinfo_unix.cpp index ae0885c0f4..241986d9e8 100644 --- a/src/printsupport/kernel/qprinterinfo_unix.cpp +++ b/src/printsupport/kernel/qprinterinfo_unix.cpp @@ -847,6 +847,8 @@ QList<QPrinter::PaperSize> qt_getCupsPrinterPaperSizes(int cupsPrinterIndex) for (int j = 0; j < size->num_choices; ++j) result.append(string2PaperSize(size->choices[j].choice)); } +#else + Q_UNUSED(cupsPrinterIndex) #endif return result; } diff --git a/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp b/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp index 2029147ecf..66a59b56ec 100644 --- a/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp +++ b/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp @@ -46,6 +46,7 @@ #include <QList> #include <QBuffer> #include <QRegExp> +#include <QVector> #include <stdio.h> #include <stdlib.h> @@ -94,7 +95,7 @@ static const char help[] = "\n"; -int qDBusParametersForMethod(const FunctionDef &mm, QList<int>& metaTypes) +int qDBusParametersForMethod(const FunctionDef &mm, QVector<int>& metaTypes) { QList<QByteArray> parameterTypes; @@ -138,7 +139,7 @@ static QString addFunction(const FunctionDef &mm, bool isSignal = false) { } } QList<ArgumentDef> names = mm.arguments; - QList<int> types; + QVector<int> types; int inputCount = qDBusParametersForMethod(mm, types); if (inputCount == -1) return QString(); // invalid form diff --git a/src/widgets/accessible/qaccessiblewidget.cpp b/src/widgets/accessible/qaccessiblewidget.cpp index 790b51102c..ae050ac643 100644 --- a/src/widgets/accessible/qaccessiblewidget.cpp +++ b/src/widgets/accessible/qaccessiblewidget.cpp @@ -557,6 +557,8 @@ QAccessible::State QAccessibleWidget::state() const state.movable = true; if (w->minimumSize() != w->maximumSize()) state.sizeable = true; + if (w->isActiveWindow()) + state.active = true; } return state; diff --git a/src/widgets/itemviews/qdirmodel.cpp b/src/widgets/itemviews/qdirmodel.cpp index 490c272e39..6ecf3c75aa 100644 --- a/src/widgets/itemviews/qdirmodel.cpp +++ b/src/widgets/itemviews/qdirmodel.cpp @@ -1162,7 +1162,6 @@ QFileInfo QDirModel::fileInfo(const QModelIndex &index) const void QDirModelPrivate::init() { - Q_Q(QDirModel); filters = QDir::AllEntries | QDir::NoDotAndDotDot; sort = QDir::Name; nameFilters << QLatin1String("*"); diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index ce57e2868d..2615ac891d 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -3014,34 +3014,14 @@ bool QApplication::notify(QObject *receiver, QEvent *e) // capture the current mouse/keyboard state if(e->spontaneous()) { - if (e->type() == QEvent::KeyPress - || e->type() == QEvent::KeyRelease) { - QKeyEvent *ke = static_cast<QKeyEvent*>(e); - QApplicationPrivate::modifier_buttons = ke->modifiers(); - } else if(e->type() == QEvent::MouseButtonPress + if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease) { QMouseEvent *me = static_cast<QMouseEvent*>(e); - QApplicationPrivate::modifier_buttons = me->modifiers(); if(me->type() == QEvent::MouseButtonPress) QApplicationPrivate::mouse_buttons |= me->button(); else QApplicationPrivate::mouse_buttons &= ~me->button(); } -#if !defined(QT_NO_WHEELEVENT) || !defined(QT_NO_TABLETEVENT) - else if (false -# ifndef QT_NO_WHEELEVENT - || e->type() == QEvent::Wheel -# endif -# ifndef QT_NO_TABLETEVENT - || e->type() == QEvent::TabletMove - || e->type() == QEvent::TabletPress - || e->type() == QEvent::TabletRelease -# endif - ) { - QInputEvent *ie = static_cast<QInputEvent*>(e); - QApplicationPrivate::modifier_buttons = ie->modifiers(); - } -#endif // !QT_NO_WHEELEVENT || !QT_NO_TABLETEVENT } #ifndef QT_NO_GESTURES diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp index aa7ccfeb4f..4723901625 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa.cpp +++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp @@ -96,8 +96,14 @@ bool QWidgetWindow::event(QEvent *event) // these should not be sent to QWidget, the corresponding events // are sent by QApplicationPrivate::notifyActiveWindowChange() case QEvent::FocusIn: - case QEvent::FocusOut: - return false; + case QEvent::FocusOut: { +#ifndef QT_NO_ACCESSIBILITY + QAccessible::State state; + state.active = true; + QAccessibleStateChangeEvent ev(widget(), state); + QAccessible::updateAccessibility(&ev); +#endif + return false; } case QEvent::FocusAboutToChange: if (QApplicationPrivate::focus_widget) { diff --git a/src/widgets/util/qsystemtrayicon_p.h b/src/widgets/util/qsystemtrayicon_p.h index cf7d794696..f7344df19c 100644 --- a/src/widgets/util/qsystemtrayicon_p.h +++ b/src/widgets/util/qsystemtrayicon_p.h @@ -122,62 +122,6 @@ private: int timerId; }; -#if defined(Q_WS_X11) -QT_BEGIN_INCLUDE_NAMESPACE -#include <QtCore/qcoreapplication.h> -#include <X11/Xlib.h> -#include <X11/Xatom.h> -#include <X11/Xutil.h> -QT_END_INCLUDE_NAMESPACE - -class QSystemTrayIconSys : public QWidget -{ - friend class QSystemTrayIconPrivate; - -public: - QSystemTrayIconSys(QSystemTrayIcon *q); - ~QSystemTrayIconSys(); - enum { - SYSTEM_TRAY_REQUEST_DOCK = 0, - SYSTEM_TRAY_BEGIN_MESSAGE = 1, - SYSTEM_TRAY_CANCEL_MESSAGE =2 - }; - - void addToTray(); - void updateIcon(); - XVisualInfo* getSysTrayVisualInfo(); - - // QObject::event is public but QWidget's ::event() re-implementation - // is protected ;( - inline bool deliverToolTipEvent(QEvent *e) - { return QWidget::event(e); } - - static Window sysTrayWindow; - static QList<QSystemTrayIconSys *> trayIcons; - static QCoreApplication::EventFilter oldEventFilter; - static bool sysTrayTracker(void *message, long *result); - static Window locateSystemTray(); - static Atom sysTraySelection; - static XVisualInfo sysTrayVisual; - -protected: - void paintEvent(QPaintEvent *pe); - void resizeEvent(QResizeEvent *re); - bool x11Event(XEvent *event); - void mousePressEvent(QMouseEvent *event); - void mouseDoubleClickEvent(QMouseEvent *event); -#ifndef QT_NO_WHEELEVENT - void wheelEvent(QWheelEvent *event); -#endif - bool event(QEvent *e); - -private: - QPixmap background; - QSystemTrayIcon *q; - Colormap colormap; -}; -#endif // Q_WS_X11 - QT_END_NAMESPACE #endif // QT_NO_SYSTEMTRAYICON diff --git a/src/widgets/util/qsystemtrayicon_x11.cpp b/src/widgets/util/qsystemtrayicon_x11.cpp index c5071b339d..174c39d1f6 100644 --- a/src/widgets/util/qsystemtrayicon_x11.cpp +++ b/src/widgets/util/qsystemtrayicon_x11.cpp @@ -39,9 +39,7 @@ ** ****************************************************************************/ -#include "private/qt_x11_p.h" #include "qlabel.h" -#include "qx11info_x11.h" #include "qpainter.h" #include "qpixmap.h" #include "qbitmap.h" @@ -52,236 +50,165 @@ #include "qtimer.h" #include "qsystemtrayicon_p.h" #include "qpaintengine.h" +#include <qwindow.h> +#include <qguiapplication.h> +#include <qscreen.h> +#include <qbackingstore.h> +#include <qplatformnativeinterface_qpa.h> +#include <qdebug.h> + +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xos.h> +#include <X11/Xatom.h> #ifndef QT_NO_SYSTEMTRAYICON QT_BEGIN_NAMESPACE -Window QSystemTrayIconSys::sysTrayWindow = XNone; -QList<QSystemTrayIconSys *> QSystemTrayIconSys::trayIcons; -QCoreApplication::EventFilter QSystemTrayIconSys::oldEventFilter = 0; -Atom QSystemTrayIconSys::sysTraySelection = XNone; -XVisualInfo QSystemTrayIconSys::sysTrayVisual = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +enum { + SYSTEM_TRAY_REQUEST_DOCK = 0, + SYSTEM_TRAY_BEGIN_MESSAGE = 1, + SYSTEM_TRAY_CANCEL_MESSAGE =2 +}; -// Locate the system tray -Window QSystemTrayIconSys::locateSystemTray() +// ### fixme (15.3.2012): The following issues need to be resolved: +// - Tracking of the actual tray window for DestroyNotify and re-creation +// of the icons on the new window should it change (see Qt 4.X). + +// Global context for the X11 system tray containing a display for the primary +// screen and a selection atom from which the tray window can be determined. +class QX11SystemTrayContext { - Display *display = QX11Info::display(); - if (sysTraySelection == XNone) { - int screen = QX11Info::appScreen(); - QString net_sys_tray = QString::fromLatin1("_NET_SYSTEM_TRAY_S%1").arg(screen); - sysTraySelection = XInternAtom(display, net_sys_tray.toLatin1(), False); - } +public: + QX11SystemTrayContext(); + ~QX11SystemTrayContext(); - return XGetSelectionOwner(QX11Info::display(), sysTraySelection); -} + bool isValid() const { return m_systemTraySelection != 0; } -XVisualInfo* QSystemTrayIconSys::getSysTrayVisualInfo() -{ - Display *display = QX11Info::display(); - - if (!sysTrayVisual.visual) { - Window win = locateSystemTray(); - if (win != XNone) { - Atom actual_type; - int actual_format; - ulong nitems, bytes_remaining; - uchar *data = 0; - int result = XGetWindowProperty(display, win, ATOM(_NET_SYSTEM_TRAY_VISUAL), 0, 1, - False, XA_VISUALID, &actual_type, - &actual_format, &nitems, &bytes_remaining, &data); - VisualID vid = 0; - if (result == Success && data && actual_type == XA_VISUALID && actual_format == 32 && - nitems == 1 && bytes_remaining == 0) - vid = *(VisualID*)data; - if (data) - XFree(data); - if (vid == 0) - return 0; - - uint mask = VisualIDMask; - XVisualInfo *vi, rvi; - int count; - rvi.visualid = vid; - vi = XGetVisualInfo(display, mask, &rvi, &count); - if (vi) { - sysTrayVisual = vi[0]; - XFree((char*)vi); - } - if (sysTrayVisual.depth != 32) - memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); - } - } + inline Display *display() const { return m_display; } + inline int screenNumber() const { return m_screenNumber; } + Window locateSystemTray() const; - return sysTrayVisual.visual ? &sysTrayVisual : 0; -} +private: + Display *m_display; + int m_screenNumber; + Atom m_systemTraySelection; +}; -bool QSystemTrayIconSys::sysTrayTracker(void *message, long *result) +QX11SystemTrayContext::QX11SystemTrayContext() : m_display(0), m_screenNumber(0), m_systemTraySelection(0) { - bool retval = false; - if (QSystemTrayIconSys::oldEventFilter) - retval = QSystemTrayIconSys::oldEventFilter(message, result); - - if (trayIcons.isEmpty()) - return retval; - - Display *display = QX11Info::display(); - XEvent *ev = (XEvent *)message; - if (ev->type == DestroyNotify && ev->xany.window == sysTrayWindow) { - sysTrayWindow = locateSystemTray(); - memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); - for (int i = 0; i < trayIcons.count(); i++) { - if (sysTrayWindow == XNone) { - QBalloonTip::hideBalloon(); - trayIcons[i]->hide(); // still no luck - trayIcons[i]->destroy(); - trayIcons[i]->create(); - } else - trayIcons[i]->addToTray(); // add it to the new tray - } - retval = true; - } else if (ev->type == ClientMessage && sysTrayWindow == XNone) { - static Atom manager_atom = XInternAtom(display, "MANAGER", False); - XClientMessageEvent *cm = (XClientMessageEvent *)message; - if ((cm->message_type == manager_atom) && ((Atom)cm->data.l[1] == sysTraySelection)) { - sysTrayWindow = cm->data.l[2]; - memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); - XSelectInput(display, sysTrayWindow, StructureNotifyMask); - for (int i = 0; i < trayIcons.count(); i++) { - trayIcons[i]->addToTray(); - } - retval = true; - } - } else if (ev->type == PropertyNotify && ev->xproperty.atom == ATOM(_NET_SYSTEM_TRAY_VISUAL) && - ev->xproperty.window == sysTrayWindow) { - memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); - for (int i = 0; i < trayIcons.count(); i++) { - trayIcons[i]->addToTray(); - } + QScreen *screen = QGuiApplication::primaryScreen(); + if (!screen) { + qWarning("%s: No screen.", Q_FUNC_INFO); + return; + } + // Open display using screen name and retrieve screen number from "hostname:0.0" + const QByteArray name = screen->name().toLocal8Bit(); + const int dotPos = name.lastIndexOf('.'); + if (dotPos != -1) { + bool ok; + const int n = name.mid(dotPos + 1).toInt(&ok); + if (ok) + m_screenNumber = n; + } + m_display = XOpenDisplay(name.constData()); + if (!m_display) { + qWarning("%s: Cannot open display '%s'.", Q_FUNC_INFO, name.constData()); + return; } - return retval; + const QByteArray netSysTray = "_NET_SYSTEM_TRAY_S" + QByteArray::number(m_screenNumber); + m_systemTraySelection = XInternAtom(m_display, netSysTray.constData(), False); + if (!m_systemTraySelection) { + qWarning("%s: Unable to retrieve atom '%s'.", Q_FUNC_INFO, netSysTray.constData()); + return; + } } -QSystemTrayIconSys::QSystemTrayIconSys(QSystemTrayIcon *q) - : QWidget(0, Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint), - q(q), colormap(0) +Window QX11SystemTrayContext::locateSystemTray() const { - setAttribute(Qt::WA_AlwaysShowToolTips); - setAttribute(Qt::WA_QuitOnClose, false); - setAttribute(Qt::WA_NoSystemBackground, true); - setAttribute(Qt::WA_PaintOnScreen); - - static bool eventFilterAdded = false; - Display *display = QX11Info::display(); - if (!eventFilterAdded) { - oldEventFilter = qApp->setEventFilter(sysTrayTracker); - eventFilterAdded = true; - Window root = QX11Info::appRootWindow(); - XWindowAttributes attr; - XGetWindowAttributes(display, root, &attr); - if ((attr.your_event_mask & StructureNotifyMask) != StructureNotifyMask) { - (void) QApplication::desktop(); // lame trick to ensure our event mask is not overridden - XSelectInput(display, root, attr.your_event_mask | StructureNotifyMask); // for MANAGER selection - } - } - if (trayIcons.isEmpty()) { - sysTrayWindow = locateSystemTray(); - if (sysTrayWindow != XNone) - XSelectInput(display, sysTrayWindow, StructureNotifyMask); // track tray events - } - trayIcons.append(this); - setMouseTracking(true); -#ifndef QT_NO_TOOLTIP - setToolTip(q->toolTip()); -#endif - if (sysTrayWindow != XNone) - addToTray(); + if (isValid()) + return XGetSelectionOwner(m_display, m_systemTraySelection); + return 0; } -QSystemTrayIconSys::~QSystemTrayIconSys() +QX11SystemTrayContext::~QX11SystemTrayContext() { - trayIcons.removeAt(trayIcons.indexOf(this)); - Display *display = QX11Info::display(); - if (trayIcons.isEmpty()) { - if (sysTrayWindow == XNone) - return; - if (display) - XSelectInput(display, sysTrayWindow, 0); // stop tracking the tray - sysTrayWindow = XNone; - } - if (colormap) - XFreeColormap(display, colormap); + if (m_display) + XCloseDisplay(m_display); } -void QSystemTrayIconSys::addToTray() +Q_GLOBAL_STATIC(QX11SystemTrayContext, qX11SystemTrayContext) + +// System tray widget. Could be replaced by a QWindow with +// a backing store if it did not need tooltip handling. +class QSystemTrayIconSys : public QWidget { - Q_ASSERT(sysTrayWindow != XNone); - Display *display = QX11Info::display(); - - XVisualInfo *vi = getSysTrayVisualInfo(); - if (vi && vi->visual) { - Window root = RootWindow(display, vi->screen); - Window p = root; - if (QWidget *pw = parentWidget()) - p = pw->effectiveWinId(); - colormap = XCreateColormap(display, root, vi->visual, AllocNone); - XSetWindowAttributes wsa; - wsa.background_pixmap = 0; - wsa.colormap = colormap; - wsa.background_pixel = 0; - wsa.border_pixel = 0; - Window wid = XCreateWindow(display, p, -1, -1, 1, 1, - 0, vi->depth, InputOutput, vi->visual, - CWBackPixmap|CWBackPixel|CWBorderPixel|CWColormap, &wsa); - create(wid); - } else { - XSetWindowBackgroundPixmap(display, winId(), ParentRelative); - } +public: + explicit QSystemTrayIconSys(QSystemTrayIcon *q); + + inline void updateIcon() { update(); } + inline QSystemTrayIcon *systemTrayIcon() const { return q; } + + QRect globalGeometry() const; + +protected: + virtual void mousePressEvent(QMouseEvent *ev); + virtual void mouseDoubleClickEvent(QMouseEvent *ev); + virtual bool event(QEvent *); + virtual void paintEvent(QPaintEvent *); - // GNOME, NET WM Specification +private: + QSystemTrayIcon *q; +}; + +QSystemTrayIconSys::QSystemTrayIconSys(QSystemTrayIcon *qIn) : + q(qIn) +{ + setToolTip(q->toolTip()); + QX11SystemTrayContext *context = qX11SystemTrayContext(); + Q_ASSERT(context->isValid()); + setAttribute(Qt::WA_AlwaysShowToolTips, true); + setAttribute(Qt::WA_TranslucentBackground, true); + setAttribute(Qt::WA_QuitOnClose, false); + setWindowFlags(Qt::Window | Qt::FramelessWindowHint); + const QSize size(22, 22); // Gnome, standard size + setGeometry(QRect(QPoint(0, 0), size)); + setMinimumSize(size); + createWinId(); + setMouseTracking(true); + + Display *display = context->display(); + + // Request to be a tray window according to GNOME, NET WM Specification static Atom netwm_tray_atom = XInternAtom(display, "_NET_SYSTEM_TRAY_OPCODE", False); long l[5] = { CurrentTime, SYSTEM_TRAY_REQUEST_DOCK, winId(), 0, 0 }; XEvent ev; memset(&ev, 0, sizeof(ev)); ev.xclient.type = ClientMessage; - ev.xclient.window = sysTrayWindow; + ev.xclient.window = context->locateSystemTray(); ev.xclient.message_type = netwm_tray_atom; ev.xclient.format = 32; memcpy((char *)&ev.xclient.data, (const char *) l, sizeof(l)); - XSendEvent(display, sysTrayWindow, False, 0, &ev); - setMinimumSize(22, 22); // required at least on GNOME -} - -void QSystemTrayIconSys::updateIcon() -{ - update(); + XSendEvent(display, ev.xclient.window, False, 0, &ev); + XSync(display, False); + show(); } -void QSystemTrayIconSys::resizeEvent(QResizeEvent *re) +QRect QSystemTrayIconSys::globalGeometry() const { - QWidget::resizeEvent(re); - updateIcon(); + QX11SystemTrayContext *context = qX11SystemTrayContext(); + ::Window dummy; + int x, y, rootX, rootY; + unsigned int width, height, border, depth; + // Use X11 API since we are parented on the tray, about which the QWindow does not know. + XGetGeometry(context->display(), winId(), &dummy, &x, &y, &width, &height, &border, &depth); + XTranslateCoordinates(context->display(), winId(), + XRootWindow(context->display(), context->screenNumber()), + x, y, &rootX, &rootY, &dummy); + return QRect(QPoint(rootX, rootY), QSize(width, height)); } -void QSystemTrayIconSys::paintEvent(QPaintEvent*) -{ - QPainter p(this); - if (!getSysTrayVisualInfo()) { - const QRegion oldSystemClip = p.paintEngine()->systemClip(); - const QRect clearedRect = oldSystemClip.boundingRect(); - XClearArea(QX11Info::display(), winId(), clearedRect.x(), clearedRect.y(), - clearedRect.width(), clearedRect.height(), False); - QPaintEngine *pe = p.paintEngine(); - pe->setSystemClip(clearedRect); - q->icon().paint(&p, rect()); - pe->setSystemClip(oldSystemClip); - } else { - p.setCompositionMode(QPainter::CompositionMode_Source); - p.fillRect(rect(), Qt::transparent); - p.setCompositionMode(QPainter::CompositionMode_SourceOver); - q->icon().paint(&p, rect()); - } -} void QSystemTrayIconSys::mousePressEvent(QMouseEvent *ev) { @@ -308,41 +235,45 @@ void QSystemTrayIconSys::mouseDoubleClickEvent(QMouseEvent *ev) emit q->activated(QSystemTrayIcon::DoubleClick); } -#ifndef QT_NO_WHEELEVENT -void QSystemTrayIconSys::wheelEvent(QWheelEvent *e) -{ - QApplication::sendEvent(q, e); -} -#endif - bool QSystemTrayIconSys::event(QEvent *e) { - if (e->type() == QEvent::ToolTip) { + switch (e->type()) { +#ifndef QT_NO_WHEELEVENT + case QEvent::Wheel: return QApplication::sendEvent(q, e); +#endif + default: + break; } return QWidget::event(e); } -bool QSystemTrayIconSys::x11Event(XEvent *event) +void QSystemTrayIconSys::paintEvent(QPaintEvent *) { - if (event->type == ReparentNotify) - show(); - return QWidget::x11Event(event); + // Note: Transparent pixels require a particular Visual which XCB + // currently does not support yet. + const QRect rect(QPoint(0, 0), geometry().size()); + QPainter painter(this); + painter.setCompositionMode(QPainter::CompositionMode_Source); + painter.fillRect(rect, Qt::transparent); + painter.setCompositionMode(QPainter::CompositionMode_SourceOver); + q->icon().paint(&painter, rect); } //////////////////////////////////////////////////////////////////////////// + void QSystemTrayIconPrivate::install_sys() { Q_Q(QSystemTrayIcon); - if (!sys) + if (!sys && qX11SystemTrayContext()->isValid()) sys = new QSystemTrayIconSys(q); } QRect QSystemTrayIconPrivate::geometry_sys() const { if (!sys) - return QRect(); - return QRect(sys->mapToGlobal(QPoint(0, 0)), sys->size()); + return QRect(); + return sys->globalGeometry(); } void QSystemTrayIconPrivate::remove_sys() @@ -357,9 +288,8 @@ void QSystemTrayIconPrivate::remove_sys() void QSystemTrayIconPrivate::updateIcon_sys() { - if (!sys) - return; - sys->updateIcon(); + if (sys) + sys->updateIcon(); } void QSystemTrayIconPrivate::updateMenu_sys() @@ -378,7 +308,10 @@ void QSystemTrayIconPrivate::updateToolTip_sys() bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys() { - return QSystemTrayIconSys::locateSystemTray() != XNone; + const QString platform = QGuiApplication::platformName(); + if (platform.compare(QStringLiteral("xcb"), Qt::CaseInsensitive) == 0) + return qX11SystemTrayContext()->locateSystemTray() != None; + return false; } bool QSystemTrayIconPrivate::supportsMessages_sys() @@ -391,8 +324,8 @@ void QSystemTrayIconPrivate::showMessage_sys(const QString &message, const QStri { if (!sys) return; - QPoint g = sys->mapToGlobal(QPoint(0, 0)); - QBalloonTip::showBalloon(icon, message, title, sys->q, + const QPoint g = sys->globalGeometry().topLeft(); + QBalloonTip::showBalloon(icon, message, title, sys->systemTrayIcon(), QPoint(g.x() + sys->width()/2, g.y() + sys->height()/2), msecs); } diff --git a/src/widgets/util/util.pri b/src/widgets/util/util.pri index 16765558f6..958958f469 100644 --- a/src/widgets/util/util.pri +++ b/src/widgets/util/util.pri @@ -29,6 +29,9 @@ SOURCES += \ win32:!wince* { SOURCES += util/qsystemtrayicon_win.cpp +} else:contains(QT_CONFIG, xcb) { + SOURCES += util/qsystemtrayicon_x11.cpp + CONFIG += x11 } else { SOURCES += util/qsystemtrayicon_qpa.cpp } diff --git a/src/widgets/widgets/qgroupbox.cpp b/src/widgets/widgets/qgroupbox.cpp index e9edea286f..d8ad04cd84 100644 --- a/src/widgets/widgets/qgroupbox.cpp +++ b/src/widgets/widgets/qgroupbox.cpp @@ -643,6 +643,12 @@ void QGroupBox::setChecked(bool b) update(); d->checked = b; d->_q_setChildrenEnabled(b); +#ifndef QT_NO_ACCESSIBILITY + QAccessible::State st; + st.checked = true; + QAccessibleStateChangeEvent *ev = new QAccessibleStateChangeEvent(this, st); + QAccessible::updateAccessibility(ev); +#endif emit toggled(b); } } diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp index ca30c7eef8..b4a7007190 100644 --- a/src/widgets/widgets/qwidgetlinecontrol.cpp +++ b/src/widgets/widgets/qwidgetlinecontrol.cpp @@ -47,6 +47,7 @@ #include "qclipboard.h" #include <private/qguiapplication_p.h> #include <qplatformtheme_qpa.h> +#include <qstylehints.h> #ifndef QT_NO_ACCESSIBILITY #include "qaccessible.h" #endif @@ -58,21 +59,6 @@ QT_BEGIN_NAMESPACE -#ifdef QT_GUI_PASSWORD_ECHO_DELAY -static const int qt_passwordEchoDelay = QT_GUI_PASSWORD_ECHO_DELAY; -#endif - -/*! - \macro QT_GUI_PASSWORD_ECHO_DELAY - - \internal - - Defines the amount of time in milliseconds the last entered character - should be displayed unmasked in the Password echo mode. - - If not defined in qplatformdefs.h there will be no delay in masking - password characters. -*/ /*! \internal @@ -113,7 +99,6 @@ void QWidgetLineControl::updateDisplayText(bool forceUpdate) if (m_echoMode == QLineEdit::Password) { str.fill(m_passwordCharacter); -#ifdef QT_GUI_PASSWORD_ECHO_DELAY if (m_passwordEchoTimer != 0 && m_cursor > 0 && m_cursor <= m_text.length()) { int cursor = m_cursor - 1; QChar uc = m_text.at(cursor); @@ -126,7 +111,6 @@ void QWidgetLineControl::updateDisplayText(bool forceUpdate) str[cursor - 1] = uc; } } -#endif } else if (m_echoMode == QLineEdit::PasswordEchoOnEdit && !m_passwordEchoEditing) { str.fill(m_passwordCharacter); } @@ -818,13 +802,13 @@ void QWidgetLineControl::addCommand(const Command &cmd) */ void QWidgetLineControl::internalInsert(const QString &s) { -#ifdef QT_GUI_PASSWORD_ECHO_DELAY if (m_echoMode == QLineEdit::Password) { if (m_passwordEchoTimer != 0) killTimer(m_passwordEchoTimer); - m_passwordEchoTimer = startTimer(qt_passwordEchoDelay); + int delay = qGuiApp->styleHints()->passwordMaskDelay(); + if (delay > 0) + m_passwordEchoTimer = startTimer(delay); } -#endif if (hasSelectedText()) addCommand(Command(SetSelection, m_cursor, 0, m_selstart, m_selend)); if (m_maskData) { @@ -1517,12 +1501,10 @@ void QWidgetLineControl::timerEvent(QTimerEvent *event) } else if (event->timerId() == m_tripleClickTimer) { killTimer(m_tripleClickTimer); m_tripleClickTimer = 0; -#ifdef QT_GUI_PASSWORD_ECHO_DELAY } else if (event->timerId() == m_passwordEchoTimer) { killTimer(m_passwordEchoTimer); m_passwordEchoTimer = 0; updateDisplayText(); -#endif } } diff --git a/src/widgets/widgets/qwidgetlinecontrol_p.h b/src/widgets/widgets/qwidgetlinecontrol_p.h index 72f25e9068..62184a27bb 100644 --- a/src/widgets/widgets/qwidgetlinecontrol_p.h +++ b/src/widgets/widgets/qwidgetlinecontrol_p.h @@ -93,9 +93,7 @@ public: m_ascent(0), m_maxLength(32767), m_lastCursorPos(-1), m_tripleClickTimer(0), m_maskData(0), m_modifiedState(0), m_undoState(0), m_selstart(0), m_selend(0), m_passwordEchoEditing(false) -#ifdef QT_GUI_PASSWORD_ECHO_DELAY , m_passwordEchoTimer(0) -#endif #if defined(Q_WS_MAC) , m_threadChecks(false) , m_textLayoutThread(0) @@ -306,10 +304,8 @@ public: void updatePasswordEchoEditing(bool editing); bool passwordEchoEditing() const { -#ifdef QT_GUI_PASSWORD_ECHO_DELAY if (m_passwordEchoTimer != 0) return true; -#endif return m_passwordEchoEditing ; } @@ -484,17 +480,13 @@ private: bool m_passwordEchoEditing; QChar m_passwordCharacter; -#ifdef QT_GUI_PASSWORD_ECHO_DELAY int m_passwordEchoTimer; -#endif void cancelPasswordEchoTimer() { -#ifdef QT_GUI_PASSWORD_ECHO_DELAY if (m_passwordEchoTimer != 0) { killTimer(m_passwordEchoTimer); m_passwordEchoTimer = 0; } -#endif } int redoTextLayout() const; diff --git a/tests/auto/corelib/global/qflags/tst_qflags.cpp b/tests/auto/corelib/global/qflags/tst_qflags.cpp index 2794c174ba..7f67f3a612 100644 --- a/tests/auto/corelib/global/qflags/tst_qflags.cpp +++ b/tests/auto/corelib/global/qflags/tst_qflags.cpp @@ -106,7 +106,7 @@ void tst_QFlags::constExpr() switch (btn) { case Qt::LeftButton: QVERIFY(false); break; case Qt::RightButton: QVERIFY(false); break; - case Qt::LeftButton | Qt::RightButton: QVERIFY(true); break; + case int(Qt::LeftButton | Qt::RightButton): QVERIFY(true); break; default: QVERIFY(false); } diff --git a/tests/auto/corelib/thread/qthreadstorage/test/test.pro b/tests/auto/corelib/thread/qthreadstorage/test/test.pro index a7d8eb0106..cfbf5bf5a4 100644 --- a/tests/auto/corelib/thread/qthreadstorage/test/test.pro +++ b/tests/auto/corelib/thread/qthreadstorage/test/test.pro @@ -4,3 +4,7 @@ CONFIG -= app_bundle CONFIG += console QT = core testlib SOURCES = ../tst_qthreadstorage.cpp + +load(testcase) # for installTestHelperApp() +installTestHelperApp("../crashonexit/crashonexit",crashonexit,crashonexit) + diff --git a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp index 761d3ec928..7e12e42107 100644 --- a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp +++ b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp @@ -133,6 +133,8 @@ private slots: void weekendDays(); void listPatterns(); + void measurementSystems(); + private: QString m_decimal, m_thousand, m_sdate, m_ldate, m_time; QString m_sysapp; @@ -2034,5 +2036,20 @@ void tst_QLocale::listPatterns() QCOMPARE(zh_CN.createSeparatedList(sl5), QString::fromUtf8("aaa" "\xe3\x80\x81" "bbb" "\xe3\x80\x81" "ccc" "\xe5\x92\x8c" "ddd")); } +void tst_QLocale::measurementSystems() +{ + QLocale locale(QLocale::English, QLocale::UnitedStates); + QCOMPARE(locale.measurementSystem(), QLocale::ImperialUSSystem); + + locale = QLocale(QLocale::English, QLocale::UnitedKingdom); + QCOMPARE(locale.measurementSystem(), QLocale::ImperialUKSystem); + + locale = QLocale(QLocale::English, QLocale::Australia); + QCOMPARE(locale.measurementSystem(), QLocale::MetricSystem); + + locale = QLocale(QLocale::German); + QCOMPARE(locale.measurementSystem(), QLocale::MetricSystem); +} + QTEST_MAIN(tst_QLocale) #include "tst_qlocale.moc" diff --git a/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp b/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp index 5470de76ee..4e1fba5fcb 100644 --- a/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp +++ b/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp @@ -137,12 +137,10 @@ void tst_QRegExp::indexIn_data() << QStringList(); QTest::newRow(qPrintable(stri + "anc09")) << QString("a(?:(?!)|b)z") << QString("abz") << 0 << 3 << QStringList(); -#if 0 - QTest::newRow(qPrintable(stri + "anc10")) << QString("a?(?=^b$)") << QString("ab") << 0 << 1 + QTest::newRow(qPrintable(stri + "anc10")) << QString("a?(?=^b$)") << QString("ab") << -1 << -1 << QStringList(); QTest::newRow(qPrintable(stri + "anc11")) << QString("a?(?=^b$)") << QString("b") << 0 << 0 << QStringList(); -#endif // back-references QTest::newRow(qPrintable(stri + "bref00")) << QString("(a*)(\\1)") << QString("aaaaa") << 0 << 4 @@ -573,6 +571,7 @@ void tst_QRegExp::indexIn() int mylen = rx.matchedLength(); QStringList mycaps = rx.capturedTexts(); + QEXPECT_FAIL("anc11", "QRegExp has bugs with anchors inside lookaheads", Abort); QCOMPARE( mypos, pos ); QCOMPARE( mylen, len ); if ( caps.size() > 1 && caps[1] != "IGNORE ME" ) { @@ -626,6 +625,7 @@ void tst_QRegExp::lastIndexIn() QStringList mycaps = rx.capturedTexts(); if ( mypos <= pos || pos == -1 ) { + QEXPECT_FAIL("anc11", "QRegExp has bugs with anchors inside lookaheads", Abort); QCOMPARE( mypos, pos ); QCOMPARE( mylen, len ); diff --git a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp index 0c009ec155..1dc2e551b4 100644 --- a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp +++ b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp @@ -55,6 +55,7 @@ private slots: void topLevelWindows(); void abortQuitOnShow(); void changeFocusWindow(); + void keyboardModifiers(); }; class DummyWindow : public QWindow @@ -239,6 +240,80 @@ void tst_QGuiApplication::changeFocusWindow() QCOMPARE(window1.windowDuringFocusOut, &window2); } +void tst_QGuiApplication::keyboardModifiers() +{ + int argc = 0; + QGuiApplication app(argc, 0); + + QWindow *window = new QWindow; + window->show(); + QTest::qWaitForWindowShown(window); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::NoModifier); + + // mouse events + QPoint center = window->geometry().center(); + QTest::mouseEvent(QTest::MousePress, window, Qt::LeftButton, Qt::NoModifier, center); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::NoModifier); + QTest::mouseEvent(QTest::MouseRelease, window, Qt::LeftButton, Qt::NoModifier, center); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::NoModifier); + QTest::mouseEvent(QTest::MousePress, window, Qt::RightButton, Qt::ControlModifier, center); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::ControlModifier); + QTest::mouseEvent(QTest::MouseRelease, window, Qt::RightButton, Qt::ControlModifier, center); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::ControlModifier); + + // shortcut events + QWindowSystemInterface::tryHandleSynchronousShortcutEvent(window, Qt::Key_5, Qt::MetaModifier); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::MetaModifier); + QWindowSystemInterface::tryHandleSynchronousShortcutEvent(window, Qt::Key_Period, Qt::NoModifier); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::NoModifier); + QWindowSystemInterface::tryHandleSynchronousShortcutEvent(window, Qt::Key_0, Qt::ControlModifier); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::ControlModifier); + + // key events + QTest::keyEvent(QTest::Press, window, Qt::Key_C); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::NoModifier); + QTest::keyEvent(QTest::Release, window, Qt::Key_C); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::NoModifier); + + QTest::keyEvent(QTest::Press, window, Qt::Key_U, Qt::ControlModifier); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::ControlModifier); + QTest::keyEvent(QTest::Release, window, Qt::Key_U, Qt::ControlModifier); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::ControlModifier); + + QTest::keyEvent(QTest::Press, window, Qt::Key_T); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::NoModifier); + QTest::keyEvent(QTest::Release, window, Qt::Key_T); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::NoModifier); + + QTest::keyEvent(QTest::Press, window, Qt::Key_E, Qt::ControlModifier); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::ControlModifier); + QTest::keyEvent(QTest::Release, window, Qt::Key_E, Qt::ControlModifier); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::ControlModifier); + + // wheel events + QPoint global = window->mapToGlobal(center); + QPoint delta(0, 1); + QWindowSystemInterface::handleWheelEvent(window, center, global, delta, delta, Qt::NoModifier); + QWindowSystemInterface::sendWindowSystemEvents(app.eventDispatcher(), QEventLoop::AllEvents); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::NoModifier); + QWindowSystemInterface::handleWheelEvent(window, center, global, delta, delta, Qt::AltModifier); + QWindowSystemInterface::sendWindowSystemEvents(app.eventDispatcher(), QEventLoop::AllEvents); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::AltModifier); + QWindowSystemInterface::handleWheelEvent(window, center, global, delta, delta, Qt::ControlModifier); + QWindowSystemInterface::sendWindowSystemEvents(app.eventDispatcher(), QEventLoop::AllEvents); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::ControlModifier); + + // touch events + QList<const QTouchDevice *> touchDevices = QTouchDevice::devices(); + if (!touchDevices.isEmpty()) { + QTouchDevice *touchDevice = const_cast<QTouchDevice *>(touchDevices.first()); + QTest::touchEvent(window, touchDevice).press(1, center).release(1, center); + QCOMPARE(QGuiApplication::keyboardModifiers(), Qt::NoModifier); + } + + window->close(); + delete window; +} QTEST_APPLESS_MAIN(tst_QGuiApplication) #include "tst_qguiapplication.moc" diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp index ebd8823149..df58d8340b 100644 --- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp +++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp @@ -44,6 +44,7 @@ #include <QtTest/QtTest> #include <QEvent> +#include <QStyleHints> // For QSignalSpy slot connections. Q_DECLARE_METATYPE(Qt::ScreenOrientation) @@ -67,6 +68,7 @@ private slots: void orientation(); void close(); void activateAndClose(); + void mouseEventSequence(); void initTestCase() { @@ -304,15 +306,20 @@ public: if (ignoreMouse) { event->ignore(); } else { + ++mousePressedCount; + mouseSequenceSignature += 'p'; mousePressButton = event->button(); mousePressScreenPos = event->screenPos(); } } void mouseReleaseEvent(QMouseEvent *event) { - if (ignoreMouse) + if (ignoreMouse) { event->ignore(); - else + } else { + ++mouseReleasedCount; + mouseSequenceSignature += 'r'; mouseReleaseButton = event->button(); + } } void mouseMoveEvent(QMouseEvent *event) { if (ignoreMouse) { @@ -322,6 +329,14 @@ public: mouseMoveScreenPos = event->screenPos(); } } + void mouseDoubleClickEvent(QMouseEvent *event) { + if (ignoreMouse) { + event->ignore(); + } else { + ++mouseDoubleClickedCount; + mouseSequenceSignature += 'd'; + } + } void touchEvent(QTouchEvent *event) { if (ignoreTouch) { event->ignore(); @@ -345,16 +360,23 @@ public: } } } + void resetCounters() { + mousePressedCount = mouseReleasedCount = mouseDoubleClickedCount = 0; + mouseSequenceSignature = QString(); + touchPressedCount = touchReleasedCount = touchMovedCount = 0; + } InputTestWindow() { keyPressCode = keyReleaseCode = 0; - mousePressButton = mouseReleaseButton = 0; - touchPressedCount = touchReleasedCount = touchMovedCount = 0; + mousePressButton = mouseReleaseButton = mouseMoveButton = 0; ignoreMouse = ignoreTouch = false; + resetCounters(); } int keyPressCode, keyReleaseCode; int mousePressButton, mouseReleaseButton, mouseMoveButton; + int mousePressedCount, mouseReleasedCount, mouseDoubleClickedCount; + QString mouseSequenceSignature; QPointF mousePressScreenPos, mouseMoveScreenPos; int touchPressedCount, touchReleasedCount, touchMovedCount; QEvent::Type touchEventType; @@ -691,5 +713,96 @@ void tst_QWindow::activateAndClose() } } +void tst_QWindow::mouseEventSequence() +{ + int doubleClickInterval = qGuiApp->styleHints()->mouseDoubleClickInterval(); + + InputTestWindow window; + window.setGeometry(80, 80, 40, 40); + window.show(); + QTest::qWaitForWindowShown(&window); + + ulong timestamp = 0; + QPointF local(12, 34); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + QCoreApplication::processEvents(); + QCOMPARE(window.mousePressedCount, 1); + QCOMPARE(window.mouseReleasedCount, 1); + QCOMPARE(window.mouseDoubleClickedCount, 0); + QCOMPARE(window.mouseSequenceSignature, QLatin1String("pr")); + + window.resetCounters(); + timestamp += doubleClickInterval; + + // A double click must result in press, release, press, doubleclick, release. + // Check that no unexpected event suppression occurs and that the order is correct. + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + QCoreApplication::processEvents(); + QCOMPARE(window.mousePressedCount, 2); + QCOMPARE(window.mouseReleasedCount, 2); + QCOMPARE(window.mouseDoubleClickedCount, 1); + QCOMPARE(window.mouseSequenceSignature, QLatin1String("prpdr")); + + timestamp += doubleClickInterval; + window.resetCounters(); + + // Triple click = double + single click + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + QCoreApplication::processEvents(); + QCOMPARE(window.mousePressedCount, 3); + QCOMPARE(window.mouseReleasedCount, 3); + QCOMPARE(window.mouseDoubleClickedCount, 1); + QCOMPARE(window.mouseSequenceSignature, QLatin1String("prpdrpr")); + + timestamp += doubleClickInterval; + window.resetCounters(); + + // Two double clicks. + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + QCoreApplication::processEvents(); + QCOMPARE(window.mousePressedCount, 4); + QCOMPARE(window.mouseReleasedCount, 4); + QCOMPARE(window.mouseDoubleClickedCount, 2); + QCOMPARE(window.mouseSequenceSignature, QLatin1String("prpdrprpdr")); + + timestamp += doubleClickInterval; + window.resetCounters(); + + // Four clicks, none of which qualifies as a double click. + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + timestamp += doubleClickInterval; + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + timestamp += doubleClickInterval; + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + timestamp += doubleClickInterval; + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton); + QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton); + timestamp += doubleClickInterval; + QCoreApplication::processEvents(); + QCOMPARE(window.mousePressedCount, 4); + QCOMPARE(window.mouseReleasedCount, 4); + QCOMPARE(window.mouseDoubleClickedCount, 0); + QCOMPARE(window.mouseSequenceSignature, QLatin1String("prprprpr")); +} + #include <tst_qwindow.moc> -QTEST_MAIN(tst_QWindow); +QTEST_MAIN(tst_QWindow) diff --git a/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp b/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp index 0ad37c21e8..618587356b 100644 --- a/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp +++ b/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp @@ -57,12 +57,11 @@ private slots: void cleanup(); void openUrl(); void handlers(); + void testDataLocation(); }; tst_qdesktopservices::tst_qdesktopservices() { - QCoreApplication::setOrganizationName("Nokia"); - QCoreApplication::setApplicationName("tst_qdesktopservices"); } tst_qdesktopservices::~tst_qdesktopservices() @@ -117,5 +116,37 @@ void tst_qdesktopservices::handlers() QCOMPARE(barHandler.lastHandledUrl.toString(), barUrl.toString()); } +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) +#define Q_XDG_PLATFORM +#endif + +void tst_qdesktopservices::testDataLocation() +{ + // This is the one point where QDesktopServices and QStandardPaths differ. + // QDesktopServices on unix returns "data"/orgname/appname for DataLocation, for Qt4 compat. + // And the appname in qt4 defaulted to empty, not to argv[0]. + { + const QString base = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); + const QString app = QDesktopServices::storageLocation(QDesktopServices::DataLocation); +#ifdef Q_XDG_PLATFORM + QCOMPARE(app, base + "/data//"); // as ugly as in Qt4 +#else + QCOMPARE(app, base); +#endif + } + QCoreApplication::instance()->setOrganizationName("Qt"); + QCoreApplication::instance()->setApplicationName("QtTest"); + { + const QString base = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); + const QString app = QDesktopServices::storageLocation(QDesktopServices::DataLocation); +#ifdef Q_XDG_PLATFORM + QCOMPARE(app, base + "/data/Qt/QtTest"); +#else + QCOMPARE(app, base + "/Qt/QtTest"); +#endif + } +} + QTEST_MAIN(tst_qdesktopservices) + #include "tst_qdesktopservices.moc" diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp index ba05579817..262d185bd1 100644 --- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp @@ -252,6 +252,7 @@ private slots: void mdiAreaTest(); void mdiSubWindowTest(); void lineEditTest(); + void groupBoxTest(); void dialogButtonBoxTest(); void dialTest(); void rubberBandTest(); @@ -775,6 +776,7 @@ void tst_QAccessibility::applicationTest() void tst_QAccessibility::mainWindowTest() { + { QMainWindow *mw = new QMainWindow; mw->resize(300, 200); mw->show(); // triggers layout @@ -785,12 +787,51 @@ void tst_QAccessibility::mainWindowTest() QAccessibleEvent show(mw, QAccessible::ObjectShow); QVERIFY_EVENT(&show); - QAccessibleInterface *interface = QAccessible::queryAccessibleInterface(mw); - QCOMPARE(interface->text(QAccessible::Name), name); - QCOMPARE(interface->role(), QAccessible::Window); - delete interface; + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(mw); + QCOMPARE(iface->text(QAccessible::Name), name); + QCOMPARE(iface->role(), QAccessible::Window); + QVERIFY(iface->state().active); + + QAccessible::State activeState; + activeState.active = true; + QAccessibleStateChangeEvent active(mw, activeState); + QVERIFY_EVENT(&active); + + delete iface; delete mw; + } QTestAccessibility::clearEvents(); + + { + QWindow window; + window.setGeometry(80, 80, 40, 40); + window.show(); + QTRY_VERIFY(QGuiApplication::focusWindow() == &window); + +// We currently don't have an accessible interface for QWindow +// the active state is either in the QMainWindow or QQuickView +// QAIPtr windowIface(QAccessible::queryAccessibleInterface(&window)); +// QVERIFY(windowIface->state().active); + + QAccessible::State activeState; + activeState.active = true; + QAccessibleStateChangeEvent active(&window, activeState); + QVERIFY_EVENT(&active); + + QWindow child; + child.setParent(&window); + child.setGeometry(10, 10, 20, 20); + child.show(); + + child.requestActivateWindow(); + QTRY_VERIFY(QGuiApplication::focusWindow() == &child); + + QAccessibleStateChangeEvent deactivate(&window, activeState); + QVERIFY_EVENT(&deactivate); // deactivation of parent + + QAccessibleStateChangeEvent activeChild(&child, activeState); + QVERIFY_EVENT(&activeChild); + } } class CounterButton : public QPushButton { @@ -1526,9 +1567,9 @@ void tst_QAccessibility::textEditTest() QCOMPARE(endOffset, 30); QCOMPARE(iface->textInterface()->characterCount(), 31); QFontMetrics fm(edit.font()); - QCOMPARE(iface->textInterface()->characterRect(0, QAccessible2::RelativeToParent).size(), QSize(fm.width("h"), fm.height())); - QCOMPARE(iface->textInterface()->characterRect(5, QAccessible2::RelativeToParent).size(), QSize(fm.width(" "), fm.height())); - QCOMPARE(iface->textInterface()->characterRect(6, QAccessible2::RelativeToParent).size(), QSize(fm.width("w"), fm.height())); + QCOMPARE(iface->textInterface()->characterRect(0).size(), QSize(fm.width("h"), fm.height())); + QCOMPARE(iface->textInterface()->characterRect(5).size(), QSize(fm.width(" "), fm.height())); + QCOMPARE(iface->textInterface()->characterRect(6).size(), QSize(fm.width("w"), fm.height())); iface->editableTextInterface()->copyText(6, 11); QCOMPARE(QApplication::clipboard()->text(), QLatin1String("world")); @@ -1879,20 +1920,113 @@ void tst_QAccessibility::lineEditTest() QAccessibleTextUpdateEvent update(lineEdit, 0, "foo", "bar"); QVERIFY(QTestAccessibility::containsEvent(&update)); -// QTestEventList keys; -// keys.addKeyClick('D'); -// keys.addKeyClick('E'); -// keys.addKeyClick(Qt::Key_Left); -// keys.addKeyClick(Qt::Key_Left); -// keys.addKeyClick('C'); -// keys.addKeyClick('O'); -// keys.simulate(lineEdit); -// FIXME: Test key press events... + // FIXME check what extra events are around and get rid of them + QTestAccessibility::clearEvents(); + + QTestEventList keys; + keys.addKeyClick('D'); + keys.simulate(lineEdit); + + QAccessibleTextInsertEvent insertD(lineEdit, 3, "D"); + QVERIFY_EVENT(&insertD); + keys.clear(); + keys.addKeyClick('E'); + keys.simulate(lineEdit); + + QAccessibleTextInsertEvent insertE(lineEdit, 4, "E"); + QVERIFY(QTestAccessibility::containsEvent(&insertE)); + keys.clear(); + keys.addKeyClick(Qt::Key_Left); + keys.addKeyClick(Qt::Key_Left); + keys.simulate(lineEdit); + cursorEvent.setCursorPosition(4); + QVERIFY(QTestAccessibility::containsEvent(&cursorEvent)); + cursorEvent.setCursorPosition(3); + QVERIFY(QTestAccessibility::containsEvent(&cursorEvent)); + + keys.clear(); + keys.addKeyClick('C'); + keys.simulate(lineEdit); + + QAccessibleTextInsertEvent insertC(lineEdit, 3, "C"); + QVERIFY(QTestAccessibility::containsEvent(&insertC)); + + keys.clear(); + keys.addKeyClick('O'); + keys.simulate(lineEdit); + QAccessibleTextInsertEvent insertO(lineEdit, 4, "O"); + QVERIFY(QTestAccessibility::containsEvent(&insertO)); } delete toplevel; QTestAccessibility::clearEvents(); } +void tst_QAccessibility::groupBoxTest() +{ + { + QGroupBox *groupBox = new QGroupBox(); + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(groupBox); + + groupBox->setTitle(QLatin1String("Test QGroupBox")); + + QAccessibleEvent ev(groupBox, QAccessible::NameChanged); + QVERIFY_EVENT(&ev); + + groupBox->setToolTip(QLatin1String("This group box will be used to test accessibility")); + QVBoxLayout *layout = new QVBoxLayout(); + QRadioButton *rbutton = new QRadioButton(); + layout->addWidget(rbutton); + groupBox->setLayout(layout); + QAccessibleInterface *rButtonIface = QAccessible::queryAccessibleInterface(rbutton); + + QCOMPARE(iface->childCount(), 1); + QCOMPARE(iface->role(), QAccessible::Grouping); + QCOMPARE(iface->text(QAccessible::Name), QLatin1String("Test QGroupBox")); + QCOMPARE(iface->text(QAccessible::Description), QLatin1String("This group box will be used to test accessibility")); + QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > relations = rButtonIface->relations(); + QVERIFY(relations.size() == 1); + QPair<QAccessibleInterface*, QAccessible::Relation> relation = relations.first(); + QCOMPARE(relation.first->object(), groupBox); + QCOMPARE(relation.second, QAccessible::Label); + + delete relation.first; + + delete rButtonIface; + delete iface; + delete groupBox; + } + + { + QGroupBox *groupBox = new QGroupBox(); + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(groupBox); + QVERIFY(!iface->state().checkable); + groupBox->setCheckable(true); + + groupBox->setChecked(false); + QAccessible::State st; + st.checked = true; + QAccessibleStateChangeEvent ev(groupBox, st); + QVERIFY_EVENT(&ev); + + QCOMPARE(iface->role(), QAccessible::CheckBox); + QAccessibleActionInterface *actionIface = iface->actionInterface(); + QVERIFY(actionIface); + QAccessible::State state = iface->state(); + QVERIFY(state.checkable); + QVERIFY(!state.checked); + QVERIFY(actionIface->actionNames().contains(QAccessibleActionInterface::checkAction())); + actionIface->doAction(QAccessibleActionInterface::checkAction()); + QVERIFY(groupBox->isChecked()); + state = iface->state(); + QVERIFY(state.checked); + QAccessibleStateChangeEvent ev2(groupBox, st); + QVERIFY_EVENT(&ev2); + + delete iface; + delete groupBox; + } +} + bool accessibleInterfaceLeftOf(const QAccessibleInterface *a1, const QAccessibleInterface *a2) { return a1->rect().x() < a2->rect().x(); @@ -2733,7 +2867,8 @@ void tst_QAccessibility::labelTest() QCOMPARE(imageInterface->imageSize(), testPixmap.size()); QCOMPARE(imageInterface->imageDescription(), QString::fromLatin1("Test Description")); - QCOMPARE(imageInterface->imagePosition(QAccessible2::RelativeToParent), imageLabel.geometry()); + const QPoint labelPos = imageLabel.mapToGlobal(QPoint(0,0)); + QCOMPARE(imageInterface->imagePosition().topLeft(), labelPos); delete acc_label; diff --git a/tests/auto/printsupport/kernel/qprinterinfo/tst_qprinterinfo.cpp b/tests/auto/printsupport/kernel/qprinterinfo/tst_qprinterinfo.cpp index 2323dc8df3..48d38a8146 100644 --- a/tests/auto/printsupport/kernel/qprinterinfo/tst_qprinterinfo.cpp +++ b/tests/auto/printsupport/kernel/qprinterinfo/tst_qprinterinfo.cpp @@ -275,7 +275,7 @@ void tst_QPrinterInfo::testForPrinters() # endif QList<QPrinterInfo> printers = QPrinterInfo::availablePrinters(); - QCOMPARE(printers.size(), sysPrinters.size()); +// QCOMPARE(printers.size(), sysPrinters.size()); QHash<QString, bool> qtPrinters; diff --git a/tests/auto/sql/kernel/qsqlthread/tst_qsqlthread.cpp b/tests/auto/sql/kernel/qsqlthread/tst_qsqlthread.cpp index 66f6cd2999..2432548039 100644 --- a/tests/auto/sql/kernel/qsqlthread/tst_qsqlthread.cpp +++ b/tests/auto/sql/kernel/qsqlthread/tst_qsqlthread.cpp @@ -101,7 +101,7 @@ private: int threadFinishedCount; }; -static QBasicAtomicInt counter; +static QAtomicInt counter; class QtTestSqlThread : public QThread { diff --git a/tests/auto/widgets/dialogs/qdialog/qdialog.pro b/tests/auto/widgets/dialogs/qdialog/qdialog.pro index 2c4d10dd0b..779c10ed66 100644 --- a/tests/auto/widgets/dialogs/qdialog/qdialog.pro +++ b/tests/auto/widgets/dialogs/qdialog/qdialog.pro @@ -2,3 +2,4 @@ CONFIG += testcase TARGET = tst_qdialog QT += widgets testlib SOURCES += tst_qdialog.cpp +mac:CONFIG += insignificant_test # QTBUG-24977 diff --git a/tests/auto/widgets/util/qsystemtrayicon/tst_qsystemtrayicon.cpp b/tests/auto/widgets/util/qsystemtrayicon/tst_qsystemtrayicon.cpp index 1f717727b0..9a09af0282 100644 --- a/tests/auto/widgets/util/qsystemtrayicon/tst_qsystemtrayicon.cpp +++ b/tests/auto/widgets/util/qsystemtrayicon/tst_qsystemtrayicon.cpp @@ -42,7 +42,7 @@ #include <QtTest/QtTest> -#include <qcoreapplication.h> +#include <qguiapplication.h> #include <qdebug.h> #include <qsystemtrayicon.h> #include <qmenu.h> @@ -125,7 +125,10 @@ void tst_QSystemTrayIcon::supportsMessages() #elif defined(Q_OS_WIN) && !defined(Q_OS_WINCE) QCOMPARE(QSystemTrayIcon::supportsMessages(), true); #else - QEXPECT_FAIL("", "QTBUG-20978 QSystemTrayIcon is unimplemented for qpa", Abort); + const QString platform = QGuiApplication::platformName(); + if (platform.compare(QStringLiteral("xcb"), Qt::CaseInsensitive)) { + QEXPECT_FAIL("", "QTBUG-20978 QSystemTrayIcon is unimplemented for qpa", Abort); + } QCOMPARE(QSystemTrayIcon::supportsMessages(), true); #endif } diff --git a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp index 7e7b049166..43c0022c25 100644 --- a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp +++ b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp @@ -764,9 +764,6 @@ void tst_QDockWidget::task169808_setFloating() qt_x11_wait_for_window_manager(&mw); #endif -#ifdef Q_OS_MAC - QEXPECT_FAIL("", "Window handling: QTBUG-24774", Abort); -#endif QCOMPARE(dw->widget()->size(), dw->widget()->sizeHint()); //and now we try to test if the contents margin is taken into account diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp index f67f7ce1e8..a6860006c2 100644 --- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp +++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp @@ -49,6 +49,7 @@ #include "qcompleter.h" #include "qstandarditemmodel.h" #include "qplatformtheme_qpa.h" +#include "qstylehints.h" #include <private/qguiapplication_p.h> #ifndef QT_NO_CLIPBOARD @@ -174,10 +175,7 @@ private slots: void displayText_data(); void displayText(); void passwordEchoOnEdit(); - -#ifdef QT_GUI_PASSWORD_ECHO_DELAY void passwordEchoDelay(); -#endif void maxLength_mask_data(); void maxLength_mask(); @@ -1664,9 +1662,10 @@ void tst_QLineEdit::passwordEchoOnEdit() testWidget->setEchoMode(QLineEdit::Normal); } -#ifdef QT_GUI_PASSWORD_ECHO_DELAY void tst_QLineEdit::passwordEchoDelay() { + if (qGuiApp->styleHints()->passwordMaskDelay() <= 0) + QSKIP("No mask delay in use"); QStyleOptionFrameV2 opt; QChar fillChar = testWidget->style()->styleHint(QStyle::SH_LineEdit_PasswordCharacter, &opt, testWidget); @@ -1686,7 +1685,7 @@ void tst_QLineEdit::passwordEchoDelay() QCOMPARE(testWidget->displayText(), QString(4, fillChar)); QTest::keyPress(testWidget, '4'); QCOMPARE(testWidget->displayText(), QString(4, fillChar) + QLatin1Char('4')); - QTest::qWait(QT_GUI_PASSWORD_ECHO_DELAY); + QTest::qWait(qGuiApp->styleHints()->passwordMaskDelay()); QTRY_COMPARE(testWidget->displayText(), QString(5, fillChar)); QTest::keyPress(testWidget, '5'); QCOMPARE(testWidget->displayText(), QString(5, fillChar) + QLatin1Char('5')); @@ -1714,7 +1713,6 @@ void tst_QLineEdit::passwordEchoDelay() // restore clean state testWidget->setEchoMode(QLineEdit::Normal); } -#endif void tst_QLineEdit::maxLength_mask_data() { diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 5faaae50f8..62040db66f 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -176,6 +176,7 @@ Configure::Configure(int& argc, char** argv) } } + defaultBuildParts << QStringLiteral("libs") << QStringLiteral("examples") << QStringLiteral("tests"); dictionary[ "QT_SOURCE_TREE" ] = fixSeparators(sourcePath); dictionary[ "QT_BUILD_TREE" ] = fixSeparators(buildPath); dictionary[ "QT_INSTALL_PREFIX" ] = fixSeparators(installPath); @@ -933,11 +934,16 @@ void Configure::parseCmdLine() dictionary["LICENSE_CONFIRMED"] = "yes"; } - else if (configCmdLine.at(i) == "-nomake") { + else if (configCmdLine.at(i) == "-make") { + ++i; + if (i == argCount) + break; + buildParts += configCmdLine.at(i); + } else if (configCmdLine.at(i) == "-nomake") { ++i; if (i == argCount) break; - disabledBuildParts += configCmdLine.at(i); + nobuildParts.removeAll(configCmdLine.at(i)); } // Directories ---------------------------------------------- @@ -1046,7 +1052,7 @@ void Configure::parseCmdLine() dictionary[ "QT_HOST_DATA" ] = configCmdLine.at(i); } - else if (configCmdLine.at(i) == "-make") { + else if (configCmdLine.at(i) == "-make-tool") { ++i; if (i == argCount) break; @@ -1489,6 +1495,11 @@ bool Configure::displayHelp() "subdirectory targets. All other Makefiles are created as wrappers " "which will in turn run qmake\n"); + desc( "-make <part>", "Add part to the list of parts to be built at make time."); + for (int i=0; i<defaultBuildParts.size(); ++i) + desc( "", qPrintable(QString(" %1").arg(defaultBuildParts.at(i))), false, ' '); + desc( "-nomake <part>", "Exclude part from the list of parts to be built.\n"); + desc("EXCEPTIONS", "no", "-no-exceptions", "Disable exceptions on platforms that support it."); desc("EXCEPTIONS", "yes","-exceptions", "Enable exceptions on platforms that support it.\n"); @@ -2215,6 +2226,14 @@ void Configure::generateOutputVars() qmakeConfig += dictionary[ "BUILD" ]; dictionary[ "QMAKE_OUTDIR" ] = dictionary[ "BUILD" ]; + if (buildParts.isEmpty()) + buildParts = defaultBuildParts; + while (!nobuildParts.isEmpty()) + buildParts.removeAll(nobuildParts.takeFirst()); + if (!buildParts.contains("libs")) + buildParts += "libs"; + buildParts.removeDuplicates(); + if (dictionary["MSVC_MP"] == "yes") qmakeConfig += "msvc_mp"; @@ -2449,11 +2468,6 @@ void Configure::generateCachefile() moduleStream << "#paths" << endl; moduleStream << "QT_BUILD_TREE = " << fixSeparators(dictionary[ "QT_BUILD_TREE" ], true) << endl; moduleStream << "QT_SOURCE_TREE = " << fixSeparators(dictionary[ "QT_SOURCE_TREE" ], true) << endl; - QStringList buildParts; - buildParts << QStringLiteral("libs") << QStringLiteral("examples") << QStringLiteral("tests"); - foreach (const QString &item, disabledBuildParts) { - buildParts.removeAll(item); - } moduleStream << "QT_BUILD_PARTS = " << buildParts.join(" ") << endl << endl; //so that we can build without an install first (which would be impossible) diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h index 65aa0cbed9..42068e77b4 100644 --- a/tools/configure/configureapp.h +++ b/tools/configure/configureapp.h @@ -107,13 +107,15 @@ public: private: // Our variable dictionaries QMap<QString,QString> dictionary; + QStringList defaultBuildParts; + QStringList buildParts; + QStringList nobuildParts; QStringList licensedModules; QStringList allSqlDrivers; QStringList allConfigs; QStringList disabledModules; QStringList enabledModules; QStringList modules; - QStringList disabledBuildParts; // QStringList sqlDrivers; QStringList configCmdLine; QStringList qmakeConfig; |