summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dist/changes-5.12.483
-rw-r--r--examples/widgets/doc/src/classwizard.qdoc2
-rw-r--r--mkspecs/features/ltcg.prf9
-rw-r--r--mkspecs/features/qt_module_headers.prf4
-rw-r--r--src/3rdparty/angle/src/libEGL/libEGL_mingw32.def142
-rw-r--r--src/3rdparty/angle/src/libEGL/libEGLd_mingw32.def142
-rw-r--r--src/3rdparty/angle/src/libGLESv2/libGLESv2_mingw32.def805
-rw-r--r--src/3rdparty/angle/src/libGLESv2/libGLESv2d_mingw32.def805
-rw-r--r--src/concurrent/qtconcurrentrun.cpp16
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp4
-rw-r--r--src/corelib/thread/qfuture.qdoc8
-rw-r--r--src/corelib/thread/qfuturewatcher.cpp10
-rw-r--r--src/corelib/thread/qthread_unix.cpp6
-rw-r--r--src/gui/accessible/qaccessible.cpp1
-rw-r--r--src/gui/accessible/qaccessible.h1
-rw-r--r--src/gui/image/qimagereader.cpp10
-rw-r--r--src/gui/kernel/qhighdpiscaling.cpp2
-rw-r--r--src/gui/kernel/qhighdpiscaling_p.h264
-rw-r--r--src/gui/math3d/qvector3d.cpp2
-rw-r--r--src/gui/painting/qdrawhelper.cpp37
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp50
-rw-r--r--src/gui/painting/qstroker.cpp2
-rw-r--r--src/network/bearer/qnetworkconfigmanager.cpp27
-rw-r--r--src/network/bearer/qnetworksession.cpp3
-rw-r--r--src/platformsupport/linuxaccessibility/bridge.cpp2
-rw-r--r--src/plugins/bearer/qnetworksession_impl.cpp13
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.cpp739
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.h6
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.mm24
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm31
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm20
-rw-r--r--src/plugins/platforms/ios/quiview_accessibility.mm8
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp5
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp6
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h1
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h4
-rw-r--r--src/plugins/styles/mac/qmacstyle_mac.mm11
-rw-r--r--src/widgets/styles/qstylesheetstyle.cpp54
-rw-r--r--tests/auto/gui/image/qimagereader/images/qticon16.pngbin0 -> 1884 bytes
-rw-r--r--tests/auto/gui/image/qimagereader/images/qticon16@2x.pngbin0 -> 3187 bytes
-rw-r--r--tests/auto/gui/image/qimagereader/images/qticon16@3x.pngbin0 -> 5307 bytes
-rw-r--r--tests/auto/gui/image/qimagereader/tst_qimagereader.cpp25
-rw-r--r--tests/auto/network/access/qftp/tst_qftp.cpp4
-rw-r--r--tests/auto/other/lancelot/scripts/degeneratebeziers.qps11
46 files changed, 1848 insertions, 1553 deletions
diff --git a/dist/changes-5.12.4 b/dist/changes-5.12.4
new file mode 100644
index 0000000000..781e9766b9
--- /dev/null
+++ b/dist/changes-5.12.4
@@ -0,0 +1,83 @@
+Qt 5.12.4 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.12.0 through 5.12.3.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+https://doc.qt.io/qt-5/index.html
+
+The Qt version 5.12 series is binary compatible with the 5.11.x series.
+Applications compiled for 5.11 will continue to run with 5.12.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* Platform Specific Changes *
+****************************************************************************
+
+ - X11 / XCB:
+ * [QTBUG-45375] QTabletEvent coordinates now come from AbsX/AbsY
+ valuators in the X11 event, in more precise 32.32 fixed-point format,
+ scaled to fit the virtual desktop. It's possible to revert to using
+ the legacy 16.16-format event_x/event_y coordinates as in previous
+ releases by setting the QT_XCB_TABLET_LEGACY_COORDINATES environment
+ variable.
+
+****************************************************************************
+* QtCore *
+****************************************************************************
+
+ - Global:
+ * [QTBUG-72073] Added the QT_NO_FLOAT16_OPERATORS macro in order to work
+ around a Microsoft <= VS2017 compiler bug that is exposed when using
+ std::bitset along with any Qt header that includes <qfloat16.h>.
+
+ - QDeadlineTimer:
+ * [QTBUG-69750] Fixed integer overflows leading to immediate timeouts.
+
+ - QFile:
+ * Made QFile::copy() issue a filesystem-synchronization system call,
+ which would make it less likely to result in incomplete or corrupt
+ files if the system reboots or uncleanly shuts down soon after the
+ function returns. New code is advised to use QSaveFile instead, which
+ also allows to display a progress report while copying.
+
+ - QFileInfo:
+ * [QTBUG-63970][QTBUG-30401][QTBUG-20791] Fixed resolving of symbolic
+ links to UNC shares on NTFS file systems.
+
+ - QMetaObject:
+ * Non-copyable lambdas can now be used with invokeMethod(). For
+ consistency reasons, the functor object is now always moved.
+
+****************************************************************************
+* QtGui *
+****************************************************************************
+
+ - [QTBUG-73231] QWindow::mapToGlobal()/mapFromGlobal() now handle windows
+ spanning screens correctly.
+
+ - [QTBUG-75522] QBezier: Fix possible endless loop when stroking curves
+
+****************************************************************************
+* QtWidgets *
+****************************************************************************
+
+ - QMenu:
+ * Shortcuts are again shown by default in context menus, except on
+ macOS. They can be forced off by setting
+ AA_DontShowShortcutsInContextMenus to true.
+
+****************************************************************************
+* Third-Party Code *
+****************************************************************************
+
+ - libpng was updated to version 1.6.37
+ - Updated QLocale to CLDR v35.1
+ - Updated bundled SQLite to version 3.28.0
diff --git a/examples/widgets/doc/src/classwizard.qdoc b/examples/widgets/doc/src/classwizard.qdoc
index 6977cf5efa..7f3693b65e 100644
--- a/examples/widgets/doc/src/classwizard.qdoc
+++ b/examples/widgets/doc/src/classwizard.qdoc
@@ -30,7 +30,7 @@
\title Class Wizard Example
\ingroup examples-dialogs
- \brief The License Wizard example shows how to implement linear
+ \brief The Class Wizard example shows how to implement linear
wizards using QWizard.
\image classwizard.png Screenshot of the Class Wizard example
diff --git a/mkspecs/features/ltcg.prf b/mkspecs/features/ltcg.prf
index ccf0226272..f2dbc6fa9e 100644
--- a/mkspecs/features/ltcg.prf
+++ b/mkspecs/features/ltcg.prf
@@ -28,7 +28,10 @@ CONFIG(release, debug|release) {
}
load(link_ltcg)
- QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG
- QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG
- QMAKE_LFLAGS *= $$QMAKE_LFLAGS_LTCG
+ QMAKE_CFLAGS -= $$QMAKE_CFLAGS_LTCG
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_LTCG
+ QMAKE_CXXFLAGS -= $$QMAKE_CXXFLAGS_LTCG
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_LTCG
+ QMAKE_LFLAGS -= $$QMAKE_LFLAGS_LTCG
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS_LTCG
}
diff --git a/mkspecs/features/qt_module_headers.prf b/mkspecs/features/qt_module_headers.prf
index 37b69e31c8..899a40103a 100644
--- a/mkspecs/features/qt_module_headers.prf
+++ b/mkspecs/features/qt_module_headers.prf
@@ -272,7 +272,7 @@ headersclean:!internal_module {
hcleanFLAGS += -std=c++98
}
- hcleanCOMMAND = $$QMAKE_CXX -c $(CXXFLAGS) $$hcleanFLAGS $(INCPATH) $$hcleanDEFS -xc++ ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+ hcleanCOMMAND = $(CXX) -c $(CXXFLAGS) $$hcleanFLAGS $(INCPATH) $$hcleanDEFS -xc++ ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
} else: msvc:!intel_icl {
# 4180: qualifier applied to function type has no meaning; ignored
# 4458: declaration of 'identifier' hides class member
@@ -284,7 +284,7 @@ headersclean:!internal_module {
# 4577: 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc
greaterThan(QMAKE_MSC_VER, 18): hcleanFLAGS += -wd4577
- hcleanCOMMAND = $$QMAKE_CXX -c $(CXXFLAGS) $$hcleanFLAGS $(INCPATH) $$hcleanDEFS -FI${QMAKE_FILE_IN} -Fo${QMAKE_FILE_OUT} \
+ hcleanCOMMAND = $(CXX) -c $(CXXFLAGS) $$hcleanFLAGS $(INCPATH) $$hcleanDEFS -FI${QMAKE_FILE_IN} -Fo${QMAKE_FILE_OUT} \
$$[QT_INSTALL_DATA/src]/mkspecs/features/data/dummy.cpp
}
diff --git a/src/3rdparty/angle/src/libEGL/libEGL_mingw32.def b/src/3rdparty/angle/src/libEGL/libEGL_mingw32.def
index e68d27295e..14eb331b3a 100644
--- a/src/3rdparty/angle/src/libEGL/libEGL_mingw32.def
+++ b/src/3rdparty/angle/src/libEGL/libEGL_mingw32.def
@@ -1,77 +1,77 @@
LIBRARY libEGL
EXPORTS
- eglBindAPI @14
- eglBindTexImage @20
- eglChooseConfig @7
- eglCopyBuffers @33
- eglCreateContext @23
- eglCreatePbufferFromClientBuffer @18
- eglCreatePbufferSurface @10
- eglCreatePixmapSurface @11
- eglCreateWindowSurface @9
- eglDestroyContext @24
- eglDestroySurface @12
- eglGetConfigAttrib @8
- eglGetConfigs @6
- eglGetCurrentContext @26
- eglGetCurrentDisplay @28
- eglGetCurrentSurface @27
- eglGetDisplay @2
- eglGetError @1
- eglGetProcAddress @34
- eglInitialize @3
- eglMakeCurrent @25
- eglQueryAPI @15
- eglQueryContext @29
- eglQueryString @5
- eglQuerySurface @13
- eglReleaseTexImage @21
- eglReleaseThread @17
- eglSurfaceAttrib @19
- eglSwapBuffers @32
- eglSwapInterval @22
- eglTerminate @4
- eglWaitClient @16
- eglWaitGL @30
- eglWaitNative @31
+ eglBindAPI@4 @14
+ eglBindTexImage@12 @20
+ eglChooseConfig@20 @7
+ eglCopyBuffers@12 @33
+ eglCreateContext@16 @23
+ eglCreatePbufferFromClientBuffer@20 @18
+ eglCreatePbufferSurface@12 @10
+ eglCreatePixmapSurface@16 @11
+ eglCreateWindowSurface@16 @9
+ eglDestroyContext@8 @24
+ eglDestroySurface@8 @12
+ eglGetConfigAttrib@16 @8
+ eglGetConfigs@16 @6
+ eglGetCurrentContext@0 @26
+ eglGetCurrentDisplay@0 @28
+ eglGetCurrentSurface@4 @27
+ eglGetDisplay@4 @2
+ eglGetError@0 @1
+ eglGetProcAddress@4 @34
+ eglInitialize@12 @3
+ eglMakeCurrent@16 @25
+ eglQueryAPI@0 @15
+ eglQueryContext@16 @29
+ eglQueryString@8 @5
+ eglQuerySurface@16 @13
+ eglReleaseTexImage@12 @21
+ eglReleaseThread@0 @17
+ eglSurfaceAttrib@16 @19
+ eglSwapBuffers@8 @32
+ eglSwapInterval@8 @22
+ eglTerminate@4 @4
+ eglWaitClient@0 @16
+ eglWaitGL@0 @30
+ eglWaitNative@4 @31
; Extensions
- eglGetPlatformDisplayEXT @35
- eglQuerySurfacePointerANGLE @36
- eglPostSubBufferNV @37
- eglQueryDisplayAttribEXT @48
- eglQueryDeviceAttribEXT @49
- eglQueryDeviceStringEXT @50
- eglCreateImageKHR @51
- eglDestroyImageKHR @52
- eglCreateDeviceANGLE @53
- eglReleaseDeviceANGLE @54
- eglCreateStreamKHR @55
- eglDestroyStreamKHR @56
- eglStreamAttribKHR @57
- eglQueryStreamKHR @58
- eglQueryStreamu64KHR @59
- eglStreamConsumerGLTextureExternalKHR @60
- eglStreamConsumerAcquireKHR @61
- eglStreamConsumerReleaseKHR @62
- eglStreamConsumerGLTextureExternalAttribsNV @63
- eglCreateStreamProducerD3DTextureNV12ANGLE @64
- eglStreamPostD3DTextureNV12ANGLE @65
- eglGetSyncValuesCHROMIUM @66
- eglSwapBuffersWithDamageEXT @67
- eglProgramCacheGetAttribANGLE @68
- eglProgramCachePopulateANGLE @69
- eglProgramCacheQueryANGLE @70
- eglProgramCacheResizeANGLE @71
+ eglGetPlatformDisplayEXT@12 @35
+ eglQuerySurfacePointerANGLE@16 @36
+ eglPostSubBufferNV@24 @37
+ eglQueryDisplayAttribEXT@12 @48
+ eglQueryDeviceAttribEXT@12 @49
+ eglQueryDeviceStringEXT@8 @50
+ eglCreateImageKHR@20 @51
+ eglDestroyImageKHR@8 @52
+ eglCreateDeviceANGLE@12 @53
+ eglReleaseDeviceANGLE@4 @54
+ eglCreateStreamKHR@8 @55
+ eglDestroyStreamKHR@8 @56
+ eglStreamAttribKHR@16 @57
+ eglQueryStreamKHR@16 @58
+ eglQueryStreamu64KHR@16 @59
+ eglStreamConsumerGLTextureExternalKHR@8 @60
+ eglStreamConsumerAcquireKHR@8 @61
+ eglStreamConsumerReleaseKHR@8 @62
+ eglStreamConsumerGLTextureExternalAttribsNV@12 @63
+ eglCreateStreamProducerD3DTextureNV12ANGLE@12 @64
+ eglStreamPostD3DTextureNV12ANGLE@16 @65
+ eglGetSyncValuesCHROMIUM@20 @66
+ eglSwapBuffersWithDamageEXT@16 @67
+ eglProgramCacheGetAttribANGLE@8 @68
+ eglProgramCachePopulateANGLE@20 @69
+ eglProgramCacheQueryANGLE@24 @70
+ eglProgramCacheResizeANGLE@12 @71
; 1.5 entry points
- eglCreateSync @38
- eglDestroySync @39
- eglClientWaitSync @40
- eglGetSyncAttrib @41
- eglCreateImage @42
- eglDestroyImage @43
- eglGetPlatformDisplay @44
- eglCreatePlatformWindowSurface @45
- eglCreatePlatformPixmapSurface @46
- eglWaitSync @47
+ eglCreateSync@12 @38
+ eglDestroySync@8 @39
+ eglClientWaitSync@20 @40
+ eglGetSyncAttrib@16 @41
+ eglCreateImage@20 @42
+ eglDestroyImage@8 @43
+ eglGetPlatformDisplay@12 @44
+ eglCreatePlatformWindowSurface@16 @45
+ eglCreatePlatformPixmapSurface@16 @46
+ eglWaitSync@12 @47
diff --git a/src/3rdparty/angle/src/libEGL/libEGLd_mingw32.def b/src/3rdparty/angle/src/libEGL/libEGLd_mingw32.def
index e68d27295e..14eb331b3a 100644
--- a/src/3rdparty/angle/src/libEGL/libEGLd_mingw32.def
+++ b/src/3rdparty/angle/src/libEGL/libEGLd_mingw32.def
@@ -1,77 +1,77 @@
LIBRARY libEGL
EXPORTS
- eglBindAPI @14
- eglBindTexImage @20
- eglChooseConfig @7
- eglCopyBuffers @33
- eglCreateContext @23
- eglCreatePbufferFromClientBuffer @18
- eglCreatePbufferSurface @10
- eglCreatePixmapSurface @11
- eglCreateWindowSurface @9
- eglDestroyContext @24
- eglDestroySurface @12
- eglGetConfigAttrib @8
- eglGetConfigs @6
- eglGetCurrentContext @26
- eglGetCurrentDisplay @28
- eglGetCurrentSurface @27
- eglGetDisplay @2
- eglGetError @1
- eglGetProcAddress @34
- eglInitialize @3
- eglMakeCurrent @25
- eglQueryAPI @15
- eglQueryContext @29
- eglQueryString @5
- eglQuerySurface @13
- eglReleaseTexImage @21
- eglReleaseThread @17
- eglSurfaceAttrib @19
- eglSwapBuffers @32
- eglSwapInterval @22
- eglTerminate @4
- eglWaitClient @16
- eglWaitGL @30
- eglWaitNative @31
+ eglBindAPI@4 @14
+ eglBindTexImage@12 @20
+ eglChooseConfig@20 @7
+ eglCopyBuffers@12 @33
+ eglCreateContext@16 @23
+ eglCreatePbufferFromClientBuffer@20 @18
+ eglCreatePbufferSurface@12 @10
+ eglCreatePixmapSurface@16 @11
+ eglCreateWindowSurface@16 @9
+ eglDestroyContext@8 @24
+ eglDestroySurface@8 @12
+ eglGetConfigAttrib@16 @8
+ eglGetConfigs@16 @6
+ eglGetCurrentContext@0 @26
+ eglGetCurrentDisplay@0 @28
+ eglGetCurrentSurface@4 @27
+ eglGetDisplay@4 @2
+ eglGetError@0 @1
+ eglGetProcAddress@4 @34
+ eglInitialize@12 @3
+ eglMakeCurrent@16 @25
+ eglQueryAPI@0 @15
+ eglQueryContext@16 @29
+ eglQueryString@8 @5
+ eglQuerySurface@16 @13
+ eglReleaseTexImage@12 @21
+ eglReleaseThread@0 @17
+ eglSurfaceAttrib@16 @19
+ eglSwapBuffers@8 @32
+ eglSwapInterval@8 @22
+ eglTerminate@4 @4
+ eglWaitClient@0 @16
+ eglWaitGL@0 @30
+ eglWaitNative@4 @31
; Extensions
- eglGetPlatformDisplayEXT @35
- eglQuerySurfacePointerANGLE @36
- eglPostSubBufferNV @37
- eglQueryDisplayAttribEXT @48
- eglQueryDeviceAttribEXT @49
- eglQueryDeviceStringEXT @50
- eglCreateImageKHR @51
- eglDestroyImageKHR @52
- eglCreateDeviceANGLE @53
- eglReleaseDeviceANGLE @54
- eglCreateStreamKHR @55
- eglDestroyStreamKHR @56
- eglStreamAttribKHR @57
- eglQueryStreamKHR @58
- eglQueryStreamu64KHR @59
- eglStreamConsumerGLTextureExternalKHR @60
- eglStreamConsumerAcquireKHR @61
- eglStreamConsumerReleaseKHR @62
- eglStreamConsumerGLTextureExternalAttribsNV @63
- eglCreateStreamProducerD3DTextureNV12ANGLE @64
- eglStreamPostD3DTextureNV12ANGLE @65
- eglGetSyncValuesCHROMIUM @66
- eglSwapBuffersWithDamageEXT @67
- eglProgramCacheGetAttribANGLE @68
- eglProgramCachePopulateANGLE @69
- eglProgramCacheQueryANGLE @70
- eglProgramCacheResizeANGLE @71
+ eglGetPlatformDisplayEXT@12 @35
+ eglQuerySurfacePointerANGLE@16 @36
+ eglPostSubBufferNV@24 @37
+ eglQueryDisplayAttribEXT@12 @48
+ eglQueryDeviceAttribEXT@12 @49
+ eglQueryDeviceStringEXT@8 @50
+ eglCreateImageKHR@20 @51
+ eglDestroyImageKHR@8 @52
+ eglCreateDeviceANGLE@12 @53
+ eglReleaseDeviceANGLE@4 @54
+ eglCreateStreamKHR@8 @55
+ eglDestroyStreamKHR@8 @56
+ eglStreamAttribKHR@16 @57
+ eglQueryStreamKHR@16 @58
+ eglQueryStreamu64KHR@16 @59
+ eglStreamConsumerGLTextureExternalKHR@8 @60
+ eglStreamConsumerAcquireKHR@8 @61
+ eglStreamConsumerReleaseKHR@8 @62
+ eglStreamConsumerGLTextureExternalAttribsNV@12 @63
+ eglCreateStreamProducerD3DTextureNV12ANGLE@12 @64
+ eglStreamPostD3DTextureNV12ANGLE@16 @65
+ eglGetSyncValuesCHROMIUM@20 @66
+ eglSwapBuffersWithDamageEXT@16 @67
+ eglProgramCacheGetAttribANGLE@8 @68
+ eglProgramCachePopulateANGLE@20 @69
+ eglProgramCacheQueryANGLE@24 @70
+ eglProgramCacheResizeANGLE@12 @71
; 1.5 entry points
- eglCreateSync @38
- eglDestroySync @39
- eglClientWaitSync @40
- eglGetSyncAttrib @41
- eglCreateImage @42
- eglDestroyImage @43
- eglGetPlatformDisplay @44
- eglCreatePlatformWindowSurface @45
- eglCreatePlatformPixmapSurface @46
- eglWaitSync @47
+ eglCreateSync@12 @38
+ eglDestroySync@8 @39
+ eglClientWaitSync@20 @40
+ eglGetSyncAttrib@16 @41
+ eglCreateImage@20 @42
+ eglDestroyImage@8 @43
+ eglGetPlatformDisplay@12 @44
+ eglCreatePlatformWindowSurface@16 @45
+ eglCreatePlatformPixmapSurface@16 @46
+ eglWaitSync@12 @47
diff --git a/src/3rdparty/angle/src/libGLESv2/libGLESv2_mingw32.def b/src/3rdparty/angle/src/libGLESv2/libGLESv2_mingw32.def
index 2ff4cc0579..a182c21a05 100644
--- a/src/3rdparty/angle/src/libGLESv2/libGLESv2_mingw32.def
+++ b/src/3rdparty/angle/src/libGLESv2/libGLESv2_mingw32.def
@@ -1,412 +1,411 @@
LIBRARY libGLESv2
EXPORTS
- glActiveTexture @1
- glAttachShader @2
- glBindAttribLocation @3
- glBindBuffer @4
- glBindFramebuffer @5
- glBindRenderbuffer @6
- glBindTexture @7
- glBlendColor @8
- glBlendEquation @9
- glBlendEquationSeparate @10
- glBlendFunc @11
- glBlendFuncSeparate @12
- glBufferData @13
- glBufferSubData @14
- glCheckFramebufferStatus @15
- glClear @16
- glClearColor @17
- glClearDepthf @18
- glClearStencil @19
- glColorMask @20
- glCompileShader @21
- glCompressedTexImage2D @22
- glCompressedTexSubImage2D @23
- glCopyTexImage2D @24
- glCopyTexSubImage2D @25
- glCreateProgram @26
- glCreateShader @27
- glCullFace @28
- glDeleteBuffers @29
- glDeleteFramebuffers @30
- glDeleteProgram @32
- glDeleteRenderbuffers @33
- glDeleteShader @34
- glDeleteTextures @31
- glDepthFunc @36
- glDepthMask @37
- glDepthRangef @38
- glDetachShader @35
- glDisable @39
- glDisableVertexAttribArray @40
- glDrawArrays @41
- glDrawElements @42
- glEnable @43
- glEnableVertexAttribArray @44
- glFinish @45
- glFlush @46
- glFramebufferRenderbuffer @47
- glFramebufferTexture2D @48
- glFrontFace @49
- glGenBuffers @50
- glGenFramebuffers @52
- glGenRenderbuffers @53
- glGenTextures @54
- glGenerateMipmap @51
- glGetActiveAttrib @55
- glGetActiveUniform @56
- glGetAttachedShaders @57
- glGetAttribLocation @58
- glGetBooleanv @59
- glGetBufferParameteriv @60
- glGetError @61
- glGetFloatv @62
- glGetFramebufferAttachmentParameteriv @63
- glGetIntegerv @64
- glGetProgramInfoLog @66
- glGetProgramiv @65
- glGetRenderbufferParameteriv @67
- glGetShaderInfoLog @69
- glGetShaderPrecisionFormat @70
- glGetShaderSource @71
- glGetShaderiv @68
- glGetString @72
- glGetTexParameterfv @73
- glGetTexParameteriv @74
- glGetUniformLocation @77
- glGetUniformfv @75
- glGetUniformiv @76
- glGetVertexAttribPointerv @80
- glGetVertexAttribfv @78
- glGetVertexAttribiv @79
- glHint @81
- glIsBuffer @82
- glIsEnabled @83
- glIsFramebuffer @84
- glIsProgram @85
- glIsRenderbuffer @86
- glIsShader @87
- glIsTexture @88
- glLineWidth @89
- glLinkProgram @90
- glPixelStorei @91
- glPolygonOffset @92
- glReadPixels @93
- glReleaseShaderCompiler @94
- glRenderbufferStorage @95
- glSampleCoverage @96
- glScissor @97
- glShaderBinary @98
- glShaderSource @99
- glStencilFunc @100
- glStencilFuncSeparate @101
- glStencilMask @102
- glStencilMaskSeparate @103
- glStencilOp @104
- glStencilOpSeparate @105
- glTexImage2D @106
- glTexParameterf @107
- glTexParameterfv @108
- glTexParameteri @109
- glTexParameteriv @110
- glTexSubImage2D @111
- glUniform1f @112
- glUniform1fv @113
- glUniform1i @114
- glUniform1iv @115
- glUniform2f @116
- glUniform2fv @117
- glUniform2i @118
- glUniform2iv @119
- glUniform3f @120
- glUniform3fv @121
- glUniform3i @122
- glUniform3iv @123
- glUniform4f @124
- glUniform4fv @125
- glUniform4i @126
- glUniform4iv @127
- glUniformMatrix2fv @128
- glUniformMatrix3fv @129
- glUniformMatrix4fv @130
- glUseProgram @131
- glValidateProgram @132
- glVertexAttrib1f @133
- glVertexAttrib1fv @134
- glVertexAttrib2f @135
- glVertexAttrib2fv @136
- glVertexAttrib3f @137
- glVertexAttrib3fv @138
- glVertexAttrib4f @139
- glVertexAttrib4fv @140
- glVertexAttribPointer @141
- glViewport @142
+ glActiveTexture@4 @1
+ glAttachShader@8 @2
+ glBindAttribLocation@12 @3
+ glBindBuffer@8 @4
+ glBindFramebuffer@8 @5
+ glBindRenderbuffer@8 @6
+ glBindTexture@8 @7
+ glBlendColor@16 @8
+ glBlendEquation@4 @9
+ glBlendEquationSeparate@8 @10
+ glBlendFunc@8 @11
+ glBlendFuncSeparate@16 @12
+ glBufferData@16 @13
+ glBufferSubData@16 @14
+ glCheckFramebufferStatus@4 @15
+ glClear@4 @16
+ glClearColor@16 @17
+ glClearDepthf@4 @18
+ glClearStencil@4 @19
+ glColorMask@16 @20
+ glCompileShader@4 @21
+ glCompressedTexImage2D@32 @22
+ glCompressedTexSubImage2D@36 @23
+ glCopyTexImage2D@32 @24
+ glCopyTexSubImage2D@32 @25
+ glCreateProgram@0 @26
+ glCreateShader@4 @27
+ glCullFace@4 @28
+ glDeleteBuffers@8 @29
+ glDeleteFramebuffers@8 @30
+ glDeleteProgram@4 @32
+ glDeleteRenderbuffers@8 @33
+ glDeleteShader@4 @34
+ glDeleteTextures@8 @31
+ glDepthFunc@4 @36
+ glDepthMask@4 @37
+ glDepthRangef@8 @38
+ glDetachShader@8 @35
+ glDisable@4 @39
+ glDisableVertexAttribArray@4 @40
+ glDrawArrays@12 @41
+ glDrawElements@16 @42
+ glEnable@4 @43
+ glEnableVertexAttribArray@4 @44
+ glFinish@0 @45
+ glFlush@0 @46
+ glFramebufferRenderbuffer@16 @47
+ glFramebufferTexture2D@20 @48
+ glFrontFace@4 @49
+ glGenBuffers@8 @50
+ glGenFramebuffers@8 @52
+ glGenRenderbuffers@8 @53
+ glGenTextures@8 @54
+ glGenerateMipmap@4 @51
+ glGetActiveAttrib@28 @55
+ glGetActiveUniform@28 @56
+ glGetAttachedShaders@16 @57
+ glGetAttribLocation@8 @58
+ glGetBooleanv@8 @59
+ glGetBufferParameteriv@12 @60
+ glGetError@0 @61
+ glGetFloatv@8 @62
+ glGetFramebufferAttachmentParameteriv@16 @63
+ glGetIntegerv@8 @64
+ glGetProgramInfoLog@16 @66
+ glGetProgramiv@12 @65
+ glGetRenderbufferParameteriv@12 @67
+ glGetShaderInfoLog@16 @69
+ glGetShaderPrecisionFormat@16 @70
+ glGetShaderSource@16 @71
+ glGetShaderiv@12 @68
+ glGetString@4 @72
+ glGetTexParameterfv@12 @73
+ glGetTexParameteriv@12 @74
+ glGetUniformLocation@8 @77
+ glGetUniformfv@12 @75
+ glGetUniformiv@12 @76
+ glGetVertexAttribPointerv@12 @80
+ glGetVertexAttribfv@12 @78
+ glGetVertexAttribiv@12 @79
+ glHint@8 @81
+ glIsBuffer@4 @82
+ glIsEnabled@4 @83
+ glIsFramebuffer@4 @84
+ glIsProgram@4 @85
+ glIsRenderbuffer@4 @86
+ glIsShader@4 @87
+ glIsTexture@4 @88
+ glLineWidth@4 @89
+ glLinkProgram@4 @90
+ glPixelStorei@8 @91
+ glPolygonOffset@8 @92
+ glReadPixels@28 @93
+ glReleaseShaderCompiler@0 @94
+ glRenderbufferStorage@16 @95
+ glSampleCoverage@8 @96
+ glScissor@16 @97
+ glShaderBinary@20 @98
+ glShaderSource@16 @99
+ glStencilFunc@12 @100
+ glStencilFuncSeparate@16 @101
+ glStencilMask@4 @102
+ glStencilMaskSeparate@8 @103
+ glStencilOp@12 @104
+ glStencilOpSeparate@16 @105
+ glTexImage2D@36 @106
+ glTexParameterf@12 @107
+ glTexParameterfv@12 @108
+ glTexParameteri@12 @109
+ glTexParameteriv@12 @110
+ glTexSubImage2D@36 @111
+ glUniform1f@8 @112
+ glUniform1fv@12 @113
+ glUniform1i@8 @114
+ glUniform1iv@12 @115
+ glUniform2f@12 @116
+ glUniform2fv@12 @117
+ glUniform2i@12 @118
+ glUniform2iv@12 @119
+ glUniform3f@16 @120
+ glUniform3fv@12 @121
+ glUniform3i@16 @122
+ glUniform3iv@12 @123
+ glUniform4f@20 @124
+ glUniform4fv@12 @125
+ glUniform4i@20 @126
+ glUniform4iv@12 @127
+ glUniformMatrix2fv@16 @128
+ glUniformMatrix3fv@16 @129
+ glUniformMatrix4fv@16 @130
+ glUseProgram@4 @131
+ glValidateProgram@4 @132
+ glVertexAttrib1f@8 @133
+ glVertexAttrib1fv@8 @134
+ glVertexAttrib2f@12 @135
+ glVertexAttrib2fv@8 @136
+ glVertexAttrib3f@16 @137
+ glVertexAttrib3fv@8 @138
+ glVertexAttrib4f@20 @139
+ glVertexAttrib4fv@8 @140
+ glVertexAttribPointer@24 @141
+ glViewport@16 @142
; Extensions
- glBlitFramebufferANGLE @149
- glRenderbufferStorageMultisampleANGLE @150
- glDeleteFencesNV @151
- glFinishFenceNV @152
- glGenFencesNV @153
- glGetFenceivNV @154
- glIsFenceNV @155
- glSetFenceNV @156
- glTestFenceNV @157
- glGetTranslatedShaderSourceANGLE @159
- glTexStorage2DEXT @160
- glGetGraphicsResetStatusEXT @161
- glReadnPixelsEXT @162
- glGetnUniformfvEXT @163
- glGetnUniformivEXT @164
- glGenQueriesEXT @165
- glDeleteQueriesEXT @166
- glIsQueryEXT @167
- glBeginQueryEXT @168
- glEndQueryEXT @169
- glGetQueryivEXT @170
- glGetQueryObjectuivEXT @171
- glVertexAttribDivisorANGLE @172
- glDrawArraysInstancedANGLE @173
- glDrawElementsInstancedANGLE @174
- glProgramBinaryOES @175
- glGetProgramBinaryOES @176
- glDrawBuffersEXT @179
- glMapBufferOES @285
- glUnmapBufferOES @286
- glGetBufferPointervOES @287
- glMapBufferRangeEXT @288
- glFlushMappedBufferRangeEXT @289
- glDiscardFramebufferEXT @293
- glInsertEventMarkerEXT @294
- glPushGroupMarkerEXT @295
- glPopGroupMarkerEXT @296
- glEGLImageTargetTexture2DOES @297
- glEGLImageTargetRenderbufferStorageOES @298
- glBindVertexArrayOES @299
- glDeleteVertexArraysOES @300
- glGenVertexArraysOES @301
- glIsVertexArrayOES @302
- glDebugMessageControlKHR @303
- glDebugMessageInsertKHR @304
- glDebugMessageCallbackKHR @305
- glGetDebugMessageLogKHR @306
- glPushDebugGroupKHR @307
- glPopDebugGroupKHR @308
- glObjectLabelKHR @309
- glGetObjectLabelKHR @310
- glObjectPtrLabelKHR @311
- glGetObjectPtrLabelKHR @312
- glGetPointervKHR @313
- glQueryCounterEXT @314
- glGetQueryObjectivEXT @315
- glGetQueryObjecti64vEXT @316
- glGetQueryObjectui64vEXT @317
- glBindUniformLocationCHROMIUM @318
- glCoverageModulationCHROMIUM @319
+ glBlitFramebufferANGLE@40 @149
+ glRenderbufferStorageMultisampleANGLE@20 @150
+ glDeleteFencesNV@8 @151
+ glFinishFenceNV@4 @152
+ glGenFencesNV@8 @153
+ glGetFenceivNV@12 @154
+ glIsFenceNV@4 @155
+ glSetFenceNV@8 @156
+ glTestFenceNV@4 @157
+ glGetTranslatedShaderSourceANGLE@16 @159
+ glTexStorage2DEXT@20 @160
+ glGetGraphicsResetStatusEXT@0 @161
+ glReadnPixelsEXT@32 @162
+ glGetnUniformfvEXT@16 @163
+ glGetnUniformivEXT@16 @164
+ glGenQueriesEXT@8 @165
+ glDeleteQueriesEXT@8 @166
+ glIsQueryEXT@4 @167
+ glBeginQueryEXT@8 @168
+ glEndQueryEXT@4 @169
+ glGetQueryivEXT@12 @170
+ glGetQueryObjectuivEXT@12 @171
+ glVertexAttribDivisorANGLE@8 @172
+ glDrawArraysInstancedANGLE@16 @173
+ glDrawElementsInstancedANGLE@20 @174
+ glProgramBinaryOES@16 @175
+ glGetProgramBinaryOES@20 @176
+ glDrawBuffersEXT@8 @179
+ glMapBufferOES@8 @285
+ glUnmapBufferOES@4 @286
+ glGetBufferPointervOES@12 @287
+ glMapBufferRangeEXT@16 @288
+ glFlushMappedBufferRangeEXT@12 @289
+ glDiscardFramebufferEXT@12 @293
+ glInsertEventMarkerEXT@8 @294
+ glPushGroupMarkerEXT@8 @295
+ glPopGroupMarkerEXT@0 @296
+ glEGLImageTargetTexture2DOES@8 @297
+ glEGLImageTargetRenderbufferStorageOES@8 @298
+ glBindVertexArrayOES@4 @299
+ glDeleteVertexArraysOES@8 @300
+ glGenVertexArraysOES@8 @301
+ glIsVertexArrayOES@4 @302
+ glDebugMessageControlKHR@24 @303
+ glDebugMessageInsertKHR@24 @304
+ glDebugMessageCallbackKHR@8 @305
+ glGetDebugMessageLogKHR@32 @306
+ glPushDebugGroupKHR@16 @307
+ glPopDebugGroupKHR@0 @308
+ glObjectLabelKHR@16 @309
+ glGetObjectLabelKHR@20 @310
+ glObjectPtrLabelKHR@12 @311
+ glGetObjectPtrLabelKHR@16 @312
+ glGetPointervKHR@8 @313
+ glQueryCounterEXT@8 @314
+ glGetQueryObjectivEXT@12 @315
+ glGetQueryObjecti64vEXT@12 @316
+ glGetQueryObjectui64vEXT@12 @317
+ glBindUniformLocationCHROMIUM@12 @318
+ glCoverageModulationCHROMIUM@4 @319
+ glMatrixLoadfCHROMIUM@8 @320
+ glMatrixLoadIdentityCHROMIUM@4 @321
+ glGenPathsCHROMIUM@4 @322
+ glDeletePathsCHROMIUM@8 @323
+ glIsPathCHROMIUM@4 @324
+ glPathCommandsCHROMIUM@24 @325
+ glPathParameterfCHROMIUM@12 @326
+ glPathParameteriCHROMIUM@12 @327
+ glGetPathParameterfvCHROMIUM@12 @328
+ glGetPathParameterivCHROMIUM@12 @329
+ glPathStencilFuncCHROMIUM@12 @330
+ glStencilFillPathCHROMIUM@12 @331
+ glStencilStrokePathCHROMIUM@12 @332
+ glCoverFillPathCHROMIUM@8 @333
+ glCoverStrokePathCHROMIUM@8 @334
+ glStencilThenCoverFillPathCHROMIUM@16 @335
+ glStencilThenCoverStrokePathCHROMIUM@16 @336
+ glCoverFillPathInstancedCHROMIUM@28 @337
+ glCoverStrokePathInstancedCHROMIUM@28 @338
+ glStencilStrokePathInstancedCHROMIUM@32 @339
+ glStencilFillPathInstancedCHROMIUM@32 @340
+ glStencilThenCoverFillPathInstancedCHROMIUM@36 @341
+ glStencilThenCoverStrokePathInstancedCHROMIUM@36 @342
+ glBindFragmentInputLocationCHROMIUM@12 @343
+ glProgramPathFragmentInputGenCHROMIUM@20 @344
- glMatrixLoadfCHROMIUM @320
- glMatrixLoadIdentityCHROMIUM @321
- glGenPathsCHROMIUM @322
- glDeletePathsCHROMIUM @323
- glIsPathCHROMIUM @324
- glPathCommandsCHROMIUM @325
- glPathParameterfCHROMIUM @326
- glPathParameteriCHROMIUM @327
- glGetPathParameterfvCHROMIUM @328
- glGetPathParameterivCHROMIUM @329
- glPathStencilFuncCHROMIUM @330
- glStencilFillPathCHROMIUM @331
- glStencilStrokePathCHROMIUM @332
- glCoverFillPathCHROMIUM @333
- glCoverStrokePathCHROMIUM @334
- glStencilThenCoverFillPathCHROMIUM @335
- glStencilThenCoverStrokePathCHROMIUM @336
- glCoverFillPathInstancedCHROMIUM @337
- glCoverStrokePathInstancedCHROMIUM @338
- glStencilStrokePathInstancedCHROMIUM @339
- glStencilFillPathInstancedCHROMIUM @340
- glStencilThenCoverFillPathInstancedCHROMIUM @341
- glStencilThenCoverStrokePathInstancedCHROMIUM @342
- glBindFragmentInputLocationCHROMIUM @343
- glProgramPathFragmentInputGenCHROMIUM @344
-
- glFramebufferTextureMultiviewLayeredANGLE @413
- glFramebufferTextureMultiviewSideBySideANGLE @414
- glRequestExtensionANGLE @415
+ glFramebufferTextureMultiviewLayeredANGLE@24 @413
+ glFramebufferTextureMultiviewSideBySideANGLE@24 @414
+ glRequestExtensionANGLE@4 @415
; GLES 3.0 Functions
- glReadBuffer @180
- glDrawRangeElements @181
- glTexImage3D @182
- glTexSubImage3D @183
- glCopyTexSubImage3D @184
- glCompressedTexImage3D @185
- glCompressedTexSubImage3D @186
- glGenQueries @187
- glDeleteQueries @188
- glIsQuery @189
- glBeginQuery @190
- glEndQuery @191
- glGetQueryiv @192
- glGetQueryObjectuiv @193
- glUnmapBuffer @194
- glGetBufferPointerv @195
- glDrawBuffers @196
- glUniformMatrix2x3fv @197
- glUniformMatrix3x2fv @198
- glUniformMatrix2x4fv @199
- glUniformMatrix4x2fv @200
- glUniformMatrix3x4fv @201
- glUniformMatrix4x3fv @202
- glBlitFramebuffer @203
- glRenderbufferStorageMultisample @204
- glFramebufferTextureLayer @205
- glMapBufferRange @206
- glFlushMappedBufferRange @207
- glBindVertexArray @208
- glDeleteVertexArrays @209
- glGenVertexArrays @210
- glIsVertexArray @211
- glGetIntegeri_v @212
- glBeginTransformFeedback @213
- glEndTransformFeedback @214
- glBindBufferRange @215
- glBindBufferBase @216
- glTransformFeedbackVaryings @217
- glGetTransformFeedbackVarying @218
- glVertexAttribIPointer @219
- glGetVertexAttribIiv @220
- glGetVertexAttribIuiv @221
- glVertexAttribI4i @222
- glVertexAttribI4ui @223
- glVertexAttribI4iv @224
- glVertexAttribI4uiv @225
- glGetUniformuiv @226
- glGetFragDataLocation @227
- glUniform1ui @228
- glUniform2ui @229
- glUniform3ui @230
- glUniform4ui @231
- glUniform1uiv @232
- glUniform2uiv @233
- glUniform3uiv @234
- glUniform4uiv @235
- glClearBufferiv @236
- glClearBufferuiv @237
- glClearBufferfv @238
- glClearBufferfi @239
- glGetStringi @240
- glCopyBufferSubData @241
- glGetUniformIndices @242
- glGetActiveUniformsiv @243
- glGetUniformBlockIndex @244
- glGetActiveUniformBlockiv @245
- glGetActiveUniformBlockName @246
- glUniformBlockBinding @247
- glDrawArraysInstanced @248
- glDrawElementsInstanced @249
- glFenceSync @250
- glIsSync @251
- glDeleteSync @252
- glClientWaitSync @253
- glWaitSync @254
- glGetInteger64v @255
- glGetSynciv @256
- glGetInteger64i_v @257
- glGetBufferParameteri64v @258
- glGenSamplers @259
- glDeleteSamplers @260
- glIsSampler @261
- glBindSampler @262
- glSamplerParameteri @263
- glSamplerParameteriv @264
- glSamplerParameterf @265
- glSamplerParameterfv @266
- glGetSamplerParameteriv @267
- glGetSamplerParameterfv @268
- glVertexAttribDivisor @269
- glBindTransformFeedback @270
- glDeleteTransformFeedbacks @271
- glGenTransformFeedbacks @272
- glIsTransformFeedback @273
- glPauseTransformFeedback @274
- glResumeTransformFeedback @275
- glGetProgramBinary @276
- glProgramBinary @277
- glProgramParameteri @278
- glInvalidateFramebuffer @279
- glInvalidateSubFramebuffer @280
- glTexStorage2D @281
- glTexStorage3D @282
- glGetInternalformativ @283
+ glReadBuffer@4 @180
+ glDrawRangeElements@24 @181
+ glTexImage3D@40 @182
+ glTexSubImage3D@44 @183
+ glCopyTexSubImage3D@36 @184
+ glCompressedTexImage3D@36 @185
+ glCompressedTexSubImage3D@44 @186
+ glGenQueries@8 @187
+ glDeleteQueries@8 @188
+ glIsQuery@4 @189
+ glBeginQuery@8 @190
+ glEndQuery@4 @191
+ glGetQueryiv@12 @192
+ glGetQueryObjectuiv@12 @193
+ glUnmapBuffer@4 @194
+ glGetBufferPointerv@12 @195
+ glDrawBuffers@8 @196
+ glUniformMatrix2x3fv@16 @197
+ glUniformMatrix3x2fv@16 @198
+ glUniformMatrix2x4fv@16 @199
+ glUniformMatrix4x2fv@16 @200
+ glUniformMatrix3x4fv@16 @201
+ glUniformMatrix4x3fv@16 @202
+ glBlitFramebuffer@40 @203
+ glRenderbufferStorageMultisample@20 @204
+ glFramebufferTextureLayer@20 @205
+ glMapBufferRange@16 @206
+ glFlushMappedBufferRange@12 @207
+ glBindVertexArray@4 @208
+ glDeleteVertexArrays@8 @209
+ glGenVertexArrays@8 @210
+ glIsVertexArray@4 @211
+ glGetIntegeri_v@12 @212
+ glBeginTransformFeedback@4 @213
+ glEndTransformFeedback@0 @214
+ glBindBufferRange@20 @215
+ glBindBufferBase@12 @216
+ glTransformFeedbackVaryings@16 @217
+ glGetTransformFeedbackVarying@28 @218
+ glVertexAttribIPointer@20 @219
+ glGetVertexAttribIiv@12 @220
+ glGetVertexAttribIuiv@12 @221
+ glVertexAttribI4i@20 @222
+ glVertexAttribI4ui@20 @223
+ glVertexAttribI4iv@8 @224
+ glVertexAttribI4uiv@8 @225
+ glGetUniformuiv@12 @226
+ glGetFragDataLocation@8 @227
+ glUniform1ui@8 @228
+ glUniform2ui@12 @229
+ glUniform3ui@16 @230
+ glUniform4ui@20 @231
+ glUniform1uiv@12 @232
+ glUniform2uiv@12 @233
+ glUniform3uiv@12 @234
+ glUniform4uiv@12 @235
+ glClearBufferiv@12 @236
+ glClearBufferuiv@12 @237
+ glClearBufferfv@12 @238
+ glClearBufferfi@16 @239
+ glGetStringi@8 @240
+ glCopyBufferSubData@20 @241
+ glGetUniformIndices@16 @242
+ glGetActiveUniformsiv@20 @243
+ glGetUniformBlockIndex@8 @244
+ glGetActiveUniformBlockiv@16 @245
+ glGetActiveUniformBlockName@20 @246
+ glUniformBlockBinding@12 @247
+ glDrawArraysInstanced@16 @248
+ glDrawElementsInstanced@20 @249
+ glFenceSync@8 @250
+ glIsSync@4 @251
+ glDeleteSync@4 @252
+ glClientWaitSync@16 @253
+ glWaitSync@16 @254
+ glGetInteger64v@8 @255
+ glGetSynciv@20 @256
+ glGetInteger64i_v@12 @257
+ glGetBufferParameteri64v@12 @258
+ glGenSamplers@8 @259
+ glDeleteSamplers@8 @260
+ glIsSampler@4 @261
+ glBindSampler@8 @262
+ glSamplerParameteri@12 @263
+ glSamplerParameteriv@12 @264
+ glSamplerParameterf@12 @265
+ glSamplerParameterfv@12 @266
+ glGetSamplerParameteriv@12 @267
+ glGetSamplerParameterfv@12 @268
+ glVertexAttribDivisor@8 @269
+ glBindTransformFeedback@8 @270
+ glDeleteTransformFeedbacks@8 @271
+ glGenTransformFeedbacks@8 @272
+ glIsTransformFeedback@4 @273
+ glPauseTransformFeedback@0 @274
+ glResumeTransformFeedback@0 @275
+ glGetProgramBinary@20 @276
+ glProgramBinary@16 @277
+ glProgramParameteri@12 @278
+ glInvalidateFramebuffer@12 @279
+ glInvalidateSubFramebuffer@28 @280
+ glTexStorage2D@20 @281
+ glTexStorage3D@24 @282
+ glGetInternalformativ@20 @283
; GLES 3.1 Functions
- glDispatchCompute @345
- glDispatchComputeIndirect @346
- glDrawArraysIndirect @347
- glDrawElementsIndirect @348
- glFramebufferParameteri @349
- glGetFramebufferParameteriv @350
- glGetProgramInterfaceiv @351
- glGetProgramResourceIndex @352
- glGetProgramResourceName @353
- glGetProgramResourceiv @354
- glGetProgramResourceLocation @355
- glUseProgramStages @356
- glActiveShaderProgram @357
- glCreateShaderProgramv @358
- glBindProgramPipeline @359
- glDeleteProgramPipelines @360
- glGenProgramPipelines @361
- glIsProgramPipeline @362
- glGetProgramPipelineiv @363
- glProgramUniform1i @364
- glProgramUniform2i @365
- glProgramUniform3i @366
- glProgramUniform4i @367
- glProgramUniform1ui @368
- glProgramUniform2ui @369
- glProgramUniform3ui @370
- glProgramUniform4ui @371
- glProgramUniform1f @372
- glProgramUniform2f @373
- glProgramUniform3f @374
- glProgramUniform4f @375
- glProgramUniform1iv @376
- glProgramUniform2iv @377
- glProgramUniform3iv @378
- glProgramUniform4iv @379
- glProgramUniform1uiv @380
- glProgramUniform2uiv @381
- glProgramUniform3uiv @382
- glProgramUniform4uiv @383
- glProgramUniform1fv @384
- glProgramUniform2fv @385
- glProgramUniform3fv @386
- glProgramUniform4fv @387
- glProgramUniformMatrix2fv @388
- glProgramUniformMatrix3fv @389
- glProgramUniformMatrix4fv @390
- glProgramUniformMatrix2x3fv @391
- glProgramUniformMatrix3x2fv @392
- glProgramUniformMatrix2x4fv @393
- glProgramUniformMatrix4x2fv @394
- glProgramUniformMatrix3x4fv @395
- glProgramUniformMatrix4x3fv @396
- glValidateProgramPipeline @397
- glGetProgramPipelineInfoLog @398
- glBindImageTexture @399
- glGetBooleani_v @400
- glMemoryBarrier @401
- glMemoryBarrierByRegion @402
- glTexStorage2DMultisample @403
- glGetMultisamplefv @404
- glSampleMaski @405
- glGetTexLevelParameteriv @406
- glGetTexLevelParameterfv @407
- glBindVertexBuffer @408
- glVertexAttribFormat @409
- glVertexAttribIFormat @410
- glVertexAttribBinding @411
- glVertexBindingDivisor @412
+ glDispatchCompute@12 @345
+ glDispatchComputeIndirect@4 @346
+ glDrawArraysIndirect@8 @347
+ glDrawElementsIndirect@12 @348
+ glFramebufferParameteri@12 @349
+ glGetFramebufferParameteriv@12 @350
+ glGetProgramInterfaceiv@16 @351
+ glGetProgramResourceIndex@12 @352
+ glGetProgramResourceName@24 @353
+ glGetProgramResourceiv@32 @354
+ glGetProgramResourceLocation@12 @355
+ glUseProgramStages@12 @356
+ glActiveShaderProgram@8 @357
+ glCreateShaderProgramv@12 @358
+ glBindProgramPipeline@4 @359
+ glDeleteProgramPipelines@8 @360
+ glGenProgramPipelines@8 @361
+ glIsProgramPipeline@4 @362
+ glGetProgramPipelineiv@12 @363
+ glProgramUniform1i@12 @364
+ glProgramUniform2i@16 @365
+ glProgramUniform3i@20 @366
+ glProgramUniform4i@24 @367
+ glProgramUniform1ui@12 @368
+ glProgramUniform2ui@16 @369
+ glProgramUniform3ui@20 @370
+ glProgramUniform4ui@24 @371
+ glProgramUniform1f@12 @372
+ glProgramUniform2f@16 @373
+ glProgramUniform3f@20 @374
+ glProgramUniform4f@24 @375
+ glProgramUniform1iv@16 @376
+ glProgramUniform2iv@16 @377
+ glProgramUniform3iv@16 @378
+ glProgramUniform4iv@16 @379
+ glProgramUniform1uiv@16 @380
+ glProgramUniform2uiv@16 @381
+ glProgramUniform3uiv@16 @382
+ glProgramUniform4uiv@16 @383
+ glProgramUniform1fv@16 @384
+ glProgramUniform2fv@16 @385
+ glProgramUniform3fv@16 @386
+ glProgramUniform4fv@16 @387
+ glProgramUniformMatrix2fv@20 @388
+ glProgramUniformMatrix3fv@20 @389
+ glProgramUniformMatrix4fv@20 @390
+ glProgramUniformMatrix2x3fv@20 @391
+ glProgramUniformMatrix3x2fv@20 @392
+ glProgramUniformMatrix2x4fv@20 @393
+ glProgramUniformMatrix4x2fv@20 @394
+ glProgramUniformMatrix3x4fv@20 @395
+ glProgramUniformMatrix4x3fv@20 @396
+ glValidateProgramPipeline@4 @397
+ glGetProgramPipelineInfoLog@16 @398
+ glBindImageTexture@28 @399
+ glGetBooleani_v@12 @400
+ glMemoryBarrier@4 @401
+ glMemoryBarrierByRegion@4 @402
+ glTexStorage2DMultisample@24 @403
+ glGetMultisamplefv@12 @404
+ glSampleMaski@8 @405
+ glGetTexLevelParameteriv@16 @406
+ glGetTexLevelParameterfv@16 @407
+ glBindVertexBuffer@16 @408
+ glVertexAttribFormat@20 @409
+ glVertexAttribIFormat@16 @410
+ glVertexAttribBinding@8 @411
+ glVertexBindingDivisor@8 @412
diff --git a/src/3rdparty/angle/src/libGLESv2/libGLESv2d_mingw32.def b/src/3rdparty/angle/src/libGLESv2/libGLESv2d_mingw32.def
index 2ff4cc0579..a182c21a05 100644
--- a/src/3rdparty/angle/src/libGLESv2/libGLESv2d_mingw32.def
+++ b/src/3rdparty/angle/src/libGLESv2/libGLESv2d_mingw32.def
@@ -1,412 +1,411 @@
LIBRARY libGLESv2
EXPORTS
- glActiveTexture @1
- glAttachShader @2
- glBindAttribLocation @3
- glBindBuffer @4
- glBindFramebuffer @5
- glBindRenderbuffer @6
- glBindTexture @7
- glBlendColor @8
- glBlendEquation @9
- glBlendEquationSeparate @10
- glBlendFunc @11
- glBlendFuncSeparate @12
- glBufferData @13
- glBufferSubData @14
- glCheckFramebufferStatus @15
- glClear @16
- glClearColor @17
- glClearDepthf @18
- glClearStencil @19
- glColorMask @20
- glCompileShader @21
- glCompressedTexImage2D @22
- glCompressedTexSubImage2D @23
- glCopyTexImage2D @24
- glCopyTexSubImage2D @25
- glCreateProgram @26
- glCreateShader @27
- glCullFace @28
- glDeleteBuffers @29
- glDeleteFramebuffers @30
- glDeleteProgram @32
- glDeleteRenderbuffers @33
- glDeleteShader @34
- glDeleteTextures @31
- glDepthFunc @36
- glDepthMask @37
- glDepthRangef @38
- glDetachShader @35
- glDisable @39
- glDisableVertexAttribArray @40
- glDrawArrays @41
- glDrawElements @42
- glEnable @43
- glEnableVertexAttribArray @44
- glFinish @45
- glFlush @46
- glFramebufferRenderbuffer @47
- glFramebufferTexture2D @48
- glFrontFace @49
- glGenBuffers @50
- glGenFramebuffers @52
- glGenRenderbuffers @53
- glGenTextures @54
- glGenerateMipmap @51
- glGetActiveAttrib @55
- glGetActiveUniform @56
- glGetAttachedShaders @57
- glGetAttribLocation @58
- glGetBooleanv @59
- glGetBufferParameteriv @60
- glGetError @61
- glGetFloatv @62
- glGetFramebufferAttachmentParameteriv @63
- glGetIntegerv @64
- glGetProgramInfoLog @66
- glGetProgramiv @65
- glGetRenderbufferParameteriv @67
- glGetShaderInfoLog @69
- glGetShaderPrecisionFormat @70
- glGetShaderSource @71
- glGetShaderiv @68
- glGetString @72
- glGetTexParameterfv @73
- glGetTexParameteriv @74
- glGetUniformLocation @77
- glGetUniformfv @75
- glGetUniformiv @76
- glGetVertexAttribPointerv @80
- glGetVertexAttribfv @78
- glGetVertexAttribiv @79
- glHint @81
- glIsBuffer @82
- glIsEnabled @83
- glIsFramebuffer @84
- glIsProgram @85
- glIsRenderbuffer @86
- glIsShader @87
- glIsTexture @88
- glLineWidth @89
- glLinkProgram @90
- glPixelStorei @91
- glPolygonOffset @92
- glReadPixels @93
- glReleaseShaderCompiler @94
- glRenderbufferStorage @95
- glSampleCoverage @96
- glScissor @97
- glShaderBinary @98
- glShaderSource @99
- glStencilFunc @100
- glStencilFuncSeparate @101
- glStencilMask @102
- glStencilMaskSeparate @103
- glStencilOp @104
- glStencilOpSeparate @105
- glTexImage2D @106
- glTexParameterf @107
- glTexParameterfv @108
- glTexParameteri @109
- glTexParameteriv @110
- glTexSubImage2D @111
- glUniform1f @112
- glUniform1fv @113
- glUniform1i @114
- glUniform1iv @115
- glUniform2f @116
- glUniform2fv @117
- glUniform2i @118
- glUniform2iv @119
- glUniform3f @120
- glUniform3fv @121
- glUniform3i @122
- glUniform3iv @123
- glUniform4f @124
- glUniform4fv @125
- glUniform4i @126
- glUniform4iv @127
- glUniformMatrix2fv @128
- glUniformMatrix3fv @129
- glUniformMatrix4fv @130
- glUseProgram @131
- glValidateProgram @132
- glVertexAttrib1f @133
- glVertexAttrib1fv @134
- glVertexAttrib2f @135
- glVertexAttrib2fv @136
- glVertexAttrib3f @137
- glVertexAttrib3fv @138
- glVertexAttrib4f @139
- glVertexAttrib4fv @140
- glVertexAttribPointer @141
- glViewport @142
+ glActiveTexture@4 @1
+ glAttachShader@8 @2
+ glBindAttribLocation@12 @3
+ glBindBuffer@8 @4
+ glBindFramebuffer@8 @5
+ glBindRenderbuffer@8 @6
+ glBindTexture@8 @7
+ glBlendColor@16 @8
+ glBlendEquation@4 @9
+ glBlendEquationSeparate@8 @10
+ glBlendFunc@8 @11
+ glBlendFuncSeparate@16 @12
+ glBufferData@16 @13
+ glBufferSubData@16 @14
+ glCheckFramebufferStatus@4 @15
+ glClear@4 @16
+ glClearColor@16 @17
+ glClearDepthf@4 @18
+ glClearStencil@4 @19
+ glColorMask@16 @20
+ glCompileShader@4 @21
+ glCompressedTexImage2D@32 @22
+ glCompressedTexSubImage2D@36 @23
+ glCopyTexImage2D@32 @24
+ glCopyTexSubImage2D@32 @25
+ glCreateProgram@0 @26
+ glCreateShader@4 @27
+ glCullFace@4 @28
+ glDeleteBuffers@8 @29
+ glDeleteFramebuffers@8 @30
+ glDeleteProgram@4 @32
+ glDeleteRenderbuffers@8 @33
+ glDeleteShader@4 @34
+ glDeleteTextures@8 @31
+ glDepthFunc@4 @36
+ glDepthMask@4 @37
+ glDepthRangef@8 @38
+ glDetachShader@8 @35
+ glDisable@4 @39
+ glDisableVertexAttribArray@4 @40
+ glDrawArrays@12 @41
+ glDrawElements@16 @42
+ glEnable@4 @43
+ glEnableVertexAttribArray@4 @44
+ glFinish@0 @45
+ glFlush@0 @46
+ glFramebufferRenderbuffer@16 @47
+ glFramebufferTexture2D@20 @48
+ glFrontFace@4 @49
+ glGenBuffers@8 @50
+ glGenFramebuffers@8 @52
+ glGenRenderbuffers@8 @53
+ glGenTextures@8 @54
+ glGenerateMipmap@4 @51
+ glGetActiveAttrib@28 @55
+ glGetActiveUniform@28 @56
+ glGetAttachedShaders@16 @57
+ glGetAttribLocation@8 @58
+ glGetBooleanv@8 @59
+ glGetBufferParameteriv@12 @60
+ glGetError@0 @61
+ glGetFloatv@8 @62
+ glGetFramebufferAttachmentParameteriv@16 @63
+ glGetIntegerv@8 @64
+ glGetProgramInfoLog@16 @66
+ glGetProgramiv@12 @65
+ glGetRenderbufferParameteriv@12 @67
+ glGetShaderInfoLog@16 @69
+ glGetShaderPrecisionFormat@16 @70
+ glGetShaderSource@16 @71
+ glGetShaderiv@12 @68
+ glGetString@4 @72
+ glGetTexParameterfv@12 @73
+ glGetTexParameteriv@12 @74
+ glGetUniformLocation@8 @77
+ glGetUniformfv@12 @75
+ glGetUniformiv@12 @76
+ glGetVertexAttribPointerv@12 @80
+ glGetVertexAttribfv@12 @78
+ glGetVertexAttribiv@12 @79
+ glHint@8 @81
+ glIsBuffer@4 @82
+ glIsEnabled@4 @83
+ glIsFramebuffer@4 @84
+ glIsProgram@4 @85
+ glIsRenderbuffer@4 @86
+ glIsShader@4 @87
+ glIsTexture@4 @88
+ glLineWidth@4 @89
+ glLinkProgram@4 @90
+ glPixelStorei@8 @91
+ glPolygonOffset@8 @92
+ glReadPixels@28 @93
+ glReleaseShaderCompiler@0 @94
+ glRenderbufferStorage@16 @95
+ glSampleCoverage@8 @96
+ glScissor@16 @97
+ glShaderBinary@20 @98
+ glShaderSource@16 @99
+ glStencilFunc@12 @100
+ glStencilFuncSeparate@16 @101
+ glStencilMask@4 @102
+ glStencilMaskSeparate@8 @103
+ glStencilOp@12 @104
+ glStencilOpSeparate@16 @105
+ glTexImage2D@36 @106
+ glTexParameterf@12 @107
+ glTexParameterfv@12 @108
+ glTexParameteri@12 @109
+ glTexParameteriv@12 @110
+ glTexSubImage2D@36 @111
+ glUniform1f@8 @112
+ glUniform1fv@12 @113
+ glUniform1i@8 @114
+ glUniform1iv@12 @115
+ glUniform2f@12 @116
+ glUniform2fv@12 @117
+ glUniform2i@12 @118
+ glUniform2iv@12 @119
+ glUniform3f@16 @120
+ glUniform3fv@12 @121
+ glUniform3i@16 @122
+ glUniform3iv@12 @123
+ glUniform4f@20 @124
+ glUniform4fv@12 @125
+ glUniform4i@20 @126
+ glUniform4iv@12 @127
+ glUniformMatrix2fv@16 @128
+ glUniformMatrix3fv@16 @129
+ glUniformMatrix4fv@16 @130
+ glUseProgram@4 @131
+ glValidateProgram@4 @132
+ glVertexAttrib1f@8 @133
+ glVertexAttrib1fv@8 @134
+ glVertexAttrib2f@12 @135
+ glVertexAttrib2fv@8 @136
+ glVertexAttrib3f@16 @137
+ glVertexAttrib3fv@8 @138
+ glVertexAttrib4f@20 @139
+ glVertexAttrib4fv@8 @140
+ glVertexAttribPointer@24 @141
+ glViewport@16 @142
; Extensions
- glBlitFramebufferANGLE @149
- glRenderbufferStorageMultisampleANGLE @150
- glDeleteFencesNV @151
- glFinishFenceNV @152
- glGenFencesNV @153
- glGetFenceivNV @154
- glIsFenceNV @155
- glSetFenceNV @156
- glTestFenceNV @157
- glGetTranslatedShaderSourceANGLE @159
- glTexStorage2DEXT @160
- glGetGraphicsResetStatusEXT @161
- glReadnPixelsEXT @162
- glGetnUniformfvEXT @163
- glGetnUniformivEXT @164
- glGenQueriesEXT @165
- glDeleteQueriesEXT @166
- glIsQueryEXT @167
- glBeginQueryEXT @168
- glEndQueryEXT @169
- glGetQueryivEXT @170
- glGetQueryObjectuivEXT @171
- glVertexAttribDivisorANGLE @172
- glDrawArraysInstancedANGLE @173
- glDrawElementsInstancedANGLE @174
- glProgramBinaryOES @175
- glGetProgramBinaryOES @176
- glDrawBuffersEXT @179
- glMapBufferOES @285
- glUnmapBufferOES @286
- glGetBufferPointervOES @287
- glMapBufferRangeEXT @288
- glFlushMappedBufferRangeEXT @289
- glDiscardFramebufferEXT @293
- glInsertEventMarkerEXT @294
- glPushGroupMarkerEXT @295
- glPopGroupMarkerEXT @296
- glEGLImageTargetTexture2DOES @297
- glEGLImageTargetRenderbufferStorageOES @298
- glBindVertexArrayOES @299
- glDeleteVertexArraysOES @300
- glGenVertexArraysOES @301
- glIsVertexArrayOES @302
- glDebugMessageControlKHR @303
- glDebugMessageInsertKHR @304
- glDebugMessageCallbackKHR @305
- glGetDebugMessageLogKHR @306
- glPushDebugGroupKHR @307
- glPopDebugGroupKHR @308
- glObjectLabelKHR @309
- glGetObjectLabelKHR @310
- glObjectPtrLabelKHR @311
- glGetObjectPtrLabelKHR @312
- glGetPointervKHR @313
- glQueryCounterEXT @314
- glGetQueryObjectivEXT @315
- glGetQueryObjecti64vEXT @316
- glGetQueryObjectui64vEXT @317
- glBindUniformLocationCHROMIUM @318
- glCoverageModulationCHROMIUM @319
+ glBlitFramebufferANGLE@40 @149
+ glRenderbufferStorageMultisampleANGLE@20 @150
+ glDeleteFencesNV@8 @151
+ glFinishFenceNV@4 @152
+ glGenFencesNV@8 @153
+ glGetFenceivNV@12 @154
+ glIsFenceNV@4 @155
+ glSetFenceNV@8 @156
+ glTestFenceNV@4 @157
+ glGetTranslatedShaderSourceANGLE@16 @159
+ glTexStorage2DEXT@20 @160
+ glGetGraphicsResetStatusEXT@0 @161
+ glReadnPixelsEXT@32 @162
+ glGetnUniformfvEXT@16 @163
+ glGetnUniformivEXT@16 @164
+ glGenQueriesEXT@8 @165
+ glDeleteQueriesEXT@8 @166
+ glIsQueryEXT@4 @167
+ glBeginQueryEXT@8 @168
+ glEndQueryEXT@4 @169
+ glGetQueryivEXT@12 @170
+ glGetQueryObjectuivEXT@12 @171
+ glVertexAttribDivisorANGLE@8 @172
+ glDrawArraysInstancedANGLE@16 @173
+ glDrawElementsInstancedANGLE@20 @174
+ glProgramBinaryOES@16 @175
+ glGetProgramBinaryOES@20 @176
+ glDrawBuffersEXT@8 @179
+ glMapBufferOES@8 @285
+ glUnmapBufferOES@4 @286
+ glGetBufferPointervOES@12 @287
+ glMapBufferRangeEXT@16 @288
+ glFlushMappedBufferRangeEXT@12 @289
+ glDiscardFramebufferEXT@12 @293
+ glInsertEventMarkerEXT@8 @294
+ glPushGroupMarkerEXT@8 @295
+ glPopGroupMarkerEXT@0 @296
+ glEGLImageTargetTexture2DOES@8 @297
+ glEGLImageTargetRenderbufferStorageOES@8 @298
+ glBindVertexArrayOES@4 @299
+ glDeleteVertexArraysOES@8 @300
+ glGenVertexArraysOES@8 @301
+ glIsVertexArrayOES@4 @302
+ glDebugMessageControlKHR@24 @303
+ glDebugMessageInsertKHR@24 @304
+ glDebugMessageCallbackKHR@8 @305
+ glGetDebugMessageLogKHR@32 @306
+ glPushDebugGroupKHR@16 @307
+ glPopDebugGroupKHR@0 @308
+ glObjectLabelKHR@16 @309
+ glGetObjectLabelKHR@20 @310
+ glObjectPtrLabelKHR@12 @311
+ glGetObjectPtrLabelKHR@16 @312
+ glGetPointervKHR@8 @313
+ glQueryCounterEXT@8 @314
+ glGetQueryObjectivEXT@12 @315
+ glGetQueryObjecti64vEXT@12 @316
+ glGetQueryObjectui64vEXT@12 @317
+ glBindUniformLocationCHROMIUM@12 @318
+ glCoverageModulationCHROMIUM@4 @319
+ glMatrixLoadfCHROMIUM@8 @320
+ glMatrixLoadIdentityCHROMIUM@4 @321
+ glGenPathsCHROMIUM@4 @322
+ glDeletePathsCHROMIUM@8 @323
+ glIsPathCHROMIUM@4 @324
+ glPathCommandsCHROMIUM@24 @325
+ glPathParameterfCHROMIUM@12 @326
+ glPathParameteriCHROMIUM@12 @327
+ glGetPathParameterfvCHROMIUM@12 @328
+ glGetPathParameterivCHROMIUM@12 @329
+ glPathStencilFuncCHROMIUM@12 @330
+ glStencilFillPathCHROMIUM@12 @331
+ glStencilStrokePathCHROMIUM@12 @332
+ glCoverFillPathCHROMIUM@8 @333
+ glCoverStrokePathCHROMIUM@8 @334
+ glStencilThenCoverFillPathCHROMIUM@16 @335
+ glStencilThenCoverStrokePathCHROMIUM@16 @336
+ glCoverFillPathInstancedCHROMIUM@28 @337
+ glCoverStrokePathInstancedCHROMIUM@28 @338
+ glStencilStrokePathInstancedCHROMIUM@32 @339
+ glStencilFillPathInstancedCHROMIUM@32 @340
+ glStencilThenCoverFillPathInstancedCHROMIUM@36 @341
+ glStencilThenCoverStrokePathInstancedCHROMIUM@36 @342
+ glBindFragmentInputLocationCHROMIUM@12 @343
+ glProgramPathFragmentInputGenCHROMIUM@20 @344
- glMatrixLoadfCHROMIUM @320
- glMatrixLoadIdentityCHROMIUM @321
- glGenPathsCHROMIUM @322
- glDeletePathsCHROMIUM @323
- glIsPathCHROMIUM @324
- glPathCommandsCHROMIUM @325
- glPathParameterfCHROMIUM @326
- glPathParameteriCHROMIUM @327
- glGetPathParameterfvCHROMIUM @328
- glGetPathParameterivCHROMIUM @329
- glPathStencilFuncCHROMIUM @330
- glStencilFillPathCHROMIUM @331
- glStencilStrokePathCHROMIUM @332
- glCoverFillPathCHROMIUM @333
- glCoverStrokePathCHROMIUM @334
- glStencilThenCoverFillPathCHROMIUM @335
- glStencilThenCoverStrokePathCHROMIUM @336
- glCoverFillPathInstancedCHROMIUM @337
- glCoverStrokePathInstancedCHROMIUM @338
- glStencilStrokePathInstancedCHROMIUM @339
- glStencilFillPathInstancedCHROMIUM @340
- glStencilThenCoverFillPathInstancedCHROMIUM @341
- glStencilThenCoverStrokePathInstancedCHROMIUM @342
- glBindFragmentInputLocationCHROMIUM @343
- glProgramPathFragmentInputGenCHROMIUM @344
-
- glFramebufferTextureMultiviewLayeredANGLE @413
- glFramebufferTextureMultiviewSideBySideANGLE @414
- glRequestExtensionANGLE @415
+ glFramebufferTextureMultiviewLayeredANGLE@24 @413
+ glFramebufferTextureMultiviewSideBySideANGLE@24 @414
+ glRequestExtensionANGLE@4 @415
; GLES 3.0 Functions
- glReadBuffer @180
- glDrawRangeElements @181
- glTexImage3D @182
- glTexSubImage3D @183
- glCopyTexSubImage3D @184
- glCompressedTexImage3D @185
- glCompressedTexSubImage3D @186
- glGenQueries @187
- glDeleteQueries @188
- glIsQuery @189
- glBeginQuery @190
- glEndQuery @191
- glGetQueryiv @192
- glGetQueryObjectuiv @193
- glUnmapBuffer @194
- glGetBufferPointerv @195
- glDrawBuffers @196
- glUniformMatrix2x3fv @197
- glUniformMatrix3x2fv @198
- glUniformMatrix2x4fv @199
- glUniformMatrix4x2fv @200
- glUniformMatrix3x4fv @201
- glUniformMatrix4x3fv @202
- glBlitFramebuffer @203
- glRenderbufferStorageMultisample @204
- glFramebufferTextureLayer @205
- glMapBufferRange @206
- glFlushMappedBufferRange @207
- glBindVertexArray @208
- glDeleteVertexArrays @209
- glGenVertexArrays @210
- glIsVertexArray @211
- glGetIntegeri_v @212
- glBeginTransformFeedback @213
- glEndTransformFeedback @214
- glBindBufferRange @215
- glBindBufferBase @216
- glTransformFeedbackVaryings @217
- glGetTransformFeedbackVarying @218
- glVertexAttribIPointer @219
- glGetVertexAttribIiv @220
- glGetVertexAttribIuiv @221
- glVertexAttribI4i @222
- glVertexAttribI4ui @223
- glVertexAttribI4iv @224
- glVertexAttribI4uiv @225
- glGetUniformuiv @226
- glGetFragDataLocation @227
- glUniform1ui @228
- glUniform2ui @229
- glUniform3ui @230
- glUniform4ui @231
- glUniform1uiv @232
- glUniform2uiv @233
- glUniform3uiv @234
- glUniform4uiv @235
- glClearBufferiv @236
- glClearBufferuiv @237
- glClearBufferfv @238
- glClearBufferfi @239
- glGetStringi @240
- glCopyBufferSubData @241
- glGetUniformIndices @242
- glGetActiveUniformsiv @243
- glGetUniformBlockIndex @244
- glGetActiveUniformBlockiv @245
- glGetActiveUniformBlockName @246
- glUniformBlockBinding @247
- glDrawArraysInstanced @248
- glDrawElementsInstanced @249
- glFenceSync @250
- glIsSync @251
- glDeleteSync @252
- glClientWaitSync @253
- glWaitSync @254
- glGetInteger64v @255
- glGetSynciv @256
- glGetInteger64i_v @257
- glGetBufferParameteri64v @258
- glGenSamplers @259
- glDeleteSamplers @260
- glIsSampler @261
- glBindSampler @262
- glSamplerParameteri @263
- glSamplerParameteriv @264
- glSamplerParameterf @265
- glSamplerParameterfv @266
- glGetSamplerParameteriv @267
- glGetSamplerParameterfv @268
- glVertexAttribDivisor @269
- glBindTransformFeedback @270
- glDeleteTransformFeedbacks @271
- glGenTransformFeedbacks @272
- glIsTransformFeedback @273
- glPauseTransformFeedback @274
- glResumeTransformFeedback @275
- glGetProgramBinary @276
- glProgramBinary @277
- glProgramParameteri @278
- glInvalidateFramebuffer @279
- glInvalidateSubFramebuffer @280
- glTexStorage2D @281
- glTexStorage3D @282
- glGetInternalformativ @283
+ glReadBuffer@4 @180
+ glDrawRangeElements@24 @181
+ glTexImage3D@40 @182
+ glTexSubImage3D@44 @183
+ glCopyTexSubImage3D@36 @184
+ glCompressedTexImage3D@36 @185
+ glCompressedTexSubImage3D@44 @186
+ glGenQueries@8 @187
+ glDeleteQueries@8 @188
+ glIsQuery@4 @189
+ glBeginQuery@8 @190
+ glEndQuery@4 @191
+ glGetQueryiv@12 @192
+ glGetQueryObjectuiv@12 @193
+ glUnmapBuffer@4 @194
+ glGetBufferPointerv@12 @195
+ glDrawBuffers@8 @196
+ glUniformMatrix2x3fv@16 @197
+ glUniformMatrix3x2fv@16 @198
+ glUniformMatrix2x4fv@16 @199
+ glUniformMatrix4x2fv@16 @200
+ glUniformMatrix3x4fv@16 @201
+ glUniformMatrix4x3fv@16 @202
+ glBlitFramebuffer@40 @203
+ glRenderbufferStorageMultisample@20 @204
+ glFramebufferTextureLayer@20 @205
+ glMapBufferRange@16 @206
+ glFlushMappedBufferRange@12 @207
+ glBindVertexArray@4 @208
+ glDeleteVertexArrays@8 @209
+ glGenVertexArrays@8 @210
+ glIsVertexArray@4 @211
+ glGetIntegeri_v@12 @212
+ glBeginTransformFeedback@4 @213
+ glEndTransformFeedback@0 @214
+ glBindBufferRange@20 @215
+ glBindBufferBase@12 @216
+ glTransformFeedbackVaryings@16 @217
+ glGetTransformFeedbackVarying@28 @218
+ glVertexAttribIPointer@20 @219
+ glGetVertexAttribIiv@12 @220
+ glGetVertexAttribIuiv@12 @221
+ glVertexAttribI4i@20 @222
+ glVertexAttribI4ui@20 @223
+ glVertexAttribI4iv@8 @224
+ glVertexAttribI4uiv@8 @225
+ glGetUniformuiv@12 @226
+ glGetFragDataLocation@8 @227
+ glUniform1ui@8 @228
+ glUniform2ui@12 @229
+ glUniform3ui@16 @230
+ glUniform4ui@20 @231
+ glUniform1uiv@12 @232
+ glUniform2uiv@12 @233
+ glUniform3uiv@12 @234
+ glUniform4uiv@12 @235
+ glClearBufferiv@12 @236
+ glClearBufferuiv@12 @237
+ glClearBufferfv@12 @238
+ glClearBufferfi@16 @239
+ glGetStringi@8 @240
+ glCopyBufferSubData@20 @241
+ glGetUniformIndices@16 @242
+ glGetActiveUniformsiv@20 @243
+ glGetUniformBlockIndex@8 @244
+ glGetActiveUniformBlockiv@16 @245
+ glGetActiveUniformBlockName@20 @246
+ glUniformBlockBinding@12 @247
+ glDrawArraysInstanced@16 @248
+ glDrawElementsInstanced@20 @249
+ glFenceSync@8 @250
+ glIsSync@4 @251
+ glDeleteSync@4 @252
+ glClientWaitSync@16 @253
+ glWaitSync@16 @254
+ glGetInteger64v@8 @255
+ glGetSynciv@20 @256
+ glGetInteger64i_v@12 @257
+ glGetBufferParameteri64v@12 @258
+ glGenSamplers@8 @259
+ glDeleteSamplers@8 @260
+ glIsSampler@4 @261
+ glBindSampler@8 @262
+ glSamplerParameteri@12 @263
+ glSamplerParameteriv@12 @264
+ glSamplerParameterf@12 @265
+ glSamplerParameterfv@12 @266
+ glGetSamplerParameteriv@12 @267
+ glGetSamplerParameterfv@12 @268
+ glVertexAttribDivisor@8 @269
+ glBindTransformFeedback@8 @270
+ glDeleteTransformFeedbacks@8 @271
+ glGenTransformFeedbacks@8 @272
+ glIsTransformFeedback@4 @273
+ glPauseTransformFeedback@0 @274
+ glResumeTransformFeedback@0 @275
+ glGetProgramBinary@20 @276
+ glProgramBinary@16 @277
+ glProgramParameteri@12 @278
+ glInvalidateFramebuffer@12 @279
+ glInvalidateSubFramebuffer@28 @280
+ glTexStorage2D@20 @281
+ glTexStorage3D@24 @282
+ glGetInternalformativ@20 @283
; GLES 3.1 Functions
- glDispatchCompute @345
- glDispatchComputeIndirect @346
- glDrawArraysIndirect @347
- glDrawElementsIndirect @348
- glFramebufferParameteri @349
- glGetFramebufferParameteriv @350
- glGetProgramInterfaceiv @351
- glGetProgramResourceIndex @352
- glGetProgramResourceName @353
- glGetProgramResourceiv @354
- glGetProgramResourceLocation @355
- glUseProgramStages @356
- glActiveShaderProgram @357
- glCreateShaderProgramv @358
- glBindProgramPipeline @359
- glDeleteProgramPipelines @360
- glGenProgramPipelines @361
- glIsProgramPipeline @362
- glGetProgramPipelineiv @363
- glProgramUniform1i @364
- glProgramUniform2i @365
- glProgramUniform3i @366
- glProgramUniform4i @367
- glProgramUniform1ui @368
- glProgramUniform2ui @369
- glProgramUniform3ui @370
- glProgramUniform4ui @371
- glProgramUniform1f @372
- glProgramUniform2f @373
- glProgramUniform3f @374
- glProgramUniform4f @375
- glProgramUniform1iv @376
- glProgramUniform2iv @377
- glProgramUniform3iv @378
- glProgramUniform4iv @379
- glProgramUniform1uiv @380
- glProgramUniform2uiv @381
- glProgramUniform3uiv @382
- glProgramUniform4uiv @383
- glProgramUniform1fv @384
- glProgramUniform2fv @385
- glProgramUniform3fv @386
- glProgramUniform4fv @387
- glProgramUniformMatrix2fv @388
- glProgramUniformMatrix3fv @389
- glProgramUniformMatrix4fv @390
- glProgramUniformMatrix2x3fv @391
- glProgramUniformMatrix3x2fv @392
- glProgramUniformMatrix2x4fv @393
- glProgramUniformMatrix4x2fv @394
- glProgramUniformMatrix3x4fv @395
- glProgramUniformMatrix4x3fv @396
- glValidateProgramPipeline @397
- glGetProgramPipelineInfoLog @398
- glBindImageTexture @399
- glGetBooleani_v @400
- glMemoryBarrier @401
- glMemoryBarrierByRegion @402
- glTexStorage2DMultisample @403
- glGetMultisamplefv @404
- glSampleMaski @405
- glGetTexLevelParameteriv @406
- glGetTexLevelParameterfv @407
- glBindVertexBuffer @408
- glVertexAttribFormat @409
- glVertexAttribIFormat @410
- glVertexAttribBinding @411
- glVertexBindingDivisor @412
+ glDispatchCompute@12 @345
+ glDispatchComputeIndirect@4 @346
+ glDrawArraysIndirect@8 @347
+ glDrawElementsIndirect@12 @348
+ glFramebufferParameteri@12 @349
+ glGetFramebufferParameteriv@12 @350
+ glGetProgramInterfaceiv@16 @351
+ glGetProgramResourceIndex@12 @352
+ glGetProgramResourceName@24 @353
+ glGetProgramResourceiv@32 @354
+ glGetProgramResourceLocation@12 @355
+ glUseProgramStages@12 @356
+ glActiveShaderProgram@8 @357
+ glCreateShaderProgramv@12 @358
+ glBindProgramPipeline@4 @359
+ glDeleteProgramPipelines@8 @360
+ glGenProgramPipelines@8 @361
+ glIsProgramPipeline@4 @362
+ glGetProgramPipelineiv@12 @363
+ glProgramUniform1i@12 @364
+ glProgramUniform2i@16 @365
+ glProgramUniform3i@20 @366
+ glProgramUniform4i@24 @367
+ glProgramUniform1ui@12 @368
+ glProgramUniform2ui@16 @369
+ glProgramUniform3ui@20 @370
+ glProgramUniform4ui@24 @371
+ glProgramUniform1f@12 @372
+ glProgramUniform2f@16 @373
+ glProgramUniform3f@20 @374
+ glProgramUniform4f@24 @375
+ glProgramUniform1iv@16 @376
+ glProgramUniform2iv@16 @377
+ glProgramUniform3iv@16 @378
+ glProgramUniform4iv@16 @379
+ glProgramUniform1uiv@16 @380
+ glProgramUniform2uiv@16 @381
+ glProgramUniform3uiv@16 @382
+ glProgramUniform4uiv@16 @383
+ glProgramUniform1fv@16 @384
+ glProgramUniform2fv@16 @385
+ glProgramUniform3fv@16 @386
+ glProgramUniform4fv@16 @387
+ glProgramUniformMatrix2fv@20 @388
+ glProgramUniformMatrix3fv@20 @389
+ glProgramUniformMatrix4fv@20 @390
+ glProgramUniformMatrix2x3fv@20 @391
+ glProgramUniformMatrix3x2fv@20 @392
+ glProgramUniformMatrix2x4fv@20 @393
+ glProgramUniformMatrix4x2fv@20 @394
+ glProgramUniformMatrix3x4fv@20 @395
+ glProgramUniformMatrix4x3fv@20 @396
+ glValidateProgramPipeline@4 @397
+ glGetProgramPipelineInfoLog@16 @398
+ glBindImageTexture@28 @399
+ glGetBooleani_v@12 @400
+ glMemoryBarrier@4 @401
+ glMemoryBarrierByRegion@4 @402
+ glTexStorage2DMultisample@24 @403
+ glGetMultisamplefv@12 @404
+ glSampleMaski@8 @405
+ glGetTexLevelParameteriv@16 @406
+ glGetTexLevelParameterfv@16 @407
+ glBindVertexBuffer@16 @408
+ glVertexAttribFormat@20 @409
+ glVertexAttribIFormat@16 @410
+ glVertexAttribBinding@8 @411
+ glVertexBindingDivisor@8 @412
diff --git a/src/concurrent/qtconcurrentrun.cpp b/src/concurrent/qtconcurrentrun.cpp
index bbd1f5ec62..d9867e1f1a 100644
--- a/src/concurrent/qtconcurrentrun.cpp
+++ b/src/concurrent/qtconcurrentrun.cpp
@@ -138,10 +138,10 @@
T is the same type as the return value of \a function. Non-void return
values can be accessed via the QFuture::result() function.
- Note that the QFuture returned by QtConcurrent::run() does not support
- canceling, pausing, or progress reporting. The QFuture returned can only
- be used to query for the running/finished status and the return value of
- the function.
+ \note The QFuture returned can only be used to query for the
+ running/finished status and the return value of the function. In particular,
+ canceling or pausing can be issued only if the computations behind the future
+ has not been started.
\sa {Concurrent Run}
*/
@@ -157,10 +157,10 @@
T is the same type as the return value of \a function. Non-void return
values can be accessed via the QFuture::result() function.
- Note that the QFuture returned by QtConcurrent::run() does not support
- canceling, pausing, or progress reporting. The QFuture returned can only
- be used to query for the running/finished status and the return value of
- the function.
+ \note The QFuture returned can only be used to query for the
+ running/finished status and the return value of the function. In particular,
+ canceling or pausing can be issued only if the computations behind the future
+ has not been started.
\sa {Concurrent Run}
*/
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 84d4111418..75597f8739 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -984,7 +984,11 @@ void QCoreApplication::setAttribute(Qt::ApplicationAttribute attribute, bool on)
QCoreApplicationPrivate::attribs |= 1 << attribute;
else
QCoreApplicationPrivate::attribs &= ~(1 << attribute);
+#if defined(QT_NO_QOBJECT)
if (Q_UNLIKELY(qApp)) {
+#else
+ if (Q_UNLIKELY(QCoreApplicationPrivate::is_app_running)) {
+#endif
switch (attribute) {
case Qt::AA_EnableHighDpiScaling:
case Qt::AA_DisableHighDpiScaling:
diff --git a/src/corelib/thread/qfuture.qdoc b/src/corelib/thread/qfuture.qdoc
index 7db65dacd3..076725e19c 100644
--- a/src/corelib/thread/qfuture.qdoc
+++ b/src/corelib/thread/qfuture.qdoc
@@ -55,8 +55,8 @@
instance, the computation can be canceled with the cancel() function. To
pause the computation, use the setPaused() function or one of the pause(),
resume(), or togglePaused() convenience functions. Be aware that not all
- asynchronous computations can be canceled or paused. For example, the
- future returned by QtConcurrent::run() cannot be canceled; but the
+ running asynchronous computations can be canceled or paused. For example,
+ the future returned by QtConcurrent::run() cannot be canceled; but the
future returned by QtConcurrent::mappedReduced() can.
Progress information is provided by the progressValue(),
@@ -133,8 +133,8 @@
Any QFutureWatcher object that is watching this future will not deliver
progress and result ready signals on a canceled future.
- Be aware that not all asynchronous computations can be canceled. For
- example, the future returned by QtConcurrent::run() cannot be canceled;
+ Be aware that not all running asynchronous computations can be canceled.
+ For example, the future returned by QtConcurrent::run() cannot be canceled;
but the future returned by QtConcurrent::mappedReduced() can.
*/
diff --git a/src/corelib/thread/qfuturewatcher.cpp b/src/corelib/thread/qfuturewatcher.cpp
index 4ee7693ace..cf220bbd48 100644
--- a/src/corelib/thread/qfuturewatcher.cpp
+++ b/src/corelib/thread/qfuturewatcher.cpp
@@ -84,8 +84,8 @@ QT_BEGIN_NAMESPACE
\snippet code/src_corelib_thread_qfuturewatcher.cpp 0
- Be aware that not all asynchronous computations can be canceled or paused.
- For example, the future returned by QtConcurrent::run() cannot be
+ Be aware that not all running asynchronous computations can be canceled or
+ paused. For example, the future returned by QtConcurrent::run() cannot be
canceled; but the future returned by QtConcurrent::mappedReduced() can.
QFutureWatcher<void> is specialized to not contain any of the result
@@ -124,9 +124,9 @@ QFutureWatcherBase::QFutureWatcherBase(QObject *parent)
progressRangeChanged(), progressTextChanged(), resultReadyAt(), and
resultsReadyAt() signals.
- Be aware that not all asynchronous computations can be canceled. For
- example, the QFuture returned by QtConcurrent::run() cannot be canceled;
- but the QFuture returned by QtConcurrent::mappedReduced() can.
+ Be aware that not all running asynchronous computations can be canceled.
+ For example, the QFuture returned by QtConcurrent::run() cannot be
+ canceled; but the QFuture returned by QtConcurrent::mappedReduced() can.
*/
void QFutureWatcherBase::cancel()
{
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index ea78b0a147..710528ea41 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -725,6 +725,12 @@ void QThread::start(Priority priority)
}
}
+#ifdef Q_OS_INTEGRITY
+ if (Q_LIKELY(objectName().isEmpty()))
+ pthread_attr_setthreadname(&attr, metaObject()->className());
+ else
+ pthread_attr_setthreadname(&attr, objectName().toLocal8Bit());
+#endif
pthread_t threadId;
int code = pthread_create(&threadId, &attr, QThreadPrivate::start, this);
if (code == EPERM) {
diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp
index 6b825fa001..bdec9e973a 100644
--- a/src/gui/accessible/qaccessible.cpp
+++ b/src/gui/accessible/qaccessible.cpp
@@ -350,6 +350,7 @@ Q_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core");
\value MenuItem An item in a menu or menu bar.
\value NoRole The object has no role. This usually indicates an invalid object.
\value Note A section whose content is parenthetic or ancillary to the main content of the resource.
+ \value Notification An object that represents a notification (e.g. in the system tray). This role only has an effect on Linux.
\value PageTab A page tab that the user can select to switch to a different page in a dialog.
\value PageTabList A list of page tabs.
\value Paragraph A paragraph of text (usually found in documents).
diff --git a/src/gui/accessible/qaccessible.h b/src/gui/accessible/qaccessible.h
index e2163b06d0..2220efd5cb 100644
--- a/src/gui/accessible/qaccessible.h
+++ b/src/gui/accessible/qaccessible.h
@@ -299,6 +299,7 @@ public:
Paragraph = 0x00000083,
WebDocument = 0x00000084,
Section = 0x00000085,
+ Notification = 0x00000086,
// IAccessible2 roles
// IA2_ROLE_CANVAS = 0x401, ### Qt 6 use this one instead of Canvas above
diff --git a/src/gui/image/qimagereader.cpp b/src/gui/image/qimagereader.cpp
index 61f20e0c65..ade6a9eaaa 100644
--- a/src/gui/image/qimagereader.cpp
+++ b/src/gui/image/qimagereader.cpp
@@ -1319,10 +1319,12 @@ bool QImageReader::read(QImage *image)
}
}
- // successful read; check for "@2x" file name suffix and set device pixel ratio.
- static bool disable2xImageLoading = !qEnvironmentVariableIsEmpty("QT_HIGHDPI_DISABLE_2X_IMAGE_LOADING");
- if (!disable2xImageLoading && QFileInfo(fileName()).baseName().endsWith(QLatin1String("@2x"))) {
- image->setDevicePixelRatio(2.0);
+ // successful read; check for "@Nx" file name suffix and set device pixel ratio.
+ static bool disableNxImageLoading = !qEnvironmentVariableIsEmpty("QT_HIGHDPI_DISABLE_2X_IMAGE_LOADING");
+ if (!disableNxImageLoading) {
+ const QByteArray suffix = QFileInfo(fileName()).baseName().right(3).toLatin1();
+ if (suffix.length() == 3 && suffix[0] == '@' && suffix[1] >= '2' && suffix[1] <= '9' && suffix[2] == 'x')
+ image->setDevicePixelRatio(suffix[1] - '0');
}
if (autoTransform())
qt_imageTransform(*image, transformation());
diff --git a/src/gui/kernel/qhighdpiscaling.cpp b/src/gui/kernel/qhighdpiscaling.cpp
index 4f8e9a3817..93fcb1a216 100644
--- a/src/gui/kernel/qhighdpiscaling.cpp
+++ b/src/gui/kernel/qhighdpiscaling.cpp
@@ -400,7 +400,7 @@ QPoint QHighDpiScaling::mapPositionToGlobal(const QPoint &pos, const QPoint &win
QPoint QHighDpiScaling::mapPositionFromGlobal(const QPoint &pos, const QPoint &windowGlobalPosition, const QWindow *window)
{
QPoint windowPosCandidate = pos - windowGlobalPosition;
- if (QGuiApplicationPrivate::screen_list.size() <= 1)
+ if (QGuiApplicationPrivate::screen_list.size() <= 1 || window->handle() == nullptr)
return windowPosCandidate;
// Device independent global (screen) space may discontiguous when high-dpi scaling
diff --git a/src/gui/kernel/qhighdpiscaling_p.h b/src/gui/kernel/qhighdpiscaling_p.h
index dfc6abf5ba..525e3fe78e 100644
--- a/src/gui/kernel/qhighdpiscaling_p.h
+++ b/src/gui/kernel/qhighdpiscaling_p.h
@@ -108,208 +108,114 @@ private:
namespace QHighDpi {
-inline QPointF fromNative(const QPointF &pos, qreal scaleFactor, const QPointF &origin)
+template <typename T>
+inline T scale(const T &value, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
- return (pos - origin) / scaleFactor + origin;
+ Q_UNUSED(origin)
+ return value * scaleFactor;
}
-inline QPointF toNative(const QPointF &pos, qreal scaleFactor, const QPointF &origin)
+inline QPointF scale(const QPointF &pos, qreal scaleFactor, QPointF origin = QPointF(0, 0))
{
return (pos - origin) * scaleFactor + origin;
}
-inline QPoint fromNative(const QPoint &pos, qreal scaleFactor, const QPoint &origin)
-{
- return (pos - origin) / scaleFactor + origin;
-}
-
-inline QPoint toNative(const QPoint &pos, qreal scaleFactor, const QPoint &origin)
+inline QPoint scale(const QPoint &pos, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
return (pos - origin) * scaleFactor + origin;
}
-inline QPoint fromNative(const QPoint &pos, qreal scaleFactor)
-{
- return pos / scaleFactor;
-}
-
-inline QPoint toNative(const QPoint &pos, qreal scaleFactor)
-{
- return pos * scaleFactor;
-}
-
-inline QSize fromNative(const QSize &size, qreal scaleFactor)
-{
- return size / scaleFactor; // TODO: should we round up?
-}
-
-inline QSize toNative(const QSize &size, qreal scaleFactor)
+inline QRect scale(const QRect &rect, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
- return size * scaleFactor;
-}
-
-inline QSizeF fromNative(const QSizeF &size, qreal scaleFactor)
-{
- return size / scaleFactor;
-}
-
-inline QSizeF toNative(const QSizeF &size, qreal scaleFactor)
-{
- return size * scaleFactor;
-}
-
-inline QRect fromNative(const QRect &rect, qreal scaleFactor, const QPoint &origin)
-{
- return QRect(fromNative(rect.topLeft(), scaleFactor, origin), fromNative(rect.size(), scaleFactor));
-}
-
-inline QRect toNative(const QRect &rect, qreal scaleFactor, const QPoint &origin)
-{
- return QRect(toNative(rect.topLeft(), scaleFactor, origin), toNative(rect.size(), scaleFactor));
-
-}
-
-inline QRect fromNative(const QRect &rect, const QScreen *screen, const QPoint &screenOrigin)
-{
- return fromNative(rect, QHighDpiScaling::factor(screen), screenOrigin);
-}
-
-inline QRect fromNativeScreenGeometry(const QRect &nativeScreenGeometry, const QScreen *screen)
-{
- return QRect(nativeScreenGeometry.topLeft(),
- fromNative(nativeScreenGeometry.size(), QHighDpiScaling::factor(screen)));
-}
-
-inline QPoint fromNativeLocalPosition(const QPoint &pos, const QWindow *window)
-{
- const qreal scaleFactor = QHighDpiScaling::factor(window);
- return pos / scaleFactor;
-}
-
-inline QPoint toNativeLocalPosition(const QPoint &pos, const QWindow *window)
-{
- const qreal scaleFactor = QHighDpiScaling::factor(window);
- return pos * scaleFactor;
-}
-
-inline QPointF fromNativeLocalPosition(const QPointF &pos, const QWindow *window)
-{
- const qreal scaleFactor = QHighDpiScaling::factor(window);
- return pos / scaleFactor;
-}
-
-inline QPointF toNativeLocalPosition(const QPointF &pos, const QWindow *window)
-{
- const qreal scaleFactor = QHighDpiScaling::factor(window);
- return pos * scaleFactor;
+ return QRect(scale(rect.topLeft(), scaleFactor, origin), scale(rect.size(), scaleFactor));
}
-template <typename C>
-inline QRect fromNativePixels(const QRect &pixelRect, const C *context)
+inline QRectF scale(const QRectF &rect, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
- const qreal scaleFactor = QHighDpiScaling::factor(context);
- const QPoint origin = QHighDpiScaling::origin(context);
- return QRect(fromNative(pixelRect.topLeft(), scaleFactor, origin),
- fromNative(pixelRect.size(), scaleFactor));
+ return QRectF(scale(rect.topLeft(), scaleFactor, origin), scale(rect.size(), scaleFactor));
}
-template <typename C>
-inline QRect toNativePixels(const QRect &pointRect, const C *context)
+inline QMargins scale(const QMargins &margins, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
- const qreal scaleFactor = QHighDpiScaling::factor(context);
- const QPoint origin = QHighDpiScaling::origin(context);
- return QRect(toNative(pointRect.topLeft(), scaleFactor, origin),
- toNative(pointRect.size(), scaleFactor));
+ Q_UNUSED(origin)
+ return QMargins(qRound(qreal(margins.left()) * scaleFactor), qRound(qreal(margins.top()) * scaleFactor),
+ qRound(qreal(margins.right()) * scaleFactor), qRound(qreal(margins.bottom()) * scaleFactor));
}
-template <typename C>
-inline QRectF toNativePixels(const QRectF &pointRect, const C *context)
+template <typename T>
+QVector<T> scale(const QVector<T> &vector, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
- const qreal scaleFactor = QHighDpiScaling::factor(context);
- const QPoint origin = QHighDpiScaling::origin(context);
- return QRectF(toNative(pointRect.topLeft(), scaleFactor, origin),
- toNative(pointRect.size(), scaleFactor));
-}
+ if (!QHighDpiScaling::isActive())
+ return vector;
-template <typename C>
-inline QRectF fromNativePixels(const QRectF &pixelRect, const C *context)
-{
- const qreal scaleFactor = QHighDpiScaling::factor(context);
- const QPoint origin = QHighDpiScaling::origin(context);
- return QRectF(fromNative(pixelRect.topLeft(), scaleFactor, origin),
- fromNative(pixelRect.size(), scaleFactor));
+ QVector<T> scaled;
+ scaled.reserve(vector.size());
+ for (const T &item : vector)
+ scaled.append(scale(item, scaleFactor, origin));
+ return scaled;
}
-inline QSize fromNativePixels(const QSize &pixelSize, const QWindow *window)
+inline QRegion scale(const QRegion &region, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
- return pixelSize / QHighDpiScaling::factor(window);
-}
+ if (!QHighDpiScaling::isActive())
+ return region;
-inline QSize toNativePixels(const QSize &pointSize, const QWindow *window)
-{
- return pointSize * QHighDpiScaling::factor(window);
+ QRegion scaled;
+ for (const QRect &rect : region)
+ scaled += scale(rect, scaleFactor, origin);
+ return scaled;
}
-inline QSizeF fromNativePixels(const QSizeF &pixelSize, const QWindow *window)
+template <typename T, typename C>
+T fromNativePixels(const T &value, const C *context)
{
- return pixelSize / QHighDpiScaling::factor(window);
+ return scale(value, qreal(1) / QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
}
-inline QSizeF toNativePixels(const QSizeF &pointSize, const QWindow *window)
+template <typename T, typename C>
+T toNativePixels(const T &value, const C *context)
{
- return pointSize * QHighDpiScaling::factor(window);
+ return scale(value, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
}
-template <typename C>
-inline QPoint fromNativePixels(const QPoint &pixelPoint, const C *context)
+template <typename T, typename C>
+T fromNativeLocalPosition(const T &value, const C *context)
{
- return fromNative(pixelPoint, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
+ return scale(value, qreal(1) / QHighDpiScaling::factor(context));
}
-template <typename C>
-inline QPoint toNativePixels(const QPoint &pointPoint, const C *context)
+template <typename T, typename C>
+T toNativeLocalPosition(const T &value, const C *context)
{
- return toNative(pointPoint, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
+ return scale(value, QHighDpiScaling::factor(context));
}
-template <typename C>
-inline QPointF fromNativePixels(const QPointF &pixelPoint, const C *context)
+template <typename T>
+inline T fromNative(const T &value, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
- return fromNative(pixelPoint, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
+ return scale(value, qreal(1) / scaleFactor, origin);
}
-template <typename C>
-inline QPointF toNativePixels(const QPointF &pointPoint, const C *context)
+template <typename T>
+inline T toNative(const T &value, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
- return toNative(pointPoint, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
+ return scale(value, scaleFactor, origin);
}
-inline QMargins fromNativePixels(const QMargins &pixelMargins, const QWindow *window)
+inline QRect fromNative(const QRect &rect, const QScreen *screen, const QPoint &screenOrigin)
{
- const qreal scaleFactor = QHighDpiScaling::factor(window);
- return QMargins(pixelMargins.left() / scaleFactor, pixelMargins.top() / scaleFactor,
- pixelMargins.right() / scaleFactor, pixelMargins.bottom() / scaleFactor);
+ return scale(rect, qreal(1) / QHighDpiScaling::factor(screen), screenOrigin);
}
-inline QMargins toNativePixels(const QMargins &pointMargins, const QWindow *window)
+inline QRect fromNativeScreenGeometry(const QRect &nativeScreenGeometry, const QScreen *screen)
{
- const qreal scaleFactor = QHighDpiScaling::factor(window);
- return QMargins(pointMargins.left() * scaleFactor, pointMargins.top() * scaleFactor,
- pointMargins.right() * scaleFactor, pointMargins.bottom() * scaleFactor);
+ return QRect(nativeScreenGeometry.topLeft(),
+ scale(nativeScreenGeometry.size(), qreal(1) / QHighDpiScaling::factor(screen)));
}
inline QRegion fromNativeLocalRegion(const QRegion &pixelRegion, const QWindow *window)
{
- if (!QHighDpiScaling::isActive())
- return pixelRegion;
-
- qreal scaleFactor = QHighDpiScaling::factor(window);
- QRegion pointRegion;
- for (const QRect &rect : pixelRegion) {
- pointRegion += QRect(fromNative(rect.topLeft(), scaleFactor),
- fromNative(rect.size(), scaleFactor));
- }
- return pointRegion;
+ return scale(pixelRegion, qreal(1) / QHighDpiScaling::factor(window));
}
// When mapping expose events to Qt rects: round top/left towards the origin and
@@ -333,67 +239,7 @@ inline QRegion fromNativeLocalExposedRegion(const QRegion &pixelRegion, const QW
inline QRegion toNativeLocalRegion(const QRegion &pointRegion, const QWindow *window)
{
- if (!QHighDpiScaling::isActive())
- return pointRegion;
-
- qreal scaleFactor = QHighDpiScaling::factor(window);
- QRegion pixelRegon;
- for (const QRect &rect : pointRegion) {
- pixelRegon += QRect(toNative(rect.topLeft(), scaleFactor),
- toNative(rect.size(), scaleFactor));
- }
- return pixelRegon;
-}
-
-// Any T that has operator/()
-template <typename T, typename C>
-T fromNativePixels(const T &pixelValue, const C *context)
-{
- if (!QHighDpiScaling::isActive())
- return pixelValue;
-
- return pixelValue / QHighDpiScaling::factor(context);
-
-}
-
-// Any T that has operator*()
-template <typename T, typename C>
-T toNativePixels(const T &pointValue, const C *context)
-{
- if (!QHighDpiScaling::isActive())
- return pointValue;
-
- return pointValue * QHighDpiScaling::factor(context);
-}
-
-// Any QVector<T> where T has operator/()
-template <typename T>
-QVector<T> fromNativePixels(const QVector<T> &pixelValues, const QWindow *window)
-{
- if (!QHighDpiScaling::isActive())
- return pixelValues;
-
- QVector<T> pointValues;
- pointValues.reserve(pixelValues.size());
- const auto factor = QHighDpiScaling::factor(window);
- for (const T &pixelValue : pixelValues)
- pointValues.append(pixelValue / factor);
- return pointValues;
-}
-
-// Any QVector<T> where T has operator*()
-template <typename T>
-QVector<T> toNativePixels(const QVector<T> &pointValues, const QWindow *window)
-{
- if (!QHighDpiScaling::isActive())
- return pointValues;
-
- QVector<T> pixelValues;
- pixelValues.reserve(pointValues.size());
- const auto factor = QHighDpiScaling::factor(window);
- for (const T &pointValue : pointValues)
- pixelValues.append(pointValue * factor);
- return pixelValues;
+ return scale(pointRegion, QHighDpiScaling::factor(window));
}
} // namespace QHighDpi
diff --git a/src/gui/math3d/qvector3d.cpp b/src/gui/math3d/qvector3d.cpp
index 12a7902272..4f72c1da66 100644
--- a/src/gui/math3d/qvector3d.cpp
+++ b/src/gui/math3d/qvector3d.cpp
@@ -514,7 +514,7 @@ float QVector3D::distanceToPlane
/*!
\overload
- Returns the distance from this vertex a plane defined by
+ Returns the distance from this vertex to a plane defined by
the vertices \a plane1, \a plane2 and \a plane3.
The return value will be negative if the vertex is below the plane,
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index 2dd18f6dfc..10d97556bc 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -4510,7 +4510,9 @@ static void blend_color_rgb16(int count, const QSpan *spans, void *userData)
if (mode == QPainter::CompositionMode_Source) {
// inline for performance
ushort c = data->solidColor.toRgb16();
- while (count--) {
+ for (; count--; spans++) {
+ if (!spans->len)
+ continue;
ushort *target = ((ushort *)data->rasterBuffer->scanLine(spans->y)) + spans->x;
if (spans->coverage == 255) {
qt_memfill(target, c, spans->len);
@@ -4523,13 +4525,14 @@ static void blend_color_rgb16(int count, const QSpan *spans, void *userData)
++target;
}
}
- ++spans;
}
return;
}
if (mode == QPainter::CompositionMode_SourceOver) {
- while (count--) {
+ for (; count--; spans++) {
+ if (!spans->len)
+ continue;
uint color = BYTE_MUL(data->solidColor.toArgb32(), spans->coverage);
int ialpha = qAlpha(~color);
ushort c = qConvertRgb32To16(color);
@@ -4561,7 +4564,6 @@ static void blend_color_rgb16(int count, const QSpan *spans, void *userData)
// one last pixel beyond a full word
*target = c + BYTE_MUL_RGB16(*target, ialpha);
}
- ++spans;
}
return;
}
@@ -4578,6 +4580,11 @@ void handleSpans(int count, const QSpan *spans, const QSpanData *data, T &handle
int coverage = 0;
while (count) {
+ if (!spans->len) {
+ ++spans;
+ --count;
+ continue;
+ }
int x = spans->x;
const int y = spans->y;
int right = x + spans->len;
@@ -4730,7 +4737,9 @@ static void blend_untransformed_generic(int count, const QSpan *spans, void *use
int xoff = -qRound(-data->dx);
int yoff = -qRound(-data->dy);
- while (count--) {
+ for (; count--; spans++) {
+ if (!spans->len)
+ continue;
int x = spans->x;
int length = spans->len;
int sx = xoff + x;
@@ -4758,7 +4767,6 @@ static void blend_untransformed_generic(int count, const QSpan *spans, void *use
}
}
}
- ++spans;
}
}
@@ -4779,7 +4787,9 @@ static void blend_untransformed_generic_rgb64(int count, const QSpan *spans, voi
int xoff = -qRound(-data->dx);
int yoff = -qRound(-data->dy);
- while (count--) {
+ for (; count--; spans++) {
+ if (!spans->len)
+ continue;
int x = spans->x;
int length = spans->len;
int sx = xoff + x;
@@ -4807,7 +4817,6 @@ static void blend_untransformed_generic_rgb64(int count, const QSpan *spans, voi
}
}
}
- ++spans;
}
}
@@ -4827,7 +4836,9 @@ static void blend_untransformed_argb(int count, const QSpan *spans, void *userDa
int xoff = -qRound(-data->dx);
int yoff = -qRound(-data->dy);
- while (count--) {
+ for (; count--; spans++) {
+ if (!spans->len)
+ continue;
int x = spans->x;
int length = spans->len;
int sx = xoff + x;
@@ -4847,7 +4858,6 @@ static void blend_untransformed_argb(int count, const QSpan *spans, void *userDa
op.func(dest, src, length, coverage);
}
}
- ++spans;
}
}
@@ -4920,7 +4930,12 @@ static void blend_untransformed_rgb565(int count, const QSpan *spans, void *user
int xoff = -qRound(-data->dx);
int yoff = -qRound(-data->dy);
- while (count--) {
+ const QSpan *end = spans + count;
+ while (spans < end) {
+ if (!spans->len) {
+ ++spans;
+ continue;
+ }
const quint8 coverage = (data->texture.const_alpha * spans->coverage) >> 8;
if (coverage == 0) {
++spans;
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 65319c0804..2d2041c907 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -4183,7 +4183,7 @@ static void qt_span_fill_clipped(int spanCount, const QSpan *spans, void *userDa
Clip spans to \a{clip}-rectangle.
Returns number of unclipped spans
*/
-static int qt_intersect_spans(QT_FT_Span *spans, int numSpans,
+static int qt_intersect_spans(QT_FT_Span *&spans, int numSpans,
const QRect &clip)
{
const short minx = clip.left();
@@ -4191,29 +4191,32 @@ static int qt_intersect_spans(QT_FT_Span *spans, int numSpans,
const short maxx = clip.right();
const short maxy = clip.bottom();
- int n = 0;
- for (int i = 0; i < numSpans; ++i) {
- if (spans[i].y > maxy)
+ QT_FT_Span *end = spans + numSpans;
+ while (spans < end) {
+ if (spans->y >= miny)
break;
- if (spans[i].y < miny
- || spans[i].x > maxx
- || spans[i].x + spans[i].len <= minx) {
+ ++spans;
+ }
+
+ QT_FT_Span *s = spans;
+ while (s < end) {
+ if (s->y > maxy)
+ break;
+ if (s->x > maxx || s->x + s->len <= minx) {
+ s->len = 0;
+ ++s;
continue;
}
- if (spans[i].x < minx) {
- spans[n].len = qMin(spans[i].len - (minx - spans[i].x), maxx - minx + 1);
- spans[n].x = minx;
+ if (s->x < minx) {
+ s->len = qMin(s->len - (minx - s->x), maxx - minx + 1);
+ s->x = minx;
} else {
- spans[n].x = spans[i].x;
- spans[n].len = qMin(spans[i].len, ushort(maxx - spans[n].x + 1));
+ s->len = qMin(s->len, ushort(maxx - s->x + 1));
}
- if (spans[n].len == 0)
- continue;
- spans[n].y = spans[i].y;
- spans[n].coverage = spans[i].coverage;
- ++n;
+ ++s;
}
- return n;
+
+ return s - spans;
}
@@ -4226,11 +4229,12 @@ static void qt_span_fill_clipRect(int count, const QSpan *spans,
Q_ASSERT(fillData->clip);
Q_ASSERT(!fillData->clip->clipRect.isEmpty());
+ QSpan *s = const_cast<QSpan *>(spans);
// hw: check if this const_cast<> is safe!!!
- count = qt_intersect_spans(const_cast<QSpan*>(spans), count,
+ count = qt_intersect_spans(s, count,
fillData->clip->clipRect);
if (count > 0)
- fillData->unclipped_blend(count, spans, fillData);
+ fillData->unclipped_blend(count, s, fillData);
}
static void qt_span_clip(int count, const QSpan *spans, void *userData)
@@ -4843,7 +4847,8 @@ static inline void drawEllipsePoints(int x, int y, int length,
if (length == 0)
return;
- QT_FT_Span outline[4];
+ QT_FT_Span _outline[4];
+ QT_FT_Span *outline = _outline;
const int midx = rect.x() + (rect.width() + 1) / 2;
const int midy = rect.y() + (rect.height() + 1) / 2;
@@ -4875,7 +4880,8 @@ static inline void drawEllipsePoints(int x, int y, int length,
outline[3].coverage = 255;
if (brush_func && outline[0].x + outline[0].len < outline[1].x) {
- QT_FT_Span fill[2];
+ QT_FT_Span _fill[2];
+ QT_FT_Span *fill = _fill;
// top fill
fill[0].x = outline[0].x + outline[0].len - 1;
diff --git a/src/gui/painting/qstroker.cpp b/src/gui/painting/qstroker.cpp
index 327190b678..90c06788e1 100644
--- a/src/gui/painting/qstroker.cpp
+++ b/src/gui/painting/qstroker.cpp
@@ -525,7 +525,7 @@ void QStroker::joinPoints(qfixed focal_x, qfixed focal_y, const QLineF &nextLine
QLineF shortCut(prevLine.p2(), nextLine.p1());
qreal angle = shortCut.angleTo(prevLine);
- if (type == QLineF::BoundedIntersection || (angle > 90 && !qFuzzyCompare(angle, (qreal)90))) {
+ if ((type == QLineF::BoundedIntersection || (angle > qreal(90.01))) && nextLine.length() > offset) {
emitLineTo(focal_x, focal_y);
emitLineTo(qt_real_to_fixed(nextLine.x1()), qt_real_to_fixed(nextLine.y1()));
return;
diff --git a/src/network/bearer/qnetworkconfigmanager.cpp b/src/network/bearer/qnetworkconfigmanager.cpp
index 81b5e01d6a..cd87c3669c 100644
--- a/src/network/bearer/qnetworkconfigmanager.cpp
+++ b/src/network/bearer/qnetworkconfigmanager.cpp
@@ -233,19 +233,20 @@ QNetworkConfigurationManager::QNetworkConfigurationManager(QObject *parent)
: QObject(parent)
{
QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
-
- connect(priv, SIGNAL(configurationAdded(QNetworkConfiguration)),
- this, SIGNAL(configurationAdded(QNetworkConfiguration)));
- connect(priv, SIGNAL(configurationRemoved(QNetworkConfiguration)),
- this, SIGNAL(configurationRemoved(QNetworkConfiguration)));
- connect(priv, SIGNAL(configurationChanged(QNetworkConfiguration)),
- this, SIGNAL(configurationChanged(QNetworkConfiguration)));
- connect(priv, SIGNAL(onlineStateChanged(bool)),
- this, SIGNAL(onlineStateChanged(bool)));
- connect(priv, SIGNAL(configurationUpdateComplete()),
- this, SIGNAL(updateCompleted()));
-
- priv->enablePolling();
+ if (priv) {
+ connect(priv, SIGNAL(configurationAdded(QNetworkConfiguration)),
+ this, SIGNAL(configurationAdded(QNetworkConfiguration)));
+ connect(priv, SIGNAL(configurationRemoved(QNetworkConfiguration)),
+ this, SIGNAL(configurationRemoved(QNetworkConfiguration)));
+ connect(priv, SIGNAL(configurationChanged(QNetworkConfiguration)),
+ this, SIGNAL(configurationChanged(QNetworkConfiguration)));
+ connect(priv, SIGNAL(onlineStateChanged(bool)),
+ this, SIGNAL(onlineStateChanged(bool)));
+ connect(priv, SIGNAL(configurationUpdateComplete()),
+ this, SIGNAL(updateCompleted()));
+
+ priv->enablePolling();
+ }
}
/*!
diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp
index 471d322998..1636bcee97 100644
--- a/src/network/bearer/qnetworksession.cpp
+++ b/src/network/bearer/qnetworksession.cpp
@@ -258,7 +258,8 @@ QNetworkSession::QNetworkSession(const QNetworkConfiguration &connectionConfig,
// invalid configuration
if (!connectionConfig.identifier().isEmpty()) {
- const auto engines = qNetworkConfigurationManagerPrivate()->engines();
+ auto priv = qNetworkConfigurationManagerPrivate();
+ const auto engines = priv ? priv->engines() : QList<QBearerEngine *>();
for (QBearerEngine *engine : engines) {
if (engine->hasIdentifier(connectionConfig.identifier())) {
d = engine->createSessionBackend();
diff --git a/src/platformsupport/linuxaccessibility/bridge.cpp b/src/platformsupport/linuxaccessibility/bridge.cpp
index a96fe258df..fdc8cd3198 100644
--- a/src/platformsupport/linuxaccessibility/bridge.cpp
+++ b/src/platformsupport/linuxaccessibility/bridge.cpp
@@ -265,6 +265,8 @@ static RoleMapping map[] = {
//: Role of an accessible object
{ QAccessible::Desktop, ATSPI_ROLE_DESKTOP_FRAME, QT_TRANSLATE_NOOP("QSpiAccessibleBridge", "desktop") },
//: Role of an accessible object
+ { QAccessible::Notification, ATSPI_ROLE_NOTIFICATION, QT_TRANSLATE_NOOP("QSpiAccessibleBridge", "notification") },
+ //: Role of an accessible object
{ QAccessible::UserRole, ATSPI_ROLE_UNKNOWN, QT_TRANSLATE_NOOP("QSpiAccessibleBridge", "unknown") }
};
diff --git a/src/plugins/bearer/qnetworksession_impl.cpp b/src/plugins/bearer/qnetworksession_impl.cpp
index a09ae72cb5..c6b678ab20 100644
--- a/src/plugins/bearer/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/qnetworksession_impl.cpp
@@ -56,12 +56,13 @@ QT_BEGIN_NAMESPACE
static QBearerEngineImpl *getEngineFromId(const QString &id)
{
QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
-
- const auto engines = priv->engines();
- for (QBearerEngine *engine : engines) {
- QBearerEngineImpl *engineImpl = qobject_cast<QBearerEngineImpl *>(engine);
- if (engineImpl && engineImpl->hasIdentifier(id))
- return engineImpl;
+ if (priv) {
+ const auto engines = priv->engines();
+ for (QBearerEngine *engine : engines) {
+ QBearerEngineImpl *engineImpl = qobject_cast<QBearerEngineImpl *>(engine);
+ if (engineImpl && engineImpl->hasIdentifier(id))
+ return engineImpl;
+ }
}
return 0;
diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp
index db40c30d7d..fa07af8c46 100644
--- a/src/plugins/platforms/android/qandroidinputcontext.cpp
+++ b/src/plugins/platforms/android/qandroidinputcontext.cpp
@@ -64,29 +64,33 @@
QT_BEGIN_NAMESPACE
-template <typename T>
-class ScopedValueChangeBack
+namespace {
+
+class BatchEditLock
{
public:
- ScopedValueChangeBack(T &variable, T newValue)
- : m_oldValue(variable),
- m_variable(variable)
- {
- m_variable = newValue;
- }
- inline void setOldValue()
+
+ explicit BatchEditLock(QAndroidInputContext *context)
+ : m_context(context)
{
- m_variable = m_oldValue;
+ m_context->beginBatchEdit();
}
- ~ScopedValueChangeBack()
+
+ ~BatchEditLock()
{
- setOldValue();
+ m_context->endBatchEdit();
}
+
+ BatchEditLock(const BatchEditLock &) = delete;
+ BatchEditLock &operator=(const BatchEditLock &) = delete;
+
private:
- T m_oldValue;
- T &m_variable;
+
+ QAndroidInputContext *m_context;
};
+} // namespace anonymous
+
static QAndroidInputContext *m_androidInputContext = 0;
static char const *const QtNativeInputConnectionClassName = "org/qtproject/qt5/android/QtNativeInputConnection";
static char const *const QtExtractedTextClassName = "org/qtproject/qt5/android/QtExtractedText";
@@ -423,8 +427,12 @@ static QRect inputItemRectangle()
}
QAndroidInputContext::QAndroidInputContext()
- : QPlatformInputContext(), m_composingTextStart(-1), m_blockUpdateSelection(false),
- m_handleMode(Hidden), m_batchEditNestingLevel(0), m_focusObject(0)
+ : QPlatformInputContext()
+ , m_composingTextStart(-1)
+ , m_composingCursor(-1)
+ , m_handleMode(Hidden)
+ , m_batchEditNestingLevel(0)
+ , m_focusObject(0)
{
jclass clazz = QJNIEnvironmentPrivate::findClass(QtNativeInputConnectionClassName);
if (Q_UNLIKELY(!clazz)) {
@@ -565,13 +573,13 @@ void QAndroidInputContext::reset()
void QAndroidInputContext::commit()
{
- finishComposingText();
+ focusObjectStopComposing();
}
void QAndroidInputContext::updateCursorPosition()
{
QSharedPointer<QInputMethodQueryEvent> query = focusObjectInputMethodQuery();
- if (!query.isNull() && !m_blockUpdateSelection && !m_batchEditNestingLevel) {
+ if (!query.isNull() && m_batchEditNestingLevel == 0) {
const int cursorPos = getAbsoluteCursorPosition(query);
const int composeLength = m_composingText.length();
@@ -579,24 +587,29 @@ void QAndroidInputContext::updateCursorPosition()
if (m_composingText.isEmpty() != (m_composingTextStart == -1))
qWarning() << "Input method out of sync" << m_composingText << m_composingTextStart;
- int realCursorPosition = cursorPos;
- int realAnchorPosition = cursorPos;
+ int realSelectionStart = cursorPos;
+ int realSelectionEnd = cursorPos;
int cpos = query->value(Qt::ImCursorPosition).toInt();
int anchor = query->value(Qt::ImAnchorPosition).toInt();
if (cpos != anchor) {
if (!m_composingText.isEmpty()) {
qWarning("Selecting text while preediting may give unpredictable results.");
- finishComposingText();
+ focusObjectStopComposing();
}
int blockPos = getBlockPosition(query);
- realCursorPosition = blockPos + cpos;
- realAnchorPosition = blockPos + anchor;
+ realSelectionStart = blockPos + cpos;
+ realSelectionEnd = blockPos + anchor;
}
// Qt's idea of the cursor position is the start of the preedit area, so we maintain our own preedit cursor pos
- if (!m_composingText.isEmpty())
- realCursorPosition = realAnchorPosition = m_composingCursor;
- QtAndroidInput::updateSelection(realCursorPosition, realAnchorPosition,
+ if (focusObjectIsComposing())
+ realSelectionStart = realSelectionEnd = m_composingCursor;
+
+ // Some keyboards misbahave when selStart > selEnd
+ if (realSelectionStart > realSelectionEnd)
+ std::swap(realSelectionStart, realSelectionEnd);
+
+ QtAndroidInput::updateSelection(realSelectionStart, realSelectionEnd,
m_composingTextStart, m_composingTextStart + composeLength); // pre-edit text
}
}
@@ -666,13 +679,11 @@ void QAndroidInputContext::updateSelectionHandles()
*/
void QAndroidInputContext::handleLocationChanged(int handleId, int x, int y)
{
- if (m_batchEditNestingLevel.load() || m_blockUpdateSelection) {
+ if (m_batchEditNestingLevel != 0) {
qWarning() << "QAndroidInputContext::handleLocationChanged returned";
return;
}
- finishComposingText();
-
auto im = qGuiApp->inputMethod();
auto leftRect = im->cursorRectangle();
// The handle is down of the cursor, but we want the position in the middle.
@@ -682,63 +693,96 @@ void QAndroidInputContext::handleLocationChanged(int handleId, int x, int y)
: QHighDpiScaling::factor(QtAndroid::androidPlatformIntegration()->screen());
QPointF point(x / pixelDensity, y / pixelDensity);
point.setY(point.y() - leftRect.width() / 2);
- if (handleId == 1) {
- setSelectionOnFocusObject(point, point);
- return;
- }
- QInputMethodQueryEvent query(Qt::ImCursorPosition | Qt::ImAnchorPosition | Qt::ImCurrentSelection);
+ QInputMethodQueryEvent query(Qt::ImCursorPosition | Qt::ImAnchorPosition
+ | Qt::ImAbsolutePosition | Qt::ImCurrentSelection);
QCoreApplication::sendEvent(m_focusObject, &query);
int cpos = query.value(Qt::ImCursorPosition).toInt();
int anchor = query.value(Qt::ImAnchorPosition).toInt();
- bool rtl = query.value(Qt::ImCurrentSelection).toString().isRightToLeft();
auto rightRect = im->anchorRectangle();
if (cpos > anchor)
std::swap(leftRect, rightRect);
- auto checkLeftHandle = [&rightRect](QPointF &handlePos) {
- if (handlePos.y() > rightRect.center().y())
- handlePos.setY(rightRect.center().y()); // adjust Y handle pos
- if (handlePos.y() >= rightRect.y() && handlePos.y() <= rightRect.bottom() && handlePos.x() >= rightRect.x())
- return false; // same line and wrong X pos ?
- return true;
- };
-
- auto checkRtlRightHandle = [&rightRect](QPointF &handlePos) {
- if (handlePos.y() > rightRect.center().y())
- handlePos.setY(rightRect.center().y()); // adjust Y handle pos
- if (handlePos.y() >= rightRect.y() && handlePos.y() <= rightRect.bottom() && rightRect.x() >= handlePos.x())
- return false; // same line and wrong X pos ?
- return true;
- };
-
- auto checkRightHandle = [&leftRect](QPointF &handlePos) {
- if (handlePos.y() < leftRect.center().y())
- handlePos.setY(leftRect.center().y()); // adjust Y handle pos
- if (handlePos.y() >= leftRect.y() && handlePos.y() <= leftRect.bottom() && leftRect.x() >= handlePos.x())
- return false; // same line and wrong X pos ?
- return true;
- };
-
- auto checkRtlLeftHandle = [&leftRect](QPointF &handlePos) {
- if (handlePos.y() < leftRect.center().y())
- handlePos.setY(leftRect.center().y()); // adjust Y handle pos
- if (handlePos.y() >= leftRect.y() && handlePos.y() <= leftRect.bottom() && handlePos.x() >= leftRect.x())
- return false; // same line and wrong X pos ?
- return true;
- };
-
- if (handleId == 2) {
- QPointF rightPoint(rightRect.center());
- if ((!rtl && !checkLeftHandle(point)) || (rtl && !checkRtlRightHandle(point)))
- return;
- setSelectionOnFocusObject(point, rightPoint);
+ // Do not allow dragging left handle below right handle, or right handle above left handle
+ if (handleId == 2 && point.y() > rightRect.center().y()) {
+ point.setY(rightRect.center().y());
+ } else if (handleId == 3 && point.y() < leftRect.center().y()) {
+ point.setY(leftRect.center().y());
+ }
+
+ const QPointF pointLocal = im->inputItemTransform().inverted().map(point);
+ bool ok;
+ const int handlePos =
+ QInputMethod::queryFocusObject(Qt::ImCursorPosition, pointLocal).toInt(&ok);
+ if (!ok)
+ return;
+
+ int newCpos = cpos;
+ int newAnchor = anchor;
+ if (newAnchor > newCpos)
+ std::swap(newAnchor, newCpos);
+
+ if (handleId == 1) {
+ newCpos = handlePos;
+ newAnchor = handlePos;
+ } else if (handleId == 2) {
+ newAnchor = handlePos;
} else if (handleId == 3) {
- QPointF leftPoint(leftRect.center());
- if ((!rtl && !checkRightHandle(point)) || (rtl && !checkRtlLeftHandle(point)))
+ newCpos = handlePos;
+ }
+
+ /*
+ Do not allow clearing selection by dragging selection handles and do not allow swapping
+ selection handles for consistency with Android's native text editing controls. Ensure that at
+ least one symbol remains selected.
+ */
+ if ((handleId == 2 || handleId == 3) && newCpos <= newAnchor) {
+ QTextBoundaryFinder finder(QTextBoundaryFinder::Grapheme,
+ query.value(Qt::ImCurrentSelection).toString());
+
+ const int oldSelectionStartPos = qMin(cpos, anchor);
+
+ if (handleId == 2) {
+ finder.toEnd();
+ finder.toPreviousBoundary();
+ newAnchor = finder.position() + oldSelectionStartPos;
+ } else {
+ finder.toStart();
+ finder.toNextBoundary();
+ newCpos = finder.position() + oldSelectionStartPos;
+ }
+ }
+
+ // Check if handle has been dragged far enough
+ if (!focusObjectIsComposing() && newCpos == cpos && newAnchor == anchor)
+ return;
+
+ /*
+ If the editor is currently in composing state, we have to compare newCpos with
+ m_composingCursor instead of cpos. And since there is nothing to compare with newAnchor, we
+ perform the check only when user drags the cursor handle.
+ */
+ if (focusObjectIsComposing() && handleId == 1) {
+ int absoluteCpos = query.value(Qt::ImAbsolutePosition).toInt(&ok);
+ if (!ok)
+ absoluteCpos = cpos;
+ const int blockPos = absoluteCpos - cpos;
+
+ if (blockPos + newCpos == m_composingCursor)
return;
- setSelectionOnFocusObject(leftPoint, point);
}
+
+ BatchEditLock batchEditLock(this);
+
+ focusObjectStopComposing();
+
+ QList<QInputMethodEvent::Attribute> attributes;
+ attributes.append({ QInputMethodEvent::Selection, newAnchor, newCpos - newAnchor });
+ if (newCpos != newAnchor)
+ attributes.append({ QInputMethodEvent::Cursor, 0, 0 });
+
+ QInputMethodEvent event(QString(), attributes);
+ QGuiApplication::sendEvent(m_focusObject, &event);
}
void QAndroidInputContext::touchDown(int x, int y)
@@ -748,7 +792,7 @@ void QAndroidInputContext::touchDown(int x, int y)
m_handleMode = ShowCursor;
// The VK will appear in a moment, stop the timer
m_hideCursorHandleTimer.stop();
- finishComposingText();
+ focusObjectStopComposing();
updateSelectionHandles();
}
}
@@ -760,13 +804,19 @@ void QAndroidInputContext::longPress(int x, int y)
return;
if (m_focusObject && inputItemRectangle().contains(x, y)) {
- finishComposingText();
+ BatchEditLock batchEditLock(this);
+
+ focusObjectStopComposing();
// Release left button, otherwise the following events will cancel the menu popup
QtAndroidInput::releaseMouse(x, y);
- handleLocationChanged(1, x, y);
- ScopedValueChangeBack<bool> svcb(m_blockUpdateSelection, true);
+ const double pixelDensity =
+ QGuiApplication::focusWindow()
+ ? QHighDpiScaling::factor(QGuiApplication::focusWindow())
+ : QHighDpiScaling::factor(QtAndroid::androidPlatformIntegration()->screen());
+ const QPointF touchPoint(x / pixelDensity, y / pixelDensity);
+ setSelectionOnFocusObject(touchPoint, touchPoint);
QInputMethodQueryEvent query(Qt::ImCursorPosition | Qt::ImAnchorPosition | Qt::ImTextBeforeCursor | Qt::ImTextAfterCursor);
QCoreApplication::sendEvent(m_focusObject, &query);
@@ -905,6 +955,7 @@ void QAndroidInputContext::clear()
{
m_composingText.clear();
m_composingTextStart = -1;
+ m_composingCursor = -1;
m_extractedText.clear();
}
@@ -912,9 +963,8 @@ void QAndroidInputContext::clear()
void QAndroidInputContext::setFocusObject(QObject *object)
{
if (object != m_focusObject) {
+ focusObjectStopComposing();
m_focusObject = object;
- if (!m_composingText.isEmpty())
- finishComposingText();
reset();
}
QPlatformInputContext::setFocusObject(object);
@@ -929,78 +979,135 @@ jboolean QAndroidInputContext::beginBatchEdit()
jboolean QAndroidInputContext::endBatchEdit()
{
- if (--m_batchEditNestingLevel == 0 && !m_blockUpdateSelection) //ending batch edit mode
+ if (--m_batchEditNestingLevel == 0) { //ending batch edit mode
+ focusObjectStartComposing();
updateCursorPosition();
+ }
return JNI_TRUE;
}
/*
- Android docs say: If composing, replace compose text with \a text.
- Otherwise insert \a text at current cursor position.
-
- The cursor should then be moved to newCursorPosition. If > 0, this is
- relative to the end of the text - 1; if <= 0, this is relative to the start
- of the text. updateSelection() needs to be called.
+ Android docs say: This behaves like calling setComposingText(text, newCursorPosition) then
+ finishComposingText().
*/
jboolean QAndroidInputContext::commitText(const QString &text, jint newCursorPosition)
{
- ScopedValueChangeBack<bool> svcb(m_blockUpdateSelection, true);
- QInputMethodEvent event;
- event.setCommitString(text);
- sendInputMethodEvent(&event);
- clear();
-
- // Qt has now put the cursor at the end of the text, corresponding to newCursorPosition == 1
- if (newCursorPosition != 1) {
- QSharedPointer<QInputMethodQueryEvent> query = focusObjectInputMethodQuery();
- if (!query.isNull()) {
- QList<QInputMethodEvent::Attribute> attributes;
- const int localPos = query->value(Qt::ImCursorPosition).toInt();
- const int newLocalPos = newCursorPosition > 0
- ? localPos + newCursorPosition - 1
- : localPos - text.length() + newCursorPosition;
- //move the cursor
- attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Selection,
- newLocalPos, 0));
- }
- }
- svcb.setOldValue();
- updateCursorPosition();
- return JNI_TRUE;
+ BatchEditLock batchEditLock(this);
+ return setComposingText(text, newCursorPosition) && finishComposingText();
}
jboolean QAndroidInputContext::deleteSurroundingText(jint leftLength, jint rightLength)
{
+ BatchEditLock batchEditLock(this);
+
+ focusObjectStopComposing();
+
QSharedPointer<QInputMethodQueryEvent> query = focusObjectInputMethodQuery();
if (query.isNull())
return JNI_TRUE;
- m_composingText.clear();
- m_composingTextStart = -1;
-
if (leftLength < 0) {
rightLength += -leftLength;
leftLength = 0;
}
+ const int initialBlockPos = getBlockPosition(query);
+ const int initialCursorPos = getAbsoluteCursorPosition(query);
+ const int initialAnchorPos = initialBlockPos + query->value(Qt::ImAnchorPosition).toInt();
+
+ /*
+ According to documentation, we should delete leftLength characters before current selection
+ and rightLength characters after current selection (without affecting selection). But that is
+ absolutely not what Android's native EditText does. It deletes leftLength characters before
+ min(selection start, composing region start) and rightLength characters after max(selection
+ end, composing region end). There are no known keyboards that depend on this behavior, but
+ it is better to be consistent with EditText behavior, because there definetly should be no
+ keyboards that depend on documented behavior.
+ */
+ const int leftEnd =
+ m_composingText.isEmpty()
+ ? qMin(initialCursorPos, initialAnchorPos)
+ : qMin(qMin(initialCursorPos, initialAnchorPos), m_composingTextStart);
+
+ const int rightBegin =
+ m_composingText.isEmpty()
+ ? qMax(initialCursorPos, initialAnchorPos)
+ : qMax(qMax(initialCursorPos, initialAnchorPos),
+ m_composingTextStart + m_composingText.length());
+
+ int textBeforeCursorLen;
+ int textAfterCursorLen;
+
QVariant textBeforeCursor = query->value(Qt::ImTextBeforeCursor);
QVariant textAfterCursor = query->value(Qt::ImTextAfterCursor);
if (textBeforeCursor.isValid() && textAfterCursor.isValid()) {
- leftLength = qMin(leftLength, textBeforeCursor.toString().length());
- rightLength = qMin(rightLength, textAfterCursor.toString().length());
+ textBeforeCursorLen = textBeforeCursor.toString().length();
+ textAfterCursorLen = textAfterCursor.toString().length();
} else {
- int cursorPos = query->value(Qt::ImCursorPosition).toInt();
- leftLength = qMin(leftLength, cursorPos);
- rightLength = qMin(rightLength, query->value(Qt::ImSurroundingText).toString().length() - cursorPos);
+ textBeforeCursorLen = initialCursorPos - initialBlockPos;
+ textAfterCursorLen =
+ query->value(Qt::ImSurroundingText).toString().length() - textBeforeCursorLen;
}
+ leftLength = qMin(qMax(0, textBeforeCursorLen - (initialCursorPos - leftEnd)), leftLength);
+ rightLength = qMin(qMax(0, textAfterCursorLen - (rightBegin - initialCursorPos)), rightLength);
+
if (leftLength == 0 && rightLength == 0)
return JNI_TRUE;
- QInputMethodEvent event;
- event.setCommitString(QString(), -leftLength, leftLength+rightLength);
- sendInputMethodEvent(&event);
- clear();
+ if (leftEnd == rightBegin) {
+ // We have no selection and no composing region; we can do everything using one event
+ QInputMethodEvent event;
+ event.setCommitString({}, -leftLength, leftLength + rightLength);
+ QGuiApplication::sendEvent(m_focusObject, &event);
+ } else {
+ if (initialCursorPos != initialAnchorPos) {
+ QInputMethodEvent event({}, {
+ { QInputMethodEvent::Selection, initialCursorPos - initialBlockPos, 0 }
+ });
+
+ QGuiApplication::sendEvent(m_focusObject, &event);
+ }
+
+ int currentCursorPos = initialCursorPos;
+
+ if (rightLength > 0) {
+ QInputMethodEvent event;
+ event.setCommitString({}, rightBegin - currentCursorPos, rightLength);
+ QGuiApplication::sendEvent(m_focusObject, &event);
+
+ currentCursorPos = rightBegin;
+ }
+
+ if (leftLength > 0) {
+ const int leftBegin = leftEnd - leftLength;
+
+ QInputMethodEvent event;
+ event.setCommitString({}, leftBegin - currentCursorPos, leftLength);
+ QGuiApplication::sendEvent(m_focusObject, &event);
+
+ currentCursorPos = leftBegin;
+
+ if (!m_composingText.isEmpty())
+ m_composingTextStart -= leftLength;
+ }
+
+ // Restore cursor position or selection
+ if (currentCursorPos != initialCursorPos - leftLength
+ || initialCursorPos != initialAnchorPos) {
+ // If we have deleted a newline character, we are now in a new block
+ const int currentBlockPos = getBlockPosition(
+ focusObjectInputMethodQuery(Qt::ImAbsolutePosition | Qt::ImCursorPosition));
+
+ QInputMethodEvent event({}, {
+ { QInputMethodEvent::Selection, initialCursorPos - leftLength - currentBlockPos,
+ initialAnchorPos - initialCursorPos },
+ { QInputMethodEvent::Cursor, 0, 0 }
+ });
+
+ QGuiApplication::sendEvent(m_focusObject, &event);
+ }
+ }
return JNI_TRUE;
}
@@ -1008,16 +1115,70 @@ jboolean QAndroidInputContext::deleteSurroundingText(jint leftLength, jint right
// Android docs say the cursor must not move
jboolean QAndroidInputContext::finishComposingText()
{
- if (m_composingText.isEmpty())
- return JNI_TRUE; // not composing
+ BatchEditLock batchEditLock(this);
+
+ if (!focusObjectStopComposing())
+ return JNI_FALSE;
+
+ clear();
+ return JNI_TRUE;
+}
+
+bool QAndroidInputContext::focusObjectIsComposing() const
+{
+ return m_composingCursor != -1;
+}
+
+void QAndroidInputContext::focusObjectStartComposing()
+{
+ if (focusObjectIsComposing() || m_composingText.isEmpty())
+ return;
+
+ // Composing strings containing newline characters are rare and may cause problems
+ if (m_composingText.contains(QLatin1Char('\n')))
+ return;
+
+ QSharedPointer<QInputMethodQueryEvent> query = focusObjectInputMethodQuery();
+ if (!query)
+ return;
+
+ if (query->value(Qt::ImCursorPosition).toInt() != query->value(Qt::ImAnchorPosition).toInt())
+ return;
+
+ const int absoluteCursorPos = getAbsoluteCursorPosition(query);
+ if (absoluteCursorPos < m_composingTextStart
+ || absoluteCursorPos > m_composingTextStart + m_composingText.length())
+ return;
+
+ m_composingCursor = absoluteCursorPos;
+
+ QTextCharFormat underlined;
+ underlined.setFontUnderline(true);
+
+ QInputMethodEvent event(m_composingText, {
+ { QInputMethodEvent::Cursor, absoluteCursorPos - m_composingTextStart, 1 },
+ { QInputMethodEvent::TextFormat, 0, m_composingText.length(), underlined }
+ });
+
+ event.setCommitString({}, m_composingTextStart - absoluteCursorPos, m_composingText.length());
+
+ QGuiApplication::sendEvent(m_focusObject, &event);
+}
+
+bool QAndroidInputContext::focusObjectStopComposing()
+{
+ if (!focusObjectIsComposing())
+ return true; // not composing
QSharedPointer<QInputMethodQueryEvent> query = focusObjectInputMethodQuery();
if (query.isNull())
- return JNI_FALSE;
+ return false;
const int blockPos = getBlockPosition(query);
const int localCursorPos = m_composingCursor - blockPos;
+ m_composingCursor = -1;
+
// Moving Qt's cursor to where the preedit cursor used to be
QList<QInputMethodEvent::Attribute> attributes;
attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Selection, localCursorPos, 0));
@@ -1025,9 +1186,8 @@ jboolean QAndroidInputContext::finishComposingText()
QInputMethodEvent event(QString(), attributes);
event.setCommitString(m_composingText);
sendInputMethodEvent(&event);
- clear();
- return JNI_TRUE;
+ return true;
}
jint QAndroidInputContext::getCursorCapsMode(jint /*reqModes*/)
@@ -1067,52 +1227,51 @@ const QAndroidInputContext::ExtractedText &QAndroidInputContext::getExtractedTex
// updateExtractedText(View, int, ExtractedText) whenever you call
// updateSelection(View, int, int, int, int)." QTBUG-37980
- QSharedPointer<QInputMethodQueryEvent> query = focusObjectInputMethodQuery();
+ QSharedPointer<QInputMethodQueryEvent> query = focusObjectInputMethodQuery(
+ Qt::ImCursorPosition | Qt::ImAbsolutePosition | Qt::ImAnchorPosition);
if (query.isNull())
return m_extractedText;
- int localPos = query->value(Qt::ImCursorPosition).toInt(); //position before pre-edit text relative to the current block
- int blockPos = getBlockPosition(query);
- QString blockText = query->value(Qt::ImSurroundingText).toString();
- int composeLength = m_composingText.length();
-
- if (composeLength > 0) {
- //Qt doesn't give us the preedit text, so we have to insert it at the correct position
- int localComposePos = m_composingTextStart - blockPos;
- blockText = blockText.leftRef(localComposePos) + m_composingText + blockText.midRef(localComposePos);
- }
-
- int cpos = localPos + composeLength; //actual cursor pos relative to the current block
-
- int localOffset = 0; // start of extracted text relative to the current block
- if (blockPos > 0) {
- QString prevBlockEnding = query->value(Qt::ImTextBeforeCursor).toString();
- prevBlockEnding.chop(localPos);
- if (prevBlockEnding.endsWith(QLatin1Char('\n'))) {
- localOffset = -qMin(20, prevBlockEnding.length());
- blockText = prevBlockEnding.right(-localOffset) + blockText;
- }
- }
+ const int cursorPos = getAbsoluteCursorPosition(query);
+ const int blockPos = getBlockPosition(query);
// It is documented that we should try to return hintMaxChars
- // characters, but that's not what the standard Android controls do, and
+ // characters, but standard Android controls always return all text, and
// there are input methods out there that (surprise) seem to depend on
// what happens in reality rather than what's documented.
- m_extractedText.text = blockText;
- m_extractedText.startOffset = blockPos + localOffset;
+ QVariant textBeforeCursor = QInputMethod::queryFocusObject(Qt::ImTextBeforeCursor, INT_MAX);
+ QVariant textAfterCursor = QInputMethod::queryFocusObject(Qt::ImTextAfterCursor, INT_MAX);
+ if (textBeforeCursor.isValid() && textAfterCursor.isValid()) {
+ if (focusObjectIsComposing()) {
+ m_extractedText.text =
+ textBeforeCursor.toString() + m_composingText + textAfterCursor.toString();
+ } else {
+ m_extractedText.text = textBeforeCursor.toString() + textAfterCursor.toString();
+ }
+
+ m_extractedText.startOffset = qMax(0, cursorPos - textBeforeCursor.toString().length());
+ } else {
+ m_extractedText.text = focusObjectInputMethodQuery(Qt::ImSurroundingText)
+ ->value(Qt::ImSurroundingText).toString();
+
+ if (focusObjectIsComposing())
+ m_extractedText.text.insert(cursorPos - blockPos, m_composingText);
- const QString &selection = query->value(Qt::ImCurrentSelection).toString();
- const int selLen = selection.length();
- if (selLen) {
- m_extractedText.selectionStart = query->value(Qt::ImAnchorPosition).toInt() - localOffset;
- m_extractedText.selectionEnd = m_extractedText.selectionStart + selLen;
- } else if (composeLength > 0) {
+ m_extractedText.startOffset = blockPos;
+ }
+
+ if (focusObjectIsComposing()) {
m_extractedText.selectionStart = m_composingCursor - m_extractedText.startOffset;
- m_extractedText.selectionEnd = m_composingCursor - m_extractedText.startOffset;
- } else {
- m_extractedText.selectionStart = cpos - localOffset;
- m_extractedText.selectionEnd = cpos - localOffset;
+ m_extractedText.selectionEnd = m_extractedText.selectionStart;
+ } else {
+ m_extractedText.selectionStart = cursorPos - m_extractedText.startOffset;
+ m_extractedText.selectionEnd =
+ blockPos + query->value(Qt::ImAnchorPosition).toInt() - m_extractedText.startOffset;
+
+ // Some keyboards misbehave when selectionStart > selectionEnd
+ if (m_extractedText.selectionStart > m_extractedText.selectionEnd)
+ std::swap(m_extractedText.selectionStart, m_extractedText.selectionEnd);
}
return m_extractedText;
@@ -1147,10 +1306,20 @@ QString QAndroidInputContext::getTextAfterCursor(jint length, jint /*flags*/)
}
}
- // Controls do not report preedit text, so we have to add it
- if (!m_composingText.isEmpty()) {
+ if (focusObjectIsComposing()) {
+ // Controls do not report preedit text, so we have to add it
const int cursorPosInsidePreedit = m_composingCursor - m_composingTextStart;
text = m_composingText.midRef(cursorPosInsidePreedit) + text;
+ } else {
+ // We must not return selected text if there is any
+ QSharedPointer<QInputMethodQueryEvent> query =
+ focusObjectInputMethodQuery(Qt::ImCursorPosition | Qt::ImAnchorPosition);
+ if (query) {
+ const int cursorPos = query->value(Qt::ImCursorPosition).toInt();
+ const int anchorPos = query->value(Qt::ImAnchorPosition).toInt();
+ if (anchorPos > cursorPos)
+ text.remove(0, anchorPos - cursorPos);
+ }
}
text.truncate(length);
@@ -1177,10 +1346,20 @@ QString QAndroidInputContext::getTextBeforeCursor(jint length, jint /*flags*/)
}
}
- // Controls do not report preedit text, so we have to add it
- if (!m_composingText.isEmpty()) {
+ if (focusObjectIsComposing()) {
+ // Controls do not report preedit text, so we have to add it
const int cursorPosInsidePreedit = m_composingCursor - m_composingTextStart;
text += m_composingText.leftRef(cursorPosInsidePreedit);
+ } else {
+ // We must not return selected text if there is any
+ QSharedPointer<QInputMethodQueryEvent> query =
+ focusObjectInputMethodQuery(Qt::ImCursorPosition | Qt::ImAnchorPosition);
+ if (query) {
+ const int cursorPos = query->value(Qt::ImCursorPosition).toInt();
+ const int anchorPos = query->value(Qt::ImAnchorPosition).toInt();
+ if (anchorPos < cursorPos)
+ text.chop(cursorPos - anchorPos);
+ }
}
if (text.length() > length)
@@ -1189,11 +1368,13 @@ QString QAndroidInputContext::getTextBeforeCursor(jint length, jint /*flags*/)
}
/*
- Android docs say that this function should remove the current preedit text
- if any, and replace it with the given text. Any selected text should be
- removed. The cursor is then moved to newCursorPosition. If > 0, this is
- relative to the end of the text - 1; if <= 0, this is relative to the start
- of the text.
+ Android docs say that this function should:
+ - remove the current composing text, if there is any
+ - otherwise remove currently selected text, if there is any
+ - insert new text in place of old composing text or, if there was none, at current cursor position
+ - mark the inserted text as composing
+ - move cursor as specified by newCursorPosition: if > 0, it is relative to the end of inserted
+ text - 1; if <= 0, it is relative to the start of inserted text
*/
jboolean QAndroidInputContext::setComposingText(const QString &text, jint newCursorPosition)
@@ -1202,47 +1383,110 @@ jboolean QAndroidInputContext::setComposingText(const QString &text, jint newCur
if (query.isNull())
return JNI_FALSE;
- const int cursorPos = getAbsoluteCursorPosition(query);
- if (newCursorPosition > 0)
- newCursorPosition += text.length() - 1;
+ BatchEditLock batchEditLock(this);
+
+ const int absoluteCursorPos = getAbsoluteCursorPosition(query);
+ int absoluteAnchorPos = getBlockPosition(query) + query->value(Qt::ImAnchorPosition).toInt();
+
+ // If we have composing region and selection (and therefore focusObjectIsComposing() == false),
+ // we must clear selection so that we won't delete it when we will be replacing composing text
+ if (!m_composingText.isEmpty() && absoluteCursorPos != absoluteAnchorPos) {
+ const int cursorPos = query->value(Qt::ImCursorPosition).toInt();
+ QInputMethodEvent event({}, { { QInputMethodEvent::Selection, cursorPos, 0 } });
+ QGuiApplication::sendEvent(m_focusObject, &event);
+
+ absoluteAnchorPos = absoluteCursorPos;
+ }
+
+ // If we had no composing region, pretend that we had a zero-length composing region at current
+ // cursor position to simplify code. Also account for that we must delete selected text if there
+ // (still) is any.
+ const int effectiveAbsoluteCursorPos = qMin(absoluteCursorPos, absoluteAnchorPos);
+ if (m_composingTextStart == -1)
+ m_composingTextStart = effectiveAbsoluteCursorPos;
+ const int oldComposingTextLen = m_composingText.length();
m_composingText = text;
- m_composingTextStart = text.isEmpty() ? -1 : cursorPos;
- m_composingCursor = cursorPos + newCursorPosition;
- QList<QInputMethodEvent::Attribute> attributes;
- attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Cursor,
- newCursorPosition,
- 1));
- // Show compose text underlined
- QTextCharFormat underlined;
- underlined.setFontUnderline(true);
- attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat,0, text.length(),
- QVariant(underlined)));
- QInputMethodEvent event(m_composingText, attributes);
- sendInputMethodEvent(&event);
+ const int newAbsoluteCursorPos =
+ newCursorPosition <= 0
+ ? m_composingTextStart + newCursorPosition
+ : m_composingTextStart + m_composingText.length() + newCursorPosition - 1;
- QMetaObject::invokeMethod(this, "keyDown");
+ const bool focusObjectWasComposing = focusObjectIsComposing();
+
+ // Same checks as in focusObjectStartComposing()
+ if (!m_composingText.isEmpty() && !m_composingText.contains(QLatin1Char('\n'))
+ && newAbsoluteCursorPos >= m_composingTextStart
+ && newAbsoluteCursorPos <= m_composingTextStart + m_composingText.length())
+ m_composingCursor = newAbsoluteCursorPos;
+ else
+ m_composingCursor = -1;
- updateCursorPosition();
+ QInputMethodEvent event;
+ if (focusObjectIsComposing()) {
+ QTextCharFormat underlined;
+ underlined.setFontUnderline(true);
+
+ event = QInputMethodEvent(m_composingText, {
+ { QInputMethodEvent::TextFormat, 0, m_composingText.length(), underlined },
+ { QInputMethodEvent::Cursor, m_composingCursor - m_composingTextStart, 1 }
+ });
+
+ if (oldComposingTextLen > 0 && !focusObjectWasComposing) {
+ event.setCommitString({}, m_composingTextStart - effectiveAbsoluteCursorPos,
+ oldComposingTextLen);
+ }
+ } else {
+ event = QInputMethodEvent({}, {});
+
+ if (focusObjectWasComposing) {
+ event.setCommitString(m_composingText);
+ } else {
+ event.setCommitString(m_composingText,
+ m_composingTextStart - effectiveAbsoluteCursorPos,
+ oldComposingTextLen);
+ }
+ }
+
+ if (m_composingText.isEmpty())
+ clear();
+
+ QGuiApplication::sendEvent(m_focusObject, &event);
+
+ if (!focusObjectIsComposing() && newCursorPosition != 1) {
+ // Move cursor using a separate event because if we have inserted or deleted a newline
+ // character, then we are now inside an another block
+
+ const int newBlockPos = getBlockPosition(
+ focusObjectInputMethodQuery(Qt::ImCursorPosition | Qt::ImAbsolutePosition));
+
+ event = QInputMethodEvent({}, {
+ { QInputMethodEvent::Selection, newAbsoluteCursorPos - newBlockPos, 0 }
+ });
+
+ QGuiApplication::sendEvent(m_focusObject, &event);
+ }
+
+ keyDown();
return JNI_TRUE;
}
// Android docs say:
// * start may be after end, same meaning as if swapped
-// * this function should not trigger updateSelection
+// * this function should not trigger updateSelection, but Android's native EditText does trigger it
// * if start == end then we should stop composing
jboolean QAndroidInputContext::setComposingRegion(jint start, jint end)
{
+ BatchEditLock batchEditLock(this);
+
// Qt will not include the current preedit text in the query results, and interprets all
// parameters relative to the text excluding the preedit. The simplest solution is therefore to
// tell Qt that we commit the text before we set the new region. This may cause a little flicker, but is
// much more robust than trying to keep the two different world views in sync
- bool wasComposing = !m_composingText.isEmpty();
- if (wasComposing)
- finishComposingText();
+ finishComposingText();
QSharedPointer<QInputMethodQueryEvent> query = focusObjectInputMethodQuery();
if (query.isNull())
@@ -1253,54 +1497,42 @@ jboolean QAndroidInputContext::setComposingRegion(jint start, jint end)
if (start > end)
qSwap(start, end);
- /*
- start and end are cursor positions, not character positions,
- i.e. selecting the first character is done by start == 0 and end == 1,
- and start == end means no character selected
-
- Therefore, the length of the region is end - start
- */
-
- int length = end - start;
- int localPos = query->value(Qt::ImCursorPosition).toInt();
- int blockPosition = getBlockPosition(query);
- int localStart = start - blockPosition; // Qt uses position inside block
- int currentCursor = wasComposing ? m_composingCursor : blockPosition + localPos;
-
- ScopedValueChangeBack<bool> svcb(m_blockUpdateSelection, true);
-
QString text = query->value(Qt::ImSurroundingText).toString();
+ int textOffset = getBlockPosition(query);
- m_composingText = text.mid(localStart, length);
- m_composingTextStart = start;
- m_composingCursor = currentCursor;
-
- //in the Qt text controls, the preedit is defined relative to the cursor position
- int relativeStart = localStart - localPos;
+ if (start < textOffset || end > textOffset + text.length()) {
+ const int cursorPos = query->value(Qt::ImCursorPosition).toInt();
- QList<QInputMethodEvent::Attribute> attributes;
+ if (end - textOffset > text.length()) {
+ const QString after = query->value(Qt::ImTextAfterCursor).toString();
+ const int additionalSuffixLen = after.length() - (text.length() - cursorPos);
- // Show compose text underlined
- QTextCharFormat underlined;
- underlined.setFontUnderline(true);
- attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat,0, length,
- QVariant(underlined)));
+ if (additionalSuffixLen > 0)
+ text += after.rightRef(additionalSuffixLen);
+ }
- // Keep the cursor position unchanged (don't move to end of preedit)
- attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, currentCursor - start, 1));
+ if (start < textOffset) {
+ QString before = query->value(Qt::ImTextBeforeCursor).toString();
+ before.chop(cursorPos);
- QInputMethodEvent event(m_composingText, attributes);
- event.setCommitString(QString(), relativeStart, length);
- sendInputMethodEvent(&event);
+ if (!before.isEmpty()) {
+ text = before + text;
+ textOffset -= before.length();
+ }
+ }
+ if (start < textOffset || end - textOffset > text.length()) {
#ifdef QT_DEBUG_ANDROID_IM_PROTOCOL
- QSharedPointer<QInputMethodQueryEvent> query2 = focusObjectInputMethodQuery();
- if (!query2.isNull()) {
- qDebug() << "Setting. Prev local cpos:" << localPos << "block pos:" <<blockPosition << "comp.start:" << m_composingTextStart << "rel.start:" << relativeStart << "len:" << length << "cpos attr:" << localPos - localStart;
- qDebug() << "New cursor pos" << getAbsoluteCursorPosition(query2);
- }
+ qWarning("setComposingRegion: failed to retrieve text from composing region");
#endif
+ return JNI_TRUE;
+ }
+ }
+
+ m_composingText = text.mid(start - textOffset, end - start);
+ m_composingTextStart = start;
+
return JNI_TRUE;
}
@@ -1310,15 +1542,18 @@ jboolean QAndroidInputContext::setSelection(jint start, jint end)
if (query.isNull())
return JNI_FALSE;
+ BatchEditLock batchEditLock(this);
+
int blockPosition = getBlockPosition(query);
int localCursorPos = start - blockPosition;
- QList<QInputMethodEvent::Attribute> attributes;
- if (!m_composingText.isEmpty() && start == end) {
+ if (focusObjectIsComposing() && start == end && start >= m_composingTextStart
+ && start <= m_composingTextStart + m_composingText.length()) {
// not actually changing the selection; just moving the
// preedit cursor
int localOldPos = query->value(Qt::ImCursorPosition).toInt();
int pos = localCursorPos - localOldPos;
+ QList<QInputMethodEvent::Attribute> attributes;
attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, pos, 1));
//but we have to tell Qt about the compose text all over again
@@ -1330,21 +1565,26 @@ jboolean QAndroidInputContext::setSelection(jint start, jint end)
QVariant(underlined)));
m_composingCursor = start;
+ QInputMethodEvent event(m_composingText, attributes);
+ QGuiApplication::sendEvent(m_focusObject, &event);
} else {
// actually changing the selection
+ focusObjectStopComposing();
+ QList<QInputMethodEvent::Attribute> attributes;
attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Selection,
localCursorPos,
end - start));
+ QInputMethodEvent event({}, attributes);
+ QGuiApplication::sendEvent(m_focusObject, &event);
}
- QInputMethodEvent event(m_composingText, attributes);
- sendInputMethodEvent(&event);
- updateCursorPosition();
return JNI_TRUE;
}
jboolean QAndroidInputContext::selectAll()
{
- finishComposingText();
+ BatchEditLock batchEditLock(this);
+
+ focusObjectStopComposing();
m_handleMode = ShowCursor;
sendShortcut(QKeySequence::SelectAll);
return JNI_TRUE;
@@ -1352,7 +1592,12 @@ jboolean QAndroidInputContext::selectAll()
jboolean QAndroidInputContext::cut()
{
+ BatchEditLock batchEditLock(this);
+
+ // This is probably not what native EditText would do, but normally if there is selection, then
+ // there will be no composing region
finishComposingText();
+
m_handleMode = ShowCursor;
sendShortcut(QKeySequence::Cut);
return JNI_TRUE;
@@ -1360,7 +1605,9 @@ jboolean QAndroidInputContext::cut()
jboolean QAndroidInputContext::copy()
{
- finishComposingText();
+ BatchEditLock batchEditLock(this);
+
+ focusObjectStopComposing();
m_handleMode = ShowCursor;
sendShortcut(QKeySequence::Copy);
return JNI_TRUE;
@@ -1374,7 +1621,11 @@ jboolean QAndroidInputContext::copyURL()
jboolean QAndroidInputContext::paste()
{
+ BatchEditLock batchEditLock(this);
+
+ // TODO: This is not what native EditText does
finishComposingText();
+
m_handleMode = ShowCursor;
sendShortcut(QKeySequence::Paste);
return JNI_TRUE;
@@ -1386,8 +1637,12 @@ void QAndroidInputContext::sendShortcut(const QKeySequence &sequence)
const int keys = sequence[i];
Qt::Key key = Qt::Key(keys & ~Qt::KeyboardModifierMask);
Qt::KeyboardModifiers mod = Qt::KeyboardModifiers(keys & Qt::KeyboardModifierMask);
- QGuiApplication::postEvent(m_focusObject, new QKeyEvent(QEvent::KeyPress, key, mod));
- QGuiApplication::postEvent(m_focusObject, new QKeyEvent(QEvent::KeyRelease, key, mod));
+
+ QKeyEvent pressEvent(QEvent::KeyPress, key, mod);
+ QKeyEvent releaseEvent(QEvent::KeyRelease, key, mod);
+
+ QGuiApplication::sendEvent(m_focusObject, &pressEvent);
+ QGuiApplication::sendEvent(m_focusObject, &releaseEvent);
}
}
diff --git a/src/plugins/platforms/android/qandroidinputcontext.h b/src/plugins/platforms/android/qandroidinputcontext.h
index bd3edb30f0..e9bfb98e66 100644
--- a/src/plugins/platforms/android/qandroidinputcontext.h
+++ b/src/plugins/platforms/android/qandroidinputcontext.h
@@ -151,6 +151,9 @@ private slots:
private:
void sendInputMethodEvent(QInputMethodEvent *event);
QSharedPointer<QInputMethodQueryEvent> focusObjectInputMethodQuery(Qt::InputMethodQueries queries = Qt::ImQueryAll);
+ bool focusObjectIsComposing() const;
+ void focusObjectStartComposing();
+ bool focusObjectStopComposing();
private:
ExtractedText m_extractedText;
@@ -158,9 +161,8 @@ private:
int m_composingTextStart;
int m_composingCursor;
QMetaObject::Connection m_updateCursorPosConnection;
- bool m_blockUpdateSelection;
HandleModes m_handleMode;
- QAtomicInt m_batchEditNestingLevel;
+ int m_batchEditNestingLevel;
QObject *m_focusObject;
QTimer m_hideCursorHandleTimer;
};
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h
index acddc3ecc8..2398e6351e 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.h
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.h
@@ -55,6 +55,7 @@ public:
QNSWindowBackingStore(QWindow *window);
~QNSWindowBackingStore();
+ void resize(const QSize &size, const QRegion &staticContents) override;
void flush(QWindow *, const QRegion &, const QPoint &) override;
private:
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
index c381f87844..01b4894324 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.mm
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
@@ -71,6 +71,24 @@ QImage::Format QNSWindowBackingStore::format() const
return QRasterBackingStore::format();
}
+void QNSWindowBackingStore::resize(const QSize &size, const QRegion &staticContents)
+{
+ qCDebug(lcQpaBackingStore) << "Resize requested to" << size;
+ QRasterBackingStore::resize(size, staticContents);
+
+ // The window shadow rendered by AppKit is based on the shape/content of the
+ // NSWindow surface. Technically any flush of the backingstore can result in
+ // a potentially new shape of the window, and would need a shadow invalidation,
+ // but this is likely too expensive to do at every flush for the few cases where
+ // clients change the shape dynamically. One case where we do know that the shadow
+ // likely needs invalidation, if the window has partially transparent content,
+ // is after a resize, where AppKit's default shadow may be based on the previous
+ // window content.
+ QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window()->handle());
+ if (cocoaWindow->isContentView() && !cocoaWindow->isOpaque())
+ cocoaWindow->m_needsInvalidateShadow = true;
+}
+
/*!
Flushes the given \a region from the specified \a window onto the
screen.
@@ -217,6 +235,7 @@ void QNSWindowBackingStore::flush(QWindow *window, const QRegion &region, const
QCocoaWindow *topLevelCocoaWindow = static_cast<QCocoaWindow *>(topLevelWindow->handle());
if (Q_UNLIKELY(topLevelCocoaWindow->m_needsInvalidateShadow)) {
+ qCDebug(lcQpaBackingStore) << "Invalidating window shadow for" << topLevelCocoaWindow;
[topLevelView.window invalidateShadow];
topLevelCocoaWindow->m_needsInvalidateShadow = false;
}
@@ -382,10 +401,11 @@ void QCALayerBackingStore::ensureBackBuffer()
bool QCALayerBackingStore::recreateBackBufferIfNeeded()
{
- const qreal devicePixelRatio = window()->devicePixelRatio();
+ const QCocoaWindow *platformWindow = static_cast<QCocoaWindow *>(window()->handle());
+ const qreal devicePixelRatio = platformWindow->devicePixelRatio();
QSize requestedBufferSize = m_requestedSize * devicePixelRatio;
- const NSView *backingStoreView = static_cast<QCocoaWindow *>(window()->handle())->view();
+ const NSView *backingStoreView = platformWindow->view();
Q_UNUSED(backingStoreView);
auto bufferSizeMismatch = [&](const QSize requested, const QSize actual) {
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
index 9771cd0289..69587a24be 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
@@ -191,6 +191,7 @@ public:
static void waitingObserverCallback(CFRunLoopObserverRef observer,
CFRunLoopActivity activity, void *info);
static void firstLoopEntry(CFRunLoopObserverRef ref, CFRunLoopActivity activity, void *info);
+ bool sendQueuedUserInputEvents();
void processPostedEvents();
};
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
index 84ffadea83..d3bb0711f0 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
@@ -377,16 +377,9 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
NSEvent* event = nil;
// First, send all previously excluded input events, if any:
- if (!excludeUserEvents) {
- while (!d->queuedUserInputEvents.isEmpty()) {
- event = static_cast<NSEvent *>(d->queuedUserInputEvents.takeFirst());
- if (!filterNativeEvent("NSEvent", event, nullptr)) {
- [NSApp sendEvent:event];
- retVal = true;
- }
- [event release];
- }
- }
+ if (d->sendQueuedUserInputEvents())
+ retVal = true;
+
// If Qt is used as a plugin, or as an extension in a native cocoa
// application, we should not run or stop NSApplication; This will be
@@ -843,6 +836,23 @@ void QCocoaEventDispatcherPrivate::waitingObserverCallback(CFRunLoopObserverRef,
emit static_cast<QCocoaEventDispatcher*>(info)->awake();
}
+bool QCocoaEventDispatcherPrivate::sendQueuedUserInputEvents()
+{
+ Q_Q(QCocoaEventDispatcher);
+ if (processEventsFlags & QEventLoop::ExcludeUserInputEvents)
+ return false;
+ bool didSendEvent = false;
+ while (!queuedUserInputEvents.isEmpty()) {
+ NSEvent *event = static_cast<NSEvent *>(queuedUserInputEvents.takeFirst());
+ if (!q->filterNativeEvent("NSEvent", event, nullptr)) {
+ [NSApp sendEvent:event];
+ didSendEvent = true;
+ }
+ [event release];
+ }
+ return didSendEvent;
+}
+
void QCocoaEventDispatcherPrivate::processPostedEvents()
{
if (blockSendPostedEvents) {
@@ -896,6 +906,7 @@ void QCocoaEventDispatcherPrivate::postedEventsSourceCallback(void *info)
d->maybeCancelWaitForMoreEvents();
return;
}
+ d->sendQueuedUserInputEvents();
d->processPostedEvents();
d->maybeCancelWaitForMoreEvents();
}
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 67b0cbdfe9..363a026e71 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -1011,16 +1011,16 @@ void QCocoaWindow::setMask(const QRegion &region)
} else {
m_view.layer.mask = nil;
}
- }
-
- if (isContentView()) {
- // Setting the mask requires invalidating the NSWindow shadow, but that needs
- // to happen after the backingstore has been redrawn, so that AppKit can pick
- // up the new window shape based on the backingstore content. Doing a display
- // directly here is not an option, as the window might not be exposed at this
- // time, and so would not result in an updated backingstore.
- m_needsInvalidateShadow = true;
- [m_view setNeedsDisplay:YES];
+ } else {
+ if (isContentView()) {
+ // Setting the mask requires invalidating the NSWindow shadow, but that needs
+ // to happen after the backingstore has been redrawn, so that AppKit can pick
+ // up the new window shape based on the backingstore content. Doing a display
+ // directly here is not an option, as the window might not be exposed at this
+ // time, and so would not result in an updated backingstore.
+ m_needsInvalidateShadow = true;
+ [m_view setNeedsDisplay:YES];
+ }
}
}
diff --git a/src/plugins/platforms/ios/quiview_accessibility.mm b/src/plugins/platforms/ios/quiview_accessibility.mm
index a3f4156a59..458ddcc9b8 100644
--- a/src/plugins/platforms/ios/quiview_accessibility.mm
+++ b/src/plugins/platforms/ios/quiview_accessibility.mm
@@ -101,6 +101,8 @@
- (id)accessibilityElementAtIndex:(NSInteger)index
{
[self initAccessibility];
+ if (index >= [m_accessibleElements count])
+ return nil;
return m_accessibleElements[index];
}
@@ -110,4 +112,10 @@
return [m_accessibleElements indexOfObject:element];
}
+- (NSArray *)accessibilityElements
+{
+ [self initAccessibility];
+ return m_accessibleElements;
+}
+
@end
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index de533cab08..38b9823d6b 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -77,6 +77,7 @@
#include <QtCore/qoperatingsystemversion.h>
#include <QtCore/qsysinfo.h>
#include <QtCore/qscopedpointer.h>
+#include <QtCore/quuid.h>
#include <QtCore/private/qsystemlibrary_p.h>
#include <QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h>
@@ -544,7 +545,7 @@ QString QWindowsContext::registerWindowClass(QString cname,
// each one has to have window class names with a unique name
// The first instance gets the unmodified name; if the class
// has already been registered by another instance of Qt then
- // add an instance-specific ID, the address of the window proc.
+ // add a UUID.
static int classExists = -1;
const HINSTANCE appInstance = static_cast<HINSTANCE>(GetModuleHandle(nullptr));
@@ -555,7 +556,7 @@ QString QWindowsContext::registerWindowClass(QString cname,
}
if (classExists)
- cname += QString::number(reinterpret_cast<quintptr>(proc));
+ cname += QUuid::createUuid().toString();
if (d->m_registeredWindowClassNames.contains(cname)) // already registered in our list
return cname;
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
index 4adf662152..f26f698e76 100644
--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
@@ -204,7 +204,6 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
, m_shareContext(0)
, m_format(format)
, m_isPBufferCurrent(false)
- , m_swapInterval(-1)
, m_ownsContext(nativeHandle.isNull())
, m_getGraphicsResetStatus(0)
, m_lost(false)
@@ -567,9 +566,9 @@ bool QGLXContext::makeCurrent(QPlatformSurface *surface)
if (success && surfaceClass == QSurface::Window) {
int interval = surface->format().swapInterval();
+ QXcbWindow *window = static_cast<QXcbWindow *>(surface);
QXcbScreen *screen = screenForPlatformSurface(surface);
- if (interval >= 0 && m_swapInterval != interval && screen) {
- m_swapInterval = interval;
+ if (interval >= 0 && interval != window->swapInterval() && screen) {
typedef void (*qt_glXSwapIntervalEXT)(Display *, GLXDrawable, int);
typedef void (*qt_glXSwapIntervalMESA)(unsigned int);
static qt_glXSwapIntervalEXT glXSwapIntervalEXT = 0;
@@ -588,6 +587,7 @@ bool QGLXContext::makeCurrent(QPlatformSurface *surface)
glXSwapIntervalEXT(m_display, glxDrawable, interval);
else if (glXSwapIntervalMESA)
glXSwapIntervalMESA(interval);
+ window->setSwapInterval(interval);
}
}
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h
index be9d3f5dcb..2a88fd6e59 100644
--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h
@@ -87,7 +87,6 @@ private:
GLXContext m_shareContext;
QSurfaceFormat m_format;
bool m_isPBufferCurrent;
- int m_swapInterval;
bool m_ownsContext;
GLenum (APIENTRY * m_getGraphicsResetStatus)();
bool m_lost;
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index f98cd8a74d..8258cc2dfa 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -184,6 +184,9 @@ public:
static void setWindowTitle(const QXcbConnection *conn, xcb_window_t window, const QString &title);
static QString windowTitle(const QXcbConnection *conn, xcb_window_t window);
+ int swapInterval() const { return m_swapInterval; }
+ void setSwapInterval(int swapInterval) { m_swapInterval = swapInterval; }
+
public Q_SLOTS:
void updateSyncRequestCounter();
@@ -276,6 +279,7 @@ protected:
SyncState m_syncState = NoSyncNeeded;
QXcbSyncWindowRequest *m_pendingSyncRequest = nullptr;
+ int m_swapInterval = -1;
};
class QXcbForeignWindow : public QXcbWindow
diff --git a/src/plugins/styles/mac/qmacstyle_mac.mm b/src/plugins/styles/mac/qmacstyle_mac.mm
index 01eaa24e80..3542606a00 100644
--- a/src/plugins/styles/mac/qmacstyle_mac.mm
+++ b/src/plugins/styles/mac/qmacstyle_mac.mm
@@ -2555,11 +2555,12 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
QPalette QMacStyle::standardPalette() const
{
- QPalette pal = QCommonStyle::standardPalette();
- pal.setColor(QPalette::Disabled, QPalette::Dark, QColor(191, 191, 191));
- pal.setColor(QPalette::Active, QPalette::Dark, QColor(191, 191, 191));
- pal.setColor(QPalette::Inactive, QPalette::Dark, QColor(191, 191, 191));
- return pal;
+ auto platformTheme = QGuiApplicationPrivate::platformTheme();
+ auto styleNames = platformTheme->themeHint(QPlatformTheme::StyleNames);
+ if (styleNames.toStringList().contains("macintosh"))
+ return *platformTheme->palette();
+ else
+ return QStyle::standardPalette();
}
int QMacStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget *w,
diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp
index 84299263d7..85b65f39b1 100644
--- a/src/widgets/styles/qstylesheetstyle.cpp
+++ b/src/widgets/styles/qstylesheetstyle.cpp
@@ -3706,17 +3706,6 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q
bool dis = !(opt->state & QStyle::State_Enabled),
act = opt->state & QStyle::State_Selected;
- int checkableOffset = 0;
- if (checkable) {
- QRenderRule subSubRule = renderRule(w, opt, PseudoElement_MenuCheckMark);
- QStyleOptionMenuItem newMi = mi;
- newMi.rect = positionRect(w, subRule, subSubRule, PseudoElement_MenuCheckMark, opt->rect, opt->direction);
- // align with icons if there are some
- checkableOffset = std::max(m->maxIconWidth, newMi.rect.width());
- if (subSubRule.hasDrawable() || checked)
- drawPrimitive(PE_IndicatorMenuCheckMark, &newMi, p, w);
- }
-
if (!mi.icon.isNull()) {
QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;
if (act && !dis)
@@ -3733,24 +3722,28 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q
}
QRect iconRect = positionRect(w, subRule, iconRule, PseudoElement_MenuIcon, opt->rect, opt->direction);
if (opt->direction == Qt::LeftToRight)
- iconRect.moveLeft(iconRect.left() + checkableOffset);
+ iconRect.moveLeft(iconRect.left());
else
- iconRect.moveRight(iconRect.right() - checkableOffset);
+ iconRect.moveRight(iconRect.right());
iconRule.drawRule(p, iconRect);
QRect pmr(0, 0, pixw, pixh);
pmr.moveCenter(iconRect.center());
p->drawPixmap(pmr.topLeft(), pixmap);
+ } else if (checkable) {
+ QRenderRule subSubRule = renderRule(w, opt, PseudoElement_MenuCheckMark);
+ if (subSubRule.hasDrawable() || checked) {
+ QStyleOptionMenuItem newMi = mi;
+ if (!dis)
+ newMi.state |= State_Enabled;
+ if (act)
+ newMi.state |= State_On;
+ newMi.rect = positionRect(w, subRule, subSubRule, PseudoElement_MenuCheckMark, opt->rect, opt->direction);
+ drawPrimitive(PE_IndicatorMenuCheckMark, &newMi, p, w);
+ }
}
- int textOffset = 0;
- // padding overrules it all
- if (!subRule.hasBox() || subRule.box()->paddings[LeftEdge] == 0) {
- textOffset = checkableOffset;
- if (!m->icon.isNull() || !checkable)
- textOffset += m->maxIconWidth;
- }
QRect textRect = subRule.contentsRect(opt->rect);
- textRect.setLeft(textRect.left() + textOffset);
+ textRect.setLeft(textRect.left() + m->maxIconWidth);
textRect.setWidth(textRect.width() - mi.tabWidth);
const QRect vTextRect = visualRect(opt->direction, m->rect, textRect);
@@ -5101,27 +5094,20 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op
if (mi->text.contains(QLatin1Char('\t')))
sz.rwidth() += 12; //as in QCommonStyle
bool checkable = mi->checkType != QStyleOptionMenuItem::NotCheckable;
- int checkableWidth = 0;
- if (checkable) {
+ if (!mi->icon.isNull()) {
+ const int pmSmall = pixelMetric(PM_SmallIconSize);
+ const QSize pmSize = mi->icon.actualSize(QSize(pmSmall, pmSmall));
+ sz.rwidth() += pmSize.width() + 4;
+ } else if (checkable) {
QRenderRule subSubRule = renderRule(w, opt, PseudoElement_MenuCheckMark);
QRect checkmarkRect = positionRect(w, subRule, subSubRule, PseudoElement_MenuCheckMark, opt->rect, opt->direction);
- checkableWidth = std::max(mi->maxIconWidth, checkmarkRect.width());
- }
- if (!mi->icon.isNull()) {
- QPixmap pixmap = mi->icon.pixmap(pixelMetric(PM_SmallIconSize));
- sz.rwidth() += pixmap.width();
+ sz.rwidth() += std::max(mi->maxIconWidth, checkmarkRect.width()) + 4;
}
if (subRule.hasFont) {
QFontMetrics fm(subRule.font);
const QRect r = fm.boundingRect(QRect(), Qt::TextSingleLine | Qt::TextShowMnemonic, mi->text);
sz = sz.expandedTo(r.size());
}
- // padding overrules it all
- if (!subRule.hasBox() || subRule.box()->paddings[LeftEdge] == 0) {
- sz.rwidth() += checkableWidth;
- if (!mi->icon.isNull() || !checkable)
- sz.rwidth() += mi->maxIconWidth;
- }
return subRule.boxSize(subRule.adjustSize(sz));
}
}
diff --git a/tests/auto/gui/image/qimagereader/images/qticon16.png b/tests/auto/gui/image/qimagereader/images/qticon16.png
new file mode 100644
index 0000000000..b6b01a4d64
--- /dev/null
+++ b/tests/auto/gui/image/qimagereader/images/qticon16.png
Binary files differ
diff --git a/tests/auto/gui/image/qimagereader/images/qticon16@2x.png b/tests/auto/gui/image/qimagereader/images/qticon16@2x.png
new file mode 100644
index 0000000000..205461daf0
--- /dev/null
+++ b/tests/auto/gui/image/qimagereader/images/qticon16@2x.png
Binary files differ
diff --git a/tests/auto/gui/image/qimagereader/images/qticon16@3x.png b/tests/auto/gui/image/qimagereader/images/qticon16@3x.png
new file mode 100644
index 0000000000..de92658241
--- /dev/null
+++ b/tests/auto/gui/image/qimagereader/images/qticon16@3x.png
Binary files differ
diff --git a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
index 1cf01133b2..d17a171728 100644
--- a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
+++ b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
@@ -164,6 +164,9 @@ private slots:
void preserveTexts_data();
void preserveTexts();
+ void devicePixelRatio_data();
+ void devicePixelRatio();
+
private:
QString prefix;
QTemporaryDir m_temporaryDir;
@@ -1976,6 +1979,28 @@ void tst_QImageReader::preserveTexts()
QCOMPARE(r.text(key3), text3.simplified());
}
+void tst_QImageReader::devicePixelRatio_data()
+{
+ QTest::addColumn<QString>("fileName");
+ QTest::addColumn<QSize>("size");
+ QTest::addColumn<qreal>("dpr");
+
+ QTest::newRow("1x") << "qticon16.png" << QSize(16, 16) << 1.0;
+ QTest::newRow("2x") << "qticon16@2x.png" << QSize(32, 32) << 2.0;
+ QTest::newRow("3x") << "qticon16@3x.png" << QSize(48, 48) << 3.0;
+}
+
+void tst_QImageReader::devicePixelRatio()
+{
+ QFETCH(QString, fileName);
+ QFETCH(QSize, size);
+ QFETCH(qreal, dpr);
+
+ QImageReader r(":/images/" + fileName);
+ QImage img = r.read();
+ QCOMPARE(img.size(), size);
+ QCOMPARE(img.devicePixelRatio(), dpr);
+}
QTEST_MAIN(tst_QImageReader)
#include "tst_qimagereader.moc"
diff --git a/tests/auto/network/access/qftp/tst_qftp.cpp b/tests/auto/network/access/qftp/tst_qftp.cpp
index 6e18e1a663..1a8f264c28 100644
--- a/tests/auto/network/access/qftp/tst_qftp.cpp
+++ b/tests/auto/network/access/qftp/tst_qftp.cpp
@@ -2342,7 +2342,7 @@ void tst_QFtp::loginURL()
ftp = newFtp();
addCommand(QFtp::ConnectToHost,
- ftp->connectToHost(QHostInfo::localHostName(), port));
+ ftp->connectToHost("127.0.0.1", port));
addCommand(QFtp::Login, ftp->login(user, password));
QTestEventLoop::instance().enterLoop(5);
@@ -2350,7 +2350,7 @@ void tst_QFtp::loginURL()
ftp = nullptr;
server.stopServer();
if (QTestEventLoop::instance().timeout())
- QFAIL(msgTimedOut(QHostInfo::localHostName(), port));
+ QFAIL(msgTimedOut("127.0.0.1", port));
QCOMPARE(server.getRawUser(), rawUser);
QCOMPARE(server.getRawPassword(), rawPass);
diff --git a/tests/auto/other/lancelot/scripts/degeneratebeziers.qps b/tests/auto/other/lancelot/scripts/degeneratebeziers.qps
index 6c069fd82f..948968b0cd 100644
--- a/tests/auto/other/lancelot/scripts/degeneratebeziers.qps
+++ b/tests/auto/other/lancelot/scripts/degeneratebeziers.qps
@@ -34,3 +34,14 @@ setPen blue 40 solidline roundcap
drawPath revbez
setPen red 0
drawPath revbez
+
+resetMatrix
+path_lineTo tightJoin 60 10
+path_cubicTo tightJoin 50 0 100 0 100 50
+
+translate 50 500
+
+setPen green 40 solidline roundcap roundjoin
+drawPath tightJoin
+setPen red 0
+drawPath tightJoin