Merge remote-tracking branch 'origin/5.13' into dev

Change-Id: I4b56ce8c76729d9fc60995564299f8f27336fcde
This commit is contained in:
Qt Forward Merge Bot 2019-02-22 19:59:08 +01:00
commit 2a1292b916
89 changed files with 707 additions and 405 deletions

View File

@ -44,7 +44,9 @@ for (cp, COPIES) {
$${pfx}.output = $$path/${QMAKE_FUNC_FILE_IN_qtStripSrcDir_$$cp}
}
$${pfx}.input = $${pfx}.files
$${pfx}.commands = $(QINSTALL) ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
contains(TEMPLATE, "vc.*"): copycommand = $$QMAKE_QMAKE -install qinstall
else: copycommand = $(QINSTALL)
$${pfx}.commands = $$copycommand ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
$${pfx}.name = COPY ${QMAKE_FILE_IN}
$${pfx}.CONFIG = no_link no_clean target_predeps
QMAKE_EXTRA_COMPILERS += $${pfx}

View File

@ -21,6 +21,11 @@ EMCC_COMMON_LFLAGS = \
--bind \
-s \"BINARYEN_TRAP_MODE=\'clamp\'\"
EMCC_USE_PORTS_FLAGS = \
-s USE_LIBPNG=1 \
-s USE_FREETYPE=1 \
-s USE_ZLIB=1
# The -s arguments can also be used with release builds,
# but are here in debug for clarity.
EMCC_COMMON_LFLAGS_DEBUG = \
@ -38,6 +43,9 @@ QMAKE_COMPILER += emscripten
QMAKE_CC = emcc
QMAKE_CXX = em++
QMAKE_CFLAGS += $$EMCC_USE_PORTS_FLAGS
QMAKE_CXXFLAGS += $$EMCC_USE_PORTS_FLAGS
# Practical debugging setup:
# "-g4" preserves function names for stack traces
# "-Os" produces reasonably sized binaries

View File

@ -0,0 +1,19 @@
#
# qmake configuration for winrt-arm-msvc2019
#
# Written for Microsoft Visual C++ 2019
#
include(../common/winrt_winphone/qmake.conf)
DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 ARM __ARM__ __arm__
QMAKE_CFLAGS += -FS
QMAKE_CXXFLAGS += -FS
QMAKE_LFLAGS += /MACHINE:ARM /NODEFAULTLIB:kernel32.lib
QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib OneCore.lib
VCPROJ_ARCH = ARM
WINSDK_VER = 10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in
WINRT_MANIFEST.architecture = arm

View File

@ -0,0 +1,40 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the qmake spec 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 The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "../common/winrt_winphone/qplatformdefs.h"

View File

@ -0,0 +1,19 @@
#
# qmake configuration for winrt-arm64-msvc2019
#
# Written for Microsoft Visual C++ 2019
#
include(../common/winrt_winphone/qmake.conf)
DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 arm64 __arm64__ __arm64__
QMAKE_CFLAGS += -FS
QMAKE_CXXFLAGS += -FS
QMAKE_LFLAGS += /MACHINE:arm64 /NODEFAULTLIB:kernel32.lib
QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib OneCore.lib
VCPROJ_ARCH = arm64
WINSDK_VER = 10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in
WINRT_MANIFEST.architecture = arm64

View File

@ -0,0 +1,40 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the qmake spec 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 The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "../common/winrt_winphone/qplatformdefs.h"

View File

@ -0,0 +1,19 @@
#
# qmake configuration for winrt-x64-msvc2019
#
# Written for Microsoft Visual C++ 2019
#
include(../common/winrt_winphone/qmake.conf)
DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 X64 __X64__ __x64__
QMAKE_CFLAGS += -FS
QMAKE_CXXFLAGS += -FS
QMAKE_LFLAGS += /MACHINE:X64 /NODEFAULTLIB:kernel32.lib
QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib OneCore.lib
VCPROJ_ARCH = x64
WINSDK_VER = 10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in
WINRT_MANIFEST.architecture = x64

View File

@ -0,0 +1,40 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the qmake spec 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 The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "../common/winrt_winphone/qplatformdefs.h"

View File

@ -0,0 +1,18 @@
#
# qmake configuration for winrt-x86-msvc2019
#
# Written for Microsoft Visual C++ 2019
#
include(../common/winrt_winphone/qmake.conf)
DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 X86 __X86__ __x86__
QMAKE_CFLAGS += -FS
QMAKE_CXXFLAGS += -FS
QMAKE_LFLAGS += /SAFESEH /MACHINE:X86 /NODEFAULTLIB:kernel32.lib
QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib OneCore.lib
VCPROJ_ARCH = Win32
WINSDK_VER = 10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in
WINRT_MANIFEST.architecture = x86

View File

@ -0,0 +1,40 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the qmake spec 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 The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "../common/winrt_winphone/qplatformdefs.h"

View File

@ -13,7 +13,7 @@ QMKSRC = $(SOURCE_PATH)\qmake
!if "$(QMAKESPEC)" == "win32-icc"
CXX = icl
LINKER = xilink
CFLAGS_EXTRA = /Zc:forScope /Qstd=c++11
CFLAGS_EXTRA = /Zc:forScope /Qstd=c++11 /O3
!elseif "$(QMAKESPEC)" == "win32-clang-msvc"
CXX = clang-cl
LINKER = lld-link
@ -30,7 +30,7 @@ PCH_OBJECT = qmake_pch.obj
!endif
CFLAGS_BARE = -c -Fo./ -Fdqmake.pdb \
-W2 -nologo -O1 \
-W2 -nologo -O2 \
$(CFLAGS_EXTRA) \
-I$(QMKSRC) -I$(QMKSRC)\library -I$(QMKSRC)\generators -I$(QMKSRC)\generators\unix -I$(QMKSRC)\generators\win32 -I$(QMKSRC)\generators\mac \
-I$(INC_PATH) -I$(INC_PATH)\QtCore -I$(INC_PATH)\QtCore\$(QT_VERSION) -I$(INC_PATH)\QtCore\$(QT_VERSION)\QtCore \

View File

@ -81,8 +81,8 @@ bool MakefileGenerator::canExecute(const QStringList &cmdline, int *a) const
QString MakefileGenerator::mkdir_p_asstring(const QString &dir, bool escape) const
{
QString edir = escape ? escapeFilePath(Option::fixPathToTargetOS(dir, false, false)) : dir;
return "@" + makedir.arg(edir);
return "@" + makedir.arg(
escape ? escapeFilePath(Option::fixPathToTargetOS(dir, false, false)) : dir);
}
bool MakefileGenerator::mkdir(const QString &in_path) const

View File

@ -1357,7 +1357,7 @@ void VcprojGenerator::initWinDeployQtTool()
// structure manually by invoking windeployqt a second time, so that
// the MDILXapCompile call succeeds and deployment continues.
conf.windeployqt.CommandLine += commandLine
+ QStringLiteral(" -list relative -dir \"$(MSBuildProjectDirectory)\" \"$(OutDir)\\$(TargetName).exe\" > ")
+ QStringLiteral(" -list relative -dir \"$(MSBuildProjectDirectory)\" \"$(OutDir)\\$(TargetFileName)\" > ")
+ MakefileGenerator::shellQuote(conf.windeployqt.Record);
conf.windeployqt.config = &vcProject.Configuration;
conf.windeployqt.ExcludedFromBuild = false;

View File

@ -604,11 +604,14 @@ public class QtActivityDelegate
}
QtNative.loadQtLibraries(loaderParams.getStringArrayList(NATIVE_LIBRARIES_KEY));
ArrayList<String> libraries = loaderParams.getStringArrayList(BUNDLED_LIBRARIES_KEY);
QtNative.loadBundledLibraries(libraries, QtNativeLibrariesDir.nativeLibrariesDir(m_activity));
String nativeLibsDir = QtNativeLibrariesDir.nativeLibrariesDir(m_activity);
QtNative.loadBundledLibraries(libraries, nativeLibsDir);
m_mainLib = loaderParams.getString(MAIN_LIBRARY_KEY);
// older apps provide the main library as the last bundled library; look for this if the main library isn't provided
if (null == m_mainLib && libraries.size() > 0)
if (null == m_mainLib && libraries.size() > 0) {
m_mainLib = libraries.get(libraries.size() - 1);
libraries.remove(libraries.size() - 1);
}
if (loaderParams.containsKey(EXTRACT_STYLE_KEY)) {
String path = loaderParams.getString(EXTRACT_STYLE_KEY);
@ -662,8 +665,8 @@ public class QtActivityDelegate
} catch (Exception e) {
e.printStackTrace();
}
return true;
m_mainLib = QtNative.loadMainLibrary(m_mainLib, nativeLibsDir);
return m_mainLib != null;
}
public boolean startApplication()
@ -726,11 +729,7 @@ public class QtActivityDelegate
@Override
public void run() {
try {
String nativeLibraryDir = QtNativeLibrariesDir.nativeLibrariesDir(m_activity);
QtNative.startApplication(m_applicationParameters,
m_environmentVariables,
m_mainLib,
nativeLibraryDir);
QtNative.startApplication(m_applicationParameters, m_environmentVariables, m_mainLib);
m_started = true;
} catch (Exception e) {
e.printStackTrace();

View File

@ -244,6 +244,41 @@ public class QtNative
});
}
public static String loadMainLibrary(final String mainLibrary, final String nativeLibraryDir)
{
final String[] res = new String[1];
res[0] = null;
m_qtThread.run(new Runnable() {
@Override
public void run() {
try {
String mainLibNameTemplate = "lib" + mainLibrary + ".so";
File f = new File(nativeLibraryDir + mainLibNameTemplate);
if (!f.exists()) {
try {
ActivityInfo info = m_activity.getPackageManager().getActivityInfo(m_activity.getComponentName(),
PackageManager.GET_META_DATA);
String systemLibraryDir = QtNativeLibrariesDir.systemLibrariesDir;
if (info.metaData.containsKey("android.app.system_libs_prefix"))
systemLibraryDir = info.metaData.getString("android.app.system_libs_prefix");
f = new File(systemLibraryDir + mainLibNameTemplate);
} catch (Exception e) {
e.printStackTrace();
return;
}
}
if (!f.exists())
return;
System.load(f.getAbsolutePath());
res[0] = f.getAbsolutePath();
} catch (Exception e) {
Log.e(QtTAG, "Can't load '" + mainLibrary + "'", e);
}
}
});
return res[0];
}
public static void setActivity(Activity qtMainActivity, QtActivityDelegate qtActivityDelegate)
{
synchronized (m_mainActivityMutex) {
@ -321,46 +356,20 @@ public class QtNative
});
}
public static boolean startApplication(String params,
final String environment,
String mainLibrary,
String nativeLibraryDir) throws Exception
public static boolean startApplication(String params, final String environment, String mainLib) throws Exception
{
String mainLibNameTemplate = "lib" + mainLibrary + ".so";
File f = new File(nativeLibraryDir + mainLibNameTemplate);
if (!f.exists()) {
try {
ActivityInfo info = m_activity.getPackageManager().getActivityInfo(m_activity.getComponentName(),
PackageManager.GET_META_DATA);
String systemLibraryDir = QtNativeLibrariesDir.systemLibrariesDir;
if (info.metaData.containsKey("android.app.system_libs_prefix"))
systemLibraryDir = info.metaData.getString("android.app.system_libs_prefix");
f = new File(systemLibraryDir + mainLibNameTemplate);
} catch (Exception e) {
}
}
if (!f.exists())
throw new Exception("Can't find main library '" + mainLibrary + "'");
if (params == null)
params = "-platform\tandroid";
final String mainLibraryPath = f.getAbsolutePath();
final boolean[] res = new boolean[1];
res[0] = false;
synchronized (m_mainActivityMutex) {
if (params.length() > 0 && !params.startsWith("\t"))
params = "\t" + params;
final String qtParams = f.getAbsolutePath() + params;
final String qtParams = mainLib + params;
m_qtThread.run(new Runnable() {
@Override
public void run() {
try {
System.load(mainLibraryPath);
} catch (Exception e) {
Log.i(QtTAG, "Can't load '" + mainLibraryPath + "'", e);
}
res[0] = startQtAndroidPlugin(qtParams, environment);
setDisplayMetrics(m_displayMetricsScreenWidthPixels,
m_displayMetricsScreenHeightPixels,

View File

@ -98,8 +98,8 @@ public class QtServiceDelegate
private static final String APP_DISPLAY_METRIC_SCREEN_YDPI_KEY = "display.screen.dpi.y";
private static final String APP_DISPLAY_METRIC_SCREEN_DENSITY_KEY = "display.screen.density";
private String m_mainLib = null;
private Service m_service = null;
private String m_mainLib;
private static String m_environmentVariables = null;
private static String m_applicationParameters = null;
@ -142,9 +142,9 @@ public class QtServiceDelegate
}
QtNative.loadQtLibraries(loaderParams.getStringArrayList(NATIVE_LIBRARIES_KEY));
ArrayList<String> libraries = loaderParams.getStringArrayList(BUNDLED_LIBRARIES_KEY);
QtNative.loadBundledLibraries(libraries, QtNativeLibrariesDir.nativeLibrariesDir(m_service));
String nativeLibsDir = QtNativeLibrariesDir.nativeLibrariesDir(m_service);
QtNative.loadBundledLibraries(libraries, nativeLibsDir);
m_mainLib = loaderParams.getString(MAIN_LIBRARY_KEY);
m_environmentVariables = loaderParams.getString(ENVIRONMENT_VARIABLES_KEY);
String additionalEnvironmentVariables = "QT_ANDROID_FONTS_MONOSPACE=Droid Sans Mono;Droid Sans;Droid Sans Fallback"
+ "\tQT_ANDROID_FONTS_SERIF=Droid Serif"
@ -165,7 +165,8 @@ public class QtServiceDelegate
else
m_applicationParameters = "";
return true;
m_mainLib = QtNative.loadMainLibrary(m_mainLib, nativeLibsDir);
return m_mainLib != null;
}
public boolean startApplication()
@ -173,10 +174,7 @@ public class QtServiceDelegate
// start application
try {
String nativeLibraryDir = QtNativeLibrariesDir.nativeLibrariesDir(m_service);
QtNative.startApplication(m_applicationParameters,
m_environmentVariables,
m_mainLib,
nativeLibraryDir);
QtNative.startApplication(m_applicationParameters, m_environmentVariables, m_mainLib);
return true;
} catch (Exception e) {
e.printStackTrace();

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Δεν ήταν δυνατή η εύρεση της υπηρεσίας Ministro. Δεν είναι δυνατή η εκκίνηση της εφαρμογής.</string>
<string name="ministro_needed_msg">Η εφαρμογή απαιτεί την υπηρεσία Ministro. Να εγκατασταθεί η υπηρεσία?</string>
<string name="fatal_error_msg">Παρουσιάστηκε ένα κρίσιμο σφάλμα και η εφαρμογή δεν μπορεί να συνεχίσει.</string>
<string name="unsupported_android_version">Αυτή η έκδοση του Android δεν υποστηρίζεται.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Servicio Ministro inesistente. Imposible ejecutar la aplicación.</string>
<string name="ministro_needed_msg">Esta aplicación requiere el servicio Ministro. Instalarlo?</string>
<string name="fatal_error_msg">La aplicación ha causado un error grave y no es posible continuar.</string>
<string name="unsupported_android_version">Esta versión de Android no es compatible.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Ei suuda leida Ministro teenust.\nProgrammi ei saa käivitada.</string>
<string name="ministro_needed_msg">See programm vajab Ministro teenust.\nKas soovite paigaldada?</string>
<string name="fatal_error_msg">Programmiga juhtus fataalne viga.\nKahjuks ei saa jätkata.</string>
<string name="unsupported_android_version">Seda Androidi versiooni ei toetata.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">سرویس Ministro را پیدا نمی‌کند. برنامه نمی‌تواند آغاز شود.</string>
<string name="ministro_needed_msg">این نرم‌افزار به سرویس Ministro احتیاج دارد. آیا دوست دارید آن را نصب کنید؟</string>
<string name="fatal_error_msg">خطایی اساسی در برنامه‌تان رخ داد و اجرای برنامه نمی‌تواند ادامه یابد.</string>
<string name="unsupported_android_version">این نسخه از Android پشتیبانی نمی شود</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Layanan Ministro tidak bisa ditemukan.\nAplikasi tidak bisa dimulai.</string>
<string name="ministro_needed_msg">Aplikasi ini membutuhkan layanan Ministro. Apakah Anda ingin menginstalnya?</string>
<string name="fatal_error_msg">Aplikasi Anda mengalami kesalahan fatal dan tidak dapat melanjutkan.</string>
<string name="unsupported_android_version">Versi Android ini tidak didukung.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Servizio Ministro inesistente. Impossibile eseguire \nl\'applicazione.</string>
<string name="ministro_needed_msg">Questa applicazione richiede il servizio Ministro.Installarlo?</string>
<string name="fatal_error_msg">L\'applicazione ha provocato un errore grave e non puo\' continuare.</string>
<string name="unsupported_android_version">Questa versione di Android non è supportata.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Ministroサービスが見つかりません。\nアプリケーションが起動できません。</string>
<string name="ministro_needed_msg">このアプリケーションにはMinistroサービスが必要です。 インストールしてもよろしいですか?</string>
<string name="fatal_error_msg">アプリケーションで致命的なエラーが発生したため続行できません。</string>
<string name="unsupported_android_version">このバージョンのAndroidはサポートされていません。</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Tidak jumpa servis Ministro.\nAplikasi tidak boleh dimulakan.</string>
<string name="ministro_needed_msg">Aplikasi ini memerlukan servis Ministro. Adakah anda ingin pasang servis itu?</string>
<string name="fatal_error_msg">Aplikasi anda menemui ralat muat dan tidak boleh diteruskan.</string>
<string name="unsupported_android_version">Versi Android ini tidak disokong.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Kan ikke finne tjenesten Ministro. Applikasjonen kan ikke starte.</string>
<string name="ministro_needed_msg">Denne applikasjonen krever tjenesten Ministro. Vil du installere denne?</string>
<string name="fatal_error_msg">Applikasjonen fikk en kritisk feil og kan ikke fortsette</string>
<string name="unsupported_android_version">Denne versjonen av Android støttes ikke.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">De Ministro service is niet gevonden.\nDe applicatie kan niet starten.</string>
<string name="ministro_needed_msg">Deze applicatie maakt gebruik van de Ministro service. Wilt u deze installeren?</string>
<string name="fatal_error_msg">Er is een fatale fout in de applicatie opgetreden. De applicatie kan niet verder gaan.</string>
<string name="unsupported_android_version">Deze versie van Android wordt niet ondersteund.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Usługa Ministro nie została znaleziona.\nAplikacja nie może zostać uruchomiona.</string>
<string name="ministro_needed_msg">Aplikacja wymaga usługi Ministro. Czy chcesz ją zainstalować?</string>
<string name="fatal_error_msg">Wystąpił błąd krytyczny. Aplikacja zostanie zamknięta.</string>
<string name="unsupported_android_version">Ta wersja Androida nie jest obsługiwana.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Não foi possível encontrar o serviço Ministro.\nA aplicação não pode iniciar.</string>
<string name="ministro_needed_msg">Essa aplicação requer o serviço Ministro. Gostaria de instalá-lo?</string>
<string name="fatal_error_msg">Sua aplicação encontrou um erro fatal e não pode continuar.</string>
<string name="unsupported_android_version">Esta versão do Android não é suportada.</string>
</resources>

View File

@ -3,5 +3,5 @@
<string name="ministro_not_found_msg">Serviciul Ministro nu poate fi găsit.\nAplicaţia nu poate porni.</string>
<string name="ministro_needed_msg">Această aplicaţie necesită serviciul Ministro.\nDoriţi să-l instalaţi?</string>
<string name="fatal_error_msg">Aplicaţia dumneavoastră a întâmpinat o eroare fatală şi nu poate continua.</string>
<string name="unsupported_android_version">Versiune Android nesuportată.</string>
<string name="unsupported_android_version">Această versiune de Android nu este suportată.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Ministro servise nije pronađen. Aplikacija ne može biti pokrenuta.</string>
<string name="ministro_needed_msg">Ova aplikacija zahteva Ministro servis. Želite li da ga instalirate?</string>
<string name="fatal_error_msg">Vaša aplikacija je naišla na fatalnu grešku i ne može nastaviti sa radom.</string>
<string name="unsupported_android_version">Ova verzija Android-a nije podržana.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">Сервис Ministro не найден.\nПриложение нельзя запустить.</string>
<string name="ministro_needed_msg">Этому приложению необходим сервис Ministro. Вы хотите его установить?</string>
<string name="fatal_error_msg">Ваше приложение столкнулось с фатальной ошибкой и не может более работать.</string>
<string name="unsupported_android_version">Эта версия Android не поддерживается.</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">无法找到Ministro服务。\n应用程序无法启动。</string>
<string name="ministro_needed_msg">此应用程序需要Ministro服务。您想安装它吗</string>
<string name="fatal_error_msg">您的应用程序遇到一个致命错误导致它无法继续。</string>
<string name="unsupported_android_version">这个版本的安卓系统不被支持。</string>
</resources>

View File

@ -3,4 +3,5 @@
<string name="ministro_not_found_msg">無法找到Ministro服務。\n應用程序無法啟動。</string>
<string name="ministro_needed_msg">此應用程序需要Ministro服務。您想安裝它嗎</string>
<string name="fatal_error_msg">您的應用程序遇到一個致命錯誤導致它無法繼續。</string>
<string name="unsupported_android_version">這個版本的安卓系統不被支持。</string>
</resources>

View File

@ -4,5 +4,5 @@
<string name="ministro_not_found_msg">Can\'t find Ministro service.\nThe application can\'t start.</string>
<string name="ministro_needed_msg">This application requires Ministro service. Would you like to install it?</string>
<string name="fatal_error_msg">Your application encountered a fatal error and cannot continue.</string>
<string name="unsupported_android_version">Unsupported Android version.</string>
<string name="unsupported_android_version">This version of Android is not supported.</string>
</resources>

View File

@ -362,16 +362,22 @@ void QProcessPrivate::destroyPipe(Q_PIPE pipe[2])
}
}
template <class T>
void deleteWorker(T *&worker)
{
if (!worker)
return;
worker->stop();
worker->deleteLater();
worker = nullptr;
}
void QProcessPrivate::closeChannel(Channel *channel)
{
if (channel == &stdinChannel) {
delete stdinChannel.writer;
stdinChannel.writer = 0;
} else if (channel->reader) {
channel->reader->stop();
channel->reader->deleteLater();
channel->reader = 0;
}
if (channel == &stdinChannel)
deleteWorker(channel->writer);
else
deleteWorker(channel->reader);
destroyPipe(channel->pipe);
}

View File

@ -2167,6 +2167,9 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
\snippet settings/settings.cpp 15
Note that type information is not preserved when reading settings from INI
files; all values will be returned as QString.
The \l{tools/settingseditor}{Settings Editor} example lets you
experiment with different settings location and with fallbacks
turned on or off.
@ -2448,7 +2451,10 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
On 32-bit Windows or from a 64-bit application on 64-bit Windows,
this works the same as specifying NativeFormat.
This enum value was added in Qt 5.7.
\value IniFormat Store the settings in INI files.
\value IniFormat Store the settings in INI files. Note that type information
is not preserved when reading settings from INI files;
all values will be returned as QString.
\value InvalidFormat Special value returned by registerFormat().
\omitvalue CustomFormat1
\omitvalue CustomFormat2

View File

@ -2,7 +2,7 @@
"Id": "psl",
"Name": "The Public Suffix List",
"QDocModule": "qtcore",
"Description": "The Public Suffix List is an initiative of the Mozilla Project,
"Description": "The Public Suffix List is an initiative of Mozilla,
but is maintained as a community resource. It is available for use in any software,
but was originally created to meet the needs of browser manufacturers.
It allows browsers to, for example:
@ -14,9 +14,11 @@ It allows browsers to, for example:
- Accurately sort history entries by site",
"Files": "qurltlds_p.h",
"QtUsage": "Used in Qt Core to avoid \"supercookies\" being set in the cookie jar
"QtUsage": "See util/corelib/qurl-generateTLDs/ for code-generator",
"QtUsage": "Used in Qt Core to avoid setting \"supercookies\" in the cookie jar
supported by Qt (by the QNetworkCookieJar class).",
"Homepage": "Consult https://github.com/publicsuffix/list for the sha1 but download from ...",
"Homepage": "http://publicsuffix.org/",
"Version": "Generated on 2018-01-04",
"License": "Mozilla Public License 2.0",

View File

@ -53,7 +53,7 @@
extern "C" {
// Equivalent to dbus-arch-deps.h
// Equivalent to dbus-arch-deps.h (generated from dbus-arch-deps.h.in)
typedef qint64 dbus_int64_t;
typedef quint64 dbus_uint64_t;
typedef qint32 dbus_int32_t;
@ -78,7 +78,7 @@ struct DBusWatch;
// which carry the following copyright:
/*
* Copyright (C) 2002, 2003 CodeFactory AB
* Copyright (C) 2004, 2005 Red Hat, Inc.
* Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
*
* Licensed under the Academic Free License version 2.1
*
@ -103,6 +103,20 @@ typedef dbus_uint32_t dbus_unichar_t;
typedef dbus_uint32_t dbus_bool_t;
/* dbus-shared.h */
typedef enum
{
DBUS_BUS_SESSION, /**< The login session bus */
DBUS_BUS_SYSTEM, /**< The systemwide bus */
DBUS_BUS_STARTER /**< The bus that started us, if any */
} DBusBusType;
typedef enum
{
DBUS_HANDLER_RESULT_HANDLED, /**< Message has had its effect - no need to run more handlers. */
DBUS_HANDLER_RESULT_NOT_YET_HANDLED, /**< Message has not had any effect - see if other handlers want it. */
DBUS_HANDLER_RESULT_NEED_MEMORY /**< Need more memory in order to return #DBUS_HANDLER_RESULT_HANDLED or #DBUS_HANDLER_RESULT_NOT_YET_HANDLED. Please try again later with more memory. */
} DBusHandlerResult;
#define DBUS_SERVICE_DBUS "org.freedesktop.DBus"
#define DBUS_PATH_DBUS "/org/freedesktop/DBus"
#define DBUS_PATH_LOCAL "/org/freedesktop/DBus/Local"
@ -124,20 +138,6 @@ typedef dbus_uint32_t dbus_bool_t;
#define DBUS_RELEASE_NAME_REPLY_NON_EXISTENT 2 /**< The given name does not exist on the bus */
#define DBUS_RELEASE_NAME_REPLY_NOT_OWNER 3 /**< Service is not an owner of the given name */
typedef enum
{
DBUS_BUS_SESSION, /**< The login session bus */
DBUS_BUS_SYSTEM, /**< The systemwide bus */
DBUS_BUS_STARTER /**< The bus that started us, if any */
} DBusBusType;
typedef enum
{
DBUS_HANDLER_RESULT_HANDLED, /**< Message has had its effect - no need to run more handlers. */
DBUS_HANDLER_RESULT_NOT_YET_HANDLED, /**< Message has not had any effect - see if other handlers want it. */
DBUS_HANDLER_RESULT_NEED_MEMORY /**< Need more memory in order to return #DBUS_HANDLER_RESULT_HANDLED or #DBUS_HANDLER_RESULT_NOT_YET_HANDLED. Please try again later with more memory. */
} DBusHandlerResult;
/* dbus-memory.h */
typedef void (* DBusFreeFunction) (void *memory);

View File

@ -7,7 +7,7 @@
"Description": "D-Bus is a message bus system, a simple way for applications to talk to one another.",
"Homepage": "https://www.freedesktop.org/wiki/Software/dbus/",
"Version": "Minimal supported is 1.2, compatible up to ...",
"Version": "1.12",
"Version": "dbus-1.12.12",
"LicenseId": "AFL-2.1 OR GPL-2.0-or-later",
"License": "Academic Free License v2.1, or GNU General Public License v2.0 or later",
"LicenseFile": "LIBDBUS-1-LICENSE.txt",

View File

@ -439,7 +439,7 @@ void QClipboard::setPixmap(const QPixmap &pixmap, Mode mode)
\fn QMimeData *QClipboard::mimeData(Mode mode) const
Returns a pointer to a QMimeData representation of the current
clipboard data (can be NULL if the given \a mode is not
clipboard data (can be \nullptr if the given \a mode is not
supported by the platform).
The \a mode argument is used to control which part of the system

View File

@ -1023,7 +1023,7 @@ QList<QScreen *> QGuiApplication::screens()
}
/*!
Returns the screen at \a point, or \c nullptr if outside of any screen.
Returns the screen at \a point, or \nullptr if outside of any screen.
The \a point is in relation to the virtualGeometry() of each set of virtual
siblings. If the point maps to more than one set of virtual siblings the first

View File

@ -1235,7 +1235,8 @@ void QOpenGLContext::deleteQGLContext()
Returns the platform-specific handle for the OpenGL implementation that
is currently in use. (for example, a HMODULE on Windows)
On platforms that do not use dynamic GL switch the return value is null.
On platforms that do not use dynamic GL switching, the return value
is \nullptr.
The library might be GL-only, meaning that windowing system interface
functions (for example EGL) may live in another, separate library.

View File

@ -291,7 +291,7 @@ QPlatformPixmap *QPlatformIntegration::createPlatformPixmap(QPlatformPixmap::Pix
platform implementation is responsible for querying the configuriation from the provided
native context.
Returns a pointer to a QPlatformOpenGLContext instance or \c NULL if the context could
Returns a pointer to a QPlatformOpenGLContext instance or \nullptr if the context could
not be created.
\sa QOpenGLContext
@ -647,7 +647,7 @@ void QPlatformIntegration::setApplicationIcon(const QIcon &icon) const
pointer to the instance for which a platform-specific backend needs to be
created.
Returns a pointer to a QPlatformOpenGLContext instance or \c NULL if the context could
Returns a pointer to a QPlatformOpenGLContext instance or \nullptr if the context could
not be created.
\sa QVulkanInstance

View File

@ -175,7 +175,7 @@ int QShortcutMap::addShortcut(QObject *owner, const QKeySequence &key, Qt::Short
/*! \internal
Removes a shortcut from the global map.
If \a owner is 0, all entries in the map with the key sequence specified
If \a owner is \nullptr, all entries in the map with the key sequence specified
is removed. If \a key is null, all sequences for \a owner is removed from
the map. If \a id is 0, any identical \a key sequences owned by \a owner
are removed.
@ -222,7 +222,7 @@ int QShortcutMap::removeShortcut(int id, QObject *owner, const QKeySequence &key
/*! \internal
Changes the enable state of a shortcut to \a enable.
If \a owner is 0, all entries in the map with the key sequence specified
If \a owner is \nullptr, all entries in the map with the key sequence specified
is removed. If \a key is null, all sequences for \a owner is removed from
the map. If \a id is 0, any identical \a key sequences owned by \a owner
are changed.
@ -260,7 +260,7 @@ int QShortcutMap::setShortcutEnabled(bool enable, int id, QObject *owner, const
/*! \internal
Changes the auto repeat state of a shortcut to \a enable.
If \a owner is 0, all entries in the map with the key sequence specified
If \a owner is \nullptr, all entries in the map with the key sequence specified
is removed. If \a key is null, all sequences for \a owner is removed from
the map. If \a id is 0, any identical \a key sequences owned by \a owner
are changed.

View File

@ -206,7 +206,8 @@ QOpenGLFunctions::QOpenGLFunctions()
/*!
Constructs a function resolver for \a context. If \a context
is null, then the resolver will be created for the current QOpenGLContext.
is \nullptr, then the resolver will be created for the current
QOpenGLContext.
The context or another context in the group must be current.
@ -5035,8 +5036,8 @@ QOpenGLExtraFunctions::QOpenGLExtraFunctions()
}
/*!
Constructs a function resolver for context. If \a context is null, then
the resolver will be created for the current QOpenGLContext.
Constructs a function resolver for context. If \a context is \nullptr,
then the resolver will be created for the current QOpenGLContext.
The context or another context in the group must be current.

View File

@ -3667,7 +3667,8 @@ QVector<float> QOpenGLShaderProgram::defaultInnerTessellationLevels() const
Language (GLSL) are supported on this system; false otherwise.
The \a context is used to resolve the GLSL extensions.
If \a context is null, then QOpenGLContext::currentContext() is used.
If \a context is \nullptr, then QOpenGLContext::currentContext()
is used.
*/
bool QOpenGLShaderProgram::hasOpenGLShaderPrograms(QOpenGLContext *context)
{
@ -3694,7 +3695,8 @@ void QOpenGLShaderProgram::shaderDestroyed()
this system; false otherwise.
The \a context is used to resolve the GLSL extensions.
If \a context is null, then QOpenGLContext::currentContext() is used.
If \a context is \nullptr, then QOpenGLContext::currentContext()
is used.
*/
bool QOpenGLShader::hasOpenGLShaders(ShaderType type, QOpenGLContext *context)
{

View File

@ -208,7 +208,7 @@ static bool isRasterSurface(QWindow *window)
The \a window must either be the top level window represented by
this backingstore, or a non-transient child of that window. Passing
\c nullptr falls back to using the backingstore's top level window.
\nullptr falls back to using the backingstore's top level window.
If the \a window is a child window, the \a region should be in child window
coordinates, and the \a offset should be the child window's offset in relation

View File

@ -1022,8 +1022,8 @@ void QFontEngine::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metr
Returns \c true if the font table idetified by \a tag exists in the font;
returns \c false otherwise.
If \a buffer is NULL, stores the size of the buffer required for the font table data,
in bytes, in \a length. If \a buffer is not NULL and the capacity
If \a buffer is \nullptr, stores the size of the buffer required for the font table data,
in bytes, in \a length. If \a buffer is not \nullptr and the capacity
of the buffer, passed in \a length, is sufficient to store the font table data,
also copies the font table data to \a buffer.

View File

@ -306,7 +306,7 @@ QVulkanInstance::QVulkanInstance()
/*!
Destructor.
\note current() will return \c nullptr once the instance is destroyed.
\note current() will return \nullptr once the instance is destroyed.
*/
QVulkanInstance::~QVulkanInstance()
{

View File

@ -1826,8 +1826,8 @@ int QFtp::cd(const QString &dir)
is data available to read. You can then read the data with the
read() or readAll() functions.
If \a dev is not 0, the data is written directly to the device \a
dev. Make sure that the \a dev pointer is valid for the duration
If \a dev is not \nullptr, the data is written directly to the device
\a dev. Make sure that the \a dev pointer is valid for the duration
of the operation (it is safe to delete it when the
commandFinished() signal is emitted). In this case the readyRead()
signal is \e not emitted and you cannot read data with the

View File

@ -506,8 +506,8 @@ void QLocalServer::setMaxPendingConnections(int numConnections)
/*!
Waits for at most \a msec milliseconds or until an incoming connection
is available. Returns \c true if a connection is available; otherwise
returns \c false. If the operation timed out and \a timedOut is not 0,
*timedOut will be set to true.
returns \c false. If the operation timed out and \a timedOut is not
\nullptr, *timedOut will be set to true.
This is a blocking function call. Its use is ill-advised in a
single-threaded GUI application, since the whole application will stop

View File

@ -999,8 +999,8 @@ void QNativeSocketEngine::close()
/*!
Waits for \a msecs milliseconds or until the socket is ready for
reading. If \a timedOut is not 0 and \a msecs milliseconds have
passed, the value of \a timedOut is set to true.
reading. If \a timedOut is not \nullptr and \a msecs milliseconds
have passed, the value of \a timedOut is set to true.
Returns \c true if data is available for reading; otherwise returns
false.
@ -1039,8 +1039,8 @@ bool QNativeSocketEngine::waitForRead(int msecs, bool *timedOut)
/*!
Waits for \a msecs milliseconds or until the socket is ready for
writing. If \a timedOut is not 0 and \a msecs milliseconds have
passed, the value of \a timedOut is set to true.
writing. If \a timedOut is not \nullptr and \a msecs milliseconds
have passed, the value of \a timedOut is set to true.
Returns \c true if data is available for writing; otherwise returns
false.

View File

@ -493,7 +493,7 @@ QHostAddress QTcpServer::serverAddress() const
Waits for at most \a msec milliseconds or until an incoming
connection is available. Returns \c true if a connection is
available; otherwise returns \c false. If the operation timed out
and \a timedOut is not 0, *\a timedOut will be set to true.
and \a timedOut is not \nullptr, *\a timedOut will be set to true.
This is a blocking function call. Its use is disadvised in a
single-threaded GUI application, since the whole application will

View File

@ -136,7 +136,7 @@ QSslDiffieHellmanParameters QSslDiffieHellmanParameters::fromEncoded(const QByte
to check whether the Diffie-Hellman parameters were valid
and loaded correctly.
In particular, if \a device is \c nullptr or not open for reading, an invalid
In particular, if \a device is \nullptr or not open for reading, an invalid
object will be returned.
\sa isValid()

View File

@ -170,7 +170,8 @@ QGLFunctions::QGLFunctions()
/*!
Constructs a function resolver for \a context. If \a context
is null, then the resolver will be created for the current QGLContext.
is \nullptr, then the resolver will be created for the current
QGLContext.
An object constructed in this way can only be used with \a context
and other contexts that share with it. Use initializeGLFunctions()
@ -305,7 +306,7 @@ bool QGLFunctions::hasOpenGLFeature(QGLFunctions::OpenGLFeature feature) const
/*!
Initializes GL function resolution for \a context. If \a context
is null, then the current QGLContext will be used.
is \nullptr, then the current QGLContext will be used.
After calling this function, the QGLFunctions object can only be
used with \a context and other contexts that share with it.

View File

@ -3169,7 +3169,8 @@ GLenum QGLShaderProgram::geometryOutputType() const
Language (GLSL) are supported on this system; false otherwise.
The \a context is used to resolve the GLSL extensions.
If \a context is null, then QGLContext::currentContext() is used.
If \a context is \nullptr, then QGLContext::currentContext() is
used.
*/
bool QGLShaderProgram::hasOpenGLShaderPrograms(const QGLContext *context)
{
@ -3207,7 +3208,8 @@ void QGLShaderProgram::shaderDestroyed()
this system; false otherwise.
The \a context is used to resolve the GLSL extensions.
If \a context is null, then QGLContext::currentContext() is used.
If \a context is \nullptr, then QGLContext::currentContext() is
used.
\since 4.7
*/

View File

@ -40,6 +40,7 @@
#include "qandroidsystemlocale.h"
#include "androidjnimain.h"
#include <QtCore/private/qjni_p.h>
#include <QtCore/private/qjnihelpers_p.h>
#include "qdatetime.h"
#include "qstringlist.h"
#include "qvariant.h"
@ -162,6 +163,23 @@ QVariant QAndroidSystemLocale::query(QueryType type, QVariant in) const
return m_locale.createSeparatedList(in.value<QStringList>());
case LocaleChanged:
Q_ASSERT_X(false, Q_FUNC_INFO, "This can't happen.");
case UILanguages: {
if (QtAndroidPrivate::androidSdkVersion() >= 24) {
QJNIObjectPrivate localeListObject =
QJNIObjectPrivate::callStaticObjectMethod("android/os/LocaleList", "getDefault",
"()Landroid/os/LocaleList;");
if (localeListObject.isValid()) {
QString lang = localeListObject.callObjectMethod("toLanguageTags",
"()Ljava/lang/String;").toString();
// Some devices return with it enclosed in []'s so check if both exists before
// removing to ensure it is formatted correctly
if (lang.startsWith(QChar('[')) && lang.endsWith(QChar(']')))
lang = lang.mid(1, lang.length() - 2);
return lang.split(QChar(','));
}
}
return QVariant();
}
default:
break;
}

View File

@ -94,7 +94,6 @@ QT_USE_NAMESPACE
bool startedQuit;
NSObject <NSApplicationDelegate> *reflectionDelegate;
bool inLaunch;
QWindowList hiddenWindows;
}
+ (instancetype)sharedDelegate
@ -116,22 +115,10 @@ QT_USE_NAMESPACE
self = [super init];
if (self) {
inLaunch = true;
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(updateScreens:)
name:NSApplicationDidChangeScreenParametersNotification
object:NSApp];
}
return self;
}
- (void)updateScreens:(NSNotification *)notification
{
Q_UNUSED(notification);
if (QCocoaIntegration *ci = QCocoaIntegration::instance())
ci->updateScreens();
}
- (void)dealloc
{
[_dockMenu release];
@ -311,41 +298,6 @@ QT_USE_NAMESPACE
return NO; // Someday qApp->quitOnLastWindowClosed(); when QApp and NSApp work closer together.
}
- (void)applicationWillHide:(NSNotification *)notification
{
if (reflectionDelegate
&& [reflectionDelegate respondsToSelector:@selector(applicationWillHide:)]) {
[reflectionDelegate applicationWillHide:notification];
}
// When the application is hidden Qt will hide the popup windows associated with
// it when it has lost the activation for the application. However, when it gets
// to this point it believes the popup windows to be hidden already due to the
// fact that the application itself is hidden, which will cause a problem when
// the application is made visible again.
const QWindowList topLevelWindows = QGuiApplication::topLevelWindows();
for (QWindow *topLevelWindow : topLevelWindows) {
if ((topLevelWindow->type() & Qt::Popup) == Qt::Popup && topLevelWindow->isVisible()) {
topLevelWindow->hide();
if ((topLevelWindow->type() & Qt::Tool) == Qt::Tool)
hiddenWindows << topLevelWindow;
}
}
}
- (void)applicationDidUnhide:(NSNotification *)notification
{
if (reflectionDelegate
&& [reflectionDelegate respondsToSelector:@selector(applicationDidUnhide:)])
[reflectionDelegate applicationDidUnhide:notification];
for (QWindow *window : qAsConst(hiddenWindows))
window->show();
hiddenWindows.clear();
}
- (void)applicationDidBecomeActive:(NSNotification *)notification
{
if (reflectionDelegate

View File

@ -144,6 +144,7 @@ private:
#endif
QScopedPointer<QPlatformTheme> mPlatformTheme;
QList<QCocoaScreen *> mScreens;
QMacScopedObserver m_screensObserver;
#ifndef QT_NO_CLIPBOARD
QCocoaClipboard *mCocoaClipboard;
#endif

View File

@ -206,6 +206,9 @@ QCocoaIntegration::QCocoaIntegration(const QStringList &paramList)
// by explicitly setting the presentation option to the magic 'default value',
// which will resolve to an actual value and result in screen invalidation.
cocoaApplication.presentationOptions = NSApplicationPresentationDefault;
m_screensObserver = QMacScopedObserver([NSApplication sharedApplication],
NSApplicationDidChangeScreenParametersNotification, [&]() { updateScreens(); });
updateScreens();
QMacInternalPasteboardMime::initializeMimeTypes();

View File

@ -410,8 +410,7 @@ QWindow *QCocoaScreen::topLevelAt(const QPoint &point) const
if (![nsWindow conformsToProtocol:@protocol(QNSWindowProtocol)])
continue;
id<QNSWindowProtocol> proto = static_cast<id<QNSWindowProtocol> >(nsWindow);
QCocoaWindow *cocoaWindow = proto.platformWindow;
QCocoaWindow *cocoaWindow = qnsview_cast(nsWindow.contentView).platformWindow;
if (!cocoaWindow)
continue;
window = cocoaWindow->window();

View File

@ -401,6 +401,11 @@ void QCocoaWindow::setVisible(bool visible)
}
}
// Note: We do not guard the order out by checking NSWindow.visible, as AppKit will
// in some cases, such as when hiding the application, order out and make a window
// invisible, but keep it in a list of "hidden windows", that it then restores again
// when the application is unhidden. We need to call orderOut explicitly, to bring
// the window out of this "hidden list".
[m_view.window orderOut:nil];
if (m_view.window == [NSApp keyWindow] && !eventDispatcher()->hasModalSession()) {
@ -1540,7 +1545,8 @@ QCocoaNSWindow *QCocoaWindow::createNSWindow(bool shouldBePanel)
// Deferring window creation breaks OpenGL (the GL context is
// set up before the window is shown and needs a proper window)
backing:NSBackingStoreBuffered defer:NO
screen:cocoaScreen->nativeScreen()];
screen:cocoaScreen->nativeScreen()
platformWindow:this];
Q_ASSERT_X(nsWindow.screen == cocoaScreen->nativeScreen(), "QCocoaWindow",
"Resulting NSScreen should match the requested NSScreen");

View File

@ -60,15 +60,10 @@ QT_FORWARD_DECLARE_CLASS(QCocoaWindow)
#define QNSWindowProtocol QT_MANGLE_NAMESPACE(QNSWindowProtocol)
@protocol QNSWindowProtocol
@optional
- (BOOL)canBecomeKeyWindow;
- (BOOL)worksWhenModal;
- (void)sendEvent:(NSEvent*)theEvent;
- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSWindowStyleMask)style
backing:(NSBackingStoreType)backingStoreType defer:(BOOL)flag screen:(NSScreen *)screen
platformWindow:(QCocoaWindow*)window;
- (void)closeAndRelease;
- (void)dealloc;
- (BOOL)isOpaque;
- (NSColor *)backgroundColor;
- (NSString *)description;
@property (nonatomic, readonly) QCocoaWindow *platformWindow;
@end

View File

@ -37,6 +37,8 @@
**
****************************************************************************/
#if !defined(QNSWINDOW_PROTOCOL_IMPLMENTATION)
#include "qnswindow.h"
#include "qcocoawindow.h"
#include "qcocoahelpers.h"
@ -89,183 +91,10 @@ static bool isMouseEvent(NSEvent *ev)
}
@end
#define super USE_qt_objcDynamicSuper_INSTEAD
@implementation QNSWindow
+ (void)load
{
const Class windowClass = [self class];
const Class panelClass = [QNSPanel class];
unsigned int protocolCount;
Protocol **protocols = class_copyProtocolList(windowClass, &protocolCount);
for (unsigned int i = 0; i < protocolCount; ++i) {
Protocol *protocol = protocols[i];
unsigned int methodDescriptionsCount;
objc_method_description *methods = protocol_copyMethodDescriptionList(
protocol, NO, YES, &methodDescriptionsCount);
for (unsigned int j = 0; j < methodDescriptionsCount; ++j) {
objc_method_description method = methods[j];
class_addMethod(panelClass, method.name,
class_getMethodImplementation(windowClass, method.name),
method.types);
}
free(methods);
}
free(protocols);
}
- (QCocoaWindow *)platformWindow
{
return qnsview_cast(self.contentView).platformWindow;
}
- (NSString *)description
{
NSMutableString *description = [NSMutableString stringWithString:qt_objcDynamicSuper()];
#ifndef QT_NO_DEBUG_STREAM
QString contentViewDescription;
QDebug debug(&contentViewDescription);
debug.nospace() << "; contentView=" << qnsview_cast(self.contentView) << ">";
NSRange lastCharacter = [description rangeOfComposedCharacterSequenceAtIndex:description.length - 1];
[description replaceCharactersInRange:lastCharacter withString:contentViewDescription.toNSString()];
#endif
return description;
}
- (BOOL)canBecomeKeyWindow
{
QCocoaWindow *pw = self.platformWindow;
if (!pw)
return NO;
if (pw->shouldRefuseKeyWindowAndFirstResponder())
return NO;
if ([self isKindOfClass:[QNSPanel class]]) {
// Only tool or dialog windows should become key:
Qt::WindowType type = pw->window()->type();
if (type == Qt::Tool || type == Qt::Dialog)
return YES;
return NO;
} else {
// The default implementation returns NO for title-bar less windows,
// override and return yes here to make sure popup windows such as
// the combobox popup can become the key window.
return YES;
}
}
- (BOOL)canBecomeMainWindow
{
BOOL canBecomeMain = YES; // By default, windows can become the main window
// Windows with a transient parent (such as combobox popup windows)
// cannot become the main window:
QCocoaWindow *pw = self.platformWindow;
if (!pw || pw->window()->transientParent())
canBecomeMain = NO;
return canBecomeMain;
}
- (BOOL)worksWhenModal
{
if ([self isKindOfClass:[QNSPanel class]]) {
if (QCocoaWindow *pw = self.platformWindow) {
Qt::WindowType type = pw->window()->type();
if (type == Qt::Popup || type == Qt::Dialog || type == Qt::Tool)
return YES;
}
}
return qt_objcDynamicSuper();
}
- (BOOL)isOpaque
{
return self.platformWindow ?
self.platformWindow->isOpaque() : qt_objcDynamicSuper();
}
/*!
Borderless windows need a transparent background
Technically windows with NSWindowStyleMaskTexturedBackground
(such as windows with unified toolbars) need to draw the textured
background of the NSWindow, and can't have a transparent
background, but as NSWindowStyleMaskBorderless is 0, you can't
have a window with NSWindowStyleMaskTexturedBackground that is
also borderless.
*/
- (NSColor *)backgroundColor
{
return self.styleMask == NSWindowStyleMaskBorderless
? [NSColor clearColor] : qt_objcDynamicSuper();
}
- (void)sendEvent:(NSEvent*)theEvent
{
qCDebug(lcQpaEvents) << "Sending" << theEvent << "to" << self;
// We might get events for a NSWindow after the corresponding platform
// window has been deleted, as the NSWindow can outlive the QCocoaWindow
// e.g. if being retained by other parts of AppKit, or in an auto-release
// pool. We guard against this in QNSView as well, as not all callbacks
// come via events, but if they do there's no point in propagating them.
if (!self.platformWindow)
return;
// Prevent deallocation of this NSWindow during event delivery, as we
// have logic further below that depends on the window being alive.
[[self retain] autorelease];
const char *eventType = object_getClassName(theEvent);
if (QWindowSystemInterface::handleNativeEvent(self.platformWindow->window(),
QByteArray::fromRawData(eventType, qstrlen(eventType)), theEvent, nullptr)) {
return;
}
qt_objcDynamicSuper(theEvent);
if (!self.platformWindow)
return; // Platform window went away while processing event
QCocoaWindow *pw = self.platformWindow;
if (pw->frameStrutEventsEnabled() && isMouseEvent(theEvent)) {
NSPoint loc = [theEvent locationInWindow];
NSRect windowFrame = [self convertRectFromScreen:self.frame];
NSRect contentFrame = self.contentView.frame;
if (NSMouseInRect(loc, windowFrame, NO) && !NSMouseInRect(loc, contentFrame, NO))
[qnsview_cast(pw->view()) handleFrameStrutMouseEvent:theEvent];
}
}
- (void)closeAndRelease
{
qCDebug(lcQpaWindow) << "Closing and releasing" << self;
[self close];
[self release];
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-missing-super-calls"
- (void)dealloc
{
qCDebug(lcQpaWindow) << "Deallocating" << self;
self.delegate = nil;
qt_objcDynamicSuper();
}
#pragma clang diagnostic pop
#define QNSWINDOW_PROTOCOL_IMPLMENTATION 1
#include "qnswindow.mm"
#undef QNSWINDOW_PROTOCOL_IMPLMENTATION
+ (void)applicationActivationChanged:(NSNotification*)notification
{
@ -326,7 +155,169 @@ static bool isMouseEvent(NSEvent *ev)
@end
@implementation QNSPanel
// Implementation shared with QNSWindow, see +[QNSWindow load] above
#define QNSWINDOW_PROTOCOL_IMPLMENTATION 1
#include "qnswindow.mm"
#undef QNSWINDOW_PROTOCOL_IMPLMENTATION
@end
#undef super
#else // QNSWINDOW_PROTOCOL_IMPLMENTATION
// The following content is mixed in to the QNSWindow and QNSPanel classes via includes
{
// Member variables
QPointer<QCocoaWindow> m_platformWindow;
}
- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSWindowStyleMask)style
backing:(NSBackingStoreType)backingStoreType defer:(BOOL)defer screen:(NSScreen *)screen
platformWindow:(QCocoaWindow*)window
{
// Initializing the window will end up in [NSWindow _commonAwake], which calls many
// of the getters below. We need to set up the platform window reference first, so
// we can properly reflect the window's state during initialization.
m_platformWindow = window;
return [super initWithContentRect:contentRect styleMask:style backing:backingStoreType defer:defer screen:screen];
}
- (QCocoaWindow *)platformWindow
{
return m_platformWindow;
}
- (NSString *)description
{
NSMutableString *description = [NSMutableString stringWithString:[super description]];
#ifndef QT_NO_DEBUG_STREAM
QString contentViewDescription;
QDebug debug(&contentViewDescription);
debug.nospace() << "; contentView=" << qnsview_cast(self.contentView) << ">";
NSRange lastCharacter = [description rangeOfComposedCharacterSequenceAtIndex:description.length - 1];
[description replaceCharactersInRange:lastCharacter withString:contentViewDescription.toNSString()];
#endif
return description;
}
- (BOOL)canBecomeKeyWindow
{
if (!m_platformWindow)
return NO;
if (m_platformWindow->shouldRefuseKeyWindowAndFirstResponder())
return NO;
if ([self isKindOfClass:[QNSPanel class]]) {
// Only tool or dialog windows should become key:
Qt::WindowType type = m_platformWindow->window()->type();
if (type == Qt::Tool || type == Qt::Dialog)
return YES;
return NO;
} else {
// The default implementation returns NO for title-bar less windows,
// override and return yes here to make sure popup windows such as
// the combobox popup can become the key window.
return YES;
}
}
- (BOOL)canBecomeMainWindow
{
BOOL canBecomeMain = YES; // By default, windows can become the main window
// Windows with a transient parent (such as combobox popup windows)
// cannot become the main window:
if (!m_platformWindow || m_platformWindow->window()->transientParent())
canBecomeMain = NO;
return canBecomeMain;
}
- (BOOL)worksWhenModal
{
if (m_platformWindow && [self isKindOfClass:[QNSPanel class]]) {
Qt::WindowType type = m_platformWindow->window()->type();
if (type == Qt::Popup || type == Qt::Dialog || type == Qt::Tool)
return YES;
}
return [super worksWhenModal];
}
- (BOOL)isOpaque
{
return m_platformWindow ? m_platformWindow->isOpaque() : [super isOpaque];
}
/*!
Borderless windows need a transparent background
Technically windows with NSWindowStyleMaskTexturedBackground
(such as windows with unified toolbars) need to draw the textured
background of the NSWindow, and can't have a transparent
background, but as NSWindowStyleMaskBorderless is 0, you can't
have a window with NSWindowStyleMaskTexturedBackground that is
also borderless.
*/
- (NSColor *)backgroundColor
{
return self.styleMask == NSWindowStyleMaskBorderless
? [NSColor clearColor] : [super backgroundColor];
}
- (void)sendEvent:(NSEvent*)theEvent
{
qCDebug(lcQpaEvents) << "Sending" << theEvent << "to" << self;
// We might get events for a NSWindow after the corresponding platform
// window has been deleted, as the NSWindow can outlive the QCocoaWindow
// e.g. if being retained by other parts of AppKit, or in an auto-release
// pool. We guard against this in QNSView as well, as not all callbacks
// come via events, but if they do there's no point in propagating them.
if (!m_platformWindow)
return;
// Prevent deallocation of this NSWindow during event delivery, as we
// have logic further below that depends on the window being alive.
[[self retain] autorelease];
const char *eventType = object_getClassName(theEvent);
if (QWindowSystemInterface::handleNativeEvent(m_platformWindow->window(),
QByteArray::fromRawData(eventType, qstrlen(eventType)), theEvent, nullptr)) {
return;
}
[super sendEvent:theEvent];
if (!m_platformWindow)
return; // Platform window went away while processing event
if (m_platformWindow->frameStrutEventsEnabled() && isMouseEvent(theEvent)) {
NSPoint loc = [theEvent locationInWindow];
NSRect windowFrame = [self convertRectFromScreen:self.frame];
NSRect contentFrame = self.contentView.frame;
if (NSMouseInRect(loc, windowFrame, NO) && !NSMouseInRect(loc, contentFrame, NO))
[qnsview_cast(m_platformWindow->view()) handleFrameStrutMouseEvent:theEvent];
}
}
- (void)closeAndRelease
{
qCDebug(lcQpaWindow) << "Closing and releasing" << self;
[self close];
[self release];
}
- (void)dealloc
{
qCDebug(lcQpaWindow) << "Deallocating" << self;
self.delegate = nil;
[super dealloc];
}
#endif

View File

@ -17,7 +17,7 @@ HEADERS = qoffscreenintegration.h \
OTHER_FILES += offscreen.json
qtConfig(system-xcb):qtConfig(xlib):qtConfig(opengl):!qtConfig(opengles2) {
qtConfig(xlib):qtConfig(opengl):!qtConfig(opengles2) {
SOURCES += qoffscreenintegration_x11.cpp
HEADERS += qoffscreenintegration_x11.h
QT += glx_support-private

View File

@ -66,7 +66,7 @@
#include <qpa/qplatformservices.h>
#if QT_CONFIG(system_xcb) && QT_CONFIG(xlib) && QT_CONFIG(opengl) && !QT_CONFIG(opengles2)
#if QT_CONFIG(xlib) && QT_CONFIG(opengl) && !QT_CONFIG(opengles2)
#include "qoffscreenintegration_x11.h"
#endif
@ -225,7 +225,7 @@ QPlatformServices *QOffscreenIntegration::services() const
QOffscreenIntegration *QOffscreenIntegration::createOffscreenIntegration()
{
#if QT_CONFIG(system_xcb) && QT_CONFIG(xlib) && QT_CONFIG(opengl) && !QT_CONFIG(opengles2)
#if QT_CONFIG(xlib) && QT_CONFIG(opengl) && !QT_CONFIG(opengles2)
QByteArray glx = qgetenv("QT_QPA_OFFSCREEN_NO_GLX");
if (glx.isEmpty())
return new QOffscreenX11Integration;

View File

@ -53,7 +53,8 @@ void QWasmCursor::changeCursor(QCursor *windowCursor, QWindow *window)
htmlCursorName = "auto";
// Set cursor on the main canvas
emscripten::val::global("window").set("cursor", emscripten::val(htmlCursorName.constData()));
emscripten::val canvasStyle = emscripten::val::module_property("canvas")["style"];
canvasStyle.set("cursor", emscripten::val(htmlCursorName.constData()));
}
QByteArray QWasmCursor::cursorShapeToHtml(Qt::CursorShape shape)

View File

@ -198,8 +198,10 @@ void QWasmWindow::injectMouseReleased(const QPoint &local, const QPoint &global,
if (!hasTitleBar() || button != Qt::LeftButton)
return;
if (closeButtonRect().contains(global) && m_activeControl == QWasmCompositor::SC_TitleBarCloseButton)
if (closeButtonRect().contains(global) && m_activeControl == QWasmCompositor::SC_TitleBarCloseButton) {
window()->close();
return;
}
if (maxButtonRect().contains(global) && m_activeControl == QWasmCompositor::SC_TitleBarMaxButton) {
window()->setWindowState(Qt::WindowMaximized);

View File

@ -48,6 +48,7 @@
#include <QDBusPendingCallWatcher>
#include <QDBusPendingReply>
#include <QFile>
#include <QMetaType>
#include <QMimeType>
#include <QMimeDatabase>
@ -181,10 +182,10 @@ void QXdgDesktopPortalFileDialog::openPortal()
if (d->saveFile) {
if (!d->directory.isEmpty())
options.insert(QLatin1String("current_folder"), d->directory.toLatin1().append('\0'));
options.insert(QLatin1String("current_folder"), QFile::encodeName(d->directory).append('\0'));
if (!d->selectedFiles.isEmpty())
options.insert(QLatin1String("current_file"), d->selectedFiles.first().toLatin1().append('\0'));
options.insert(QLatin1String("current_file"), QFile::encodeName(d->selectedFiles.first()).append('\0'));
}
// Insert filters

View File

@ -63,7 +63,7 @@
Constructs a new QSignalSpy that listens for emissions of the \a signal
from the QObject \a object. If QSignalSpy is not able to listen for a
valid signal (for example, because \a object is null or \a signal does
valid signal (for example, because \a object is \nullptr or \a signal does
not denote a valid signal of \a object), an explanatory warning message
will be output using qWarning() and subsequent calls to \c isValid() will
return false.
@ -77,7 +77,7 @@
Constructs a new QSignalSpy that listens for emissions of the \a signal
from the QObject \a object. If QSignalSpy is not able to listen for a
valid signal (for example, because \a object is null or \a signal does
valid signal (for example, because \a object is \nullptr or \a signal does
not denote a valid signal of \a object), an explanatory warning message
will be output using qWarning() and subsequent calls to \c isValid() will
return false.

View File

@ -104,6 +104,7 @@ static QSet<QByteArray> keywords()
#endif
#ifdef Q_OS_OSX
<< "osx"
<< "macos"
#endif
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
<< "windows"

View File

@ -475,6 +475,8 @@ void QTestLog::addBXFail(const char *msg, const char *file, int line)
QTEST_ASSERT(msg);
QTEST_ASSERT(file);
++QTest::blacklists;
QTest::TestLoggers::addIncident(QAbstractTestLogger::BlacklistedXFail, msg, file, line);
}

View File

@ -43,6 +43,15 @@
#include <QRegExp>
#include <algorithm>
#ifdef Q_CC_MSVC
#define popen _popen
#define QT_POPEN_READ "rb"
#define pclose _pclose
#else
#define QT_POPEN_READ "r"
#endif
static const bool mustReadOutputAnyway = true; // pclose seems to return the wrong error code unless we read the output
void deleteRecursively(const QString &dirName)
@ -70,7 +79,7 @@ FILE *openProcess(const QString &command)
QString processedCommand = command;
#endif
return popen(processedCommand.toLocal8Bit().constData(), "r");
return popen(processedCommand.toLocal8Bit().constData(), QT_POPEN_READ);
}
struct QtDependency
@ -1252,7 +1261,7 @@ bool updateStringsXml(const Options &options)
fprintf(stderr, "Can't open %s for writing.\n", qPrintable(fileName));
return false;
}
file.write(QByteArray("<?xml version='1.0' encoding='utf-8'?><resources><string name=\"app_name\">")
file.write(QByteArray("<?xml version='1.0' encoding='utf-8'?><resources><string name=\"app_name\" translatable=\"false\">")
.append(QFileInfo(options.applicationBinary).baseName().mid(sizeof("lib") - 1).toLatin1())
.append("</string></resources>\n"));
return true;
@ -1721,7 +1730,7 @@ bool scanImports(Options *options, QSet<QString> *usedDependencies)
.arg(shellQuote(rootPath))
.arg(importPaths.join(QLatin1Char(' ')));
FILE *qmlImportScannerCommand = popen(qmlImportScanner.toLocal8Bit().constData(), "r");
FILE *qmlImportScannerCommand = popen(qmlImportScanner.toLocal8Bit().constData(), QT_POPEN_READ);
if (qmlImportScannerCommand == 0) {
fprintf(stderr, "Couldn't run qmlimportscanner.\n");
return false;
@ -2160,7 +2169,7 @@ bool createAndroidProject(const Options &options)
if (options.verbose)
fprintf(stdout, " -- Command: %s\n", qPrintable(androidTool));
FILE *androidToolCommand = popen(androidTool.toLocal8Bit().constData(), "r");
FILE *androidToolCommand = popen(androidTool.toLocal8Bit().constData(), QT_POPEN_READ);
if (androidToolCommand == 0) {
fprintf(stderr, "Cannot run command '%s'\n", qPrintable(androidTool));
return false;

View File

@ -2129,8 +2129,8 @@ QString QFileDialog::labelText(DialogLabel label) const
\snippet code/src_gui_dialogs_qfiledialog.cpp 8
The function creates a modal file dialog with the given \a parent widget.
If \a parent is not 0, the dialog will be shown centered over the parent
widget.
If \a parent is not \nullptr, the dialog will be shown centered over the
parent widget.
The file dialog's working directory will be set to \a dir. If \a dir
includes a file name, the file will be selected. Only files that match the
@ -2152,8 +2152,8 @@ QString QFileDialog::labelText(DialogLabel label) const
native file dialog and not a QFileDialog.
On Windows the dialog will spin a blocking modal event loop that will not
dispatch any QTimers, and if \a parent is not 0 then it will position the
dialog just below the parent's title bar.
dispatch any QTimers, and if \a parent is not \nullptr then it will position
the dialog just below the parent's title bar.
On Unix/X11, the normal behavior of the file dialog is to resolve and
follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
@ -2242,8 +2242,8 @@ QUrl QFileDialog::getOpenFileUrl(QWidget *parent,
\snippet code/src_gui_dialogs_qfiledialog.cpp 9
This function creates a modal file dialog with the given \a parent widget.
If \a parent is not 0, the dialog will be shown centered over the parent
widget.
If \a parent is not \nullptr, the dialog will be shown centered over the
parent widget.
The file dialog's working directory will be set to \a dir. If \a dir
includes a file name, the file will be selected. The filter is set to
@ -2261,8 +2261,8 @@ QUrl QFileDialog::getOpenFileUrl(QWidget *parent,
native file dialog and not a QFileDialog.
On Windows the dialog will spin a blocking modal event loop that will not
dispatch any QTimers, and if \a parent is not 0 then it will position the
dialog just below the parent's title bar.
dispatch any QTimers, and if \a parent is not \nullptr then it will position
the dialog just below the parent's title bar.
On Unix/X11, the normal behavior of the file dialog is to resolve and
follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
@ -2434,8 +2434,8 @@ void QFileDialog::getOpenFileContent(const QString &nameFilter, const std::funct
by the user. The file does not have to exist.
It creates a modal file dialog with the given \a parent widget. If
\a parent is not 0, the dialog will be shown centered over the parent
widget.
\a parent is not \nullptr, the dialog will be shown centered over the
parent widget.
\snippet code/src_gui_dialogs_qfiledialog.cpp 11
@ -2461,9 +2461,9 @@ void QFileDialog::getOpenFileContent(const QString &nameFilter, const std::funct
native file dialog and not a QFileDialog.
On Windows the dialog will spin a blocking modal event loop that will not
dispatch any QTimers, and if \a parent is not 0 then it will position the
dialog just below the parent's title bar. On \macos, with its native file
dialog, the filter argument is ignored.
dispatch any QTimers, and if \a parent is not \nullptr then it will
position the dialog just below the parent's title bar. On \macos, with its
native file dialog, the filter argument is ignored.
On Unix/X11, the normal behavior of the file dialog is to resolve and
follow symlinks. For example, if \c{/usr/tmp} is a symlink to \c{/var/tmp},
@ -2553,8 +2553,8 @@ QUrl QFileDialog::getSaveFileUrl(QWidget *parent,
\snippet code/src_gui_dialogs_qfiledialog.cpp 12
This function creates a modal file dialog with the given \a parent widget.
If \a parent is not 0, the dialog will be shown centered over the parent
widget.
If \a parent is not \nullptr, the dialog will be shown centered over the
parent widget.
The dialog's working directory is set to \a dir, and the caption is set to
\a caption. Either of these may be an empty string in which case the
@ -2578,8 +2578,8 @@ QUrl QFileDialog::getSaveFileUrl(QWidget *parent,
symlinks as regular directories.
On Windows, the dialog will spin a blocking modal event loop that will not
dispatch any QTimers, and if \a parent is not 0 then it will position the
dialog just below the parent's title bar.
dispatch any QTimers, and if \a parent is not \nullptr then it will position
the dialog just below the parent's title bar.
\warning Do not delete \a parent during the execution of the dialog. If you
want to do this, you should create the dialog yourself using one of the

View File

@ -109,7 +109,7 @@ static int menuBarHeightForWidth(QWidget *menubar, int w)
/*!
Constructs a new top-level QLayout, with parent \a parent.
\a parent may not be a \c nullptr.
\a parent may not be a \nullptr.
The layout is set directly as the top-level layout for
\a parent. There can be only one top-level layout for a

View File

@ -102,9 +102,9 @@ QT_BEGIN_NAMESPACE
/*!
Constructs a QUndoCommand object with the given \a parent and \a text.
If \a parent is not 0, this command is appended to parent's child list.
The parent command then owns this command and will delete it in its
destructor.
If \a parent is not \nullptr, this command is appended to parent's
child list. The parent command then owns this command and will delete
it in its destructor.
\sa ~QUndoCommand()
*/
@ -118,9 +118,9 @@ QUndoCommand::QUndoCommand(const QString &text, QUndoCommand *parent)
/*!
Constructs a QUndoCommand object with parent \a parent.
If \a parent is not 0, this command is appended to parent's child list.
The parent command then owns this command and will delete it in its
destructor.
If \a parent is not \nullptr, this command is appended to parent's
child list. The parent command then owns this command and will delete
it in its destructor.
\sa ~QUndoCommand()
*/

View File

@ -1092,6 +1092,7 @@ void QDateTimeEdit::keyPressEvent(QKeyEvent *event)
d->setSelected(d->currentSectionIndex, true);
event->ignore();
emit editingFinished();
emit d->edit->returnPressed();
return;
default:
#ifdef QT_KEYPAD_NAVIGATION

View File

@ -1232,7 +1232,7 @@ QSplitterHandle *QSplitter::createHandle()
/*!
Returns the handle to the left of (or above) the item in the
splitter's layout at the given \a index, or \c nullptr if there is no such item.
splitter's layout at the given \a index, or \nullptr if there is no such item.
The handle at index 0 is always hidden.
For right-to-left languages such as Arabic and Hebrew, the layout
@ -1251,7 +1251,7 @@ QSplitterHandle *QSplitter::handle(int index) const
/*!
Returns the widget at the given \a index in the splitter's layout,
or \c nullptr if there is no such widget.
or \nullptr if there is no such widget.
\sa count(), handle(), indexOf(), insertWidget()
*/

View File

@ -2613,8 +2613,9 @@ void QXmlSimpleReaderPrivate::initIncrementalParsing()
is returned. If no such feature exists the return value is
undefined.
If \a ok is not 0: \c{*}\a{ok} is set to true if the reader has the
feature called \a name; otherwise \c{*}\a{ok} is set to false.
If \a ok is not \nullptr: \c{*}\a{ok} is set to true if the
reader has the feature called \a name; otherwise \c{*}\a{ok} is
set to false.
\sa setFeature(), hasFeature()
*/
@ -2643,7 +2644,7 @@ void QXmlSimpleReaderPrivate::initIncrementalParsing()
If the reader has the property \a name, this function returns the
value of the property; otherwise the return value is undefined.
If \a ok is not 0: if the reader has the \a name property
If \a ok is not \nullptr: if the reader has the \a name property
\c{*}\a{ok} is set to true; otherwise \c{*}\a{ok} is set to false.
\sa setProperty(), hasProperty()

View File

@ -431,6 +431,13 @@ void Http2Server::readReady()
if (connectionError)
return;
if (redirectSent) {
// We are a "single shot" server, working in 'h2' mode,
// responding with a redirect code. Don't bother to handle
// anything else now.
return;
}
if (upgradeProtocol) {
handleProtocolUpgrade();
} else if (waitingClientPreface) {
@ -800,6 +807,13 @@ void Http2Server::sendResponse(quint32 streamID, bool emptyBody)
HttpHeader header;
if (redirectWhileReading) {
if (redirectSent) {
// This is a "single-shot" server responding with a redirect code.
return;
}
redirectSent = true;
qDebug("server received HEADERS frame (followed by DATA frames), redirecting ...");
Q_ASSERT(targetPort);
header.push_back({":status", "308"});

View File

@ -193,6 +193,7 @@ private:
// Redirect, with status code 308, as soon as we've seen headers, while client
// may still be sending DATA frames. See tst_Http2::earlyResponse().
bool redirectWhileReading = false;
bool redirectSent = false;
quint16 targetPort = 0;
QAtomicInt interrupted;
protected slots:

View File

@ -474,7 +474,7 @@ void tst_Http2::earlyResponse()
runEventLoop();
QVERIFY(serverPort);
sendRequest(1, QNetworkRequest::NormalPriority, {10000000, Qt::Uninitialized});
sendRequest(1, QNetworkRequest::NormalPriority, {1000000, Qt::Uninitialized});
runEventLoop();

View File

@ -1640,15 +1640,14 @@ void tst_QUdpSocket::linkLocalIPv6()
sockets << s;
}
QUdpSocket neutral;
QVERIFY(neutral.bind(QHostAddress(QHostAddress::AnyIPv6)));
QSignalSpy neutralReadSpy(&neutral, SIGNAL(readyRead()));
QByteArray testData("hello");
foreach (QUdpSocket *s, sockets) {
QUdpSocket neutral;
QVERIFY(neutral.bind(QHostAddress(QHostAddress::AnyIPv6)));
QSignalSpy neutralReadSpy(&neutral, SIGNAL(readyRead()));
QSignalSpy spy(s, SIGNAL(readyRead()));
neutralReadSpy.clear();
QVERIFY(s->writeDatagram(testData, s->localAddress(), neutral.localPort()));
QTRY_VERIFY(neutralReadSpy.count() > 0); //note may need to accept a firewall prompt

View File

@ -913,7 +913,7 @@ void tst_QSqlDatabase::recordMySQL()
FieldDef("date", QVariant::Date, QDate::currentDate()),
FieldDef("datetime", QVariant::DateTime, dt),
FieldDef("timestamp", QVariant::DateTime, dt, false),
FieldDef("time", QVariant::Time, dt.time()),
FieldDef("time", QVariant::String, dt.time()),
FieldDef("year", QVariant::Int, 2003),
FieldDef("char(20)", QVariant::String, "Blah"),
FieldDef("varchar(20)", QVariant::String, "BlahBlah"),

View File

@ -1,8 +1,8 @@
TEMPLATE=subdirs
SUBDIRS=\
qtHaveModule(widgets): SUBDIRS = \
qsqlquerymodel \
qsqlrelationaltablemodel \
qsqlrelationaldelegate
SUBDIRS += qsqlrelationaltablemodel \
qsqltablemodel \
!qtHaveModule(widgets): SUBDIRS -= \
qsqlquerymodel

View File

@ -158,12 +158,13 @@ void tst_QSqlRelationalDelegate::comboBoxEditor()
QTest::keyClick(editor, Qt::Key_Down);
QTest::keyClick(editor, Qt::Key_Enter);
QCOMPARE(editor->currentText(), "mister");
QTest::keyClick(tv.viewport(), Qt::Key_Tab);
QVERIFY_SQL(model, submitAll());
QSqlQuery qry(db);
QVERIFY_SQL(qry, exec("SELECT title_key FROM " + reltest1 + " WHERE id=1"));
QVERIFY(qry.next());
QCOMPARE(qry.value(0).toString(), "mister");
QCOMPARE(qry.value(0).toString(), "2");
}
QTEST_MAIN(tst_QSqlRelationalDelegate)

View File

@ -0,0 +1,11 @@
winrt
[sort:QFileDialog usage]
ubuntu
b2qt
[specialFiles]
ubuntu
b2qt
[dirsBeforeFiles]
ubuntu
b2qt
windows

View File

@ -1,3 +1,6 @@
INCLUDEPATH += ../../../../shared
HEADERS += ../../../../shared/emulationdetector.h
CONFIG += testcase
# This testcase can be slow on Windows and OS X, and may interfere with other file system tests.
win32:testcase.timeout = 900
@ -8,5 +11,3 @@ QT += core-private testlib
SOURCES += tst_qfilesystemmodel.cpp
TARGET = tst_qfilesystemmodel
CONFIG += insignificant_test # QTBUG-29403

View File

@ -27,6 +27,7 @@
****************************************************************************/
#include <emulationdetector.h>
#include <QtTest/QtTest>
#ifdef QT_BUILD_INTERNAL
#include <private/qfilesystemmodel_p.h>
@ -788,6 +789,9 @@ void tst_QFileSystemModel::sort()
MyFriendFileSystemModel *myModel = new MyFriendFileSystemModel();
QTreeView *tree = new QTreeView();
if (fileDialogMode && EmulationDetector::isRunningArmOnX86())
QSKIP("Crashes in QEMU. QTBUG-70572");
#ifdef QT_BUILD_INTERNAL
if (fileDialogMode)
myModel->d_func()->disableRecursiveSort = true;