summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/arch/qatomic_armv6.h2
-rw-r--r--src/corelib/global/qcompilerdetection.h164
-rw-r--r--src/corelib/global/qglobal.cpp57
-rw-r--r--src/corelib/global/qglobal.h27
-rw-r--r--src/corelib/global/qisenum.h6
-rw-r--r--src/corelib/thread/qatomic.h4
-rw-r--r--src/corelib/thread/qmutex_linux.cpp37
-rw-r--r--src/corelib/tools/qlocale.cpp2
-rw-r--r--src/corelib/tools/qlocale.h7
-rw-r--r--src/corelib/tools/qlocale.qdoc8
-rw-r--r--src/corelib/tools/qlocale_data_p.h10
-rw-r--r--src/corelib/tools/qlocale_icu.cpp29
-rw-r--r--src/corelib/tools/qsimd_p.h16
-rw-r--r--src/dbus/dbus.pro7
-rw-r--r--src/dbus/qdbusabstractadaptor.cpp2
-rw-r--r--src/dbus/qdbusconnection_p.h12
-rw-r--r--src/dbus/qdbusintegrator.cpp8
-rw-r--r--src/dbus/qdbusintegrator_p.h6
-rw-r--r--src/dbus/qdbusmisc.cpp5
-rw-r--r--src/dbus/qdbuspendingcall.cpp7
-rw-r--r--src/dbus/qdbuspendingcall_p.h4
-rw-r--r--src/dbus/qdbusxmlgenerator.cpp2
-rw-r--r--src/gui/accessible/qaccessible2.h12
-rw-r--r--src/gui/image/qimage.h21
-rw-r--r--src/gui/kernel/qguiapplication.cpp4
-rw-r--r--src/gui/kernel/qplatformintegration_qpa.cpp2
-rw-r--r--src/gui/kernel/qplatformintegration_qpa.h3
-rw-r--r--src/gui/kernel/qplatformwindow_qpa.cpp2
-rw-r--r--src/gui/kernel/qstylehints.cpp5
-rw-r--r--src/gui/kernel/qstylehints.h2
-rw-r--r--src/gui/kernel/qwindow.cpp24
-rw-r--r--src/gui/kernel/qwindowsysteminterface_qpa.cpp4
-rw-r--r--src/gui/opengl/qopenglpaintengine_p.h2
-rw-r--r--src/gui/painting/qblittable_p.h2
-rw-r--r--src/gui/painting/qcosmeticstroker_p.h2
-rw-r--r--src/gui/painting/qdrawhelper.cpp2
-rw-r--r--src/gui/painting/qdrawhelper_p.h6
-rw-r--r--src/gui/painting/qmemrotate.cpp1
-rw-r--r--src/gui/text/qtextengine_p.h2
-rw-r--r--src/gui/util/qdesktopservices.cpp18
-rw-r--r--src/gui/util/qdesktopservices.h4
-rw-r--r--src/network/kernel/qauthenticator.cpp2
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp20
-rw-r--r--src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h2
-rw-r--r--src/plugins/accessible/widgets/main.cpp4
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.cpp17
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.h4
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.cpp109
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.h29
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.mm29
-rw-r--r--src/plugins/platforms/cocoa/qcocoaclipboard.mm1
-rw-r--r--src/plugins/platforms/cocoa/qcocoacursor.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm1
-rw-r--r--src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm11
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h7
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm18
-rw-r--r--src/plugins/platforms/cocoa/qmacclipboard.h4
-rw-r--r--src/plugins/platforms/cocoa/qmacclipboard.mm4
-rw-r--r--src/plugins/platforms/cocoa/qmacmime.h4
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm38
-rw-r--r--src/plugins/platforms/cocoa/qnsviewaccessibility.mm1
-rw-r--r--src/plugins/platforms/eglfs/eglfs.pro4
-rw-r--r--src/plugins/platforms/eglfs/qeglfsbackingstore.cpp77
-rw-r--r--src/plugins/platforms/eglfs/qeglfsbackingstore.h17
-rw-r--r--src/plugins/platforms/qnx/qnx.pro10
-rw-r--r--src/plugins/platforms/qnx/qqnxintegration.cpp17
-rw-r--r--src/plugins/platforms/qnx/qqnxintegration.h4
-rw-r--r--src/plugins/platforms/qnx/qqnxservices.cpp81
-rw-r--r--src/plugins/platforms/qnx/qqnxservices.h (renamed from src/plugins/platforms/xcb/qxcbsharedgraphicscache.h)51
-rw-r--r--src/plugins/platforms/windows/accessible/accessible.pri25
-rw-r--r--src/plugins/platforms/windows/accessible/iaccessible2.cpp123
-rw-r--r--src/plugins/platforms/windows/accessible/iaccessible2.h41
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp14
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp58
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h29
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp29
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.h8
-rw-r--r--src/plugins/platforms/xcb/qxcbsharedbuffermanager.cpp640
-rw-r--r--src/plugins/platforms/xcb/qxcbsharedbuffermanager.h215
-rw-r--r--src/plugins/platforms/xcb/qxcbsharedgraphicscache.cpp290
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp15
-rw-r--r--src/plugins/platforms/xcb/xcb.pro11
-rw-r--r--src/plugins/printsupport/windows/qwindowsprintersupport.cpp4
-rw-r--r--src/printsupport/kernel/qprinterinfo_unix.cpp2
-rw-r--r--src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp5
-rw-r--r--src/widgets/accessible/qaccessiblewidget.cpp2
-rw-r--r--src/widgets/itemviews/qdirmodel.cpp1
-rw-r--r--src/widgets/kernel/qapplication.cpp22
-rw-r--r--src/widgets/kernel/qwidgetwindow_qpa.cpp10
-rw-r--r--src/widgets/util/qsystemtrayicon_p.h56
-rw-r--r--src/widgets/util/qsystemtrayicon_x11.cpp367
-rw-r--r--src/widgets/util/util.pri3
-rw-r--r--src/widgets/widgets/qgroupbox.cpp6
-rw-r--r--src/widgets/widgets/qwidgetlinecontrol.cpp26
-rw-r--r--src/widgets/widgets/qwidgetlinecontrol_p.h8
99 files changed, 1154 insertions, 1975 deletions
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> &params);
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> &parameters, QList<int>& metaTypes);
+extern int qDBusParametersForMethod(const QList<QByteArray> &parameters, 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> &params)
+ QVector<int> &params)
{
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> &parameterTypes, QList<int>& metaTypes)
+int qDBusParametersForMethod(const QList<QByteArray> &parameterTypes, 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 &region, 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 &region, 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 &region, 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 &region, 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 &region, 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 &parameters)
#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;