Merge "Merge remote-tracking branch 'origin/release' into stable" into refs/staging/stable

This commit is contained in:
Frederik Gladhorn 2013-12-05 19:53:16 +01:00 committed by The Qt Project
commit af47adede0
46 changed files with 381 additions and 100 deletions

16
configure vendored
View File

@ -5068,6 +5068,11 @@ if [ "$CFG_TSLIB" != "no" ]; then
fi
fi
# Check we actually have X11 :-)
if compileTest x11/xlib "XLib"; then
QT_CONFIG="$QT_CONFIG xlib"
fi
if [ "$CFG_XCB" != "no" ]; then
if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists "xcb >= 1.5" 2>/dev/null; then
QMAKE_CFLAGS_XCB="`$PKG_CONFIG --cflags xcb 2>/dev/null`"
@ -5113,17 +5118,6 @@ if [ "$CFG_XCB" != "no" ]; then
fi
fi
# Check for X11. Eventually we should port everything to XCB,
# but for now the port is incomplete and Xlib is a requirement.
if compileTest x11/xlib "XLib"; then
QT_CONFIG="$QT_CONFIG xlib"
else
echo "The test for linking against Xlib failed!"
echo " You might need to install dependency packages."
echo " See src/plugins/platforms/xcb/README."
exit 1
fi
if [ "$CFG_XCB_XLIB" != "no" ]; then
if compileTest qpa/xcb-xlib "xcb-xlib" $QMAKE_CFLAGS_XCB $QMAKE_LIBS_XCB; then
QT_CONFIG="$QT_CONFIG xcb-xlib"

64
dist/changes-5.2.0 vendored
View File

@ -52,6 +52,29 @@ information about a particular change.
zero delta() in order to indicate beginning and end of transient
scrolling.
- Mac OS X framework builds of Qt no longer contain a Unix-like include/
directory; all headers are located in the frameworks. This may affect
3rd party build systems not based on qmake or cmake.
****************************************************************************
* Platform deprecation notice *
****************************************************************************
- The support for the old implementation of QAtomicInt and
QAtomicPointer is deprecated in Qt 5.2 and will be removed in Qt
5.3. Building with the following compilers or environments will not
be possible in Qt 5.3 or the build will suffer greatly in
performance, unless support is revived by writing new atomics code.
* Green Hills compiler for INTEGRITY
* Sun Studio compiler suite for Solaris
* IBM Visual Age compiler suite for AIX
* Kernel-mode VxWorks
Developers interested in picking up support should contact the
development mailing list at development@qt-project.org for more
information. Note that those platforms are currently not tested. Most
likely, they have further problems than just the atomics code.
****************************************************************************
* Library *
****************************************************************************
@ -700,3 +723,44 @@ X11
- [QTBUG-31762] Fix position of system tray icon (except Unity)
- [QTBUG-27349] Reintroduced command line argument for positioning
windows (-geometry)
****************************************************************************
* Tools *
****************************************************************************
- configure
* Added option to disable the QtMultimedia WMF backend
* [Unix] Added option to build with gcov support
* Added -extprefix option to support Qt installing into a different
location than the on-device -prefix within the -sysroot.
* [QTBUG-33584][Unix] Fixed parsing of -device-option with equal signs.
- cmake config files
* [QTBUG-33145] Fixed usage of non-QtBase modules with Qt compiled from
source tarballs.
* [QTBUG-33223] Fixed header file location on multi-arch systems.
* Added support for automatic packaging of Qt plugins with cpack.
- qmake
* [QTBUG-491] Added saner approach to debug/release path rewriting.
* Added the parseJson() function.
* Added "osx" scope as an alias for "macx". Note that matching on the
makespec is generally deprecated - use "linux", "gcc", etc.
* Added support for .qmake.stash files which are really *just* caches.
* [Xcode] Added support for QMAKE_PRE_LINK and QMAKE_POST_LINK.
* [QTBUG-31129] Added installation of PDB files for dlltarget.
* [QTBUG-28102] Added support for querying disabled Qt features.
* Removed macx-clang-libc++* makespecs. libc++ is now handled automatically.
* [QTBUG-32912][MSVS] Fixed moc not being run in case of DBUS_ADAPTORS or
DBUS_INTERFACES being present.
* [QTBUG-30644] Fixed unsatisfied requires() breaking recursive targets.
* [QTBUG-31204] Fixed extra compilers not finding their inputs.
* [QTBUG-32885][MSVS] Made it possible to disable debug information.
* [QTBUG-33446][MSVS] Fixed generation of VS2010+ solution files.
* [QTBUG-32375][MSVS] Fixed output directory of nested projects.
* [QTBUG-34392][MSVS] Fixed /SAFESEH:NO with VS2010+.
* [QTBUG-34357][MSVS] Fixed breakage with multiple VS versions in PATH.
* [MSVS] Fixed sub-project dependency generation.

View File

@ -131,30 +131,33 @@ android: CONFIG += qt_android_deps
#install directives
load(qt_installs)
!isEmpty(_QMAKE_SUPER_CACHE_): \
rplbase = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]*
else: \
rplbase = $$MODULE_BASE_OUTDIR
include_replace.match = $$rplbase/include
include_replace.replace = $$[QT_INSTALL_HEADERS/raw]
include_replace.CONFIG = path
lib_replace.match = $$rplbase/lib
host_build: \
lib_replace.replace = $$[QT_HOST_LIBS]
else: \
lib_replace.replace = $$[QT_INSTALL_LIBS/raw]
lib_replace.CONFIG = path
QMAKE_PRL_INSTALL_REPLACE += include_replace lib_replace
unix|win32-g++* {
CONFIG += create_pc
host_build: \
QMAKE_PKGCONFIG_LIBDIR = $$[QT_HOST_LIBS]
else: \
QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS/raw]
QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS/raw]
QMAKE_PKGCONFIG_LIBDIR = $$lib_replace.replace
QMAKE_PKGCONFIG_INCDIR = $$include_replace.replace
QMAKE_PKGCONFIG_CFLAGS = -I${includedir}/$$MODULE_INCNAME
QMAKE_PKGCONFIG_DESTDIR = pkgconfig
!isEmpty(_QMAKE_SUPER_CACHE_): \
rplbase = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]*
else: \
rplbase = $$MODULE_BASE_OUTDIR
include_replace.match = $$rplbase/include
include_replace.replace = $$[QT_INSTALL_HEADERS/raw]
lib_replace.match = $$rplbase/lib
lib_replace.replace = $$QMAKE_PKGCONFIG_LIBDIR
QMAKE_PKGCONFIG_INSTALL_REPLACE += include_replace lib_replace
QMAKE_PRL_INSTALL_REPLACE += include_replace lib_replace
}
unix {
CONFIG += create_libtool explicitlib
QMAKE_LIBTOOL_LIBDIR = $$QMAKE_PKGCONFIG_LIBDIR
QMAKE_LIBTOOL_LIBDIR = $$lib_replace.replace
QMAKE_LIBTOOL_INSTALL_REPLACE += include_replace lib_replace
}

View File

@ -192,6 +192,22 @@ macx-xcode {
QMAKE_CXXFLAGS += -stdlib=libstdc++
QMAKE_LFLAGS += -stdlib=libstdc++
}
# Make the default debug information format for debug builds
# DWARF instead of DWARF with dSYM. This cuts down build times
# for application debug builds significantly, as Xcode doesn't
# have to pull out all the DWARF info from our static libraries
# and put it into a dSYM file. We don't need that dSYM file in
# the first place, since the information is available in the
# object files inside the archives (static libraries). The only
# unfortunate side effect of this is that the user won't be
# able to break on specific lines of main(). This is due to
# using ld to rename the main-function, and will go away once
# we implement a separate tool to do the symbol renaming.
debug_information_format.name = DEBUG_INFORMATION_FORMAT
debug_information_format.value = dwarf
debug_information_format.build = debug
QMAKE_MAC_XCODE_SETTINGS += debug_information_format
}
macx-xcode {

View File

@ -1140,7 +1140,7 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t)
//###
}
project->values("QMAKE_PBX_PRESCRIPT_BUILDPHASES").append(phase_key);
project->values("QMAKE_PBX_BUILDPHASES").append(phase_key);
t << "\t\t" << phase_key << " = {\n"
<< "\t\t\t" << writeSettings("name", "Copy '" + bundle_data[i] + "' Files to Bundle") << ";\n"
<< "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n"

View File

@ -3336,6 +3336,13 @@ MakefileGenerator::writePkgConfigFile()
t << endl;
}
static QString windowsifyPath(const QString &str)
{
// The paths are escaped in prl files, so every slash needs to turn into two backslashes.
// Then each backslash needs to be escaped for sed. And another level for C quoting here.
return QString(str).replace('/', "\\\\\\\\");
}
QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst)
{
QString ret;
@ -3348,8 +3355,12 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QSt
for (int r = 0; r < replace_rules.size(); ++r) {
const ProString match = project->first(ProKey(replace_rules.at(r) + ".match")),
replace = project->first(ProKey(replace_rules.at(r) + ".replace"));
if (!match.isEmpty() /*&& match != replace*/)
if (!match.isEmpty() /*&& match != replace*/) {
ret += " -e " + shellQuote("s," + match + "," + replace + ",g");
if (isWindowsShell() && project->first(ProKey(replace_rules.at(r) + ".CONFIG")).contains("path"))
ret += " -e " + shellQuote("s," + windowsifyPath(match.toQString())
+ "," + windowsifyPath(replace.toQString()) + ",gi");
}
}
ret += " \"" + src + "\" >\"" + dst + "\"";
}

View File

@ -85,6 +85,7 @@ static int doSed(int argc, char **argv)
return 3;
}
QChar sep = ++j < cmd.length() ? cmd.at(j) : QChar();
Qt::CaseSensitivity matchcase = Qt::CaseSensitive;
bool escaped = false;
int phase = 1;
QStringList phases;
@ -126,12 +127,16 @@ static int doSed(int argc, char **argv)
fprintf(stderr, "Error: sed s command requires three arguments (%d, %c, %s)\n", phase, sep.toLatin1(), qPrintable(curr));
return 3;
}
if (curr.contains(QLatin1Char('i'))) {
curr.remove(QLatin1Char('i'));
matchcase = Qt::CaseInsensitive;
}
if (curr != QLatin1String("g")) {
fprintf(stderr, "Error: sed s command must be used with the g option (only)\n");
fprintf(stderr, "Error: sed s command supports only g & i options; g is required\n");
return 3;
}
SedSubst subst;
subst.from = QRegExp(phases.at(0));
subst.from = QRegExp(phases.at(0), matchcase);
subst.to = phases.at(1);
subst.to.replace("\\\\", "\\"); // QString::replace(rx, sub) groks \1, but not \\.
substs << subst;

View File

@ -181,7 +181,7 @@ mkspecs.path = $$[QT_HOST_DATA]/mkspecs
mkspecs.files = \
$$OUT_PWD/mkspecs/qconfig.pri $$OUT_PWD/mkspecs/qmodule.pri $$OUT_PWD/mkspecs/qdevice.pri $$OUT_PWD/mkspecs/qfeatures.pri \
$$files($$PWD/mkspecs/*)
mkspecs.files -= $$PWD/mkspecs/modules
mkspecs.files -= $$PWD/mkspecs/modules $$PWD/mkspecs/modules-inst
INSTALLS += mkspecs
global_docs.files = $$PWD/doc/global

View File

@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<array name="qt_sources">
<item>https://download.qt-project.org/ministro/android/qt5/latest</item>
<item>https://download.qt-project.org/ministro/android/qt5/qt-5.2</item>
</array>
<!-- The following is handled automatically by the deployment tool. It should

View File

@ -150,7 +150,7 @@ public class QtActivity extends Activity
private ActivityInfo m_activityInfo = null; // activity info object, used to access the libs and the strings
private DexClassLoader m_classLoader = null; // loader object
private String[] m_sources = {"https://download.qt-project.org/ministro/android/qt5/latest"}; // Make sure you are using ONLY secure locations
private String[] m_sources = {"https://download.qt-project.org/ministro/android/qt5/qt-5.2"}; // Make sure you are using ONLY secure locations
private String m_repository = "default"; // Overwrites the default Ministro repository
// Possible values:
// * default - Ministro default repository set with "Ministro configuration tool".

View File

@ -102,10 +102,19 @@ public:
{
if (dirty) {
dirty = false;
// This is a workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58800
// Avoid using std::nth_element for stdlibc++ <= 4.7.3 || (>= 4.8.0 && <= 4.8.2)
#if defined(__GLIBCXX__) && (__GLIBCXX__ <= 20130411 || (__GLIBCXX__ >= 20130322 && __GLIBCXX__ <= 20131016))
QVector<T> sorted = values;
std::sort(sorted.begin(), sorted.end());
currentMedian = sorted.at(bufferSize / 2);
#else
QVector<T> copy = values;
typename QVector<T>::iterator begin = copy.begin(), mid = copy.begin() + bufferSize/2, end = copy.end();
std::nth_element(begin, mid, end);
currentMedian = *mid;
#endif
}
return currentMedian;
}

View File

@ -556,10 +556,8 @@ Q_STATIC_ASSERT_X(UCHAR_MAX == 255, "Qt assumes that char is 8 bits");
\typedef qreal
\relates <QtGlobal>
Typedef for \c double on all platforms except for those using CPUs with
ARM architectures.
On ARM-based platforms, \c qreal is a typedef for \c float for performance
reasons.
Typedef for \c double unless Qt is configured with the
\c{-qreal float} option.
*/
/*! \typedef uchar

View File

@ -74,7 +74,8 @@ static jclass getCachedClass(JNIEnv *env, const char *className)
if (!classLoader.isValid())
return 0;
QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(QLatin1String(className));
QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(QString::fromLatin1(className).replace(QLatin1Char('/'),
QLatin1Char('.')));
QJNIObjectPrivate classObject = classLoader.callObjectMethod("loadClass",
"(Ljava/lang/String;)Ljava/lang/Class;",
stringName.object());

View File

@ -2996,6 +2996,10 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
expensive initialization only if something is connected to a
signal.
\warning This function is called from the thread which performs the
connection, which may be a different thread from the thread in
which this object lives.
\sa connect(), disconnectNotify()
*/
@ -3022,6 +3026,15 @@ void QObject::connectNotify(const QMetaMethod &signal)
modularity. However, it might be useful for optimizing access to
expensive resources.
\warning This function is called from the thread which performs the
disconnection, which may be a different thread from the thread in
which this object lives. This function may also be called with a QObject
internal mutex locked. It is therefore not allowed to re-enter any
of any QObject functions from your reimplementation and if you lock
a mutex in your reimplementation, make sure that you don't call QObject
functions with that mutex held in other places or it will result in
a deadlock.
\sa disconnect(), connectNotify()
*/

View File

@ -71,6 +71,7 @@ class QTextCursor;
template<typename T> class QVector;
#ifndef Q_QDOC // Workaround for QTBUG-35230
namespace Qt
{
Q_GUI_EXPORT bool mightBeRichText(const QString&);
@ -80,6 +81,7 @@ namespace Qt
Q_GUI_EXPORT QTextCodec *codecForHtml(const QByteArray &ba);
#endif
}
#endif // Q_QDOC
class Q_GUI_EXPORT QAbstractUndoItem
{

View File

@ -192,8 +192,6 @@ bool QCocoaGLContext::makeCurrent(QPlatformSurface *surface)
QWindow *window = static_cast<QCocoaWindow *>(surface)->window();
setActiveWindow(window);
if (![m_context view])
return false;
[m_context makeCurrentContext];
update();
return true;

View File

@ -159,8 +159,10 @@ public:
void registerTouch(bool enable);
qreal devicePixelRatio() const;
bool isWindowExposable();
void exposeWindow();
void obscureWindow();
void updateExposedGeometry();
QWindow *childWindowAt(QPoint windowPoint);
protected:
// NSWindow handling. The QCocoaWindow/QNSView can either be displayed
@ -202,7 +204,9 @@ public: // for QNSView
bool m_hasModalSession;
bool m_frameStrutEventsEnabled;
bool m_geometryUpdateExposeAllowed;
bool m_isExposed;
QRect m_exposedGeometry;
int m_registerTouchCount;
bool m_resizableTransientParent;
bool m_overrideBecomeKey;

View File

@ -213,6 +213,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
, m_windowCursor(0)
, m_hasModalSession(false)
, m_frameStrutEventsEnabled(false)
, m_geometryUpdateExposeAllowed(false)
, m_isExposed(false)
, m_registerTouchCount(0)
, m_resizableTransientParent(false)
@ -1084,22 +1085,61 @@ qreal QCocoaWindow::devicePixelRatio() const
}
}
// Returns whether the window can be expose, which it can
// if it is on screen and has a valid geometry.
bool QCocoaWindow::isWindowExposable()
{
QSize size = geometry().size();
bool validGeometry = (size.width() > 0 && size.height() > 0);
bool validScreen = ([[m_contentView window] screen] != 0);
bool nonHiddenSuperView = ![[m_contentView superview] isHidden];
return (validGeometry && validScreen && nonHiddenSuperView);
}
// Exposes the window by posting an expose event to QWindowSystemInterface
void QCocoaWindow::exposeWindow()
{
if (!m_isExposed && ![[m_contentView superview] isHidden]) {
m_geometryUpdateExposeAllowed = true;
if (!isWindowExposable())
return;
if (!m_isExposed) {
m_isExposed = true;
m_exposedGeometry = geometry();
QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
}
}
// Obscures the window by posting an empty expose event to QWindowSystemInterface
void QCocoaWindow::obscureWindow()
{
if (m_isExposed) {
m_geometryUpdateExposeAllowed = false;
m_isExposed = false;
QWindowSystemInterface::handleExposeEvent(window(), QRegion());
}
}
// Updates window geometry by posting an expose event to QWindowSystemInterface
void QCocoaWindow::updateExposedGeometry()
{
// updateExposedGeometry is not allowed to send the initial expose. If you want
// that call exposeWindow();
if (!m_geometryUpdateExposeAllowed)
return;
if (!isWindowExposable())
return;
if (m_exposedGeometry == geometry())
return;
m_isExposed = true;
m_exposedGeometry = geometry();
QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
}
QWindow *QCocoaWindow::childWindowAt(QPoint windowPoint)
{
QWindow *targetWindow = window();

View File

@ -93,6 +93,8 @@ QT_END_NAMESPACE
- (BOOL)hasMask;
- (BOOL)isOpaque;
- (void)convertFromScreen:(NSPoint)mouseLocation toWindowPoint:(QPointF *)qtWindowPoint andScreenPoint:(QPointF *)qtScreenPoint;
- (void)resetMouseButtons;
- (void)handleMouseEvent:(NSEvent *)theEvent;

View File

@ -175,7 +175,7 @@ static QTouchDevice *touchDevice = 0;
- (void) globalFrameChanged:(NSNotification*)notification
{
Q_UNUSED(notification);
QWindowSystemInterface::handleExposeEvent(m_window, m_window->geometry());
m_platformWindow->updateExposedGeometry();
}
- (void)viewDidMoveToSuperview
@ -186,7 +186,7 @@ static QTouchDevice *touchDevice = 0;
if ([self superview]) {
m_platformWindow->m_contentViewIsEmbedded = true;
QWindowSystemInterface::handleGeometryChange(m_window, m_platformWindow->geometry());
QWindowSystemInterface::handleExposeEvent(m_window, m_platformWindow->geometry());
m_platformWindow->updateExposedGeometry();
QWindowSystemInterface::flushWindowSystemEvents();
} else {
m_platformWindow->m_contentViewIsEmbedded = false;
@ -261,7 +261,7 @@ static QTouchDevice *touchDevice = 0;
// Send a geometry change event to Qt, if it's ready to handle events
if (!m_platformWindow->m_inConstructor) {
QWindowSystemInterface::handleGeometryChange(m_window, geometry);
QWindowSystemInterface::handleExposeEvent(m_window, geometry);
m_platformWindow->updateExposedGeometry();
QWindowSystemInterface::flushWindowSystemEvents();
}
}

View File

@ -53,6 +53,7 @@
- (id)initWithQCocoaWindow: (QCocoaWindow *) cocoaWindow;
- (void)windowDidBecomeKey:(NSNotification *)notification;
- (void)windowDidResize:(NSNotification *)notification;
- (void)windowDidMove:(NSNotification *)notification;
- (void)windowWillMove:(NSNotification *)notification;

View File

@ -56,6 +56,17 @@
return self;
}
- (void)windowDidBecomeKey:(NSNotification *)notification
{
Q_UNUSED(notification);
if (m_cocoaWindow->m_windowUnderMouse) {
QPointF windowPoint;
QPointF screenPoint;
[m_cocoaWindow->m_qtView convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint];
QWindowSystemInterface::handleEnterEvent(m_cocoaWindow->m_enterLeaveTargetWindow, windowPoint, screenPoint);
}
}
- (void)windowDidResize:(NSNotification *)notification
{
Q_UNUSED(notification);

View File

@ -206,13 +206,6 @@ namespace
bool debugStackUsage = false;
}
static int infoPlistValue(NSString* key, int defaultValue)
{
static NSBundle *bundle = [NSBundle mainBundle];
NSNumber* value = [bundle objectForInfoDictionaryKey:key];
return value ? [value intValue] : defaultValue;
}
extern "C" int __attribute__((weak)) main(int argc, char *argv[])
{
@autoreleasepool {

View File

@ -61,6 +61,7 @@ QPointF fromCGPoint(const CGPoint &point);
Qt::ScreenOrientation toQtScreenOrientation(UIDeviceOrientation uiDeviceOrientation);
UIDeviceOrientation fromQtScreenOrientation(Qt::ScreenOrientation qtOrientation);
QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen);
int infoPlistValue(NSString* key, int defaultValue);
QT_END_NAMESPACE

View File

@ -134,5 +134,12 @@ QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen)
: QRect(rect.y(), geometry.height() - rect.width() - rect.x(), rect.height(), rect.width());
}
int infoPlistValue(NSString* key, int defaultValue)
{
static NSBundle *bundle = [NSBundle mainBundle];
NSNumber* value = [bundle objectForInfoDictionaryKey:key];
return value ? [value intValue] : defaultValue;
}
QT_END_NAMESPACE

View File

@ -270,7 +270,7 @@ void QIOSInputContext::scrollRootView()
&& m_keyboardListener->m_keyboardVisibleAndDocked
&& m_focusView.window == view.window) {
QRectF cursorRect = qGuiApp->inputMethod()->cursorRectangle();
cursorRect.translate(qGuiApp->focusWindow()->geometry().topLeft());
cursorRect.translate(m_focusView.qwindow->geometry().topLeft());
qreal keyboardY = m_keyboardListener->m_keyboardEndRect.y();
int statusBarY = qGuiApp->primaryScreen()->availableGeometry().y();
const int margin = 20;

View File

@ -74,6 +74,8 @@ public:
QStringList themeNames() const;
QPlatformTheme *createPlatformTheme(const QString &name) const;
QPlatformDrag *drag() const Q_DECL_OVERRIDE { return 0; }
QAbstractEventDispatcher *createEventDispatcher() const;
QPlatformNativeInterface *nativeInterface() const;

View File

@ -101,12 +101,15 @@
- (BOOL)prefersStatusBarHidden
{
static bool hiddenFromPlist = infoPlistValue(@"UIStatusBarHidden", false);
if (hiddenFromPlist)
return YES;
QWindow *focusWindow = QGuiApplication::focusWindow();
if (!focusWindow)
if (!focusWindow || !focusWindow->handle())
return [UIApplication sharedApplication].statusBarHidden;
QIOSWindow *topLevel = static_cast<QIOSWindow *>(focusWindow->handle())->topLevelWindow();
return topLevel->window()->windowState() == Qt::WindowFullScreen;
QWindow *topLevel = static_cast<QIOSWindow *>(focusWindow->handle())->topLevelWindow();
return topLevel->windowState() == Qt::WindowFullScreen;
}
@end

View File

@ -87,7 +87,7 @@ public:
WId winId() const { return WId(m_view); };
QIOSWindow *topLevelWindow() const;
QWindow *topLevelWindow() const;
private:
void applyGeometry(const QRect &rect);

View File

@ -108,8 +108,6 @@
[NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
[self updateTextInputTraits];
if (isQtApplication())
self.hidden = YES;
@ -330,13 +328,9 @@
- (BOOL)becomeFirstResponder
{
// On iOS, a QWindow should only have input focus when the input panel is
// open. This is to stop cursors and focus rects from being drawn when the
// user cannot type. And since the keyboard will open when a view becomes
// the first responder, it's now a good time to inform QPA that the QWindow
// this view backs became active:
// Note: QIOSInputContext controls our first responder status based on
// whether or not the keyboard should be open or closed.
[self updateTextInputTraits];
QWindowSystemInterface::handleWindowActivated(m_qioswindow->window());
return [super becomeFirstResponder];
}
@ -345,7 +339,8 @@
// Resigning first responed status means that the virtual keyboard was closed, or
// some other view became first responder. In either case we clear the focus object to
// avoid blinking cursors in line edits etc:
static_cast<QWindowPrivate *>(QObjectPrivate::get(m_qioswindow->window()))->clearFocusObject();
if (m_qioswindow)
static_cast<QWindowPrivate *>(QObjectPrivate::get(m_qioswindow->window()))->clearFocusObject();
return [super resignFirstResponder];
}
@ -427,8 +422,10 @@
- (QWindow *)qwindow
{
if ([self isKindOfClass:[QUIView class]])
return static_cast<QUIView *>(self)->m_qioswindow->window();
if ([self isKindOfClass:[QUIView class]]) {
if (QIOSWindow *w = static_cast<QUIView *>(self)->m_qioswindow)
return w->window();
}
return nil;
}
@ -473,6 +470,7 @@ QIOSWindow::~QIOSWindow()
// cancellation of all touch events.
[m_view touchesCancelled:0 withEvent:0];
m_view->m_qioswindow = 0;
[m_view removeFromSuperview];
[m_view release];
}
@ -637,7 +635,7 @@ void QIOSWindow::setParent(const QPlatformWindow *parentWindow)
}
}
QIOSWindow *QIOSWindow::topLevelWindow() const
QWindow *QIOSWindow::topLevelWindow() const
{
QWindow *window = this->window();
while (window) {
@ -651,7 +649,7 @@ QIOSWindow *QIOSWindow::topLevelWindow() const
window = parent;
}
return static_cast<QIOSWindow *>(window->handle());
return window;
}
void QIOSWindow::requestActivateWindow()

View File

@ -334,14 +334,14 @@ QString Generator::fileBase(const Node *node) const
if (node->isQmlNode()) {
if (!node->qmlModuleName().isEmpty()) {
base.prepend(node->qmlModuleName() + QLatin1Char('-'));
/*
To avoid file name conflicts in the html directory,
we prepend a prefix (by default, "qml-") to the file name of QML
element doc files.
*/
if ((node->subType() == Node::QmlClass) || (node->subType() == Node::QmlBasicType)) {
base.prepend(outputPrefix(QLatin1String("QML")));
}
}
/*
To avoid file name conflicts in the html directory,
we prepend a prefix (by default, "qml-") to the file name of QML
element doc files.
*/
if ((node->subType() == Node::QmlClass) || (node->subType() == Node::QmlBasicType)) {
base.prepend(outputPrefix(QLatin1String("QML")));
}
}
else if (node->subType() == Node::QmlModule) {

View File

@ -269,6 +269,9 @@ QString HtmlGenerator::format()
void HtmlGenerator::generateTree()
{
qdb_->buildCollections();
Node* qflags = qdb_->findNodeByNameAndType(QStringList("QFlags"), Node::Class, Node::NoSubType);
if (qflags)
qflagsHref_ = linkForNode(qflags,0);
if (!runPrepareOnly()) {
Generator::generateTree();
generateCollisionPages();
@ -3660,7 +3663,7 @@ void HtmlGenerator::generateDetailedMember(const Node *node,
if (enume->flagsType()) {
out() << "<p>The " << protectEnc(enume->flagsType()->name())
<< " type is a typedef for "
<< "<a href=\"qflags.html\">QFlags</a>&lt;"
<< "<a href=\"" << qflagsHref_ << "\">QFlags</a>&lt;"
<< protectEnc(enume->name())
<< "&gt;. It stores an OR combination of "
<< protectEnc(enume->name())

View File

@ -262,6 +262,7 @@ private:
QString cppclassespage;
QString qmltypespage;
QString buildversion;
QString qflagsHref_;
public:
static bool debugging_on;

View File

@ -7634,7 +7634,10 @@ QGraphicsObject::~QGraphicsObject()
bool QGraphicsObject::event(QEvent *ev)
{
if (ev->type() == QEvent::StyleAnimationUpdate) {
update();
if (isVisible()) {
ev->accept();
update();
}
return true;
}
return QObject::event(ev);

View File

@ -1409,9 +1409,14 @@ bool QGraphicsWidget::event(QEvent *event)
break;
case QEvent::WindowActivate:
case QEvent::WindowDeactivate:
case QEvent::StyleAnimationUpdate:
update();
break;
case QEvent::StyleAnimationUpdate:
if (isVisible()) {
event->accept();
update();
}
break;
// Taken from QWidget::event
case QEvent::ActivationChange:
case QEvent::EnabledChange:

View File

@ -8249,7 +8249,10 @@ bool QWidget::event(QEvent *event)
update(static_cast<QUpdateLaterEvent*>(event)->region());
break;
case QEvent::StyleAnimationUpdate:
update();
if (isVisible() && !window()->isMinimized()) {
event->accept();
update();
}
break;
case QEvent::WindowBlocked:

View File

@ -619,7 +619,7 @@ void QStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, c
void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
const QPixmap &pixmap) const
{
int scale = pixmap.devicePixelRatio();
qreal scale = pixmap.devicePixelRatio();
QRect aligned = alignedRect(QApplication::layoutDirection(), QFlag(alignment), pixmap.size() / scale, rect);
QRect inter = aligned.intersected(rect);

View File

@ -93,7 +93,10 @@ void QStyleAnimation::setStartTime(const QTime &time)
void QStyleAnimation::updateTarget()
{
QEvent event(QEvent::StyleAnimationUpdate);
event.setAccepted(false);
QCoreApplication::sendEvent(target(), &event);
if (!event.isAccepted())
stop();
}
bool QStyleAnimation::isUpdateNeeded() const
@ -103,16 +106,8 @@ bool QStyleAnimation::isUpdateNeeded() const
void QStyleAnimation::updateCurrentTime(int)
{
if (QObject *tgt = target()) {
if (tgt->isWidgetType()) {
QWidget *widget = static_cast<QWidget *>(tgt);
if (!widget->isVisible() || widget->window()->isMinimized())
stop();
}
if (isUpdateNeeded())
updateTarget();
}
if (target() && isUpdateNeeded())
updateTarget();
}
QProgressStyleAnimation::QProgressStyleAnimation(int speed, QObject *target) :

View File

@ -3073,7 +3073,7 @@ void QComboBox::wheelEvent(QWheelEvent *e)
newIndex--;
while ((newIndex >= 0) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled))
newIndex--;
} else {
} else if (e->delta() < 0) {
newIndex++;
while ((newIndex < count()) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled))
newIndex++;

View File

@ -31,8 +31,7 @@ load(qt_targets)
wince*:QMAKE_POST_LINK =
unix|win32-g++* {
lib_replace.match = $$[QT_INSTALL_LIBS/get]
lib_replace.replace = $$[QT_INSTALL_LIBS/raw]
QMAKE_PRL_INSTALL_REPLACE += lib_replace
}
lib_replace.match = $$[QT_INSTALL_LIBS/get]
lib_replace.replace = $$[QT_INSTALL_LIBS/raw]
lib_replace.CONFIG = path
QMAKE_PRL_INSTALL_REPLACE += lib_replace

View File

@ -3,6 +3,7 @@ SUBDIRS=\
qtconcurrentfilter \
qtconcurrentiteratekernel \
qtconcurrentmap \
qtconcurrentmedian \
qtconcurrentrun \
qtconcurrentthreadengine

View File

@ -0,0 +1,5 @@
CONFIG += testcase parallel_test
TARGET = tst_qtconcurrentmedian
QT = core testlib concurrent
SOURCES = tst_qtconcurrentmedian.cpp
DEFINES += QT_STRICT_ITERATORS

View File

@ -0,0 +1,87 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia 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.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <qtconcurrentmedian.h>
#include <QtTest/QtTest>
class tst_QtConcurrentMedian: public QObject
{
Q_OBJECT
private slots:
void median_data();
void median();
};
void tst_QtConcurrentMedian::median_data()
{
QTest::addColumn<QList<int> >("values");
QTest::addColumn<int>("expectedMedian");
QTest::newRow("size=1")
<< (QList<int>() << 1)
<< 1;
QTest::newRow("size=2")
<< (QList<int>() << 3 << 2)
<< 3;
QTest::newRow("size=3")
<< (QList<int>() << 3 << 1 << 2)
<< 2;
QTest::newRow("gcc bug 58800 (nth_element)")
<< (QList<int>() << 207089 << 202585 << 180067 << 157549 << 211592 << 216096 << 207089)
<< 207089;
}
void tst_QtConcurrentMedian::median()
{
QFETCH(QList<int> , values);
QFETCH(int, expectedMedian);
QtConcurrent::Median<int> m(values.size());
foreach (int value, values)
m.addValue(value);
QCOMPARE(m.median(), expectedMedian);
}
QTEST_MAIN(tst_QtConcurrentMedian)
#include "tst_qtconcurrentmedian.moc"

View File

@ -4221,6 +4221,7 @@ void tst_QGraphicsItem::cursor()
QCursor cursor = view.viewport()->cursor();
{
QTest::mouseMove(view.viewport(), QPoint(100, 50));
QMouseEvent event(QEvent::MouseMove, QPoint(100, 50), Qt::NoButton, 0, 0);
QApplication::sendEvent(view.viewport(), &event);
}

View File

@ -1043,13 +1043,14 @@ void tst_QColumnView::dynamicModelChanges()
ColumnView view;
view.setModel(&model);
view.setItemDelegate(&delegate);
centerOnScreen(&view);
view.show();
QStandardItem *item = new QStandardItem(QLatin1String("item"));
model.appendRow(item);
QTest::qWait(200); //let the time for painting to occur
QCOMPARE(delegate.paintedIndexes.count(), 1);
QVERIFY(QTest::qWaitForWindowExposed(&view)); //let the time for painting to occur
QTRY_COMPARE(delegate.paintedIndexes.count(), 1);
QCOMPARE(*delegate.paintedIndexes.begin(), model.index(0,0));

View File

@ -598,6 +598,7 @@ void tst_QMenu::layoutDirection()
centerOnScreen(&win);
QMenu menu(&win);
menu.addAction("foo");
menu.move(win.geometry().topRight() + QPoint(50, 0));
menu.show();
QVERIFY(QTest::qWaitForWindowExposed(&menu));