summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xconfigure132
-rw-r--r--src/corelib/codecs/qutfcodec.cpp2
-rw-r--r--src/corelib/json/qjsonparser.cpp2
-rw-r--r--src/corelib/json/qjsonwriter.cpp2
-rw-r--r--src/gui/kernel/qwindow.cpp6
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp156
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h19
-rw-r--r--src/widgets/graphicsview/qgraphicslayoutitem.h3
-rw-r--r--src/widgets/kernel/qwidgetwindow_qpa.cpp34
-rw-r--r--src/xml/dom/qdom.cpp4
-rw-r--r--src/xml/sax/qxml.cpp42
-rw-r--r--src/xml/sax/qxml.h2
-rw-r--r--tests/auto/corelib/codecs/utf8/tst_utf8.cpp2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsgridlayout/qgraphicsgridlayout.pro2
-rw-r--r--tests/auto/widgets/widgets/qtextedit/qtextedit.pro15
-rw-r--r--tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp35
-rw-r--r--tests/benchmarks/corelib/tools/qstring/main.cpp2
17 files changed, 282 insertions, 178 deletions
diff --git a/configure b/configure
index 6ed696950b..0bd115e735 100755
--- a/configure
+++ b/configure
@@ -688,6 +688,7 @@ CFG_AUDIO_BACKEND=auto
CFG_V8SNAPSHOT=auto
CFG_QML_DEBUG=yes
CFG_JAVASCRIPTCORE_JIT=auto
+CFG_PKGCONFIG=auto
# Target architecture
CFG_ARCH=
@@ -890,7 +891,7 @@ while [ "$#" -gt 0 ]; do
VAL=no
;;
#Qt style yes options
- -profile|-shared|-static|-sm|-xinerama|-xshape|-xsync|-xinput|-xinput2|-egl|-reduce-exports|-pch|-separate-debug-info|-stl|-freetype|-xcursor|-xfixes|-xrandr|-xrender|-mitshm|-fontconfig|-xkb|-xcb|-eglfs|-nis|-dbus|-dbus-linked|-glib|-gstreamer|-gtkstyle|-cups|-iconv|-largefile|-h|-help|-v|-verbose|-debug|-release|-fast|-accessibility|-confirm-license|-gnumake|-framework|-debug-and-release|-exceptions|-harfbuzz|-prefix-install|-silent|-optimized-qmake|-dwarf2|-reduce-relocations|-sse|-openssl|-openssl-linked|-phonon-backend|-audio-backend|-qml-debug|-javascript-jit|-rpath|-force-pkg-config|-icu|-force-asserts|-testcocoon)
+ -profile|-shared|-static|-sm|-xinerama|-xshape|-xsync|-xinput|-xinput2|-egl|-reduce-exports|-pch|-separate-debug-info|-stl|-freetype|-xcursor|-xfixes|-xrandr|-xrender|-mitshm|-fontconfig|-xkb|-xcb|-eglfs|-nis|-dbus|-dbus-linked|-glib|-gstreamer|-gtkstyle|-cups|-iconv|-largefile|-h|-help|-v|-verbose|-debug|-release|-fast|-accessibility|-confirm-license|-gnumake|-framework|-debug-and-release|-exceptions|-harfbuzz|-prefix-install|-silent|-optimized-qmake|-dwarf2|-reduce-relocations|-sse|-openssl|-openssl-linked|-phonon-backend|-audio-backend|-qml-debug|-javascript-jit|-rpath|-pkg-config|-force-pkg-config|-icu|-force-asserts|-testcocoon)
VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
VAL=yes
;;
@@ -1080,8 +1081,15 @@ while [ "$#" -gt 0 ]; do
hostbindir)
QT_HOST_BINS="$VAL"
;;
+ pkg-config)
+ if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
+ CFG_PKGCONFIG="$VAL"
+ else
+ UNKNOWN_OPT=yes
+ fi
+ ;;
force-pkg-config)
- QT_FORCE_PKGCONFIG=yes
+ CFG_PKGCONFIG="force"
;;
docdir)
QT_INSTALL_DOCS="$VAL"
@@ -2465,50 +2473,6 @@ if [ "$CFG_DEBUG_RELEASE" = "yes" ]; then
QT_CONFIG="$QT_CONFIG build_all"
fi
-if [ -z "$PKG_CONFIG" ]; then
- # See if PKG_CONFIG is set in the mkspec:
- PKG_CONFIG=`getXQMakeConf PKG_CONFIG`
-fi
-if [ -z "$PKG_CONFIG" ]; then
- PKG_CONFIG=`"$WHICH" pkg-config 2>/dev/null`
-fi
-
-# Work out if we can use pkg-config
-if [ "$QT_CROSS_COMPILE" = "yes" ]; then
- if [ "$QT_FORCE_PKGCONFIG" = "yes" ]; then
- echo >&2 ""
- echo >&2 "You have asked to use pkg-config and are cross-compiling."
- echo >&2 "Please make sure you have a correctly set-up pkg-config"
- echo >&2 "environment!"
- echo >&2 ""
- if [ -z "$PKG_CONFIG_LIBDIR" ]; then
- echo >&2 ""
- echo >&2 "Warning: PKG_CONFIG_LIBDIR has not been set. This could mean"
- echo >&2 "the host's .pc files will be used (even if you set PKG_CONFIG_PATH)."
- echo >&2 "This is probably not what you want."
- echo >&2 ""
- elif [ -z "$PKG_CONFIG_SYSROOT" ] && [ -z "$PKG_CONFIG_SYSROOT_DIR" ]; then
- echo >&2 ""
- echo >&2 "Warning: PKG_CONFIG_SYSROOT/PKG_CONFIG_SYSROOT_DIR has not"
- echo >&2 "been set. This means your toolchain's .pc files must contain"
- echo >&2 "the paths to the toolchain's libraries & headers. If configure"
- echo >&2 "tests are failing, please check these files."
- echo >&2 ""
- fi
- else
- echo >&2 ""
- echo >&2 "You have not explicitly asked to use pkg-config and are cross-compiling."
- echo >&2 "pkg-config will not be used to automatically query cflag/lib parameters for"
- echo >&2 "dependencies"
- echo >&2 ""
- PKG_CONFIG=""
- fi
-fi
-
-if [ ! -n "$PKG_CONFIG" ]; then
- QT_CONFIG="$QT_CONFIG no-pkg-config"
-fi
-
# pass on $CFG_SDK to the configure tests.
if [ '!' -z "$CFG_SDK" ]; then
MAC_CONFIG_TEST_COMMANDLINE="$MAC_CONFIG_TEST_COMMANDLINE -sdk $CFG_SDK"
@@ -3072,6 +3036,13 @@ Configure options:
-I <string> ........ Add an explicit include path.
-L <string> ........ Add an explicit library path.
+ + -pkg-config ........ Use pkg-config to detect include and library paths. By default,
+ configure determines whether to use pkg-config or not with
+ some heuristics such as checking the environment variables.
+ -no-pkg-config ..... Disable use of pkg-config.
+ -force-pkg-config .. Force usage of pkg-config (skips pkg-config usability
+ detection heuristic).
+
-help, -h .......... Display this information.
Third Party Libraries:
@@ -3644,6 +3615,70 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
fi # Build qmake
#-------------------------------------------------------------------------------
+# Detect pkg-config
+#-------------------------------------------------------------------------------
+if [ -z "$PKG_CONFIG" ]; then
+ # See if PKG_CONFIG is set in the mkspec:
+ PKG_CONFIG=`getXQMakeConf PKG_CONFIG`
+fi
+if [ -z "$PKG_CONFIG" ]; then
+ PKG_CONFIG=`"$WHICH" pkg-config 2>/dev/null`
+fi
+
+if [ "$CFG_PKGCONFIG" = "no" ]; then
+ PKG_CONFIG=
+elif [ "$CFG_PKGCONFIG" = "force" ]; then
+ echo >&2 ""
+ echo >&2 "You have asked to use pkg-config. Please make sure you have"
+ echo >&2 "a correctly setup pkg-config environment!"
+ echo >&2 ""
+elif [ -n "$PKG_CONFIG" ]; then
+ # found a pkg-config
+ if [ "$QT_CROSS_COMPILE" = "yes" ]; then
+ # when xcompiling, check environment to see if it's actually usable
+ if [ -z "$PKG_CONFIG_LIBDIR" ]; then
+ if [ -n "$CFG_SYSROOT" ] && [ -d "$CFG_SYSROOT/usr/lib/pkgconfig" ]; then
+ PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig:$CFG_SYSROOT/usr/share/pkgconfig
+ export PKG_CONFIG_LIBDIR
+ echo >&2 "Note: PKG_CONFIG_LIBDIR automatically set to $PKG_CONFIG_LIBDIR"
+ elif [ "$CFG_PKGCONFIG" = "yes" ]; then
+ echo >&2 "Error: PKG_CONFIG_LIBDIR has not been set. This could mean"
+ echo >&2 "the host's .pc files will be used (even if you set PKG_CONFIG_PATH)."
+ echo >&2 "Set this variable to the directory that contains target .pc files"
+ echo >&2 "for pkg-config to function correctly when cross-compiling or"
+ echo >&2 "use -force-pkg-config to override this test."
+ exit 101
+ else
+ PKG_CONFIG=
+ echo >&2 "Warning: Disabling pkg-config since PKG_CONFIG_LIBDIR is not set."
+ fi
+ fi
+ if [ -z "$PKG_CONFIG_SYSROOT_DIR" ]; then
+ if [ -n "$CFG_SYSROOT" ]; then
+ PKG_CONFIG_SYSROOT_DIR=$CFG_SYSROOT
+ export PKG_CONFIG_SYSROOT_DIR
+ echo >&2 "Note: PKG_CONFIG_SYSROOT_DIR automatically set to $PKG_CONFIG_SYSROOT_DIR"
+ elif [ "$CFG_PKGCONFIG" = "yes" ]; then
+ echo >&2 "Error: PKG_CONFIG_SYSROOT_DIR has not been set. Set this variable"
+ echo >&2 "to your sysroot for pkg-config to function correctly when cross-compiling"
+ echo >&2 "or use -force-pkg-config to override this test."
+ exit 101
+ else
+ PKG_CONFIG=
+ echo >&2 "Warning: Disabling pkg-config since PKG_CONFIG_SYSROOT_DIR is not set."
+ fi
+ fi
+ fi
+elif [ "$CFG_PKGCONFIG" = "yes" ]; then
+ echo >&2 "Could not detect pkg-config from mkspec or PATH."
+ exit 101
+fi
+
+if [ -z "$PKG_CONFIG" ]; then
+ QT_CONFIG="$QT_CONFIG no-pkg-config"
+fi
+
+#-------------------------------------------------------------------------------
# tests that need qmake
#-------------------------------------------------------------------------------
@@ -5914,6 +5949,11 @@ if [ "$CFG_DEBUG_RELEASE" = "yes" ]; then
else
echo "Debug .................. $CFG_DEBUG"
fi
+if [ -n "$PKG_CONFIG" ]; then
+ echo "pkg-config ............. yes"
+else
+ echo "pkg-config ............. no"
+fi
[ "$CFG_DBUS" = "no" ] && echo "QtDBus module .......... no"
[ "$CFG_DBUS" = "yes" ] && echo "QtDBus module .......... yes (run-time)"
[ "$CFG_DBUS" = "linked" ] && echo "QtDBus module .......... yes (linked)"
diff --git a/src/corelib/codecs/qutfcodec.cpp b/src/corelib/codecs/qutfcodec.cpp
index c7076eea3a..18d063a38c 100644
--- a/src/corelib/codecs/qutfcodec.cpp
+++ b/src/corelib/codecs/qutfcodec.cpp
@@ -58,7 +58,7 @@ static inline bool isUnicodeNonCharacter(uint ucs4)
// U+FDEF (inclusive)
return (ucs4 & 0xfffe) == 0xfffe
- || (ucs4 - 0xfdd0U) < 16;
+ || (ucs4 - 0xfdd0U) < 32;
}
QByteArray QUtf8::convertFromUnicode(const QChar *uc, int len, QTextCodec::ConverterState *state)
diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp
index 9b11c9ac3e..7d25c81db2 100644
--- a/src/corelib/json/qjsonparser.cpp
+++ b/src/corelib/json/qjsonparser.cpp
@@ -731,7 +731,7 @@ static inline bool isUnicodeNonCharacter(uint ucs4)
// U+FDEF (inclusive)
return (ucs4 & 0xfffe) == 0xfffe
- || (ucs4 - 0xfdd0U) < 16;
+ || (ucs4 - 0xfdd0U) < 32;
}
static inline bool scanUtf8Char(const char *&json, const char *end, uint *result)
diff --git a/src/corelib/json/qjsonwriter.cpp b/src/corelib/json/qjsonwriter.cpp
index d544e6154b..d392bd7529 100644
--- a/src/corelib/json/qjsonwriter.cpp
+++ b/src/corelib/json/qjsonwriter.cpp
@@ -61,7 +61,7 @@ static inline bool isUnicodeNonCharacter(uint ucs4)
// U+FDEF (inclusive)
return (ucs4 & 0xfffe) == 0xfffe
- || (ucs4 - 0xfdd0U) < 16;
+ || (ucs4 - 0xfdd0U) < 32;
}
static inline uchar hexdig(uint u)
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 96f7eb5428..88ff31fe91 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -1383,7 +1383,7 @@ void QWindow::resizeEvent(QResizeEvent *ev)
/*!
Override this to handle show events.
- The show event is called when the window becomes visible in the windowing system.
+ This function is called when the window becomes visible in the windowing system.
*/
void QWindow::showEvent(QShowEvent *ev)
{
@@ -1391,9 +1391,9 @@ void QWindow::showEvent(QShowEvent *ev)
}
/*!
- Override this to handle show events.
+ Override this to handle hide events.
- The show event is called when the window becomes hidden in the windowing system.
+ This function is called when the window becomes hidden in the windowing system.
*/
void QWindow::hideEvent(QHideEvent *ev)
{
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 5a8f90b7ad..06cc5ad123 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -149,6 +149,7 @@ QXcbWindow::QXcbWindow(QWindow *window)
#if defined(XCB_USE_EGL)
, m_eglSurface(0)
#endif
+ , m_lastWindowStateEvent(-1)
{
m_screen = static_cast<QXcbScreen *>(window->screen()->handle());
@@ -636,29 +637,9 @@ static void setMotifWmHints(QXcbConnection *c, xcb_window_t window, const QtMoti
}
}
-void QXcbWindow::printNetWmState(const QVector<xcb_atom_t> &state)
+QXcbWindow::NetWmStates QXcbWindow::netWmStates()
{
- printf("_NET_WM_STATE (%d): ", state.size());
- for (int i = 0; i < state.size(); ++i) {
-#define CHECK_WM_STATE(state_atom) \
- if (state.at(i) == atom(QXcbAtom::state_atom))\
- printf(#state_atom " ");
- CHECK_WM_STATE(_NET_WM_STATE_ABOVE)
- CHECK_WM_STATE(_NET_WM_STATE_BELOW)
- CHECK_WM_STATE(_NET_WM_STATE_FULLSCREEN)
- CHECK_WM_STATE(_NET_WM_STATE_MAXIMIZED_HORZ)
- CHECK_WM_STATE(_NET_WM_STATE_MAXIMIZED_VERT)
- CHECK_WM_STATE(_NET_WM_STATE_MODAL)
- CHECK_WM_STATE(_NET_WM_STATE_STAYS_ON_TOP)
- CHECK_WM_STATE(_NET_WM_STATE_DEMANDS_ATTENTION)
-#undef CHECK_WM_STATE
- }
- printf("\n");
-}
-
-QVector<xcb_atom_t> QXcbWindow::getNetWmState()
-{
- QVector<xcb_atom_t> result;
+ NetWmStates result(0);
xcb_get_property_cookie_t get_cookie =
xcb_get_property_unchecked(xcb_connection(), 0, m_window, atom(QXcbAtom::_NET_WM_STATE),
@@ -668,15 +649,24 @@ QVector<xcb_atom_t> QXcbWindow::getNetWmState()
xcb_get_property_reply(xcb_connection(), get_cookie, NULL);
if (reply && reply->format == 32 && reply->type == XCB_ATOM_ATOM) {
- result.resize(reply->length);
-
- memcpy(result.data(), xcb_get_property_value(reply), reply->length * sizeof(xcb_atom_t));
-
-#ifdef NET_WM_STATE_DEBUG
- printf("getting net wm state (%x)\n", m_window);
- printNetWmState(result);
-#endif
-
+ const xcb_atom_t *states = static_cast<const xcb_atom_t *>(xcb_get_property_value(reply));
+ const xcb_atom_t *statesEnd = states + reply->length;
+ if (statesEnd != qFind(states, statesEnd, atom(QXcbAtom::_NET_WM_STATE_ABOVE)))
+ result |= NetWmStateAbove;
+ if (statesEnd != qFind(states, statesEnd, atom(QXcbAtom::_NET_WM_STATE_BELOW)))
+ result |= NetWmStateBelow;
+ if (statesEnd != qFind(states, statesEnd, atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN)))
+ result |= NetWmStateFullScreen;
+ if (statesEnd != qFind(states, statesEnd, atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ)))
+ result |= NetWmStateMaximizedHorz;
+ if (statesEnd != qFind(states, statesEnd, atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT)))
+ result |= NetWmStateMaximizedVert;
+ if (statesEnd != qFind(states, statesEnd, atom(QXcbAtom::_NET_WM_STATE_MODAL)))
+ result |= NetWmStateModal;
+ if (statesEnd != qFind(states, statesEnd, atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP)))
+ result |= NetWmStateStaysOnTop;
+ if (statesEnd != qFind(states, statesEnd, atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION)))
+ result |= NetWmStateDemandsAttention;
free(reply);
} else {
#ifdef NET_WM_STATE_DEBUG
@@ -687,8 +677,26 @@ QVector<xcb_atom_t> QXcbWindow::getNetWmState()
return result;
}
-void QXcbWindow::setNetWmState(const QVector<xcb_atom_t> &atoms)
+void QXcbWindow::setNetWmStates(NetWmStates states)
{
+ QVector<xcb_atom_t> atoms;
+ if (states & NetWmStateAbove)
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_ABOVE));
+ if (states & NetWmStateBelow)
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_BELOW));
+ if (states & NetWmStateFullScreen)
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN));
+ if (states & NetWmStateMaximizedHorz)
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ));
+ if (states & NetWmStateMaximizedVert)
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT));
+ if (states & NetWmStateModal)
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MODAL));
+ if (states & NetWmStateStaysOnTop)
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP));
+ if (states & NetWmStateDemandsAttention)
+ atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
+
if (atoms.isEmpty()) {
Q_XCB_CALL(xcb_delete_property(xcb_connection(), m_window, atom(QXcbAtom::_NET_WM_STATE)));
} else {
@@ -699,7 +707,6 @@ void QXcbWindow::setNetWmState(const QVector<xcb_atom_t> &atoms)
xcb_flush(xcb_connection());
}
-
Qt::WindowFlags QXcbWindow::setWindowFlags(Qt::WindowFlags flags)
{
Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
@@ -966,30 +973,28 @@ void QXcbWindow::updateMotifWmHintsBeforeMap()
void QXcbWindow::updateNetWmStateBeforeMap()
{
- QVector<xcb_atom_t> netWmState;
+ NetWmStates states(0);
- Qt::WindowFlags flags = window()->windowFlags();
+ const Qt::WindowFlags flags = window()->windowFlags();
if (flags & Qt::WindowStaysOnTopHint) {
- netWmState.append(atom(QXcbAtom::_NET_WM_STATE_ABOVE));
- netWmState.append(atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP));
+ states |= NetWmStateAbove;
+ states |= NetWmStateStaysOnTop;
} else if (flags & Qt::WindowStaysOnBottomHint) {
- netWmState.append(atom(QXcbAtom::_NET_WM_STATE_BELOW));
+ states |= NetWmStateBelow;
}
- if (window()->windowState() & Qt::WindowFullScreen) {
- netWmState.append(atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN));
- }
+ if (window()->windowState() & Qt::WindowFullScreen)
+ states |= NetWmStateFullScreen;
if (window()->windowState() & Qt::WindowMaximized) {
- netWmState.append(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ));
- netWmState.append(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT));
+ states |= NetWmStateMaximizedHorz;
+ states |= NetWmStateMaximizedVert;
}
- if (window()->windowModality() != Qt::NonModal) {
- netWmState.append(atom(QXcbAtom::_NET_WM_STATE_MODAL));
- }
+ if (window()->windowModality() != Qt::NonModal)
+ states |= NetWmStateModal;
- setNetWmState(netWmState);
+ setNetWmStates(states);
}
void QXcbWindow::updateNetWmUserTime(xcb_timestamp_t timestamp)
@@ -1452,41 +1457,42 @@ void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *ev
{
connection()->setTime(event->time);
- bool propertyDeleted = event->state == XCB_PROPERTY_DELETE;
+ const bool propertyDeleted = event->state == XCB_PROPERTY_DELETE;
+ const xcb_atom_t netWmStateAtom = atom(QXcbAtom::_NET_WM_STATE);
+ const xcb_atom_t wmStateAtom = atom(QXcbAtom::WM_STATE);
- if (event->atom == atom(QXcbAtom::_NET_WM_STATE) || event->atom == atom(QXcbAtom::WM_STATE)) {
+ if (event->atom == netWmStateAtom || event->atom == wmStateAtom) {
if (propertyDeleted)
return;
- xcb_get_property_cookie_t get_cookie =
- xcb_get_property(xcb_connection(), 0, m_window, atom(QXcbAtom::WM_STATE),
- XCB_ATOM_ANY, 0, 1024);
+ Qt::WindowState newState = Qt::WindowNoState;
+ if (event->atom == wmStateAtom) { // WM_STATE: Quick check for 'Minimize'.
+ const xcb_get_property_cookie_t get_cookie =
+ xcb_get_property(xcb_connection(), 0, m_window, wmStateAtom,
+ XCB_ATOM_ANY, 0, 1024);
- xcb_get_property_reply_t *reply =
- xcb_get_property_reply(xcb_connection(), get_cookie, NULL);
+ xcb_get_property_reply_t *reply =
+ xcb_get_property_reply(xcb_connection(), get_cookie, NULL);
- xcb_atom_t wm_state = XCB_WM_STATE_WITHDRAWN;
- if (reply && reply->format == 32 && reply->type == atom(QXcbAtom::WM_STATE)) {
- if (reply->length != 0)
- wm_state = ((long *)xcb_get_property_value(reply))[0];
- free(reply);
+ if (reply && reply->format == 32 && reply->type == wmStateAtom) {
+ const long *data = (const long *)xcb_get_property_value(reply);
+ if (reply->length != 0 && XCB_WM_STATE_ICONIC == data[0])
+ newState = Qt::WindowMinimized;
+ free(reply);
+ }
+ } // WM_STATE: Quick check for 'Minimize'.
+ if (newState != Qt::WindowMinimized) { // Something else changed, get _NET_WM_STATE.
+ const NetWmStates states = netWmStates();
+ if ((states & NetWmStateMaximizedHorz) && (states & NetWmStateMaximizedVert))
+ newState = Qt::WindowMaximized;
+ else if (states & NetWmStateFullScreen)
+ newState = Qt::WindowFullScreen;
+ }
+ // Send Window state, compress events in case other flags (modality, etc) are changed.
+ if (m_lastWindowStateEvent != newState) {
+ QWindowSystemInterface::handleWindowStateChanged(window(), newState);
+ m_lastWindowStateEvent = newState;
}
-
- QVector<xcb_atom_t> netWmState = getNetWmState();
-
- bool maximized = netWmState.contains(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ))
- && netWmState.contains(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT));
- bool fullscreen = netWmState.contains(atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN));
-
- Qt::WindowState state = Qt::WindowNoState;
- if (wm_state == XCB_WM_STATE_ICONIC)
- state = Qt::WindowMinimized;
- else if (maximized)
- state = Qt::WindowMaximized;
- else if (fullscreen)
- state = Qt::WindowFullScreen;
-
- QWindowSystemInterface::handleWindowStateChanged(window(), state);
}
}
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index c212095e98..d4c8804486 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -59,6 +59,19 @@ class QXcbEGLSurface;
class QXcbWindow : public QXcbObject, public QPlatformWindow
{
public:
+ enum NetWmState {
+ NetWmStateAbove = 0x1,
+ NetWmStateBelow = 0x2,
+ NetWmStateFullScreen = 0x4,
+ NetWmStateMaximizedHorz = 0x8,
+ NetWmStateMaximizedVert = 0x10,
+ NetWmStateModal = 0x20,
+ NetWmStateStaysOnTop = 0x40,
+ NetWmStateDemandsAttention = 0x80
+ };
+
+ Q_DECLARE_FLAGS(NetWmStates, NetWmState)
+
QXcbWindow(QWindow *window);
~QXcbWindow();
@@ -121,9 +134,8 @@ public:
private:
void changeNetWmState(bool set, xcb_atom_t one, xcb_atom_t two = 0);
- QVector<xcb_atom_t> getNetWmState();
- void setNetWmState(const QVector<xcb_atom_t> &atoms);
- void printNetWmState(const QVector<xcb_atom_t> &state);
+ NetWmStates netWmStates();
+ void setNetWmStates(NetWmStates);
void setNetWmWindowFlags(Qt::WindowFlags flags);
void setMotifWindowFlags(Qt::WindowFlags flags);
@@ -169,6 +181,7 @@ private:
QRegion m_exposeRegion;
xcb_visualid_t m_visualId;
+ int m_lastWindowStateEvent;
};
QT_END_NAMESPACE
diff --git a/src/widgets/graphicsview/qgraphicslayoutitem.h b/src/widgets/graphicsview/qgraphicslayoutitem.h
index ef391f01a0..38f09743c0 100644
--- a/src/widgets/graphicsview/qgraphicslayoutitem.h
+++ b/src/widgets/graphicsview/qgraphicslayoutitem.h
@@ -96,13 +96,12 @@ public:
QSizeF effectiveSizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const;
- virtual void updateGeometry(); //### rename to sizeHintChanged()
+ virtual void updateGeometry();
QGraphicsLayoutItem *parentLayoutItem() const;
void setParentLayoutItem(QGraphicsLayoutItem *parent);
bool isLayout() const;
- // ###Qt5: Make automatic reparenting work regardless of item/object/widget type.
QGraphicsItem *graphicsItem() const;
bool ownedByLayout() const;
diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp
index 6dbd3c1f77..3cccc52311 100644
--- a/src/widgets/kernel/qwidgetwindow_qpa.cpp
+++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp
@@ -454,10 +454,38 @@ void QWidgetWindow::handleWindowStateChangedEvent(QWindowStateChangeEvent *event
{
// QWindow does currently not know 'active'.
Qt::WindowStates eventState = event->oldState();
- if (m_widget->windowState() & Qt::WindowActive)
+ Qt::WindowStates widgetState = m_widget->windowState();
+ if (widgetState & Qt::WindowActive)
eventState |= Qt::WindowActive;
- QWindowStateChangeEvent widgetEvent(eventState);
- QGuiApplication::sendSpontaneousEvent(m_widget, &widgetEvent);
+
+ // Determine the new widget state, remember maximized/full screen
+ // during minimized.
+ switch (windowState()) {
+ case Qt::WindowNoState:
+ widgetState &= ~(Qt::WindowMinimized | Qt::WindowMaximized | Qt::WindowFullScreen);
+ break;
+ case Qt::WindowMinimized:
+ widgetState |= Qt::WindowMinimized;
+ break;
+ case Qt::WindowMaximized:
+ widgetState &= ~Qt::WindowFullScreen;
+ widgetState |= Qt::WindowMaximized;
+ break;
+ case Qt::WindowFullScreen:
+ widgetState &= ~Qt::WindowMaximized;
+ widgetState |= Qt::WindowFullScreen;
+ break;
+ case Qt::WindowActive: // Not handled by QWindow
+ break;
+ }
+
+ // Sent event if the state changed (that is, it is not triggered by
+ // QWidget::setWindowState(), which also sends an event to the widget).
+ if (widgetState != m_widget->data->window_state) {
+ m_widget->data->window_state = widgetState;
+ QWindowStateChangeEvent widgetEvent(eventState);
+ QGuiApplication::sendSpontaneousEvent(m_widget, &widgetEvent);
+ }
}
bool QWidgetWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
diff --git a/src/xml/dom/qdom.cpp b/src/xml/dom/qdom.cpp
index 04efe43e35..23a9db8e3a 100644
--- a/src/xml/dom/qdom.cpp
+++ b/src/xml/dom/qdom.cpp
@@ -4559,14 +4559,14 @@ void QDomElementPrivate::save(QTextStream& s, int depth, int indent) const
QString qName(name);
QString nsDecl(QLatin1String(""));
if (!namespaceURI.isNull()) {
- /** ### Qt 5:
+ /** ###
*
* If we still have QDom, optimize this so that we only declare namespaces that are not
* yet declared. We loose default namespace mappings, so maybe we should rather store
* the information that we get from startPrefixMapping()/endPrefixMapping() and use them.
* Modifications becomes more complex then, however.
*
- * We cannot do this during the Qt 4 series because it would require too invasive changes, and
+ * We cannot do this in a patch release because it would require too invasive changes, and
* hence possibly behavioral changes.
*/
if (prefix.isEmpty()) {
diff --git a/src/xml/sax/qxml.cpp b/src/xml/sax/qxml.cpp
index c2205edb40..a5c206dc27 100644
--- a/src/xml/sax/qxml.cpp
+++ b/src/xml/sax/qxml.cpp
@@ -99,7 +99,7 @@ static const signed char cltSq = 13; // '
static const signed char cltUnknown = 14;
// Hack for letting QDom know where the skipped entity occurred
-// ### Qt5: the use of this variable means the code isn't reentrant.
+// ### the use of this variable means the code isn't reentrant.
bool qt_xml_skipped_entity_in_content;
// character lookup table
@@ -1330,7 +1330,7 @@ QXmlInputSource::QXmlInputSource(QIODevice *dev)
*/
QXmlInputSource::~QXmlInputSource()
{
- // ### Qt 5: close the input device. See task 153111
+ // ### close the input device.
#ifndef QT_NO_TEXTCODEC
delete d->encMapper;
#endif
@@ -3133,16 +3133,17 @@ bool QXmlSimpleReader::feature(const QString& name, bool *ok) const
{
const QXmlSimpleReaderPrivate *d = d_func();
- // Qt5 ###: Change these strings to qt.nokia.com
if (ok != 0)
*ok = true;
if (name == QLatin1String("http://xml.org/sax/features/namespaces")) {
return d->useNamespaces;
} else if (name == QLatin1String("http://xml.org/sax/features/namespace-prefixes")) {
return d->useNamespacePrefixes;
- } else if (name == QLatin1String("http://trolltech.com/xml/features/report-whitespace-only-CharData")) { // Shouldn't change in Qt 4
+ } else if (name == QLatin1String("http://trolltech.com/xml/features/report-whitespace-only-CharData") // For compat with Qt 4
+ || name == QLatin1String("http://qt-project.org/xml/features/report-whitespace-only-CharData")) {
return d->reportWhitespaceCharData;
- } else if (name == QLatin1String("http://trolltech.com/xml/features/report-start-end-entity")) { // Shouldn't change in Qt 4
+ } else if (name == QLatin1String("http://trolltech.com/xml/features/report-start-end-entity") // For compat with Qt 4
+ || name == QLatin1String("http://qt-project.org/xml/features/report-start-end-entity")) {
return d->reportEntities;
} else {
qWarning("Unknown feature %s", name.toLatin1().data());
@@ -3168,12 +3169,29 @@ bool QXmlSimpleReader::feature(const QString& name, bool *ok) const
reported.
\row \li \e http://trolltech.com/xml/features/report-whitespace-only-CharData
\li true
+ \li Obsolete, use the following string instead.
+ If enabled, CharData that consist of
+ only whitespace characters are reported
+ using QXmlContentHandler::characters(). If disabled, whitespace is silently
+ discarded.
+ \row \li \e http://qt-project.org/xml/features/report-whitespace-only-CharData
+ \li true
\li If enabled, CharData that consist of
only whitespace characters are reported
using QXmlContentHandler::characters(). If disabled, whitespace is silently
discarded.
\row \li \e http://trolltech.com/xml/features/report-start-end-entity
\li false
+ \li Obsolete, use the following string instead.
+ If enabled, the parser reports
+ QXmlContentHandler::startEntity() and
+ QXmlContentHandler::endEntity() events, so character data
+ might be reported in chunks.
+ If disabled, the parser does not report these events, but
+ silently substitutes the entities, and reports the character
+ data in one chunk.
+ \row \li \e http://qt-project.org/xml/features/report-start-end-entity
+ \li false
\li If enabled, the parser reports
QXmlContentHandler::startEntity() and
QXmlContentHandler::endEntity() events, so character data
@@ -3188,14 +3206,15 @@ bool QXmlSimpleReader::feature(const QString& name, bool *ok) const
void QXmlSimpleReader::setFeature(const QString& name, bool enable)
{
Q_D(QXmlSimpleReader);
- // Qt5 ###: Change these strings to qt.nokia.com
if (name == QLatin1String("http://xml.org/sax/features/namespaces")) {
d->useNamespaces = enable;
} else if (name == QLatin1String("http://xml.org/sax/features/namespace-prefixes")) {
d->useNamespacePrefixes = enable;
- } else if (name == QLatin1String("http://trolltech.com/xml/features/report-whitespace-only-CharData")) { // Shouldn't change in Qt 4
+ } else if (name == QLatin1String("http://trolltech.com/xml/features/report-whitespace-only-CharData") // For compat with Qt 4
+ || name == QLatin1String("http://qt-project.org/xml/features/report-whitespace-only-CharData")) {
d->reportWhitespaceCharData = enable;
- } else if (name == QLatin1String("http://trolltech.com/xml/features/report-start-end-entity")) { // Shouldn't change in Qt 4
+ } else if (name == QLatin1String("http://trolltech.com/xml/features/report-start-end-entity") // For compat with Qt 4
+ || name == QLatin1String("http://trolltech.com/xml/features/report-start-end-entity")) {
d->reportEntities = enable;
} else {
qWarning("Unknown feature %s", name.toLatin1().data());
@@ -3206,11 +3225,12 @@ void QXmlSimpleReader::setFeature(const QString& name, bool enable)
*/
bool QXmlSimpleReader::hasFeature(const QString& name) const
{
- // Qt5 ###: Change these strings to qt.nokia.com
if (name == QLatin1String("http://xml.org/sax/features/namespaces")
|| name == QLatin1String("http://xml.org/sax/features/namespace-prefixes")
- || name == QLatin1String("http://trolltech.com/xml/features/report-whitespace-only-CharData") // Shouldn't change in Qt 4
- || name == QLatin1String("http://trolltech.com/xml/features/report-start-end-entity")) { // Shouldn't change in Qt 4
+ || name == QLatin1String("http://trolltech.com/xml/features/report-whitespace-only-CharData") // For compat with Qt 4
+ || name == QLatin1String("http://qt-project.org/xml/features/report-whitespace-only-CharData")
+ || name == QLatin1String("http://trolltech.com/xml/features/report-start-end-entity") // For compat with Qt 4
+ || name == QLatin1String("http://qt-project.org/xml/features/report-start-end-entity")) {
return true;
} else {
return false;
diff --git a/src/xml/sax/qxml.h b/src/xml/sax/qxml.h
index 86d0956290..0113d22942 100644
--- a/src/xml/sax/qxml.h
+++ b/src/xml/sax/qxml.h
@@ -359,7 +359,7 @@ public:
virtual bool internalEntityDecl(const QString& name, const QString& value) = 0;
virtual bool externalEntityDecl(const QString& name, const QString& publicId, const QString& systemId) = 0;
virtual QString errorString() const = 0;
- // ### Qt 5: Conform to SAX by adding elementDecl
+ // ### Conform to SAX by adding elementDecl
};
diff --git a/tests/auto/corelib/codecs/utf8/tst_utf8.cpp b/tests/auto/corelib/codecs/utf8/tst_utf8.cpp
index b80ba8e665..c0ed152c32 100644
--- a/tests/auto/corelib/codecs/utf8/tst_utf8.cpp
+++ b/tests/auto/corelib/codecs/utf8/tst_utf8.cpp
@@ -321,7 +321,7 @@ void tst_Utf8::nonCharacters_data()
// U+FDEF (inclusive)
// U+FDD0 through U+FDEF
- for (int i = 0; i < 16; ++i) {
+ for (int i = 0; i < 32; ++i) {
char utf8[] = { char(0357), char(0267), char(0220 + i), 0 };
QString utf16 = QChar(0xfdd0 + i);
QTest::newRow(qPrintable(QString::number(0xfdd0 + i, 16))) << QByteArray(utf8) << utf16;
diff --git a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/qgraphicsgridlayout.pro b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/qgraphicsgridlayout.pro
index b32c638948..5796cbfd73 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/qgraphicsgridlayout.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/qgraphicsgridlayout.pro
@@ -4,5 +4,3 @@ TARGET = tst_qgraphicsgridlayout
QT += widgets testlib
SOURCES += tst_qgraphicsgridlayout.cpp
CONFIG += parallel_test
-# ### fixme: QTBUG-20756 crashes on xcb
-contains(QT_CONFIG,xcb):CONFIG+=insignificant_test
diff --git a/tests/auto/widgets/widgets/qtextedit/qtextedit.pro b/tests/auto/widgets/widgets/qtextedit/qtextedit.pro
index 1c2821b289..6e0fff17d5 100644
--- a/tests/auto/widgets/widgets/qtextedit/qtextedit.pro
+++ b/tests/auto/widgets/widgets/qtextedit/qtextedit.pro
@@ -2,18 +2,5 @@ CONFIG += testcase
TARGET = tst_qtextedit
QT += widgets widgets-private gui-private core-private testlib
-INCLUDEPATH += ../
-HEADERS +=
-SOURCES += tst_qtextedit.cpp
-
-wince* {
- addImages.files = fullWidthSelection/*
- addImages.path = fullWidthSelection
- DEPLOYMENT += addImages
- DEFINES += SRCDIR=\\\"./\\\"
-} else {
- DEFINES += SRCDIR=\\\"$$PWD/\\\"
-}
-
-contains(QT_CONFIG,xcb):CONFIG+=insignificant_test # QTBUG-20756 crashes on xcb
+SOURCES += tst_qtextedit.cpp
diff --git a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
index 9c5a3dbed7..a3f58c4c0d 100644
--- a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
+++ b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp
@@ -58,6 +58,7 @@
#include <qimagewriter.h>
#include <qcommonstyle.h>
#include <qlayout.h>
+#include <qdir.h>
#include <qabstracttextdocumentlayout.h>
#include <qtextdocumentfragment.h>
@@ -218,6 +219,7 @@ private:
QTextEdit *ed;
qreal rootFrameMargin;
PlatformInputContext m_platformInputContext;
+ const QString m_fullWidthSelectionImagesFolder;
};
bool tst_QTextEdit::nativeClipboardWorking()
@@ -376,13 +378,17 @@ public:
int &iterationCounter;
};
-tst_QTextEdit::tst_QTextEdit()
-{}
+tst_QTextEdit::tst_QTextEdit() :
+ m_fullWidthSelectionImagesFolder(QFINDTESTDATA("fullWidthSelection"))
+{
+
+}
void tst_QTextEdit::initTestCase()
{
QInputMethodPrivate *inputMethodPrivate = QInputMethodPrivate::get(qApp->inputMethod());
inputMethodPrivate->testContext = &m_platformInputContext;
+ QVERIFY2(!m_fullWidthSelectionImagesFolder.isEmpty(), qPrintable(QString::fromLatin1("Cannot locate 'fullWidthSelection' starting from %1").arg(QDir::currentPath())));
}
void tst_QTextEdit::cleanupTestCase()
@@ -1934,12 +1940,18 @@ void tst_QTextEdit::fullWidthSelection_data()
QTest::addColumn<int>("cursorTo");
QTest::addColumn<QString>("imageFileName");
- QTest::newRow("centered fully selected") << 0 << 15 << QString("fullWidthSelection/centered-fully-selected.png");
- QTest::newRow("centered partly selected") << 2 << 15 << QString("fullWidthSelection/centered-partly-selected.png");
- QTest::newRow("last char on line") << 42 << 44 << QString("fullWidthSelection/last-char-on-line.png");
- QTest::newRow("last char on parag") << 545 << 548 << QString("fullWidthSelection/last-char-on-parag.png");
- QTest::newRow("multiple full width lines") << 20 << 60 << QString("fullWidthSelection/multiple-full-width-lines.png");
- QTest::newRow("single full width line") << 20 << 30 << QString("fullWidthSelection/single-full-width-line.png");
+ QTest::newRow("centered fully selected")
+ << 0 << 15 << (m_fullWidthSelectionImagesFolder + QStringLiteral("/centered-fully-selected.png"));
+ QTest::newRow("centered partly selected")
+ << 2 << 15 << (m_fullWidthSelectionImagesFolder + QStringLiteral("/centered-partly-selected.png"));
+ QTest::newRow("last char on line")
+ << 42 << 44 << (m_fullWidthSelectionImagesFolder + QStringLiteral("/last-char-on-line.png"));
+ QTest::newRow("last char on parag")
+ << 545 << 548 << (m_fullWidthSelectionImagesFolder + QStringLiteral("/last-char-on-parag.png"));
+ QTest::newRow("multiple full width lines")
+ << 20 << 60 << (m_fullWidthSelectionImagesFolder + QStringLiteral("/multiple-full-width-lines.png"));
+ QTest::newRow("single full width line")
+ << 20 << 30 << (m_fullWidthSelectionImagesFolder + QStringLiteral("/single-full-width-line.png"));
}
void tst_QTextEdit::fullWidthSelection()
@@ -2053,11 +2065,12 @@ void tst_QTextEdit::compareWidgetAndImage(QTextEdit &widget, const QString &imag
QPainter painter(&image);
widget.viewport()->render(&painter);
painter.end();
- // qDebug() << "file: " << QString(SRCDIR) + imageFileName;
- QImageReader reader(QString(SRCDIR) + imageFileName, "PNG");
+ QImageReader reader(imageFileName, "PNG");
+
QImage original = reader.read();
- QCOMPARE(original.isNull(), false);
+ QVERIFY2(!original.isNull(),
+ qPrintable(QString::fromLatin1("Unable to read image %1: %2").arg(imageFileName, reader.errorString())));
QCOMPARE(original.size(), image.size());
QCOMPARE(image.depth(), 32);
QCOMPARE(original.depth(), image.depth());
diff --git a/tests/benchmarks/corelib/tools/qstring/main.cpp b/tests/benchmarks/corelib/tools/qstring/main.cpp
index 9b10e97f2b..40300af947 100644
--- a/tests/benchmarks/corelib/tools/qstring/main.cpp
+++ b/tests/benchmarks/corelib/tools/qstring/main.cpp
@@ -1944,7 +1944,7 @@ static inline bool isUnicodeNonCharacter(uint ucs4)
// U+FDEF (inclusive)
return (ucs4 & 0xfffe) == 0xfffe
- || (ucs4 - 0xfdd0U) < 16;
+ || (ucs4 - 0xfdd0U) < 32;
}
int fromUtf8_qt47(ushort *dst, const char *chars, int len)