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

Conflicts:
	.qmake.conf
	src/gui/painting/qdrawhelper.cpp
	src/gui/text/qdistancefield.cpp
	src/gui/text/qdistancefield_p.h
	src/network/ssl/qsslsocket_openssl.cpp
	src/plugins/platforms/android/qandroidinputcontext.cpp
	src/widgets/styles/qstylesheetstyle.cpp

Done-With: Timur Pocheptsov <timur.pocheptsov@qt.io>
Change-Id: Ia7daad21f077ea889898f17734ec46303e71fe6b
This commit is contained in:
Liang Qi 2019-06-25 11:17:32 +02:00
commit ef37ab9970
81 changed files with 2508 additions and 1793 deletions

View File

@ -82,7 +82,7 @@
"force-pkg-config": { "type": "void", "name": "pkg-config" }, "force-pkg-config": { "type": "void", "name": "pkg-config" },
"framework": "boolean", "framework": "boolean",
"gc-binaries": { "type": "boolean", "name": "gc_binaries" }, "gc-binaries": { "type": "boolean", "name": "gc_binaries" },
"gdb-index": { "type": "boolean", "name": "gdb_index" }, "gdb-index": { "type": "boolean", "name": "enable_gdb_index" },
"gcc-sysroot": "boolean", "gcc-sysroot": "boolean",
"gcov": "boolean", "gcov": "boolean",
"gnumake": { "type": "boolean", "name": "GNUmake" }, "gnumake": { "type": "boolean", "name": "GNUmake" },

83
dist/changes-5.12.4 vendored Normal file
View File

@ -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

View File

@ -30,7 +30,7 @@
\title Class Wizard Example \title Class Wizard Example
\ingroup examples-dialogs \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. wizards using QWizard.
\image classwizard.png Screenshot of the Class Wizard example \image classwizard.png Screenshot of the Class Wizard example

View File

@ -28,7 +28,10 @@ CONFIG(release, debug|release) {
} }
load(link_ltcg) load(link_ltcg)
QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG QMAKE_CFLAGS -= $$QMAKE_CFLAGS_LTCG
QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG QMAKE_CFLAGS += $$QMAKE_CFLAGS_LTCG
QMAKE_LFLAGS *= $$QMAKE_LFLAGS_LTCG QMAKE_CXXFLAGS -= $$QMAKE_CXXFLAGS_LTCG
QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_LTCG
QMAKE_LFLAGS -= $$QMAKE_LFLAGS_LTCG
QMAKE_LFLAGS += $$QMAKE_LFLAGS_LTCG
} }

View File

@ -272,7 +272,7 @@ headersclean:!internal_module {
hcleanFLAGS += -std=c++98 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 { } else: msvc:!intel_icl {
# 4180: qualifier applied to function type has no meaning; ignored # 4180: qualifier applied to function type has no meaning; ignored
# 4458: declaration of 'identifier' hides class member # 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 # 4577: 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc
greaterThan(QMAKE_MSC_VER, 18): hcleanFLAGS += -wd4577 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 $$[QT_INSTALL_DATA/src]/mkspecs/features/data/dummy.cpp
} }

View File

@ -1,77 +1,77 @@
LIBRARY libEGL LIBRARY libEGL
EXPORTS EXPORTS
eglBindAPI @14 eglBindAPI@4 @14
eglBindTexImage @20 eglBindTexImage@12 @20
eglChooseConfig @7 eglChooseConfig@20 @7
eglCopyBuffers @33 eglCopyBuffers@12 @33
eglCreateContext @23 eglCreateContext@16 @23
eglCreatePbufferFromClientBuffer @18 eglCreatePbufferFromClientBuffer@20 @18
eglCreatePbufferSurface @10 eglCreatePbufferSurface@12 @10
eglCreatePixmapSurface @11 eglCreatePixmapSurface@16 @11
eglCreateWindowSurface @9 eglCreateWindowSurface@16 @9
eglDestroyContext @24 eglDestroyContext@8 @24
eglDestroySurface @12 eglDestroySurface@8 @12
eglGetConfigAttrib @8 eglGetConfigAttrib@16 @8
eglGetConfigs @6 eglGetConfigs@16 @6
eglGetCurrentContext @26 eglGetCurrentContext@0 @26
eglGetCurrentDisplay @28 eglGetCurrentDisplay@0 @28
eglGetCurrentSurface @27 eglGetCurrentSurface@4 @27
eglGetDisplay @2 eglGetDisplay@4 @2
eglGetError @1 eglGetError@0 @1
eglGetProcAddress @34 eglGetProcAddress@4 @34
eglInitialize @3 eglInitialize@12 @3
eglMakeCurrent @25 eglMakeCurrent@16 @25
eglQueryAPI @15 eglQueryAPI@0 @15
eglQueryContext @29 eglQueryContext@16 @29
eglQueryString @5 eglQueryString@8 @5
eglQuerySurface @13 eglQuerySurface@16 @13
eglReleaseTexImage @21 eglReleaseTexImage@12 @21
eglReleaseThread @17 eglReleaseThread@0 @17
eglSurfaceAttrib @19 eglSurfaceAttrib@16 @19
eglSwapBuffers @32 eglSwapBuffers@8 @32
eglSwapInterval @22 eglSwapInterval@8 @22
eglTerminate @4 eglTerminate@4 @4
eglWaitClient @16 eglWaitClient@0 @16
eglWaitGL @30 eglWaitGL@0 @30
eglWaitNative @31 eglWaitNative@4 @31
; Extensions ; Extensions
eglGetPlatformDisplayEXT @35 eglGetPlatformDisplayEXT@12 @35
eglQuerySurfacePointerANGLE @36 eglQuerySurfacePointerANGLE@16 @36
eglPostSubBufferNV @37 eglPostSubBufferNV@24 @37
eglQueryDisplayAttribEXT @48 eglQueryDisplayAttribEXT@12 @48
eglQueryDeviceAttribEXT @49 eglQueryDeviceAttribEXT@12 @49
eglQueryDeviceStringEXT @50 eglQueryDeviceStringEXT@8 @50
eglCreateImageKHR @51 eglCreateImageKHR@20 @51
eglDestroyImageKHR @52 eglDestroyImageKHR@8 @52
eglCreateDeviceANGLE @53 eglCreateDeviceANGLE@12 @53
eglReleaseDeviceANGLE @54 eglReleaseDeviceANGLE@4 @54
eglCreateStreamKHR @55 eglCreateStreamKHR@8 @55
eglDestroyStreamKHR @56 eglDestroyStreamKHR@8 @56
eglStreamAttribKHR @57 eglStreamAttribKHR@16 @57
eglQueryStreamKHR @58 eglQueryStreamKHR@16 @58
eglQueryStreamu64KHR @59 eglQueryStreamu64KHR@16 @59
eglStreamConsumerGLTextureExternalKHR @60 eglStreamConsumerGLTextureExternalKHR@8 @60
eglStreamConsumerAcquireKHR @61 eglStreamConsumerAcquireKHR@8 @61
eglStreamConsumerReleaseKHR @62 eglStreamConsumerReleaseKHR@8 @62
eglStreamConsumerGLTextureExternalAttribsNV @63 eglStreamConsumerGLTextureExternalAttribsNV@12 @63
eglCreateStreamProducerD3DTextureNV12ANGLE @64 eglCreateStreamProducerD3DTextureNV12ANGLE@12 @64
eglStreamPostD3DTextureNV12ANGLE @65 eglStreamPostD3DTextureNV12ANGLE@16 @65
eglGetSyncValuesCHROMIUM @66 eglGetSyncValuesCHROMIUM@20 @66
eglSwapBuffersWithDamageEXT @67 eglSwapBuffersWithDamageEXT@16 @67
eglProgramCacheGetAttribANGLE @68 eglProgramCacheGetAttribANGLE@8 @68
eglProgramCachePopulateANGLE @69 eglProgramCachePopulateANGLE@20 @69
eglProgramCacheQueryANGLE @70 eglProgramCacheQueryANGLE@24 @70
eglProgramCacheResizeANGLE @71 eglProgramCacheResizeANGLE@12 @71
; 1.5 entry points ; 1.5 entry points
eglCreateSync @38 eglCreateSync@12 @38
eglDestroySync @39 eglDestroySync@8 @39
eglClientWaitSync @40 eglClientWaitSync@20 @40
eglGetSyncAttrib @41 eglGetSyncAttrib@16 @41
eglCreateImage @42 eglCreateImage@20 @42
eglDestroyImage @43 eglDestroyImage@8 @43
eglGetPlatformDisplay @44 eglGetPlatformDisplay@12 @44
eglCreatePlatformWindowSurface @45 eglCreatePlatformWindowSurface@16 @45
eglCreatePlatformPixmapSurface @46 eglCreatePlatformPixmapSurface@16 @46
eglWaitSync @47 eglWaitSync@12 @47

View File

@ -1,77 +1,77 @@
LIBRARY libEGL LIBRARY libEGL
EXPORTS EXPORTS
eglBindAPI @14 eglBindAPI@4 @14
eglBindTexImage @20 eglBindTexImage@12 @20
eglChooseConfig @7 eglChooseConfig@20 @7
eglCopyBuffers @33 eglCopyBuffers@12 @33
eglCreateContext @23 eglCreateContext@16 @23
eglCreatePbufferFromClientBuffer @18 eglCreatePbufferFromClientBuffer@20 @18
eglCreatePbufferSurface @10 eglCreatePbufferSurface@12 @10
eglCreatePixmapSurface @11 eglCreatePixmapSurface@16 @11
eglCreateWindowSurface @9 eglCreateWindowSurface@16 @9
eglDestroyContext @24 eglDestroyContext@8 @24
eglDestroySurface @12 eglDestroySurface@8 @12
eglGetConfigAttrib @8 eglGetConfigAttrib@16 @8
eglGetConfigs @6 eglGetConfigs@16 @6
eglGetCurrentContext @26 eglGetCurrentContext@0 @26
eglGetCurrentDisplay @28 eglGetCurrentDisplay@0 @28
eglGetCurrentSurface @27 eglGetCurrentSurface@4 @27
eglGetDisplay @2 eglGetDisplay@4 @2
eglGetError @1 eglGetError@0 @1
eglGetProcAddress @34 eglGetProcAddress@4 @34
eglInitialize @3 eglInitialize@12 @3
eglMakeCurrent @25 eglMakeCurrent@16 @25
eglQueryAPI @15 eglQueryAPI@0 @15
eglQueryContext @29 eglQueryContext@16 @29
eglQueryString @5 eglQueryString@8 @5
eglQuerySurface @13 eglQuerySurface@16 @13
eglReleaseTexImage @21 eglReleaseTexImage@12 @21
eglReleaseThread @17 eglReleaseThread@0 @17
eglSurfaceAttrib @19 eglSurfaceAttrib@16 @19
eglSwapBuffers @32 eglSwapBuffers@8 @32
eglSwapInterval @22 eglSwapInterval@8 @22
eglTerminate @4 eglTerminate@4 @4
eglWaitClient @16 eglWaitClient@0 @16
eglWaitGL @30 eglWaitGL@0 @30
eglWaitNative @31 eglWaitNative@4 @31
; Extensions ; Extensions
eglGetPlatformDisplayEXT @35 eglGetPlatformDisplayEXT@12 @35
eglQuerySurfacePointerANGLE @36 eglQuerySurfacePointerANGLE@16 @36
eglPostSubBufferNV @37 eglPostSubBufferNV@24 @37
eglQueryDisplayAttribEXT @48 eglQueryDisplayAttribEXT@12 @48
eglQueryDeviceAttribEXT @49 eglQueryDeviceAttribEXT@12 @49
eglQueryDeviceStringEXT @50 eglQueryDeviceStringEXT@8 @50
eglCreateImageKHR @51 eglCreateImageKHR@20 @51
eglDestroyImageKHR @52 eglDestroyImageKHR@8 @52
eglCreateDeviceANGLE @53 eglCreateDeviceANGLE@12 @53
eglReleaseDeviceANGLE @54 eglReleaseDeviceANGLE@4 @54
eglCreateStreamKHR @55 eglCreateStreamKHR@8 @55
eglDestroyStreamKHR @56 eglDestroyStreamKHR@8 @56
eglStreamAttribKHR @57 eglStreamAttribKHR@16 @57
eglQueryStreamKHR @58 eglQueryStreamKHR@16 @58
eglQueryStreamu64KHR @59 eglQueryStreamu64KHR@16 @59
eglStreamConsumerGLTextureExternalKHR @60 eglStreamConsumerGLTextureExternalKHR@8 @60
eglStreamConsumerAcquireKHR @61 eglStreamConsumerAcquireKHR@8 @61
eglStreamConsumerReleaseKHR @62 eglStreamConsumerReleaseKHR@8 @62
eglStreamConsumerGLTextureExternalAttribsNV @63 eglStreamConsumerGLTextureExternalAttribsNV@12 @63
eglCreateStreamProducerD3DTextureNV12ANGLE @64 eglCreateStreamProducerD3DTextureNV12ANGLE@12 @64
eglStreamPostD3DTextureNV12ANGLE @65 eglStreamPostD3DTextureNV12ANGLE@16 @65
eglGetSyncValuesCHROMIUM @66 eglGetSyncValuesCHROMIUM@20 @66
eglSwapBuffersWithDamageEXT @67 eglSwapBuffersWithDamageEXT@16 @67
eglProgramCacheGetAttribANGLE @68 eglProgramCacheGetAttribANGLE@8 @68
eglProgramCachePopulateANGLE @69 eglProgramCachePopulateANGLE@20 @69
eglProgramCacheQueryANGLE @70 eglProgramCacheQueryANGLE@24 @70
eglProgramCacheResizeANGLE @71 eglProgramCacheResizeANGLE@12 @71
; 1.5 entry points ; 1.5 entry points
eglCreateSync @38 eglCreateSync@12 @38
eglDestroySync @39 eglDestroySync@8 @39
eglClientWaitSync @40 eglClientWaitSync@20 @40
eglGetSyncAttrib @41 eglGetSyncAttrib@16 @41
eglCreateImage @42 eglCreateImage@20 @42
eglDestroyImage @43 eglDestroyImage@8 @43
eglGetPlatformDisplay @44 eglGetPlatformDisplay@12 @44
eglCreatePlatformWindowSurface @45 eglCreatePlatformWindowSurface@16 @45
eglCreatePlatformPixmapSurface @46 eglCreatePlatformPixmapSurface@16 @46
eglWaitSync @47 eglWaitSync@12 @47

View File

@ -1,412 +1,411 @@
LIBRARY libGLESv2 LIBRARY libGLESv2
EXPORTS EXPORTS
glActiveTexture @1 glActiveTexture@4 @1
glAttachShader @2 glAttachShader@8 @2
glBindAttribLocation @3 glBindAttribLocation@12 @3
glBindBuffer @4 glBindBuffer@8 @4
glBindFramebuffer @5 glBindFramebuffer@8 @5
glBindRenderbuffer @6 glBindRenderbuffer@8 @6
glBindTexture @7 glBindTexture@8 @7
glBlendColor @8 glBlendColor@16 @8
glBlendEquation @9 glBlendEquation@4 @9
glBlendEquationSeparate @10 glBlendEquationSeparate@8 @10
glBlendFunc @11 glBlendFunc@8 @11
glBlendFuncSeparate @12 glBlendFuncSeparate@16 @12
glBufferData @13 glBufferData@16 @13
glBufferSubData @14 glBufferSubData@16 @14
glCheckFramebufferStatus @15 glCheckFramebufferStatus@4 @15
glClear @16 glClear@4 @16
glClearColor @17 glClearColor@16 @17
glClearDepthf @18 glClearDepthf@4 @18
glClearStencil @19 glClearStencil@4 @19
glColorMask @20 glColorMask@16 @20
glCompileShader @21 glCompileShader@4 @21
glCompressedTexImage2D @22 glCompressedTexImage2D@32 @22
glCompressedTexSubImage2D @23 glCompressedTexSubImage2D@36 @23
glCopyTexImage2D @24 glCopyTexImage2D@32 @24
glCopyTexSubImage2D @25 glCopyTexSubImage2D@32 @25
glCreateProgram @26 glCreateProgram@0 @26
glCreateShader @27 glCreateShader@4 @27
glCullFace @28 glCullFace@4 @28
glDeleteBuffers @29 glDeleteBuffers@8 @29
glDeleteFramebuffers @30 glDeleteFramebuffers@8 @30
glDeleteProgram @32 glDeleteProgram@4 @32
glDeleteRenderbuffers @33 glDeleteRenderbuffers@8 @33
glDeleteShader @34 glDeleteShader@4 @34
glDeleteTextures @31 glDeleteTextures@8 @31
glDepthFunc @36 glDepthFunc@4 @36
glDepthMask @37 glDepthMask@4 @37
glDepthRangef @38 glDepthRangef@8 @38
glDetachShader @35 glDetachShader@8 @35
glDisable @39 glDisable@4 @39
glDisableVertexAttribArray @40 glDisableVertexAttribArray@4 @40
glDrawArrays @41 glDrawArrays@12 @41
glDrawElements @42 glDrawElements@16 @42
glEnable @43 glEnable@4 @43
glEnableVertexAttribArray @44 glEnableVertexAttribArray@4 @44
glFinish @45 glFinish@0 @45
glFlush @46 glFlush@0 @46
glFramebufferRenderbuffer @47 glFramebufferRenderbuffer@16 @47
glFramebufferTexture2D @48 glFramebufferTexture2D@20 @48
glFrontFace @49 glFrontFace@4 @49
glGenBuffers @50 glGenBuffers@8 @50
glGenFramebuffers @52 glGenFramebuffers@8 @52
glGenRenderbuffers @53 glGenRenderbuffers@8 @53
glGenTextures @54 glGenTextures@8 @54
glGenerateMipmap @51 glGenerateMipmap@4 @51
glGetActiveAttrib @55 glGetActiveAttrib@28 @55
glGetActiveUniform @56 glGetActiveUniform@28 @56
glGetAttachedShaders @57 glGetAttachedShaders@16 @57
glGetAttribLocation @58 glGetAttribLocation@8 @58
glGetBooleanv @59 glGetBooleanv@8 @59
glGetBufferParameteriv @60 glGetBufferParameteriv@12 @60
glGetError @61 glGetError@0 @61
glGetFloatv @62 glGetFloatv@8 @62
glGetFramebufferAttachmentParameteriv @63 glGetFramebufferAttachmentParameteriv@16 @63
glGetIntegerv @64 glGetIntegerv@8 @64
glGetProgramInfoLog @66 glGetProgramInfoLog@16 @66
glGetProgramiv @65 glGetProgramiv@12 @65
glGetRenderbufferParameteriv @67 glGetRenderbufferParameteriv@12 @67
glGetShaderInfoLog @69 glGetShaderInfoLog@16 @69
glGetShaderPrecisionFormat @70 glGetShaderPrecisionFormat@16 @70
glGetShaderSource @71 glGetShaderSource@16 @71
glGetShaderiv @68 glGetShaderiv@12 @68
glGetString @72 glGetString@4 @72
glGetTexParameterfv @73 glGetTexParameterfv@12 @73
glGetTexParameteriv @74 glGetTexParameteriv@12 @74
glGetUniformLocation @77 glGetUniformLocation@8 @77
glGetUniformfv @75 glGetUniformfv@12 @75
glGetUniformiv @76 glGetUniformiv@12 @76
glGetVertexAttribPointerv @80 glGetVertexAttribPointerv@12 @80
glGetVertexAttribfv @78 glGetVertexAttribfv@12 @78
glGetVertexAttribiv @79 glGetVertexAttribiv@12 @79
glHint @81 glHint@8 @81
glIsBuffer @82 glIsBuffer@4 @82
glIsEnabled @83 glIsEnabled@4 @83
glIsFramebuffer @84 glIsFramebuffer@4 @84
glIsProgram @85 glIsProgram@4 @85
glIsRenderbuffer @86 glIsRenderbuffer@4 @86
glIsShader @87 glIsShader@4 @87
glIsTexture @88 glIsTexture@4 @88
glLineWidth @89 glLineWidth@4 @89
glLinkProgram @90 glLinkProgram@4 @90
glPixelStorei @91 glPixelStorei@8 @91
glPolygonOffset @92 glPolygonOffset@8 @92
glReadPixels @93 glReadPixels@28 @93
glReleaseShaderCompiler @94 glReleaseShaderCompiler@0 @94
glRenderbufferStorage @95 glRenderbufferStorage@16 @95
glSampleCoverage @96 glSampleCoverage@8 @96
glScissor @97 glScissor@16 @97
glShaderBinary @98 glShaderBinary@20 @98
glShaderSource @99 glShaderSource@16 @99
glStencilFunc @100 glStencilFunc@12 @100
glStencilFuncSeparate @101 glStencilFuncSeparate@16 @101
glStencilMask @102 glStencilMask@4 @102
glStencilMaskSeparate @103 glStencilMaskSeparate@8 @103
glStencilOp @104 glStencilOp@12 @104
glStencilOpSeparate @105 glStencilOpSeparate@16 @105
glTexImage2D @106 glTexImage2D@36 @106
glTexParameterf @107 glTexParameterf@12 @107
glTexParameterfv @108 glTexParameterfv@12 @108
glTexParameteri @109 glTexParameteri@12 @109
glTexParameteriv @110 glTexParameteriv@12 @110
glTexSubImage2D @111 glTexSubImage2D@36 @111
glUniform1f @112 glUniform1f@8 @112
glUniform1fv @113 glUniform1fv@12 @113
glUniform1i @114 glUniform1i@8 @114
glUniform1iv @115 glUniform1iv@12 @115
glUniform2f @116 glUniform2f@12 @116
glUniform2fv @117 glUniform2fv@12 @117
glUniform2i @118 glUniform2i@12 @118
glUniform2iv @119 glUniform2iv@12 @119
glUniform3f @120 glUniform3f@16 @120
glUniform3fv @121 glUniform3fv@12 @121
glUniform3i @122 glUniform3i@16 @122
glUniform3iv @123 glUniform3iv@12 @123
glUniform4f @124 glUniform4f@20 @124
glUniform4fv @125 glUniform4fv@12 @125
glUniform4i @126 glUniform4i@20 @126
glUniform4iv @127 glUniform4iv@12 @127
glUniformMatrix2fv @128 glUniformMatrix2fv@16 @128
glUniformMatrix3fv @129 glUniformMatrix3fv@16 @129
glUniformMatrix4fv @130 glUniformMatrix4fv@16 @130
glUseProgram @131 glUseProgram@4 @131
glValidateProgram @132 glValidateProgram@4 @132
glVertexAttrib1f @133 glVertexAttrib1f@8 @133
glVertexAttrib1fv @134 glVertexAttrib1fv@8 @134
glVertexAttrib2f @135 glVertexAttrib2f@12 @135
glVertexAttrib2fv @136 glVertexAttrib2fv@8 @136
glVertexAttrib3f @137 glVertexAttrib3f@16 @137
glVertexAttrib3fv @138 glVertexAttrib3fv@8 @138
glVertexAttrib4f @139 glVertexAttrib4f@20 @139
glVertexAttrib4fv @140 glVertexAttrib4fv@8 @140
glVertexAttribPointer @141 glVertexAttribPointer@24 @141
glViewport @142 glViewport@16 @142
; Extensions ; Extensions
glBlitFramebufferANGLE @149 glBlitFramebufferANGLE@40 @149
glRenderbufferStorageMultisampleANGLE @150 glRenderbufferStorageMultisampleANGLE@20 @150
glDeleteFencesNV @151 glDeleteFencesNV@8 @151
glFinishFenceNV @152 glFinishFenceNV@4 @152
glGenFencesNV @153 glGenFencesNV@8 @153
glGetFenceivNV @154 glGetFenceivNV@12 @154
glIsFenceNV @155 glIsFenceNV@4 @155
glSetFenceNV @156 glSetFenceNV@8 @156
glTestFenceNV @157 glTestFenceNV@4 @157
glGetTranslatedShaderSourceANGLE @159 glGetTranslatedShaderSourceANGLE@16 @159
glTexStorage2DEXT @160 glTexStorage2DEXT@20 @160
glGetGraphicsResetStatusEXT @161 glGetGraphicsResetStatusEXT@0 @161
glReadnPixelsEXT @162 glReadnPixelsEXT@32 @162
glGetnUniformfvEXT @163 glGetnUniformfvEXT@16 @163
glGetnUniformivEXT @164 glGetnUniformivEXT@16 @164
glGenQueriesEXT @165 glGenQueriesEXT@8 @165
glDeleteQueriesEXT @166 glDeleteQueriesEXT@8 @166
glIsQueryEXT @167 glIsQueryEXT@4 @167
glBeginQueryEXT @168 glBeginQueryEXT@8 @168
glEndQueryEXT @169 glEndQueryEXT@4 @169
glGetQueryivEXT @170 glGetQueryivEXT@12 @170
glGetQueryObjectuivEXT @171 glGetQueryObjectuivEXT@12 @171
glVertexAttribDivisorANGLE @172 glVertexAttribDivisorANGLE@8 @172
glDrawArraysInstancedANGLE @173 glDrawArraysInstancedANGLE@16 @173
glDrawElementsInstancedANGLE @174 glDrawElementsInstancedANGLE@20 @174
glProgramBinaryOES @175 glProgramBinaryOES@16 @175
glGetProgramBinaryOES @176 glGetProgramBinaryOES@20 @176
glDrawBuffersEXT @179 glDrawBuffersEXT@8 @179
glMapBufferOES @285 glMapBufferOES@8 @285
glUnmapBufferOES @286 glUnmapBufferOES@4 @286
glGetBufferPointervOES @287 glGetBufferPointervOES@12 @287
glMapBufferRangeEXT @288 glMapBufferRangeEXT@16 @288
glFlushMappedBufferRangeEXT @289 glFlushMappedBufferRangeEXT@12 @289
glDiscardFramebufferEXT @293 glDiscardFramebufferEXT@12 @293
glInsertEventMarkerEXT @294 glInsertEventMarkerEXT@8 @294
glPushGroupMarkerEXT @295 glPushGroupMarkerEXT@8 @295
glPopGroupMarkerEXT @296 glPopGroupMarkerEXT@0 @296
glEGLImageTargetTexture2DOES @297 glEGLImageTargetTexture2DOES@8 @297
glEGLImageTargetRenderbufferStorageOES @298 glEGLImageTargetRenderbufferStorageOES@8 @298
glBindVertexArrayOES @299 glBindVertexArrayOES@4 @299
glDeleteVertexArraysOES @300 glDeleteVertexArraysOES@8 @300
glGenVertexArraysOES @301 glGenVertexArraysOES@8 @301
glIsVertexArrayOES @302 glIsVertexArrayOES@4 @302
glDebugMessageControlKHR @303 glDebugMessageControlKHR@24 @303
glDebugMessageInsertKHR @304 glDebugMessageInsertKHR@24 @304
glDebugMessageCallbackKHR @305 glDebugMessageCallbackKHR@8 @305
glGetDebugMessageLogKHR @306 glGetDebugMessageLogKHR@32 @306
glPushDebugGroupKHR @307 glPushDebugGroupKHR@16 @307
glPopDebugGroupKHR @308 glPopDebugGroupKHR@0 @308
glObjectLabelKHR @309 glObjectLabelKHR@16 @309
glGetObjectLabelKHR @310 glGetObjectLabelKHR@20 @310
glObjectPtrLabelKHR @311 glObjectPtrLabelKHR@12 @311
glGetObjectPtrLabelKHR @312 glGetObjectPtrLabelKHR@16 @312
glGetPointervKHR @313 glGetPointervKHR@8 @313
glQueryCounterEXT @314 glQueryCounterEXT@8 @314
glGetQueryObjectivEXT @315 glGetQueryObjectivEXT@12 @315
glGetQueryObjecti64vEXT @316 glGetQueryObjecti64vEXT@12 @316
glGetQueryObjectui64vEXT @317 glGetQueryObjectui64vEXT@12 @317
glBindUniformLocationCHROMIUM @318 glBindUniformLocationCHROMIUM@12 @318
glCoverageModulationCHROMIUM @319 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 glFramebufferTextureMultiviewLayeredANGLE@24 @413
glMatrixLoadIdentityCHROMIUM @321 glFramebufferTextureMultiviewSideBySideANGLE@24 @414
glGenPathsCHROMIUM @322 glRequestExtensionANGLE@4 @415
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
; GLES 3.0 Functions ; GLES 3.0 Functions
glReadBuffer @180 glReadBuffer@4 @180
glDrawRangeElements @181 glDrawRangeElements@24 @181
glTexImage3D @182 glTexImage3D@40 @182
glTexSubImage3D @183 glTexSubImage3D@44 @183
glCopyTexSubImage3D @184 glCopyTexSubImage3D@36 @184
glCompressedTexImage3D @185 glCompressedTexImage3D@36 @185
glCompressedTexSubImage3D @186 glCompressedTexSubImage3D@44 @186
glGenQueries @187 glGenQueries@8 @187
glDeleteQueries @188 glDeleteQueries@8 @188
glIsQuery @189 glIsQuery@4 @189
glBeginQuery @190 glBeginQuery@8 @190
glEndQuery @191 glEndQuery@4 @191
glGetQueryiv @192 glGetQueryiv@12 @192
glGetQueryObjectuiv @193 glGetQueryObjectuiv@12 @193
glUnmapBuffer @194 glUnmapBuffer@4 @194
glGetBufferPointerv @195 glGetBufferPointerv@12 @195
glDrawBuffers @196 glDrawBuffers@8 @196
glUniformMatrix2x3fv @197 glUniformMatrix2x3fv@16 @197
glUniformMatrix3x2fv @198 glUniformMatrix3x2fv@16 @198
glUniformMatrix2x4fv @199 glUniformMatrix2x4fv@16 @199
glUniformMatrix4x2fv @200 glUniformMatrix4x2fv@16 @200
glUniformMatrix3x4fv @201 glUniformMatrix3x4fv@16 @201
glUniformMatrix4x3fv @202 glUniformMatrix4x3fv@16 @202
glBlitFramebuffer @203 glBlitFramebuffer@40 @203
glRenderbufferStorageMultisample @204 glRenderbufferStorageMultisample@20 @204
glFramebufferTextureLayer @205 glFramebufferTextureLayer@20 @205
glMapBufferRange @206 glMapBufferRange@16 @206
glFlushMappedBufferRange @207 glFlushMappedBufferRange@12 @207
glBindVertexArray @208 glBindVertexArray@4 @208
glDeleteVertexArrays @209 glDeleteVertexArrays@8 @209
glGenVertexArrays @210 glGenVertexArrays@8 @210
glIsVertexArray @211 glIsVertexArray@4 @211
glGetIntegeri_v @212 glGetIntegeri_v@12 @212
glBeginTransformFeedback @213 glBeginTransformFeedback@4 @213
glEndTransformFeedback @214 glEndTransformFeedback@0 @214
glBindBufferRange @215 glBindBufferRange@20 @215
glBindBufferBase @216 glBindBufferBase@12 @216
glTransformFeedbackVaryings @217 glTransformFeedbackVaryings@16 @217
glGetTransformFeedbackVarying @218 glGetTransformFeedbackVarying@28 @218
glVertexAttribIPointer @219 glVertexAttribIPointer@20 @219
glGetVertexAttribIiv @220 glGetVertexAttribIiv@12 @220
glGetVertexAttribIuiv @221 glGetVertexAttribIuiv@12 @221
glVertexAttribI4i @222 glVertexAttribI4i@20 @222
glVertexAttribI4ui @223 glVertexAttribI4ui@20 @223
glVertexAttribI4iv @224 glVertexAttribI4iv@8 @224
glVertexAttribI4uiv @225 glVertexAttribI4uiv@8 @225
glGetUniformuiv @226 glGetUniformuiv@12 @226
glGetFragDataLocation @227 glGetFragDataLocation@8 @227
glUniform1ui @228 glUniform1ui@8 @228
glUniform2ui @229 glUniform2ui@12 @229
glUniform3ui @230 glUniform3ui@16 @230
glUniform4ui @231 glUniform4ui@20 @231
glUniform1uiv @232 glUniform1uiv@12 @232
glUniform2uiv @233 glUniform2uiv@12 @233
glUniform3uiv @234 glUniform3uiv@12 @234
glUniform4uiv @235 glUniform4uiv@12 @235
glClearBufferiv @236 glClearBufferiv@12 @236
glClearBufferuiv @237 glClearBufferuiv@12 @237
glClearBufferfv @238 glClearBufferfv@12 @238
glClearBufferfi @239 glClearBufferfi@16 @239
glGetStringi @240 glGetStringi@8 @240
glCopyBufferSubData @241 glCopyBufferSubData@20 @241
glGetUniformIndices @242 glGetUniformIndices@16 @242
glGetActiveUniformsiv @243 glGetActiveUniformsiv@20 @243
glGetUniformBlockIndex @244 glGetUniformBlockIndex@8 @244
glGetActiveUniformBlockiv @245 glGetActiveUniformBlockiv@16 @245
glGetActiveUniformBlockName @246 glGetActiveUniformBlockName@20 @246
glUniformBlockBinding @247 glUniformBlockBinding@12 @247
glDrawArraysInstanced @248 glDrawArraysInstanced@16 @248
glDrawElementsInstanced @249 glDrawElementsInstanced@20 @249
glFenceSync @250 glFenceSync@8 @250
glIsSync @251 glIsSync@4 @251
glDeleteSync @252 glDeleteSync@4 @252
glClientWaitSync @253 glClientWaitSync@16 @253
glWaitSync @254 glWaitSync@16 @254
glGetInteger64v @255 glGetInteger64v@8 @255
glGetSynciv @256 glGetSynciv@20 @256
glGetInteger64i_v @257 glGetInteger64i_v@12 @257
glGetBufferParameteri64v @258 glGetBufferParameteri64v@12 @258
glGenSamplers @259 glGenSamplers@8 @259
glDeleteSamplers @260 glDeleteSamplers@8 @260
glIsSampler @261 glIsSampler@4 @261
glBindSampler @262 glBindSampler@8 @262
glSamplerParameteri @263 glSamplerParameteri@12 @263
glSamplerParameteriv @264 glSamplerParameteriv@12 @264
glSamplerParameterf @265 glSamplerParameterf@12 @265
glSamplerParameterfv @266 glSamplerParameterfv@12 @266
glGetSamplerParameteriv @267 glGetSamplerParameteriv@12 @267
glGetSamplerParameterfv @268 glGetSamplerParameterfv@12 @268
glVertexAttribDivisor @269 glVertexAttribDivisor@8 @269
glBindTransformFeedback @270 glBindTransformFeedback@8 @270
glDeleteTransformFeedbacks @271 glDeleteTransformFeedbacks@8 @271
glGenTransformFeedbacks @272 glGenTransformFeedbacks@8 @272
glIsTransformFeedback @273 glIsTransformFeedback@4 @273
glPauseTransformFeedback @274 glPauseTransformFeedback@0 @274
glResumeTransformFeedback @275 glResumeTransformFeedback@0 @275
glGetProgramBinary @276 glGetProgramBinary@20 @276
glProgramBinary @277 glProgramBinary@16 @277
glProgramParameteri @278 glProgramParameteri@12 @278
glInvalidateFramebuffer @279 glInvalidateFramebuffer@12 @279
glInvalidateSubFramebuffer @280 glInvalidateSubFramebuffer@28 @280
glTexStorage2D @281 glTexStorage2D@20 @281
glTexStorage3D @282 glTexStorage3D@24 @282
glGetInternalformativ @283 glGetInternalformativ@20 @283
; GLES 3.1 Functions ; GLES 3.1 Functions
glDispatchCompute @345 glDispatchCompute@12 @345
glDispatchComputeIndirect @346 glDispatchComputeIndirect@4 @346
glDrawArraysIndirect @347 glDrawArraysIndirect@8 @347
glDrawElementsIndirect @348 glDrawElementsIndirect@12 @348
glFramebufferParameteri @349 glFramebufferParameteri@12 @349
glGetFramebufferParameteriv @350 glGetFramebufferParameteriv@12 @350
glGetProgramInterfaceiv @351 glGetProgramInterfaceiv@16 @351
glGetProgramResourceIndex @352 glGetProgramResourceIndex@12 @352
glGetProgramResourceName @353 glGetProgramResourceName@24 @353
glGetProgramResourceiv @354 glGetProgramResourceiv@32 @354
glGetProgramResourceLocation @355 glGetProgramResourceLocation@12 @355
glUseProgramStages @356 glUseProgramStages@12 @356
glActiveShaderProgram @357 glActiveShaderProgram@8 @357
glCreateShaderProgramv @358 glCreateShaderProgramv@12 @358
glBindProgramPipeline @359 glBindProgramPipeline@4 @359
glDeleteProgramPipelines @360 glDeleteProgramPipelines@8 @360
glGenProgramPipelines @361 glGenProgramPipelines@8 @361
glIsProgramPipeline @362 glIsProgramPipeline@4 @362
glGetProgramPipelineiv @363 glGetProgramPipelineiv@12 @363
glProgramUniform1i @364 glProgramUniform1i@12 @364
glProgramUniform2i @365 glProgramUniform2i@16 @365
glProgramUniform3i @366 glProgramUniform3i@20 @366
glProgramUniform4i @367 glProgramUniform4i@24 @367
glProgramUniform1ui @368 glProgramUniform1ui@12 @368
glProgramUniform2ui @369 glProgramUniform2ui@16 @369
glProgramUniform3ui @370 glProgramUniform3ui@20 @370
glProgramUniform4ui @371 glProgramUniform4ui@24 @371
glProgramUniform1f @372 glProgramUniform1f@12 @372
glProgramUniform2f @373 glProgramUniform2f@16 @373
glProgramUniform3f @374 glProgramUniform3f@20 @374
glProgramUniform4f @375 glProgramUniform4f@24 @375
glProgramUniform1iv @376 glProgramUniform1iv@16 @376
glProgramUniform2iv @377 glProgramUniform2iv@16 @377
glProgramUniform3iv @378 glProgramUniform3iv@16 @378
glProgramUniform4iv @379 glProgramUniform4iv@16 @379
glProgramUniform1uiv @380 glProgramUniform1uiv@16 @380
glProgramUniform2uiv @381 glProgramUniform2uiv@16 @381
glProgramUniform3uiv @382 glProgramUniform3uiv@16 @382
glProgramUniform4uiv @383 glProgramUniform4uiv@16 @383
glProgramUniform1fv @384 glProgramUniform1fv@16 @384
glProgramUniform2fv @385 glProgramUniform2fv@16 @385
glProgramUniform3fv @386 glProgramUniform3fv@16 @386
glProgramUniform4fv @387 glProgramUniform4fv@16 @387
glProgramUniformMatrix2fv @388 glProgramUniformMatrix2fv@20 @388
glProgramUniformMatrix3fv @389 glProgramUniformMatrix3fv@20 @389
glProgramUniformMatrix4fv @390 glProgramUniformMatrix4fv@20 @390
glProgramUniformMatrix2x3fv @391 glProgramUniformMatrix2x3fv@20 @391
glProgramUniformMatrix3x2fv @392 glProgramUniformMatrix3x2fv@20 @392
glProgramUniformMatrix2x4fv @393 glProgramUniformMatrix2x4fv@20 @393
glProgramUniformMatrix4x2fv @394 glProgramUniformMatrix4x2fv@20 @394
glProgramUniformMatrix3x4fv @395 glProgramUniformMatrix3x4fv@20 @395
glProgramUniformMatrix4x3fv @396 glProgramUniformMatrix4x3fv@20 @396
glValidateProgramPipeline @397 glValidateProgramPipeline@4 @397
glGetProgramPipelineInfoLog @398 glGetProgramPipelineInfoLog@16 @398
glBindImageTexture @399 glBindImageTexture@28 @399
glGetBooleani_v @400 glGetBooleani_v@12 @400
glMemoryBarrier @401 glMemoryBarrier@4 @401
glMemoryBarrierByRegion @402 glMemoryBarrierByRegion@4 @402
glTexStorage2DMultisample @403 glTexStorage2DMultisample@24 @403
glGetMultisamplefv @404 glGetMultisamplefv@12 @404
glSampleMaski @405 glSampleMaski@8 @405
glGetTexLevelParameteriv @406 glGetTexLevelParameteriv@16 @406
glGetTexLevelParameterfv @407 glGetTexLevelParameterfv@16 @407
glBindVertexBuffer @408 glBindVertexBuffer@16 @408
glVertexAttribFormat @409 glVertexAttribFormat@20 @409
glVertexAttribIFormat @410 glVertexAttribIFormat@16 @410
glVertexAttribBinding @411 glVertexAttribBinding@8 @411
glVertexBindingDivisor @412 glVertexBindingDivisor@8 @412

View File

@ -1,412 +1,411 @@
LIBRARY libGLESv2 LIBRARY libGLESv2
EXPORTS EXPORTS
glActiveTexture @1 glActiveTexture@4 @1
glAttachShader @2 glAttachShader@8 @2
glBindAttribLocation @3 glBindAttribLocation@12 @3
glBindBuffer @4 glBindBuffer@8 @4
glBindFramebuffer @5 glBindFramebuffer@8 @5
glBindRenderbuffer @6 glBindRenderbuffer@8 @6
glBindTexture @7 glBindTexture@8 @7
glBlendColor @8 glBlendColor@16 @8
glBlendEquation @9 glBlendEquation@4 @9
glBlendEquationSeparate @10 glBlendEquationSeparate@8 @10
glBlendFunc @11 glBlendFunc@8 @11
glBlendFuncSeparate @12 glBlendFuncSeparate@16 @12
glBufferData @13 glBufferData@16 @13
glBufferSubData @14 glBufferSubData@16 @14
glCheckFramebufferStatus @15 glCheckFramebufferStatus@4 @15
glClear @16 glClear@4 @16
glClearColor @17 glClearColor@16 @17
glClearDepthf @18 glClearDepthf@4 @18
glClearStencil @19 glClearStencil@4 @19
glColorMask @20 glColorMask@16 @20
glCompileShader @21 glCompileShader@4 @21
glCompressedTexImage2D @22 glCompressedTexImage2D@32 @22
glCompressedTexSubImage2D @23 glCompressedTexSubImage2D@36 @23
glCopyTexImage2D @24 glCopyTexImage2D@32 @24
glCopyTexSubImage2D @25 glCopyTexSubImage2D@32 @25
glCreateProgram @26 glCreateProgram@0 @26
glCreateShader @27 glCreateShader@4 @27
glCullFace @28 glCullFace@4 @28
glDeleteBuffers @29 glDeleteBuffers@8 @29
glDeleteFramebuffers @30 glDeleteFramebuffers@8 @30
glDeleteProgram @32 glDeleteProgram@4 @32
glDeleteRenderbuffers @33 glDeleteRenderbuffers@8 @33
glDeleteShader @34 glDeleteShader@4 @34
glDeleteTextures @31 glDeleteTextures@8 @31
glDepthFunc @36 glDepthFunc@4 @36
glDepthMask @37 glDepthMask@4 @37
glDepthRangef @38 glDepthRangef@8 @38
glDetachShader @35 glDetachShader@8 @35
glDisable @39 glDisable@4 @39
glDisableVertexAttribArray @40 glDisableVertexAttribArray@4 @40
glDrawArrays @41 glDrawArrays@12 @41
glDrawElements @42 glDrawElements@16 @42
glEnable @43 glEnable@4 @43
glEnableVertexAttribArray @44 glEnableVertexAttribArray@4 @44
glFinish @45 glFinish@0 @45
glFlush @46 glFlush@0 @46
glFramebufferRenderbuffer @47 glFramebufferRenderbuffer@16 @47
glFramebufferTexture2D @48 glFramebufferTexture2D@20 @48
glFrontFace @49 glFrontFace@4 @49
glGenBuffers @50 glGenBuffers@8 @50
glGenFramebuffers @52 glGenFramebuffers@8 @52
glGenRenderbuffers @53 glGenRenderbuffers@8 @53
glGenTextures @54 glGenTextures@8 @54
glGenerateMipmap @51 glGenerateMipmap@4 @51
glGetActiveAttrib @55 glGetActiveAttrib@28 @55
glGetActiveUniform @56 glGetActiveUniform@28 @56
glGetAttachedShaders @57 glGetAttachedShaders@16 @57
glGetAttribLocation @58 glGetAttribLocation@8 @58
glGetBooleanv @59 glGetBooleanv@8 @59
glGetBufferParameteriv @60 glGetBufferParameteriv@12 @60
glGetError @61 glGetError@0 @61
glGetFloatv @62 glGetFloatv@8 @62
glGetFramebufferAttachmentParameteriv @63 glGetFramebufferAttachmentParameteriv@16 @63
glGetIntegerv @64 glGetIntegerv@8 @64
glGetProgramInfoLog @66 glGetProgramInfoLog@16 @66
glGetProgramiv @65 glGetProgramiv@12 @65
glGetRenderbufferParameteriv @67 glGetRenderbufferParameteriv@12 @67
glGetShaderInfoLog @69 glGetShaderInfoLog@16 @69
glGetShaderPrecisionFormat @70 glGetShaderPrecisionFormat@16 @70
glGetShaderSource @71 glGetShaderSource@16 @71
glGetShaderiv @68 glGetShaderiv@12 @68
glGetString @72 glGetString@4 @72
glGetTexParameterfv @73 glGetTexParameterfv@12 @73
glGetTexParameteriv @74 glGetTexParameteriv@12 @74
glGetUniformLocation @77 glGetUniformLocation@8 @77
glGetUniformfv @75 glGetUniformfv@12 @75
glGetUniformiv @76 glGetUniformiv@12 @76
glGetVertexAttribPointerv @80 glGetVertexAttribPointerv@12 @80
glGetVertexAttribfv @78 glGetVertexAttribfv@12 @78
glGetVertexAttribiv @79 glGetVertexAttribiv@12 @79
glHint @81 glHint@8 @81
glIsBuffer @82 glIsBuffer@4 @82
glIsEnabled @83 glIsEnabled@4 @83
glIsFramebuffer @84 glIsFramebuffer@4 @84
glIsProgram @85 glIsProgram@4 @85
glIsRenderbuffer @86 glIsRenderbuffer@4 @86
glIsShader @87 glIsShader@4 @87
glIsTexture @88 glIsTexture@4 @88
glLineWidth @89 glLineWidth@4 @89
glLinkProgram @90 glLinkProgram@4 @90
glPixelStorei @91 glPixelStorei@8 @91
glPolygonOffset @92 glPolygonOffset@8 @92
glReadPixels @93 glReadPixels@28 @93
glReleaseShaderCompiler @94 glReleaseShaderCompiler@0 @94
glRenderbufferStorage @95 glRenderbufferStorage@16 @95
glSampleCoverage @96 glSampleCoverage@8 @96
glScissor @97 glScissor@16 @97
glShaderBinary @98 glShaderBinary@20 @98
glShaderSource @99 glShaderSource@16 @99
glStencilFunc @100 glStencilFunc@12 @100
glStencilFuncSeparate @101 glStencilFuncSeparate@16 @101
glStencilMask @102 glStencilMask@4 @102
glStencilMaskSeparate @103 glStencilMaskSeparate@8 @103
glStencilOp @104 glStencilOp@12 @104
glStencilOpSeparate @105 glStencilOpSeparate@16 @105
glTexImage2D @106 glTexImage2D@36 @106
glTexParameterf @107 glTexParameterf@12 @107
glTexParameterfv @108 glTexParameterfv@12 @108
glTexParameteri @109 glTexParameteri@12 @109
glTexParameteriv @110 glTexParameteriv@12 @110
glTexSubImage2D @111 glTexSubImage2D@36 @111
glUniform1f @112 glUniform1f@8 @112
glUniform1fv @113 glUniform1fv@12 @113
glUniform1i @114 glUniform1i@8 @114
glUniform1iv @115 glUniform1iv@12 @115
glUniform2f @116 glUniform2f@12 @116
glUniform2fv @117 glUniform2fv@12 @117
glUniform2i @118 glUniform2i@12 @118
glUniform2iv @119 glUniform2iv@12 @119
glUniform3f @120 glUniform3f@16 @120
glUniform3fv @121 glUniform3fv@12 @121
glUniform3i @122 glUniform3i@16 @122
glUniform3iv @123 glUniform3iv@12 @123
glUniform4f @124 glUniform4f@20 @124
glUniform4fv @125 glUniform4fv@12 @125
glUniform4i @126 glUniform4i@20 @126
glUniform4iv @127 glUniform4iv@12 @127
glUniformMatrix2fv @128 glUniformMatrix2fv@16 @128
glUniformMatrix3fv @129 glUniformMatrix3fv@16 @129
glUniformMatrix4fv @130 glUniformMatrix4fv@16 @130
glUseProgram @131 glUseProgram@4 @131
glValidateProgram @132 glValidateProgram@4 @132
glVertexAttrib1f @133 glVertexAttrib1f@8 @133
glVertexAttrib1fv @134 glVertexAttrib1fv@8 @134
glVertexAttrib2f @135 glVertexAttrib2f@12 @135
glVertexAttrib2fv @136 glVertexAttrib2fv@8 @136
glVertexAttrib3f @137 glVertexAttrib3f@16 @137
glVertexAttrib3fv @138 glVertexAttrib3fv@8 @138
glVertexAttrib4f @139 glVertexAttrib4f@20 @139
glVertexAttrib4fv @140 glVertexAttrib4fv@8 @140
glVertexAttribPointer @141 glVertexAttribPointer@24 @141
glViewport @142 glViewport@16 @142
; Extensions ; Extensions
glBlitFramebufferANGLE @149 glBlitFramebufferANGLE@40 @149
glRenderbufferStorageMultisampleANGLE @150 glRenderbufferStorageMultisampleANGLE@20 @150
glDeleteFencesNV @151 glDeleteFencesNV@8 @151
glFinishFenceNV @152 glFinishFenceNV@4 @152
glGenFencesNV @153 glGenFencesNV@8 @153
glGetFenceivNV @154 glGetFenceivNV@12 @154
glIsFenceNV @155 glIsFenceNV@4 @155
glSetFenceNV @156 glSetFenceNV@8 @156
glTestFenceNV @157 glTestFenceNV@4 @157
glGetTranslatedShaderSourceANGLE @159 glGetTranslatedShaderSourceANGLE@16 @159
glTexStorage2DEXT @160 glTexStorage2DEXT@20 @160
glGetGraphicsResetStatusEXT @161 glGetGraphicsResetStatusEXT@0 @161
glReadnPixelsEXT @162 glReadnPixelsEXT@32 @162
glGetnUniformfvEXT @163 glGetnUniformfvEXT@16 @163
glGetnUniformivEXT @164 glGetnUniformivEXT@16 @164
glGenQueriesEXT @165 glGenQueriesEXT@8 @165
glDeleteQueriesEXT @166 glDeleteQueriesEXT@8 @166
glIsQueryEXT @167 glIsQueryEXT@4 @167
glBeginQueryEXT @168 glBeginQueryEXT@8 @168
glEndQueryEXT @169 glEndQueryEXT@4 @169
glGetQueryivEXT @170 glGetQueryivEXT@12 @170
glGetQueryObjectuivEXT @171 glGetQueryObjectuivEXT@12 @171
glVertexAttribDivisorANGLE @172 glVertexAttribDivisorANGLE@8 @172
glDrawArraysInstancedANGLE @173 glDrawArraysInstancedANGLE@16 @173
glDrawElementsInstancedANGLE @174 glDrawElementsInstancedANGLE@20 @174
glProgramBinaryOES @175 glProgramBinaryOES@16 @175
glGetProgramBinaryOES @176 glGetProgramBinaryOES@20 @176
glDrawBuffersEXT @179 glDrawBuffersEXT@8 @179
glMapBufferOES @285 glMapBufferOES@8 @285
glUnmapBufferOES @286 glUnmapBufferOES@4 @286
glGetBufferPointervOES @287 glGetBufferPointervOES@12 @287
glMapBufferRangeEXT @288 glMapBufferRangeEXT@16 @288
glFlushMappedBufferRangeEXT @289 glFlushMappedBufferRangeEXT@12 @289
glDiscardFramebufferEXT @293 glDiscardFramebufferEXT@12 @293
glInsertEventMarkerEXT @294 glInsertEventMarkerEXT@8 @294
glPushGroupMarkerEXT @295 glPushGroupMarkerEXT@8 @295
glPopGroupMarkerEXT @296 glPopGroupMarkerEXT@0 @296
glEGLImageTargetTexture2DOES @297 glEGLImageTargetTexture2DOES@8 @297
glEGLImageTargetRenderbufferStorageOES @298 glEGLImageTargetRenderbufferStorageOES@8 @298
glBindVertexArrayOES @299 glBindVertexArrayOES@4 @299
glDeleteVertexArraysOES @300 glDeleteVertexArraysOES@8 @300
glGenVertexArraysOES @301 glGenVertexArraysOES@8 @301
glIsVertexArrayOES @302 glIsVertexArrayOES@4 @302
glDebugMessageControlKHR @303 glDebugMessageControlKHR@24 @303
glDebugMessageInsertKHR @304 glDebugMessageInsertKHR@24 @304
glDebugMessageCallbackKHR @305 glDebugMessageCallbackKHR@8 @305
glGetDebugMessageLogKHR @306 glGetDebugMessageLogKHR@32 @306
glPushDebugGroupKHR @307 glPushDebugGroupKHR@16 @307
glPopDebugGroupKHR @308 glPopDebugGroupKHR@0 @308
glObjectLabelKHR @309 glObjectLabelKHR@16 @309
glGetObjectLabelKHR @310 glGetObjectLabelKHR@20 @310
glObjectPtrLabelKHR @311 glObjectPtrLabelKHR@12 @311
glGetObjectPtrLabelKHR @312 glGetObjectPtrLabelKHR@16 @312
glGetPointervKHR @313 glGetPointervKHR@8 @313
glQueryCounterEXT @314 glQueryCounterEXT@8 @314
glGetQueryObjectivEXT @315 glGetQueryObjectivEXT@12 @315
glGetQueryObjecti64vEXT @316 glGetQueryObjecti64vEXT@12 @316
glGetQueryObjectui64vEXT @317 glGetQueryObjectui64vEXT@12 @317
glBindUniformLocationCHROMIUM @318 glBindUniformLocationCHROMIUM@12 @318
glCoverageModulationCHROMIUM @319 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 glFramebufferTextureMultiviewLayeredANGLE@24 @413
glMatrixLoadIdentityCHROMIUM @321 glFramebufferTextureMultiviewSideBySideANGLE@24 @414
glGenPathsCHROMIUM @322 glRequestExtensionANGLE@4 @415
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
; GLES 3.0 Functions ; GLES 3.0 Functions
glReadBuffer @180 glReadBuffer@4 @180
glDrawRangeElements @181 glDrawRangeElements@24 @181
glTexImage3D @182 glTexImage3D@40 @182
glTexSubImage3D @183 glTexSubImage3D@44 @183
glCopyTexSubImage3D @184 glCopyTexSubImage3D@36 @184
glCompressedTexImage3D @185 glCompressedTexImage3D@36 @185
glCompressedTexSubImage3D @186 glCompressedTexSubImage3D@44 @186
glGenQueries @187 glGenQueries@8 @187
glDeleteQueries @188 glDeleteQueries@8 @188
glIsQuery @189 glIsQuery@4 @189
glBeginQuery @190 glBeginQuery@8 @190
glEndQuery @191 glEndQuery@4 @191
glGetQueryiv @192 glGetQueryiv@12 @192
glGetQueryObjectuiv @193 glGetQueryObjectuiv@12 @193
glUnmapBuffer @194 glUnmapBuffer@4 @194
glGetBufferPointerv @195 glGetBufferPointerv@12 @195
glDrawBuffers @196 glDrawBuffers@8 @196
glUniformMatrix2x3fv @197 glUniformMatrix2x3fv@16 @197
glUniformMatrix3x2fv @198 glUniformMatrix3x2fv@16 @198
glUniformMatrix2x4fv @199 glUniformMatrix2x4fv@16 @199
glUniformMatrix4x2fv @200 glUniformMatrix4x2fv@16 @200
glUniformMatrix3x4fv @201 glUniformMatrix3x4fv@16 @201
glUniformMatrix4x3fv @202 glUniformMatrix4x3fv@16 @202
glBlitFramebuffer @203 glBlitFramebuffer@40 @203
glRenderbufferStorageMultisample @204 glRenderbufferStorageMultisample@20 @204
glFramebufferTextureLayer @205 glFramebufferTextureLayer@20 @205
glMapBufferRange @206 glMapBufferRange@16 @206
glFlushMappedBufferRange @207 glFlushMappedBufferRange@12 @207
glBindVertexArray @208 glBindVertexArray@4 @208
glDeleteVertexArrays @209 glDeleteVertexArrays@8 @209
glGenVertexArrays @210 glGenVertexArrays@8 @210
glIsVertexArray @211 glIsVertexArray@4 @211
glGetIntegeri_v @212 glGetIntegeri_v@12 @212
glBeginTransformFeedback @213 glBeginTransformFeedback@4 @213
glEndTransformFeedback @214 glEndTransformFeedback@0 @214
glBindBufferRange @215 glBindBufferRange@20 @215
glBindBufferBase @216 glBindBufferBase@12 @216
glTransformFeedbackVaryings @217 glTransformFeedbackVaryings@16 @217
glGetTransformFeedbackVarying @218 glGetTransformFeedbackVarying@28 @218
glVertexAttribIPointer @219 glVertexAttribIPointer@20 @219
glGetVertexAttribIiv @220 glGetVertexAttribIiv@12 @220
glGetVertexAttribIuiv @221 glGetVertexAttribIuiv@12 @221
glVertexAttribI4i @222 glVertexAttribI4i@20 @222
glVertexAttribI4ui @223 glVertexAttribI4ui@20 @223
glVertexAttribI4iv @224 glVertexAttribI4iv@8 @224
glVertexAttribI4uiv @225 glVertexAttribI4uiv@8 @225
glGetUniformuiv @226 glGetUniformuiv@12 @226
glGetFragDataLocation @227 glGetFragDataLocation@8 @227
glUniform1ui @228 glUniform1ui@8 @228
glUniform2ui @229 glUniform2ui@12 @229
glUniform3ui @230 glUniform3ui@16 @230
glUniform4ui @231 glUniform4ui@20 @231
glUniform1uiv @232 glUniform1uiv@12 @232
glUniform2uiv @233 glUniform2uiv@12 @233
glUniform3uiv @234 glUniform3uiv@12 @234
glUniform4uiv @235 glUniform4uiv@12 @235
glClearBufferiv @236 glClearBufferiv@12 @236
glClearBufferuiv @237 glClearBufferuiv@12 @237
glClearBufferfv @238 glClearBufferfv@12 @238
glClearBufferfi @239 glClearBufferfi@16 @239
glGetStringi @240 glGetStringi@8 @240
glCopyBufferSubData @241 glCopyBufferSubData@20 @241
glGetUniformIndices @242 glGetUniformIndices@16 @242
glGetActiveUniformsiv @243 glGetActiveUniformsiv@20 @243
glGetUniformBlockIndex @244 glGetUniformBlockIndex@8 @244
glGetActiveUniformBlockiv @245 glGetActiveUniformBlockiv@16 @245
glGetActiveUniformBlockName @246 glGetActiveUniformBlockName@20 @246
glUniformBlockBinding @247 glUniformBlockBinding@12 @247
glDrawArraysInstanced @248 glDrawArraysInstanced@16 @248
glDrawElementsInstanced @249 glDrawElementsInstanced@20 @249
glFenceSync @250 glFenceSync@8 @250
glIsSync @251 glIsSync@4 @251
glDeleteSync @252 glDeleteSync@4 @252
glClientWaitSync @253 glClientWaitSync@16 @253
glWaitSync @254 glWaitSync@16 @254
glGetInteger64v @255 glGetInteger64v@8 @255
glGetSynciv @256 glGetSynciv@20 @256
glGetInteger64i_v @257 glGetInteger64i_v@12 @257
glGetBufferParameteri64v @258 glGetBufferParameteri64v@12 @258
glGenSamplers @259 glGenSamplers@8 @259
glDeleteSamplers @260 glDeleteSamplers@8 @260
glIsSampler @261 glIsSampler@4 @261
glBindSampler @262 glBindSampler@8 @262
glSamplerParameteri @263 glSamplerParameteri@12 @263
glSamplerParameteriv @264 glSamplerParameteriv@12 @264
glSamplerParameterf @265 glSamplerParameterf@12 @265
glSamplerParameterfv @266 glSamplerParameterfv@12 @266
glGetSamplerParameteriv @267 glGetSamplerParameteriv@12 @267
glGetSamplerParameterfv @268 glGetSamplerParameterfv@12 @268
glVertexAttribDivisor @269 glVertexAttribDivisor@8 @269
glBindTransformFeedback @270 glBindTransformFeedback@8 @270
glDeleteTransformFeedbacks @271 glDeleteTransformFeedbacks@8 @271
glGenTransformFeedbacks @272 glGenTransformFeedbacks@8 @272
glIsTransformFeedback @273 glIsTransformFeedback@4 @273
glPauseTransformFeedback @274 glPauseTransformFeedback@0 @274
glResumeTransformFeedback @275 glResumeTransformFeedback@0 @275
glGetProgramBinary @276 glGetProgramBinary@20 @276
glProgramBinary @277 glProgramBinary@16 @277
glProgramParameteri @278 glProgramParameteri@12 @278
glInvalidateFramebuffer @279 glInvalidateFramebuffer@12 @279
glInvalidateSubFramebuffer @280 glInvalidateSubFramebuffer@28 @280
glTexStorage2D @281 glTexStorage2D@20 @281
glTexStorage3D @282 glTexStorage3D@24 @282
glGetInternalformativ @283 glGetInternalformativ@20 @283
; GLES 3.1 Functions ; GLES 3.1 Functions
glDispatchCompute @345 glDispatchCompute@12 @345
glDispatchComputeIndirect @346 glDispatchComputeIndirect@4 @346
glDrawArraysIndirect @347 glDrawArraysIndirect@8 @347
glDrawElementsIndirect @348 glDrawElementsIndirect@12 @348
glFramebufferParameteri @349 glFramebufferParameteri@12 @349
glGetFramebufferParameteriv @350 glGetFramebufferParameteriv@12 @350
glGetProgramInterfaceiv @351 glGetProgramInterfaceiv@16 @351
glGetProgramResourceIndex @352 glGetProgramResourceIndex@12 @352
glGetProgramResourceName @353 glGetProgramResourceName@24 @353
glGetProgramResourceiv @354 glGetProgramResourceiv@32 @354
glGetProgramResourceLocation @355 glGetProgramResourceLocation@12 @355
glUseProgramStages @356 glUseProgramStages@12 @356
glActiveShaderProgram @357 glActiveShaderProgram@8 @357
glCreateShaderProgramv @358 glCreateShaderProgramv@12 @358
glBindProgramPipeline @359 glBindProgramPipeline@4 @359
glDeleteProgramPipelines @360 glDeleteProgramPipelines@8 @360
glGenProgramPipelines @361 glGenProgramPipelines@8 @361
glIsProgramPipeline @362 glIsProgramPipeline@4 @362
glGetProgramPipelineiv @363 glGetProgramPipelineiv@12 @363
glProgramUniform1i @364 glProgramUniform1i@12 @364
glProgramUniform2i @365 glProgramUniform2i@16 @365
glProgramUniform3i @366 glProgramUniform3i@20 @366
glProgramUniform4i @367 glProgramUniform4i@24 @367
glProgramUniform1ui @368 glProgramUniform1ui@12 @368
glProgramUniform2ui @369 glProgramUniform2ui@16 @369
glProgramUniform3ui @370 glProgramUniform3ui@20 @370
glProgramUniform4ui @371 glProgramUniform4ui@24 @371
glProgramUniform1f @372 glProgramUniform1f@12 @372
glProgramUniform2f @373 glProgramUniform2f@16 @373
glProgramUniform3f @374 glProgramUniform3f@20 @374
glProgramUniform4f @375 glProgramUniform4f@24 @375
glProgramUniform1iv @376 glProgramUniform1iv@16 @376
glProgramUniform2iv @377 glProgramUniform2iv@16 @377
glProgramUniform3iv @378 glProgramUniform3iv@16 @378
glProgramUniform4iv @379 glProgramUniform4iv@16 @379
glProgramUniform1uiv @380 glProgramUniform1uiv@16 @380
glProgramUniform2uiv @381 glProgramUniform2uiv@16 @381
glProgramUniform3uiv @382 glProgramUniform3uiv@16 @382
glProgramUniform4uiv @383 glProgramUniform4uiv@16 @383
glProgramUniform1fv @384 glProgramUniform1fv@16 @384
glProgramUniform2fv @385 glProgramUniform2fv@16 @385
glProgramUniform3fv @386 glProgramUniform3fv@16 @386
glProgramUniform4fv @387 glProgramUniform4fv@16 @387
glProgramUniformMatrix2fv @388 glProgramUniformMatrix2fv@20 @388
glProgramUniformMatrix3fv @389 glProgramUniformMatrix3fv@20 @389
glProgramUniformMatrix4fv @390 glProgramUniformMatrix4fv@20 @390
glProgramUniformMatrix2x3fv @391 glProgramUniformMatrix2x3fv@20 @391
glProgramUniformMatrix3x2fv @392 glProgramUniformMatrix3x2fv@20 @392
glProgramUniformMatrix2x4fv @393 glProgramUniformMatrix2x4fv@20 @393
glProgramUniformMatrix4x2fv @394 glProgramUniformMatrix4x2fv@20 @394
glProgramUniformMatrix3x4fv @395 glProgramUniformMatrix3x4fv@20 @395
glProgramUniformMatrix4x3fv @396 glProgramUniformMatrix4x3fv@20 @396
glValidateProgramPipeline @397 glValidateProgramPipeline@4 @397
glGetProgramPipelineInfoLog @398 glGetProgramPipelineInfoLog@16 @398
glBindImageTexture @399 glBindImageTexture@28 @399
glGetBooleani_v @400 glGetBooleani_v@12 @400
glMemoryBarrier @401 glMemoryBarrier@4 @401
glMemoryBarrierByRegion @402 glMemoryBarrierByRegion@4 @402
glTexStorage2DMultisample @403 glTexStorage2DMultisample@24 @403
glGetMultisamplefv @404 glGetMultisamplefv@12 @404
glSampleMaski @405 glSampleMaski@8 @405
glGetTexLevelParameteriv @406 glGetTexLevelParameteriv@16 @406
glGetTexLevelParameterfv @407 glGetTexLevelParameterfv@16 @407
glBindVertexBuffer @408 glBindVertexBuffer@16 @408
glVertexAttribFormat @409 glVertexAttribFormat@20 @409
glVertexAttribIFormat @410 glVertexAttribIFormat@16 @410
glVertexAttribBinding @411 glVertexAttribBinding@8 @411
glVertexBindingDivisor @412 glVertexBindingDivisor@8 @412

View File

@ -138,10 +138,10 @@
T is the same type as the return value of \a function. Non-void return T is the same type as the return value of \a function. Non-void return
values can be accessed via the QFuture::result() function. values can be accessed via the QFuture::result() function.
Note that the QFuture returned by QtConcurrent::run() does not support \note The QFuture returned can only be used to query for the
canceling, pausing, or progress reporting. The QFuture returned can only running/finished status and the return value of the function. In particular,
be used to query for the running/finished status and the return value of canceling or pausing can be issued only if the computations behind the future
the function. has not been started.
\sa {Concurrent Run} \sa {Concurrent Run}
*/ */
@ -157,10 +157,10 @@
T is the same type as the return value of \a function. Non-void return T is the same type as the return value of \a function. Non-void return
values can be accessed via the QFuture::result() function. values can be accessed via the QFuture::result() function.
Note that the QFuture returned by QtConcurrent::run() does not support \note The QFuture returned can only be used to query for the
canceling, pausing, or progress reporting. The QFuture returned can only running/finished status and the return value of the function. In particular,
be used to query for the running/finished status and the return value of canceling or pausing can be issued only if the computations behind the future
the function. has not been started.
\sa {Concurrent Run} \sa {Concurrent Run}
*/ */

View File

@ -1063,7 +1063,7 @@ QAbstractAnimation::~QAbstractAnimation()
if (d->state != Stopped) { if (d->state != Stopped) {
QAbstractAnimation::State oldState = d->state; QAbstractAnimation::State oldState = d->state;
d->state = Stopped; d->state = Stopped;
emit stateChanged(oldState, d->state); emit stateChanged(d->state, oldState);
if (oldState == QAbstractAnimation::Running) if (oldState == QAbstractAnimation::Running)
QAnimationTimer::unregisterAnimation(this); QAnimationTimer::unregisterAnimation(this);
} }

View File

@ -846,6 +846,9 @@ QList<QStorageInfo> QStorageInfoPrivate::mountedVolumes()
const QString mountDir = it.rootPath(); const QString mountDir = it.rootPath();
QStorageInfo info(mountDir); QStorageInfo info(mountDir);
info.d->device = it.device();
info.d->fileSystemType = it.fileSystemType();
info.d->subvolume = it.subvolume();
if (info.bytesTotal() == 0) if (info.bytesTotal() == 0)
continue; continue;
volumes.append(info); volumes.append(info);

View File

@ -977,7 +977,11 @@ void QCoreApplication::setAttribute(Qt::ApplicationAttribute attribute, bool on)
QCoreApplicationPrivate::attribs |= 1 << attribute; QCoreApplicationPrivate::attribs |= 1 << attribute;
else else
QCoreApplicationPrivate::attribs &= ~(1 << attribute); QCoreApplicationPrivate::attribs &= ~(1 << attribute);
#if defined(QT_NO_QOBJECT)
if (Q_UNLIKELY(qApp)) { if (Q_UNLIKELY(qApp)) {
#else
if (Q_UNLIKELY(QCoreApplicationPrivate::is_app_running)) {
#endif
switch (attribute) { switch (attribute) {
case Qt::AA_EnableHighDpiScaling: case Qt::AA_EnableHighDpiScaling:
case Qt::AA_DisableHighDpiScaling: case Qt::AA_DisableHighDpiScaling:

View File

@ -688,6 +688,12 @@ static const char *winPosInsertAfter(quintptr h)
static const char *sessionMgrLogOffOption(uint p) static const char *sessionMgrLogOffOption(uint p)
{ {
#ifndef ENDSESSION_CLOSEAPP
#define ENDSESSION_CLOSEAPP 0x00000001
#endif
#ifndef ENDSESSION_CRITICAL
#define ENDSESSION_CRITICAL 0x40000000
#endif
static const QWinMessageMapping<uint> values[] = { static const QWinMessageMapping<uint> values[] = {
{ENDSESSION_CLOSEAPP, "Close application"}, {ENDSESSION_CLOSEAPP, "Close application"},
{ENDSESSION_CRITICAL, "Force application end"}, {ENDSESSION_CRITICAL, "Force application end"},
@ -881,12 +887,6 @@ QString decodeMSG(const MSG& msg)
parameters += QLatin1Char(')'); parameters += QLatin1Char(')');
} }
break; break;
#ifndef ENDSESSION_CLOSEAPP
#define ENDSESSION_CLOSEAPP 0x00000001
#endif
#ifndef ENDSESSION_CRITICAL
#define ENDSESSION_CRITICAL 0x40000000
#endif
case WM_QUERYENDSESSION: case WM_QUERYENDSESSION:
parameters = QLatin1String("End session: "); parameters = QLatin1String("End session: ");
if (const char *logoffOption = sessionMgrLogOffOption(uint(wParam))) if (const char *logoffOption = sessionMgrLogOffOption(uint(wParam)))

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2018 Intel Corporation. ** Copyright (C) 2019 Intel Corporation.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtCore module of the Qt Toolkit. ** This file is part of the QtCore module of the Qt Toolkit.
@ -598,10 +598,12 @@ QCborValue QCborValue::fromJsonValue(const QJsonValue &v)
switch (v.type()) { switch (v.type()) {
case QJsonValue::Bool: case QJsonValue::Bool:
return v.b; return v.b;
case QJsonValue::Double: case QJsonValue::Double: {
if (v.dbl == qint64(v.dbl)) qint64 i;
return qint64(v.dbl); if (convertDoubleTo(v.dbl, &i))
return i;
return v.dbl; return v.dbl;
}
case QJsonValue::String: case QJsonValue::String:
return v.toString(); return v.toString();
case QJsonValue::Array: case QJsonValue::Array:

View File

@ -55,8 +55,8 @@
instance, the computation can be canceled with the cancel() function. To instance, the computation can be canceled with the cancel() function. To
pause the computation, use the setPaused() function or one of the pause(), pause the computation, use the setPaused() function or one of the pause(),
resume(), or togglePaused() convenience functions. Be aware that not all resume(), or togglePaused() convenience functions. Be aware that not all
asynchronous computations can be canceled or paused. For example, the running asynchronous computations can be canceled or paused. For example,
future returned by QtConcurrent::run() cannot be canceled; but the the future returned by QtConcurrent::run() cannot be canceled; but the
future returned by QtConcurrent::mappedReduced() can. future returned by QtConcurrent::mappedReduced() can.
Progress information is provided by the progressValue(), Progress information is provided by the progressValue(),
@ -133,8 +133,8 @@
Any QFutureWatcher object that is watching this future will not deliver Any QFutureWatcher object that is watching this future will not deliver
progress and result ready signals on a canceled future. progress and result ready signals on a canceled future.
Be aware that not all asynchronous computations can be canceled. For Be aware that not all running asynchronous computations can be canceled.
example, the future returned by QtConcurrent::run() cannot be canceled; For example, the future returned by QtConcurrent::run() cannot be canceled;
but the future returned by QtConcurrent::mappedReduced() can. but the future returned by QtConcurrent::mappedReduced() can.
*/ */

View File

@ -84,8 +84,8 @@ QT_BEGIN_NAMESPACE
\snippet code/src_corelib_thread_qfuturewatcher.cpp 0 \snippet code/src_corelib_thread_qfuturewatcher.cpp 0
Be aware that not all asynchronous computations can be canceled or paused. Be aware that not all running asynchronous computations can be canceled or
For example, the future returned by QtConcurrent::run() cannot be paused. For example, the future returned by QtConcurrent::run() cannot be
canceled; but the future returned by QtConcurrent::mappedReduced() can. canceled; but the future returned by QtConcurrent::mappedReduced() can.
QFutureWatcher<void> is specialized to not contain any of the result QFutureWatcher<void> is specialized to not contain any of the result
@ -124,9 +124,9 @@ QFutureWatcherBase::QFutureWatcherBase(QObject *parent)
progressRangeChanged(), progressTextChanged(), resultReadyAt(), and progressRangeChanged(), progressTextChanged(), resultReadyAt(), and
resultsReadyAt() signals. resultsReadyAt() signals.
Be aware that not all asynchronous computations can be canceled. For Be aware that not all running asynchronous computations can be canceled.
example, the QFuture returned by QtConcurrent::run() cannot be canceled; For example, the QFuture returned by QtConcurrent::run() cannot be
but the QFuture returned by QtConcurrent::mappedReduced() can. canceled; but the QFuture returned by QtConcurrent::mappedReduced() can.
*/ */
void QFutureWatcherBase::cancel() void QFutureWatcherBase::cancel()
{ {

View File

@ -727,6 +727,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; pthread_t threadId;
int code = pthread_create(&threadId, &attr, QThreadPrivate::start, this); int code = pthread_create(&threadId, &attr, QThreadPrivate::start, this);
if (code == EPERM) { if (code == EPERM) {

View File

@ -0,0 +1,3 @@
#! [qt5_add_dbus_adaptor]
qt5_add_dbus_adaptor(GENERATED_SOURCES org.example.chat.xml chat.h ChatMainWindow)
#! [qt5_add_dbus_adaptor]

View File

@ -0,0 +1,224 @@
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
\page qtdbus-cmake-qt5-add-dbus-interface.html
\ingroup cmake-commands-qtdbus
\title qt5_add_dbus_interface
\brief Generates C++ sources implementing an interface for a D-Bus interface
description file.
\section1 Synopsis
\badcode
qt5_add_dbus_interface(<VAR> dbus_spec basename)
\endcode
\section1 Description
Generates C++ sources implementing an interface for a D-Bus interface description
file defined in \c{dbus_spec}. The generated files are named after \c{basename}:
\c{basename.h}, \c{basename.cpp}, \c{basename.moc}. The paths of the files
are added to \c{<VAR>}.
The function sets up a call to the \l{Qt D-Bus XML compiler (qdbusxml2cpp)}
in interface (proxy) mode. By default, \c{qdbusxml2cpp} generates a C++
class named after the interface name, with a namespaced alias:
\table
\header
\li D-Bus Interface Name
\li Class name
\li Namespaced name
\row
\li \c{org.example.chat}
\li \c{OrgExampleChatInterface}
\li \c{org.example.chat}
\endtable
\section1 Options
Options can be set using \c set_source_file_property on the \c dbus_spec:
\table
\header
\li Option
\li Value
\li Description
\row
\li \c CLASSNAME
\li \c class_name
\li Override the default interface class name with \c{class_name}.
\row
\li \c NO_NAMESPACE
\li boolean
\li Do not generate the namespaced name if set to \c{ON}.
\row
\li \c INCLUDE
\li \c path
\li Add an \c{#include "path"} in the generated code.
\endtable
*/
/*!
\page qtdbus-cmake-qt5-add-dbus-interfaces.html
\ingroup cmake-commands-qtdbus
\title qt5_add_dbus_interfaces
\brief Generates C++ sources implementing interfaces for D-Bus interface
description files.
\section1 Synopsis
\badcode
qt5_add_dbus_interfaces(<VAR> dbus_spec1 [dbus_spec2 ...])
\endcode
\section1 Description
Generates C++ sources implementing D-Bus interfaces defined in \c{dbus_spec1},
\c{dbus_spec2}, where each argument needs to be the path to a valid D-Bus
interface description file. The paths of the generated files are added to
\c{<VAR>}.
For each argument, a call to the \l{Qt D-Bus XML compiler (qdbusxml2cpp)}
in interface (proxy) mode is set up.
The generated C++ source files are named after the XML file: For the file
\c{org.example.chat.xml} the generated header will be named
\c{orgexamplechatinterface.h}.
\section1 Options
Options can be set using \c set_source_file_property on each of the file
arguments:
\table
\header
\li Option
\li Value
\li Description
\row
\li \c CLASSNAME
\li \c class_name
\li Override the default interface class name with \c{class_name}.
\row
\li \c NO_NAMESPACE
\li boolean
\li Do not generate the namespaced name if set to \c{ON}.
\row
\li \c INCLUDE
\li \c path
\li Add an \c{#include "path"} in the generated code.
\endtable
*/
/*!
\page qtdbus-cmake-qt5-generate-dbus-interface.html
\ingroup cmake-commands-qtdbus
\title qt5_generate_dbus_interface
\brief Generates a D-Bus interface from a header file.
\section1 Synopsis
\badcode
qt5_generate_dbus_interface(header
[customName]
[OPTIONS options]
)
\endcode
\section1 Description
Parses the C++ source or header file containing a QObject-derived class
declaration and generates a file containing the D-BUS Introspection XML.
By default, the generated XML file is stored in the current binary directory,
and has the same base name as the header. You can specify a different name or
path by adding \c{customName} as an optional second argument.
\section1 Options
The function sets up a call to the \c{qdbuscpp2xml} command line tool. Further
arguments to the tool can be set after \c{OPTIONS}.
*/
/*!
\page qtdbus-cmake-qt5-add-dbus-adaptor.html
\ingroup cmake-commands-qtdbus
\title qt5_add_dbus_adaptor
\brief Generates an adaptor class for a D-Bus interface.
\section1 Synopsis
\badcode
qt5_add_dbus_adaptor(<VAR> dbus_spec header parent_class
[basename]
[classname])
\endcode
\section1 Description
Generates a C++ header file implementing an adaptor for a D-Bus interface
description file defined in \c{dbus_spec}. The path of the generated file is
added to \c{<VAR>}. The generated adaptor class takes a pointer to
\c{parent_class} as QObject parent. \c{parent_class} should be declared in
\c{header}, which is included in the generated code as \c{#include "header"}.
The function sets up a call to the \l{Qt D-Bus XML compiler (qdbusxml2cpp)}
in adaptor mode. The default file and class name are generated from the last
segment in the \c{dbus_spec} base name:
\table
\header
\li XML file
\li Header file
\li Class name
\row
\li \c{org.example.chat}
\li \c{chatadaptor.h}
\li \c{ChatAdaptor}
\endtable
You can change the name of the header file to be generated by passing
\c{basename} as the fifth argument. The \c{.h} suffix is always added.
You can change the default class name by passing \c{classname} as the sixth
argument.
\section1 Examples
\snippet cmake/examples.cmake qt5_add_dbus_adaptor
*/

View File

@ -350,6 +350,7 @@ Q_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core");
\value MenuItem An item in a menu or menu bar. \value MenuItem An item in a menu or menu bar.
\value NoRole The object has no role. This usually indicates an invalid object. \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 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 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 PageTabList A list of page tabs.
\value Paragraph A paragraph of text (usually found in documents). \value Paragraph A paragraph of text (usually found in documents).

View File

@ -299,6 +299,7 @@ public:
Paragraph = 0x00000083, Paragraph = 0x00000083,
WebDocument = 0x00000084, WebDocument = 0x00000084,
Section = 0x00000085, Section = 0x00000085,
Notification = 0x00000086,
// IAccessible2 roles // IAccessible2 roles
// IA2_ROLE_CANVAS = 0x401, ### Qt 6 use this one instead of Canvas above // IA2_ROLE_CANVAS = 0x401, ### Qt 6 use this one instead of Canvas above

View File

@ -1321,10 +1321,12 @@ bool QImageReader::read(QImage *image)
} }
} }
// successful read; check for "@2x" file name suffix and set device pixel ratio. // successful read; check for "@Nx" file name suffix and set device pixel ratio.
static bool disable2xImageLoading = !qEnvironmentVariableIsEmpty("QT_HIGHDPI_DISABLE_2X_IMAGE_LOADING"); static bool disableNxImageLoading = !qEnvironmentVariableIsEmpty("QT_HIGHDPI_DISABLE_2X_IMAGE_LOADING");
if (!disable2xImageLoading && QFileInfo(fileName()).baseName().endsWith(QLatin1String("@2x"))) { if (!disableNxImageLoading) {
image->setDevicePixelRatio(2.0); 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()) if (autoTransform())
qt_imageTransform(*image, transformation()); qt_imageTransform(*image, transformation());

View File

@ -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 QHighDpiScaling::mapPositionFromGlobal(const QPoint &pos, const QPoint &windowGlobalPosition, const QWindow *window)
{ {
QPoint windowPosCandidate = pos - windowGlobalPosition; QPoint windowPosCandidate = pos - windowGlobalPosition;
if (QGuiApplicationPrivate::screen_list.size() <= 1) if (QGuiApplicationPrivate::screen_list.size() <= 1 || window->handle() == nullptr)
return windowPosCandidate; return windowPosCandidate;
// Device independent global (screen) space may discontiguous when high-dpi scaling // Device independent global (screen) space may discontiguous when high-dpi scaling

View File

@ -108,208 +108,114 @@ private:
namespace QHighDpi { 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; return (pos - origin) * scaleFactor + origin;
} }
inline QPoint fromNative(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 toNative(const QPoint &pos, qreal scaleFactor, const QPoint &origin)
{ {
return (pos - origin) * scaleFactor + origin; return (pos - origin) * scaleFactor + origin;
} }
inline QPoint fromNative(const QPoint &pos, qreal scaleFactor) inline QRect scale(const QRect &rect, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{ {
return pos / scaleFactor; return QRect(scale(rect.topLeft(), scaleFactor, origin), scale(rect.size(), scaleFactor));
} }
inline QPoint toNative(const QPoint &pos, qreal scaleFactor) inline QRectF scale(const QRectF &rect, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{ {
return pos * scaleFactor; return QRectF(scale(rect.topLeft(), scaleFactor, origin), scale(rect.size(), scaleFactor));
} }
inline QSize fromNative(const QSize &size, qreal scaleFactor) inline QMargins scale(const QMargins &margins, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{ {
return size / scaleFactor; // TODO: should we round up? 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));
} }
inline QSize toNative(const QSize &size, qreal scaleFactor) template <typename T>
QVector<T> scale(const QVector<T> &vector, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{ {
return size * scaleFactor; if (!QHighDpiScaling::isActive())
return vector;
QVector<T> scaled;
scaled.reserve(vector.size());
for (const T &item : vector)
scaled.append(scale(item, scaleFactor, origin));
return scaled;
} }
inline QSizeF fromNative(const QSizeF &size, qreal scaleFactor) inline QRegion scale(const QRegion &region, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{ {
return size / scaleFactor; if (!QHighDpiScaling::isActive())
return region;
QRegion scaled;
for (const QRect &rect : region)
scaled += scale(rect, scaleFactor, origin);
return scaled;
} }
inline QSizeF toNative(const QSizeF &size, qreal scaleFactor) template <typename T, typename C>
T fromNativePixels(const T &value, const C *context)
{ {
return size * scaleFactor; return scale(value, qreal(1) / QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
} }
inline QRect fromNative(const QRect &rect, qreal scaleFactor, const QPoint &origin) template <typename T, typename C>
T toNativePixels(const T &value, const C *context)
{ {
return QRect(fromNative(rect.topLeft(), scaleFactor, origin), fromNative(rect.size(), scaleFactor)); return scale(value, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
} }
inline QRect toNative(const QRect &rect, qreal scaleFactor, const QPoint &origin) template <typename T, typename C>
T fromNativeLocalPosition(const T &value, const C *context)
{ {
return QRect(toNative(rect.topLeft(), scaleFactor, origin), toNative(rect.size(), scaleFactor)); return scale(value, qreal(1) / QHighDpiScaling::factor(context));
}
template <typename T, typename C>
T toNativeLocalPosition(const T &value, const C *context)
{
return scale(value, QHighDpiScaling::factor(context));
}
template <typename T>
inline T fromNative(const T &value, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
return scale(value, qreal(1) / scaleFactor, origin);
}
template <typename T>
inline T toNative(const T &value, qreal scaleFactor, QPoint origin = QPoint(0, 0))
{
return scale(value, scaleFactor, origin);
} }
inline QRect fromNative(const QRect &rect, const QScreen *screen, const QPoint &screenOrigin) inline QRect fromNative(const QRect &rect, const QScreen *screen, const QPoint &screenOrigin)
{ {
return fromNative(rect, QHighDpiScaling::factor(screen), screenOrigin); return scale(rect, qreal(1) / QHighDpiScaling::factor(screen), screenOrigin);
} }
inline QRect fromNativeScreenGeometry(const QRect &nativeScreenGeometry, const QScreen *screen) inline QRect fromNativeScreenGeometry(const QRect &nativeScreenGeometry, const QScreen *screen)
{ {
return QRect(nativeScreenGeometry.topLeft(), return QRect(nativeScreenGeometry.topLeft(),
fromNative(nativeScreenGeometry.size(), QHighDpiScaling::factor(screen))); scale(nativeScreenGeometry.size(), qreal(1) / 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;
}
template <typename C>
inline QRect fromNativePixels(const QRect &pixelRect, const C *context)
{
const qreal scaleFactor = QHighDpiScaling::factor(context);
const QPoint origin = QHighDpiScaling::origin(context);
return QRect(fromNative(pixelRect.topLeft(), scaleFactor, origin),
fromNative(pixelRect.size(), scaleFactor));
}
template <typename C>
inline QRect toNativePixels(const QRect &pointRect, const C *context)
{
const qreal scaleFactor = QHighDpiScaling::factor(context);
const QPoint origin = QHighDpiScaling::origin(context);
return QRect(toNative(pointRect.topLeft(), scaleFactor, origin),
toNative(pointRect.size(), scaleFactor));
}
template <typename C>
inline QRectF toNativePixels(const QRectF &pointRect, const C *context)
{
const qreal scaleFactor = QHighDpiScaling::factor(context);
const QPoint origin = QHighDpiScaling::origin(context);
return QRectF(toNative(pointRect.topLeft(), scaleFactor, origin),
toNative(pointRect.size(), scaleFactor));
}
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));
}
inline QSize fromNativePixels(const QSize &pixelSize, const QWindow *window)
{
return pixelSize / QHighDpiScaling::factor(window);
}
inline QSize toNativePixels(const QSize &pointSize, const QWindow *window)
{
return pointSize * QHighDpiScaling::factor(window);
}
inline QSizeF fromNativePixels(const QSizeF &pixelSize, const QWindow *window)
{
return pixelSize / QHighDpiScaling::factor(window);
}
inline QSizeF toNativePixels(const QSizeF &pointSize, const QWindow *window)
{
return pointSize * QHighDpiScaling::factor(window);
}
template <typename C>
inline QPoint fromNativePixels(const QPoint &pixelPoint, const C *context)
{
return fromNative(pixelPoint, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
}
template <typename C>
inline QPoint toNativePixels(const QPoint &pointPoint, const C *context)
{
return toNative(pointPoint, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
}
template <typename C>
inline QPointF fromNativePixels(const QPointF &pixelPoint, const C *context)
{
return fromNative(pixelPoint, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
}
template <typename C>
inline QPointF toNativePixels(const QPointF &pointPoint, const C *context)
{
return toNative(pointPoint, QHighDpiScaling::factor(context), QHighDpiScaling::origin(context));
}
inline QMargins fromNativePixels(const QMargins &pixelMargins, const QWindow *window)
{
const qreal scaleFactor = QHighDpiScaling::factor(window);
return QMargins(pixelMargins.left() / scaleFactor, pixelMargins.top() / scaleFactor,
pixelMargins.right() / scaleFactor, pixelMargins.bottom() / scaleFactor);
}
inline QMargins toNativePixels(const QMargins &pointMargins, const QWindow *window)
{
const qreal scaleFactor = QHighDpiScaling::factor(window);
return QMargins(pointMargins.left() * scaleFactor, pointMargins.top() * scaleFactor,
pointMargins.right() * scaleFactor, pointMargins.bottom() * scaleFactor);
} }
inline QRegion fromNativeLocalRegion(const QRegion &pixelRegion, const QWindow *window) inline QRegion fromNativeLocalRegion(const QRegion &pixelRegion, const QWindow *window)
{ {
if (!QHighDpiScaling::isActive()) return scale(pixelRegion, qreal(1) / QHighDpiScaling::factor(window));
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;
} }
// When mapping expose events to Qt rects: round top/left towards the origin and // 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) inline QRegion toNativeLocalRegion(const QRegion &pointRegion, const QWindow *window)
{ {
if (!QHighDpiScaling::isActive()) return scale(pointRegion, QHighDpiScaling::factor(window));
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;
} }
} // namespace QHighDpi } // namespace QHighDpi

View File

@ -514,7 +514,7 @@ float QVector3D::distanceToPlane
/*! /*!
\overload \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 vertices \a plane1, \a plane2 and \a plane3.
The return value will be negative if the vertex is below the plane, The return value will be negative if the vertex is below the plane,

View File

@ -349,6 +349,9 @@ bool QOpenGLTextureBlitterPrivate::buildProgram(ProgramIndex idx, const char *vs
p->glProgram->setUniformValue(p->swizzleUniformPos, false); p->glProgram->setUniformValue(p->swizzleUniformPos, false);
// minmize state left set after a create()
p->glProgram->release();
return true; return true;
} }

View File

@ -4566,7 +4566,9 @@ static void blend_color_rgb16(int count, const QSpan *spans, void *userData)
if (mode == QPainter::CompositionMode_Source) { if (mode == QPainter::CompositionMode_Source) {
// inline for performance // inline for performance
ushort c = data->solidColor.toRgb16(); ushort c = data->solidColor.toRgb16();
while (count--) { for (; count--; spans++) {
if (!spans->len)
continue;
ushort *target = ((ushort *)data->rasterBuffer->scanLine(spans->y)) + spans->x; ushort *target = ((ushort *)data->rasterBuffer->scanLine(spans->y)) + spans->x;
if (spans->coverage == 255) { if (spans->coverage == 255) {
qt_memfill(target, c, spans->len); qt_memfill(target, c, spans->len);
@ -4579,13 +4581,14 @@ static void blend_color_rgb16(int count, const QSpan *spans, void *userData)
++target; ++target;
} }
} }
++spans;
} }
return; return;
} }
if (mode == QPainter::CompositionMode_SourceOver) { if (mode == QPainter::CompositionMode_SourceOver) {
while (count--) { for (; count--; spans++) {
if (!spans->len)
continue;
uint color = BYTE_MUL(data->solidColor.toArgb32(), spans->coverage); uint color = BYTE_MUL(data->solidColor.toArgb32(), spans->coverage);
int ialpha = qAlpha(~color); int ialpha = qAlpha(~color);
ushort c = qConvertRgb32To16(color); ushort c = qConvertRgb32To16(color);
@ -4617,7 +4620,6 @@ static void blend_color_rgb16(int count, const QSpan *spans, void *userData)
// one last pixel beyond a full word // one last pixel beyond a full word
*target = c + BYTE_MUL_RGB16(*target, ialpha); *target = c + BYTE_MUL_RGB16(*target, ialpha);
} }
++spans;
} }
return; return;
} }
@ -4634,6 +4636,11 @@ void handleSpans(int count, const QSpan *spans, const QSpanData *data, T &handle
int coverage = 0; int coverage = 0;
while (count) { while (count) {
if (!spans->len) {
++spans;
--count;
continue;
}
int x = spans->x; int x = spans->x;
const int y = spans->y; const int y = spans->y;
int right = x + spans->len; int right = x + spans->len;
@ -4790,7 +4797,9 @@ static void blend_untransformed_generic(int count, const QSpan *spans, void *use
int xoff = -qRound(-data->dx); int xoff = -qRound(-data->dx);
int yoff = -qRound(-data->dy); int yoff = -qRound(-data->dy);
while (count--) { for (; count--; spans++) {
if (!spans->len)
continue;
int x = spans->x; int x = spans->x;
int length = spans->len; int length = spans->len;
int sx = xoff + x; int sx = xoff + x;
@ -4818,7 +4827,6 @@ static void blend_untransformed_generic(int count, const QSpan *spans, void *use
} }
} }
} }
++spans;
} }
} }
@ -4840,7 +4848,9 @@ static void blend_untransformed_generic_rgb64(int count, const QSpan *spans, voi
int xoff = -qRound(-data->dx); int xoff = -qRound(-data->dx);
int yoff = -qRound(-data->dy); int yoff = -qRound(-data->dy);
while (count--) { for (; count--; spans++) {
if (!spans->len)
continue;
int x = spans->x; int x = spans->x;
int length = spans->len; int length = spans->len;
int sx = xoff + x; int sx = xoff + x;
@ -4868,7 +4878,6 @@ static void blend_untransformed_generic_rgb64(int count, const QSpan *spans, voi
} }
} }
} }
++spans;
} }
} }
#endif #endif
@ -4889,7 +4898,9 @@ static void blend_untransformed_argb(int count, const QSpan *spans, void *userDa
int xoff = -qRound(-data->dx); int xoff = -qRound(-data->dx);
int yoff = -qRound(-data->dy); int yoff = -qRound(-data->dy);
while (count--) { for (; count--; spans++) {
if (!spans->len)
continue;
int x = spans->x; int x = spans->x;
int length = spans->len; int length = spans->len;
int sx = xoff + x; int sx = xoff + x;
@ -4909,7 +4920,6 @@ static void blend_untransformed_argb(int count, const QSpan *spans, void *userDa
op.func(dest, src, length, coverage); op.func(dest, src, length, coverage);
} }
} }
++spans;
} }
} }
@ -4982,7 +4992,12 @@ static void blend_untransformed_rgb565(int count, const QSpan *spans, void *user
int xoff = -qRound(-data->dx); int xoff = -qRound(-data->dx);
int yoff = -qRound(-data->dy); 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; const quint8 coverage = (data->texture.const_alpha * spans->coverage) >> 8;
if (coverage == 0) { if (coverage == 0) {
++spans; ++spans;

View File

@ -4149,7 +4149,7 @@ static void qt_span_fill_clipped(int spanCount, const QSpan *spans, void *userDa
Clip spans to \a{clip}-rectangle. Clip spans to \a{clip}-rectangle.
Returns number of unclipped spans 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 QRect &clip)
{ {
const short minx = clip.left(); const short minx = clip.left();
@ -4157,29 +4157,32 @@ static int qt_intersect_spans(QT_FT_Span *spans, int numSpans,
const short maxx = clip.right(); const short maxx = clip.right();
const short maxy = clip.bottom(); const short maxy = clip.bottom();
int n = 0; QT_FT_Span *end = spans + numSpans;
for (int i = 0; i < numSpans; ++i) { while (spans < end) {
if (spans[i].y > maxy) if (spans->y >= miny)
break; break;
if (spans[i].y < miny ++spans;
|| spans[i].x > maxx
|| spans[i].x + spans[i].len <= minx) {
continue;
}
if (spans[i].x < minx) {
spans[n].len = qMin(spans[i].len - (minx - spans[i].x), maxx - minx + 1);
spans[n].x = minx;
} else {
spans[n].x = spans[i].x;
spans[n].len = qMin(spans[i].len, ushort(maxx - spans[n].x + 1));
}
if (spans[n].len == 0)
continue;
spans[n].y = spans[i].y;
spans[n].coverage = spans[i].coverage;
++n;
} }
return n;
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 (s->x < minx) {
s->len = qMin(s->len - (minx - s->x), maxx - minx + 1);
s->x = minx;
} else {
s->len = qMin(s->len, ushort(maxx - s->x + 1));
}
++s;
}
return s - spans;
} }
@ -4192,11 +4195,12 @@ static void qt_span_fill_clipRect(int count, const QSpan *spans,
Q_ASSERT(fillData->clip); Q_ASSERT(fillData->clip);
Q_ASSERT(!fillData->clip->clipRect.isEmpty()); Q_ASSERT(!fillData->clip->clipRect.isEmpty());
QSpan *s = const_cast<QSpan *>(spans);
// hw: check if this const_cast<> is safe!!! // 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); fillData->clip->clipRect);
if (count > 0) 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) static void qt_span_clip(int count, const QSpan *spans, void *userData)
@ -4773,7 +4777,8 @@ static inline void drawEllipsePoints(int x, int y, int length,
if (length == 0) if (length == 0)
return; 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 midx = rect.x() + (rect.width() + 1) / 2;
const int midy = rect.y() + (rect.height() + 1) / 2; const int midy = rect.y() + (rect.height() + 1) / 2;
@ -4805,7 +4810,8 @@ static inline void drawEllipsePoints(int x, int y, int length,
outline[3].coverage = 255; outline[3].coverage = 255;
if (brush_func && outline[0].x + outline[0].len < outline[1].x) { 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 // top fill
fill[0].x = outline[0].x + outline[0].len - 1; fill[0].x = outline[0].x + outline[0].len - 1;

View File

@ -522,7 +522,7 @@ void QStroker::joinPoints(qfixed focal_x, qfixed focal_y, const QLineF &nextLine
QLineF shortCut(prevLine.p2(), nextLine.p1()); QLineF shortCut(prevLine.p2(), nextLine.p1());
qreal angle = shortCut.angleTo(prevLine); 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(focal_x, focal_y);
emitLineTo(qt_real_to_fixed(nextLine.x1()), qt_real_to_fixed(nextLine.y1())); emitLineTo(qt_real_to_fixed(nextLine.x1()), qt_real_to_fixed(nextLine.y1()));
return; return;

View File

@ -899,11 +899,6 @@ QDistanceField::QDistanceField(int width, int height)
{ {
} }
QDistanceField::QDistanceField(const QDistanceField &other)
{
d = other.d;
}
QDistanceField &QDistanceField::operator=(const QDistanceField &) QDistanceField &QDistanceField::operator=(const QDistanceField &)
= default; = default;

View File

@ -94,7 +94,6 @@ public:
QDistanceField(const QRawFont &font, glyph_t glyph, bool doubleResolution = false); QDistanceField(const QRawFont &font, glyph_t glyph, bool doubleResolution = false);
QDistanceField(QFontEngine *fontEngine, glyph_t glyph, bool doubleResolution = false); QDistanceField(QFontEngine *fontEngine, glyph_t glyph, bool doubleResolution = false);
QDistanceField(const QPainterPath &path, glyph_t glyph, bool doubleResolution = false); QDistanceField(const QPainterPath &path, glyph_t glyph, bool doubleResolution = false);
QDistanceField(const QDistanceField &other);
QDistanceField &operator=(const QDistanceField &other); QDistanceField &operator=(const QDistanceField &other);
bool isNull() const; bool isNull() const;

View File

@ -233,19 +233,20 @@ QNetworkConfigurationManager::QNetworkConfigurationManager(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate(); QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
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()));
connect(priv, SIGNAL(configurationAdded(QNetworkConfiguration)), priv->enablePolling();
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();
} }
/*! /*!

View File

@ -258,7 +258,8 @@ QNetworkSession::QNetworkSession(const QNetworkConfiguration &connectionConfig,
// invalid configuration // invalid configuration
if (!connectionConfig.identifier().isEmpty()) { if (!connectionConfig.identifier().isEmpty()) {
const auto engines = qNetworkConfigurationManagerPrivate()->engines(); auto priv = qNetworkConfigurationManagerPrivate();
const auto engines = priv ? priv->engines() : QList<QBearerEngine *>();
for (QBearerEngine *engine : engines) { for (QBearerEngine *engine : engines) {
if (engine->hasIdentifier(connectionConfig.identifier())) { if (engine->hasIdentifier(connectionConfig.identifier())) {
d = engine->createSessionBackend(); d = engine->createSessionBackend();

View File

@ -71,6 +71,10 @@
#include "qwindowscarootfetcher_p.h" #include "qwindowscarootfetcher_p.h"
#endif #endif
#if !QT_CONFIG(opensslv11)
#include <openssl/x509_vfy.h>
#endif
#include <QtCore/qdatetime.h> #include <QtCore/qdatetime.h>
#include <QtCore/qdebug.h> #include <QtCore/qdebug.h>
#include <QtCore/qdir.h> #include <QtCore/qdir.h>
@ -137,6 +141,55 @@ static unsigned int q_ssl_psk_server_callback(SSL *ssl,
Q_ASSERT(d); Q_ASSERT(d);
return d->tlsPskServerCallback(identity, psk, max_psk_len); return d->tlsPskServerCallback(identity, psk, max_psk_len);
} }
#ifdef TLS1_3_VERSION
#ifndef OPENSSL_NO_PSK
static unsigned int q_ssl_psk_restore_client(SSL *ssl,
const char *hint,
char *identity, unsigned int max_identity_len,
unsigned char *psk, unsigned int max_psk_len)
{
Q_UNUSED(hint);
Q_UNUSED(identity);
Q_UNUSED(max_identity_len);
Q_UNUSED(psk);
Q_UNUSED(max_psk_len);
#ifdef QT_DEBUG
QSslSocketBackendPrivate *d = reinterpret_cast<QSslSocketBackendPrivate *>(q_SSL_get_ex_data(ssl, QSslSocketBackendPrivate::s_indexForSSLExtraData));
Q_ASSERT(d);
Q_ASSERT(d->mode == QSslSocket::SslClientMode);
#endif
q_SSL_set_psk_client_callback(ssl, &q_ssl_psk_client_callback);
return 0;
}
#endif // !OPENSSL_NO_PSK
static int q_ssl_psk_use_session_callback(SSL *ssl, const EVP_MD *md, const unsigned char **id,
size_t *idlen, SSL_SESSION **sess)
{
Q_UNUSED(ssl);
Q_UNUSED(md);
Q_UNUSED(id);
Q_UNUSED(idlen);
Q_UNUSED(sess);
#ifndef OPENSSL_NO_PSK
#ifdef QT_DEBUG
QSslSocketBackendPrivate *d = reinterpret_cast<QSslSocketBackendPrivate *>(q_SSL_get_ex_data(ssl, QSslSocketBackendPrivate::s_indexForSSLExtraData));
Q_ASSERT(d);
Q_ASSERT(d->mode == QSslSocket::SslClientMode);
#endif
// Temporarily rebind the psk because it will be called next. The function will restore it.
q_SSL_set_psk_client_callback(ssl, &q_ssl_psk_restore_client);
#endif
return 1; // need to return 1 or else "the connection setup fails."
}
#endif // TLS1_3_VERSION
#endif #endif
#if QT_CONFIG(ocsp) #if QT_CONFIG(ocsp)
@ -345,47 +398,41 @@ bool qt_OCSP_certificate_match(OCSP_SINGLERESP *singleResponse, X509 *peerCert,
#endif // ocsp #endif // ocsp
// ### This list is shared between all threads, and protected by a
// mutex. Investigate using thread local storage instead. Or better properly
// use OpenSSL's ability to attach application data to an SSL/SSL_CTX
// and extract it in a callback. See how it's done, for example, in PSK
// callback or in DTLS verification callback.
struct QSslErrorList
{
QMutex mutex;
QVector<QSslErrorEntry> errors;
};
Q_GLOBAL_STATIC(QSslErrorList, _q_sslErrorList)
int q_X509Callback(int ok, X509_STORE_CTX *ctx) int q_X509Callback(int ok, X509_STORE_CTX *ctx)
{ {
if (!ok) { if (!ok) {
// Store the error and at which depth the error was detected. // Store the error and at which depth the error was detected.
_q_sslErrorList()->errors << QSslErrorEntry::fromStoreContext(ctx);
#if !QT_CONFIG(opensslv11) using ErrorListPtr = QVector<QSslErrorEntry>*;
#ifdef QSSLSOCKET_DEBUG ErrorListPtr errors = nullptr;
qCDebug(lcSsl) << "verification error: dumping bad certificate";
qCDebug(lcSsl) << QSslCertificatePrivate::QSslCertificate_from_X509(q_X509_STORE_CTX_get_current_cert(ctx)).toPem(); // Error list is attached to either 'SSL' or 'X509_STORE'.
qCDebug(lcSsl) << "dumping chain"; if (X509_STORE *store = q_X509_STORE_CTX_get0_store(ctx)) { // We try store first:
const auto certs = QSslSocketBackendPrivate::STACKOFX509_to_QSslCertificates(q_X509_STORE_CTX_get_chain(ctx)); #if QT_CONFIG(opensslv11)
for (const QSslCertificate &cert : certs) { errors = ErrorListPtr(q_X509_STORE_get_ex_data(store, 0));
qCDebug(lcSsl) << "Issuer:" << "O=" << cert.issuerInfo(QSslCertificate::Organization) #else
<< "CN=" << cert.issuerInfo(QSslCertificate::CommonName) errors = ErrorListPtr(q_CRYPTO_get_ex_data(&store->ex_data, 0));
<< "L=" << cert.issuerInfo(QSslCertificate::LocalityName) #endif // opensslv11
<< "OU=" << cert.issuerInfo(QSslCertificate::OrganizationalUnitName)
<< "C=" << cert.issuerInfo(QSslCertificate::CountryName)
<< "ST=" << cert.issuerInfo(QSslCertificate::StateOrProvinceName);
qCDebug(lcSsl) << "Subject:" << "O=" << cert.subjectInfo(QSslCertificate::Organization)
<< "CN=" << cert.subjectInfo(QSslCertificate::CommonName)
<< "L=" << cert.subjectInfo(QSslCertificate::LocalityName)
<< "OU=" << cert.subjectInfo(QSslCertificate::OrganizationalUnitName)
<< "C=" << cert.subjectInfo(QSslCertificate::CountryName)
<< "ST=" << cert.subjectInfo(QSslCertificate::StateOrProvinceName);
qCDebug(lcSsl) << "Valid:" << cert.effectiveDate() << '-' << cert.expiryDate();
} }
#endif // QSSLSOCKET_DEBUG
#endif // !QT_CONFIG(opensslv11) if (!errors) {
// Not found on store? Try SSL and its external data then. According to the OpenSSL's
// documentation:
//
// "Whenever a X509_STORE_CTX object is created for the verification of the peers certificate
// during a handshake, a pointer to the SSL object is stored into the X509_STORE_CTX object
// to identify the connection affected. To retrieve this pointer the X509_STORE_CTX_get_ex_data()
// function can be used with the correct index."
if (SSL *ssl = static_cast<SSL *>(q_X509_STORE_CTX_get_ex_data(ctx, q_SSL_get_ex_data_X509_STORE_CTX_idx())))
errors = ErrorListPtr(q_SSL_get_ex_data(ssl, QSslSocketBackendPrivate::s_indexForSSLExtraData + 1));
}
if (!errors) {
qCWarning(lcSsl, "Neither X509_STORE, nor SSL contains error list, handshake failure");
return 0;
}
errors->append(QSslErrorEntry::fromStoreContext(ctx));
} }
// Always return OK to allow verification to continue. We handle the // Always return OK to allow verification to continue. We handle the
// errors gracefully after collecting all errors, after verification has // errors gracefully after collecting all errors, after verification has
@ -541,11 +588,7 @@ bool QSslSocketBackendPrivate::initSslContext()
else else
q_SSL_set_accept_state(ssl); q_SSL_set_accept_state(ssl);
#if OPENSSL_VERSION_NUMBER >= 0x10001000L q_SSL_set_ex_data(ssl, s_indexForSSLExtraData, this);
// Save a pointer to this object into the SSL structure.
if (QSslSocket::sslLibraryVersionNumber() >= 0x10001000L)
q_SSL_set_ex_data(ssl, s_indexForSSLExtraData, this);
#endif
#if OPENSSL_VERSION_NUMBER >= 0x10001000L && !defined(OPENSSL_NO_PSK) #if OPENSSL_VERSION_NUMBER >= 0x10001000L && !defined(OPENSSL_NO_PSK)
// Set the client callback for PSK // Set the client callback for PSK
@ -556,6 +599,13 @@ bool QSslSocketBackendPrivate::initSslContext()
q_SSL_set_psk_server_callback(ssl, &q_ssl_psk_server_callback); q_SSL_set_psk_server_callback(ssl, &q_ssl_psk_server_callback);
} }
#endif #endif
#if OPENSSL_VERSION_NUMBER >= 0x10101006L
// Set the client callback for TLSv1.3 PSK
if (mode == QSslSocket::SslClientMode
&& QSslSocket::sslLibraryBuildVersionNumber() >= 0x10101006L) {
q_SSL_set_psk_use_session_callback(ssl, &q_ssl_psk_use_session_callback);
}
#endif // openssl version >= 0x10101006L
#if QT_CONFIG(ocsp) #if QT_CONFIG(ocsp)
if (configuration.ocspStaplingEnabled) { if (configuration.ocspStaplingEnabled) {
@ -1123,14 +1173,14 @@ bool QSslSocketBackendPrivate::startHandshake()
if (inSetAndEmitError) if (inSetAndEmitError)
return false; return false;
QMutexLocker locker(&_q_sslErrorList()->mutex); QVector<QSslErrorEntry> lastErrors;
_q_sslErrorList()->errors.clear(); q_SSL_set_ex_data(ssl, s_indexForSSLExtraData + 1, &lastErrors);
int result = (mode == QSslSocket::SslClientMode) ? q_SSL_connect(ssl) : q_SSL_accept(ssl); int result = (mode == QSslSocket::SslClientMode) ? q_SSL_connect(ssl) : q_SSL_accept(ssl);
q_SSL_set_ex_data(ssl, s_indexForSSLExtraData + 1, nullptr);
const auto &lastErrors = _q_sslErrorList()->errors;
if (!lastErrors.isEmpty()) if (!lastErrors.isEmpty())
storePeerCertificates(); storePeerCertificates();
for (const auto &currentError : lastErrors) { for (const auto &currentError : qAsConst(lastErrors)) {
emit q->peerVerifyError(_q_OpenSSL_to_QSslError(currentError.code, emit q->peerVerifyError(_q_OpenSSL_to_QSslError(currentError.code,
configuration.peerCertificateChain.value(currentError.depth))); configuration.peerCertificateChain.value(currentError.depth)));
if (q->state() != QAbstractSocket::ConnectedState) if (q->state() != QAbstractSocket::ConnectedState)
@ -1138,7 +1188,6 @@ bool QSslSocketBackendPrivate::startHandshake()
} }
errorList << lastErrors; errorList << lastErrors;
locker.unlock();
// Connection aborted during handshake phase. // Connection aborted during handshake phase.
if (q->state() != QAbstractSocket::ConnectedState) if (q->state() != QAbstractSocket::ConnectedState)
@ -1520,28 +1569,14 @@ bool QSslSocketBackendPrivate::checkOcspStatus()
// 3) It checks CertID in response. // 3) It checks CertID in response.
// 4) Ensures the responder is authorized to sign the status respond. // 4) Ensures the responder is authorized to sign the status respond.
// //
// Here it's important to notice that it calls X509_cert_verify and // Note, OpenSSL prior to 1.0.2b would only use bs->certs to
// as a result, possibly, our verification callback. Given this callback
// at the moment uses a global variable, we have to lock. This will change
// as soon as we fix our verification procedure.
// Also note, OpenSSL prior to 1.0.2b would only use bs->certs to
// verify the responder's chain (see their commit 4ba9a4265bd). // verify the responder's chain (see their commit 4ba9a4265bd).
// Working this around - is too much fuss for ancient versions we // Working this around - is too much fuss for ancient versions we
// are dropping quite soon anyway. // are dropping quite soon anyway.
{ const unsigned long verificationFlags = 0;
const unsigned long verificationFlags = 0; const int success = q_OCSP_basic_verify(basicResponse, peerChain, store, verificationFlags);
const QMutexLocker locker(&_q_sslErrorList()->mutex); if (success <= 0)
// Before unlocking the mutex, startHandshake() stores errors (found in SSL_connect() ocspErrors.push_back(QSslError::OcspResponseCannotBeTrusted);
// or SSL_accept()) into the local variable, so it's safe to clear it here - as soon
// as we managed to lock, whoever had the lock before, already stored their own copy
// of errors.
_q_sslErrorList()->errors.clear();
const int success = q_OCSP_basic_verify(basicResponse, peerChain, store, verificationFlags);
if (success <= 0 || _q_sslErrorList()->errors.size()) {
_q_sslErrorList()->errors.clear();
ocspErrors.push_back(QSslError::OcspResponseCannotBeTrusted);
}
}
if (q_OCSP_resp_count(basicResponse) != 1) { if (q_OCSP_resp_count(basicResponse) != 1) {
ocspErrors.push_back(QSslError::OcspMalformedResponse); ocspErrors.push_back(QSslError::OcspMalformedResponse);
@ -1752,7 +1787,20 @@ QList<QSslError> QSslSocketBackendPrivate::verify(const QList<QSslCertificate> &
} }
} }
QMutexLocker sslErrorListMutexLocker(&_q_sslErrorList()->mutex); QVector<QSslErrorEntry> lastErrors;
#if QT_CONFIG(opensslv11)
if (!q_X509_STORE_set_ex_data(certStore, 0, &lastErrors)) {
qCWarning(lcSsl) << "Unable to attach external data (error list) to a store";
errors << QSslError(QSslError::UnspecifiedError);
return errors;
}
#else
if (!q_CRYPTO_set_ex_data(&certStore->ex_data, 0, &lastErrors)) {
qCWarning(lcSsl) << "Unable to attach external data (error list) to a store";
errors << QSslError(QSslError::UnspecifiedError);
return errors;
}
#endif // opensslv11
// Register a custom callback to get all verification errors. // Register a custom callback to get all verification errors.
q_X509_STORE_set_verify_cb(certStore, q_X509Callback); q_X509_STORE_set_verify_cb(certStore, q_X509Callback);
@ -1802,12 +1850,7 @@ QList<QSslError> QSslSocketBackendPrivate::verify(const QList<QSslCertificate> &
q_OPENSSL_sk_free((OPENSSL_STACK *)intermediates); q_OPENSSL_sk_free((OPENSSL_STACK *)intermediates);
// Now process the errors // Now process the errors
const auto errorList = std::move(_q_sslErrorList()->errors);
_q_sslErrorList()->errors.clear();
sslErrorListMutexLocker.unlock();
// Translate the errors
if (QSslCertificatePrivate::isBlacklisted(certificateChain[0])) { if (QSslCertificatePrivate::isBlacklisted(certificateChain[0])) {
QSslError error(QSslError::CertificateBlacklisted, certificateChain[0]); QSslError error(QSslError::CertificateBlacklisted, certificateChain[0]);
errors << error; errors << error;
@ -1821,8 +1864,8 @@ QList<QSslError> QSslSocketBackendPrivate::verify(const QList<QSslCertificate> &
} }
// Translate errors from the error list into QSslErrors. // Translate errors from the error list into QSslErrors.
errors.reserve(errors.size() + errorList.size()); errors.reserve(errors.size() + lastErrors.size());
for (const auto &error : qAsConst(errorList)) for (const auto &error : qAsConst(lastErrors))
errors << _q_OpenSSL_to_QSslError(error.code, certificateChain.value(error.depth)); errors << _q_OpenSSL_to_QSslError(error.code, certificateChain.value(error.depth));
q_X509_STORE_free(certStore); q_X509_STORE_free(certStore);

View File

@ -107,6 +107,8 @@ Q_AUTOTEST_EXPORT void q_X509_up_ref(X509 *a);
long q_X509_get_version(X509 *a); long q_X509_get_version(X509 *a);
EVP_PKEY *q_X509_get_pubkey(X509 *a); EVP_PKEY *q_X509_get_pubkey(X509 *a);
void q_X509_STORE_set_verify_cb(X509_STORE *ctx, X509_STORE_CTX_verify_cb verify_cb); void q_X509_STORE_set_verify_cb(X509_STORE *ctx, X509_STORE_CTX_verify_cb verify_cb);
int q_X509_STORE_set_ex_data(X509_STORE *ctx, int idx, void *data);
void *q_X509_STORE_get_ex_data(X509_STORE *r, int idx);
STACK_OF(X509) *q_X509_STORE_CTX_get0_chain(X509_STORE_CTX *ctx); STACK_OF(X509) *q_X509_STORE_CTX_get0_chain(X509_STORE_CTX *ctx);
void q_DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g); void q_DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g);
int q_DH_bits(DH *dh); int q_DH_bits(DH *dh);
@ -184,4 +186,10 @@ const OCSP_CERTID *q_OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *x);
#define q_SSL_CTX_set_max_proto_version(ctx, version) \ #define q_SSL_CTX_set_max_proto_version(ctx, version) \
q_SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, nullptr) q_SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, nullptr)
extern "C" {
typedef int (*q_SSL_psk_use_session_cb_func_t)(SSL *, const EVP_MD *, const unsigned char **, size_t *,
SSL_SESSION **);
}
void q_SSL_set_psk_use_session_callback(SSL *s, q_SSL_psk_use_session_cb_func_t);
#endif #endif

View File

@ -164,6 +164,7 @@ DEFINEFUNC(int, SSL_session_reused, SSL *a, a, return 0, return)
DEFINEFUNC2(unsigned long, SSL_CTX_set_options, SSL_CTX *ctx, ctx, unsigned long op, op, return 0, return) DEFINEFUNC2(unsigned long, SSL_CTX_set_options, SSL_CTX *ctx, ctx, unsigned long op, op, return 0, return)
#ifdef TLS1_3_VERSION #ifdef TLS1_3_VERSION
DEFINEFUNC2(int, SSL_CTX_set_ciphersuites, SSL_CTX *ctx, ctx, const char *str, str, return 0, return) DEFINEFUNC2(int, SSL_CTX_set_ciphersuites, SSL_CTX *ctx, ctx, const char *str, str, return 0, return)
DEFINEFUNC2(void, SSL_set_psk_use_session_callback, SSL *ssl, ssl, q_SSL_psk_use_session_cb_func_t callback, callback, return, DUMMYARG)
#endif #endif
DEFINEFUNC3(size_t, SSL_get_client_random, SSL *a, a, unsigned char *out, out, size_t outlen, outlen, return 0, return) DEFINEFUNC3(size_t, SSL_get_client_random, SSL *a, a, unsigned char *out, out, size_t outlen, outlen, return 0, return)
DEFINEFUNC3(size_t, SSL_SESSION_get_master_key, const SSL_SESSION *ses, ses, unsigned char *out, out, size_t outlen, outlen, return 0, return) DEFINEFUNC3(size_t, SSL_SESSION_get_master_key, const SSL_SESSION *ses, ses, unsigned char *out, out, size_t outlen, outlen, return 0, return)
@ -179,6 +180,8 @@ DEFINEFUNC(ASN1_TIME *, X509_getm_notAfter, X509 *a, a, return nullptr, return)
DEFINEFUNC(long, X509_get_version, X509 *a, a, return -1, return) DEFINEFUNC(long, X509_get_version, X509 *a, a, return -1, return)
DEFINEFUNC(EVP_PKEY *, X509_get_pubkey, X509 *a, a, return nullptr, return) DEFINEFUNC(EVP_PKEY *, X509_get_pubkey, X509 *a, a, return nullptr, return)
DEFINEFUNC2(void, X509_STORE_set_verify_cb, X509_STORE *a, a, X509_STORE_CTX_verify_cb verify_cb, verify_cb, return, DUMMYARG) DEFINEFUNC2(void, X509_STORE_set_verify_cb, X509_STORE *a, a, X509_STORE_CTX_verify_cb verify_cb, verify_cb, return, DUMMYARG)
DEFINEFUNC3(int, X509_STORE_set_ex_data, X509_STORE *a, a, int idx, idx, void *data, data, return 0, return)
DEFINEFUNC2(void *, X509_STORE_get_ex_data, X509_STORE *r, r, int idx, idx, return nullptr, return)
DEFINEFUNC(STACK_OF(X509) *, X509_STORE_CTX_get0_chain, X509_STORE_CTX *a, a, return nullptr, return) DEFINEFUNC(STACK_OF(X509) *, X509_STORE_CTX_get0_chain, X509_STORE_CTX *a, a, return nullptr, return)
DEFINEFUNC3(void, CRYPTO_free, void *str, str, const char *file, file, int line, line, return, DUMMYARG) DEFINEFUNC3(void, CRYPTO_free, void *str, str, const char *file, file, int line, line, return, DUMMYARG)
DEFINEFUNC(long, OpenSSL_version_num, void, DUMMYARG, return 0, return) DEFINEFUNC(long, OpenSSL_version_num, void, DUMMYARG, return 0, return)
@ -253,6 +256,8 @@ DEFINEFUNC(int, CRYPTO_num_locks, DUMMYARG, DUMMYARG, return 0, return)
DEFINEFUNC(void, CRYPTO_set_locking_callback, void (*a)(int, int, const char *, int), a, return, DUMMYARG) DEFINEFUNC(void, CRYPTO_set_locking_callback, void (*a)(int, int, const char *, int), a, return, DUMMYARG)
DEFINEFUNC(void, CRYPTO_set_id_callback, unsigned long (*a)(), a, return, DUMMYARG) DEFINEFUNC(void, CRYPTO_set_id_callback, unsigned long (*a)(), a, return, DUMMYARG)
DEFINEFUNC(void, CRYPTO_free, void *a, a, return, DUMMYARG) DEFINEFUNC(void, CRYPTO_free, void *a, a, return, DUMMYARG)
DEFINEFUNC3(int, CRYPTO_set_ex_data, CRYPTO_EX_DATA *ad, ad, int idx, idx, void *val, val, return 0, return)
DEFINEFUNC2(void *, CRYPTO_get_ex_data, const CRYPTO_EX_DATA *ad, ad, int idx, idx, return nullptr, return)
DEFINEFUNC(unsigned long, ERR_peek_last_error, DUMMYARG, DUMMYARG, return 0, return) DEFINEFUNC(unsigned long, ERR_peek_last_error, DUMMYARG, DUMMYARG, return 0, return)
DEFINEFUNC(void, ERR_free_strings, void, DUMMYARG, return, DUMMYARG) DEFINEFUNC(void, ERR_free_strings, void, DUMMYARG, return, DUMMYARG)
DEFINEFUNC(void, EVP_CIPHER_CTX_cleanup, EVP_CIPHER_CTX *a, a, return, DUMMYARG) DEFINEFUNC(void, EVP_CIPHER_CTX_cleanup, EVP_CIPHER_CTX *a, a, return, DUMMYARG)
@ -525,6 +530,7 @@ DEFINEFUNC2(int, X509_STORE_CTX_set_purpose, X509_STORE_CTX *a, a, int b, b, ret
DEFINEFUNC(int, X509_STORE_CTX_get_error, X509_STORE_CTX *a, a, return -1, return) DEFINEFUNC(int, X509_STORE_CTX_get_error, X509_STORE_CTX *a, a, return -1, return)
DEFINEFUNC(int, X509_STORE_CTX_get_error_depth, X509_STORE_CTX *a, a, return -1, return) DEFINEFUNC(int, X509_STORE_CTX_get_error_depth, X509_STORE_CTX *a, a, return -1, return)
DEFINEFUNC(X509 *, X509_STORE_CTX_get_current_cert, X509_STORE_CTX *a, a, return nullptr, return) DEFINEFUNC(X509 *, X509_STORE_CTX_get_current_cert, X509_STORE_CTX *a, a, return nullptr, return)
DEFINEFUNC(X509_STORE *, X509_STORE_CTX_get0_store, X509_STORE_CTX *ctx, ctx, return nullptr, return)
DEFINEFUNC(X509_STORE_CTX *, X509_STORE_CTX_new, DUMMYARG, DUMMYARG, return nullptr, return) DEFINEFUNC(X509_STORE_CTX *, X509_STORE_CTX_new, DUMMYARG, DUMMYARG, return nullptr, return)
DEFINEFUNC2(void *, X509_STORE_CTX_get_ex_data, X509_STORE_CTX *ctx, ctx, int idx, idx, return nullptr, return) DEFINEFUNC2(void *, X509_STORE_CTX_get_ex_data, X509_STORE_CTX *ctx, ctx, int idx, idx, return nullptr, return)
DEFINEFUNC(int, SSL_get_ex_data_X509_STORE_CTX_idx, DUMMYARG, DUMMYARG, return -1, return) DEFINEFUNC(int, SSL_get_ex_data_X509_STORE_CTX_idx, DUMMYARG, DUMMYARG, return -1, return)
@ -975,6 +981,7 @@ bool q_resolveOpenSslSymbols()
RESOLVEFUNC(SSL_CTX_set_options) RESOLVEFUNC(SSL_CTX_set_options)
#ifdef TLS1_3_VERSION #ifdef TLS1_3_VERSION
RESOLVEFUNC(SSL_CTX_set_ciphersuites) RESOLVEFUNC(SSL_CTX_set_ciphersuites)
RESOLVEFUNC(SSL_set_psk_use_session_callback)
#endif // TLS 1.3 or OpenSSL > 1.1.1 #endif // TLS 1.3 or OpenSSL > 1.1.1
RESOLVEFUNC(SSL_get_client_random) RESOLVEFUNC(SSL_get_client_random)
RESOLVEFUNC(SSL_SESSION_get_master_key) RESOLVEFUNC(SSL_SESSION_get_master_key)
@ -992,6 +999,8 @@ bool q_resolveOpenSslSymbols()
RESOLVEFUNC(X509_get_version) RESOLVEFUNC(X509_get_version)
RESOLVEFUNC(X509_get_pubkey) RESOLVEFUNC(X509_get_pubkey)
RESOLVEFUNC(X509_STORE_set_verify_cb) RESOLVEFUNC(X509_STORE_set_verify_cb)
RESOLVEFUNC(X509_STORE_set_ex_data)
RESOLVEFUNC(X509_STORE_get_ex_data)
RESOLVEFUNC(CRYPTO_free) RESOLVEFUNC(CRYPTO_free)
RESOLVEFUNC(OpenSSL_version_num) RESOLVEFUNC(OpenSSL_version_num)
RESOLVEFUNC(OpenSSL_version) RESOLVEFUNC(OpenSSL_version)
@ -1063,6 +1072,8 @@ bool q_resolveOpenSslSymbols()
RESOLVEFUNC(CRYPTO_num_locks) RESOLVEFUNC(CRYPTO_num_locks)
RESOLVEFUNC(CRYPTO_set_id_callback) RESOLVEFUNC(CRYPTO_set_id_callback)
RESOLVEFUNC(CRYPTO_set_locking_callback) RESOLVEFUNC(CRYPTO_set_locking_callback)
RESOLVEFUNC(CRYPTO_set_ex_data)
RESOLVEFUNC(CRYPTO_get_ex_data)
RESOLVEFUNC(ERR_peek_last_error) RESOLVEFUNC(ERR_peek_last_error)
RESOLVEFUNC(ERR_free_strings) RESOLVEFUNC(ERR_free_strings)
RESOLVEFUNC(EVP_CIPHER_CTX_cleanup) RESOLVEFUNC(EVP_CIPHER_CTX_cleanup)
@ -1324,6 +1335,7 @@ bool q_resolveOpenSslSymbols()
RESOLVEFUNC(X509_STORE_CTX_get_error) RESOLVEFUNC(X509_STORE_CTX_get_error)
RESOLVEFUNC(X509_STORE_CTX_get_error_depth) RESOLVEFUNC(X509_STORE_CTX_get_error_depth)
RESOLVEFUNC(X509_STORE_CTX_get_current_cert) RESOLVEFUNC(X509_STORE_CTX_get_current_cert)
RESOLVEFUNC(X509_STORE_CTX_get0_store)
RESOLVEFUNC(X509_cmp) RESOLVEFUNC(X509_cmp)
RESOLVEFUNC(X509_STORE_CTX_get_ex_data) RESOLVEFUNC(X509_STORE_CTX_get_ex_data)

View File

@ -464,6 +464,7 @@ int q_X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose);
int q_X509_STORE_CTX_get_error(X509_STORE_CTX *ctx); int q_X509_STORE_CTX_get_error(X509_STORE_CTX *ctx);
int q_X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx); int q_X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx);
X509 *q_X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx); X509 *q_X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx);
X509_STORE *q_X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx);
// Diffie-Hellman support // Diffie-Hellman support
DH *q_DH_new(); DH *q_DH_new();

View File

@ -84,6 +84,8 @@ int q_CRYPTO_num_locks();
void q_CRYPTO_set_locking_callback(void (*a)(int, int, const char *, int)); void q_CRYPTO_set_locking_callback(void (*a)(int, int, const char *, int));
void q_CRYPTO_set_id_callback(unsigned long (*a)()); void q_CRYPTO_set_id_callback(unsigned long (*a)());
void q_CRYPTO_free(void *a); void q_CRYPTO_free(void *a);
int q_CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val);
void *q_CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx);
unsigned long q_ERR_peek_last_error(); unsigned long q_ERR_peek_last_error();
void q_ERR_free_strings(); void q_ERR_free_strings();
void q_EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a); void q_EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);

View File

@ -265,6 +265,8 @@ static RoleMapping map[] = {
//: Role of an accessible object //: Role of an accessible object
{ QAccessible::Desktop, ATSPI_ROLE_DESKTOP_FRAME, QT_TRANSLATE_NOOP("QSpiAccessibleBridge", "desktop") }, { QAccessible::Desktop, ATSPI_ROLE_DESKTOP_FRAME, QT_TRANSLATE_NOOP("QSpiAccessibleBridge", "desktop") },
//: Role of an accessible object //: 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") } { QAccessible::UserRole, ATSPI_ROLE_UNKNOWN, QT_TRANSLATE_NOOP("QSpiAccessibleBridge", "unknown") }
}; };

View File

@ -56,12 +56,13 @@ QT_BEGIN_NAMESPACE
static QBearerEngineImpl *getEngineFromId(const QString &id) static QBearerEngineImpl *getEngineFromId(const QString &id)
{ {
QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate(); QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
if (priv) {
const auto engines = priv->engines(); const auto engines = priv->engines();
for (QBearerEngine *engine : engines) { for (QBearerEngine *engine : engines) {
QBearerEngineImpl *engineImpl = qobject_cast<QBearerEngineImpl *>(engine); QBearerEngineImpl *engineImpl = qobject_cast<QBearerEngineImpl *>(engine);
if (engineImpl && engineImpl->hasIdentifier(id)) if (engineImpl && engineImpl->hasIdentifier(id))
return engineImpl; return engineImpl;
}
} }
return 0; return 0;

File diff suppressed because it is too large Load Diff

View File

@ -151,6 +151,9 @@ private slots:
private: private:
void sendInputMethodEvent(QInputMethodEvent *event); void sendInputMethodEvent(QInputMethodEvent *event);
QSharedPointer<QInputMethodQueryEvent> focusObjectInputMethodQuery(Qt::InputMethodQueries queries = Qt::ImQueryAll); QSharedPointer<QInputMethodQueryEvent> focusObjectInputMethodQuery(Qt::InputMethodQueries queries = Qt::ImQueryAll);
bool focusObjectIsComposing() const;
void focusObjectStartComposing();
bool focusObjectStopComposing();
private: private:
ExtractedText m_extractedText; ExtractedText m_extractedText;
@ -158,9 +161,8 @@ private:
int m_composingTextStart; int m_composingTextStart;
int m_composingCursor; int m_composingCursor;
QMetaObject::Connection m_updateCursorPosConnection; QMetaObject::Connection m_updateCursorPosConnection;
bool m_blockUpdateSelection;
HandleModes m_handleMode; HandleModes m_handleMode;
QAtomicInt m_batchEditNestingLevel; int m_batchEditNestingLevel;
QObject *m_focusObject; QObject *m_focusObject;
QTimer m_hideCursorHandleTimer; QTimer m_hideCursorHandleTimer;
}; };

View File

@ -55,6 +55,7 @@ public:
QNSWindowBackingStore(QWindow *window); QNSWindowBackingStore(QWindow *window);
~QNSWindowBackingStore(); ~QNSWindowBackingStore();
void resize(const QSize &size, const QRegion &staticContents) override;
void flush(QWindow *, const QRegion &, const QPoint &) override; void flush(QWindow *, const QRegion &, const QPoint &) override;
private: private:

View File

@ -71,6 +71,24 @@ QImage::Format QNSWindowBackingStore::format() const
return QRasterBackingStore::format(); 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 Flushes the given \a region from the specified \a window onto the
screen. screen.
@ -217,6 +235,7 @@ void QNSWindowBackingStore::flush(QWindow *window, const QRegion &region, const
QCocoaWindow *topLevelCocoaWindow = static_cast<QCocoaWindow *>(topLevelWindow->handle()); QCocoaWindow *topLevelCocoaWindow = static_cast<QCocoaWindow *>(topLevelWindow->handle());
if (Q_UNLIKELY(topLevelCocoaWindow->m_needsInvalidateShadow)) { if (Q_UNLIKELY(topLevelCocoaWindow->m_needsInvalidateShadow)) {
qCDebug(lcQpaBackingStore) << "Invalidating window shadow for" << topLevelCocoaWindow;
[topLevelView.window invalidateShadow]; [topLevelView.window invalidateShadow];
topLevelCocoaWindow->m_needsInvalidateShadow = false; topLevelCocoaWindow->m_needsInvalidateShadow = false;
} }
@ -382,10 +401,11 @@ void QCALayerBackingStore::ensureBackBuffer()
bool QCALayerBackingStore::recreateBackBufferIfNeeded() 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; QSize requestedBufferSize = m_requestedSize * devicePixelRatio;
const NSView *backingStoreView = static_cast<QCocoaWindow *>(window()->handle())->view(); const NSView *backingStoreView = platformWindow->view();
Q_UNUSED(backingStoreView); Q_UNUSED(backingStoreView);
auto bufferSizeMismatch = [&](const QSize requested, const QSize actual) { auto bufferSizeMismatch = [&](const QSize requested, const QSize actual) {

View File

@ -191,6 +191,7 @@ public:
static void waitingObserverCallback(CFRunLoopObserverRef observer, static void waitingObserverCallback(CFRunLoopObserverRef observer,
CFRunLoopActivity activity, void *info); CFRunLoopActivity activity, void *info);
static void firstLoopEntry(CFRunLoopObserverRef ref, CFRunLoopActivity activity, void *info); static void firstLoopEntry(CFRunLoopObserverRef ref, CFRunLoopActivity activity, void *info);
bool sendQueuedUserInputEvents();
void processPostedEvents(); void processPostedEvents();
}; };

View File

@ -377,16 +377,9 @@ bool QCocoaEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
NSEvent* event = nil; NSEvent* event = nil;
// First, send all previously excluded input events, if any: // First, send all previously excluded input events, if any:
if (!excludeUserEvents) { if (d->sendQueuedUserInputEvents())
while (!d->queuedUserInputEvents.isEmpty()) { retVal = true;
event = static_cast<NSEvent *>(d->queuedUserInputEvents.takeFirst());
if (!filterNativeEvent("NSEvent", event, nullptr)) {
[NSApp sendEvent:event];
retVal = true;
}
[event release];
}
}
// If Qt is used as a plugin, or as an extension in a native cocoa // 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 // 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(); 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() void QCocoaEventDispatcherPrivate::processPostedEvents()
{ {
if (blockSendPostedEvents) { if (blockSendPostedEvents) {
@ -896,6 +906,7 @@ void QCocoaEventDispatcherPrivate::postedEventsSourceCallback(void *info)
d->maybeCancelWaitForMoreEvents(); d->maybeCancelWaitForMoreEvents();
return; return;
} }
d->sendQueuedUserInputEvents();
d->processPostedEvents(); d->processPostedEvents();
d->maybeCancelWaitForMoreEvents(); d->maybeCancelWaitForMoreEvents();
} }

View File

@ -92,6 +92,9 @@ public:
bool isOpen() const; bool isOpen() const;
void setIsOpen(bool isOpen); void setIsOpen(bool isOpen);
bool isAboutToShow() const;
void setIsAboutToShow(bool isAbout);
void timerEvent(QTimerEvent *e) override; void timerEvent(QTimerEvent *e) override;
void syncMenuItem_helper(QPlatformMenuItem *menuItem, bool menubarUpdate); void syncMenuItem_helper(QPlatformMenuItem *menuItem, bool menubarUpdate);
@ -111,6 +114,7 @@ private:
bool m_parentEnabled:1; bool m_parentEnabled:1;
bool m_visible:1; bool m_visible:1;
bool m_isOpen:1; bool m_isOpen:1;
bool m_isAboutToShow:1;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -178,6 +178,16 @@ void QCocoaMenu::setIsOpen(bool isOpen)
m_isOpen = isOpen; m_isOpen = isOpen;
} }
bool QCocoaMenu::isAboutToShow() const
{
return m_isAboutToShow;
}
void QCocoaMenu::setIsAboutToShow(bool isAbout)
{
m_isAboutToShow = isAbout;
}
void QCocoaMenu::removeMenuItem(QPlatformMenuItem *menuItem) void QCocoaMenu::removeMenuItem(QPlatformMenuItem *menuItem)
{ {
QMacAutoReleasePool pool; QMacAutoReleasePool pool;

View File

@ -141,6 +141,12 @@ void QCocoaMenuItem::setMenu(QPlatformMenu *menu)
if (menu == m_menu) if (menu == m_menu)
return; return;
bool setAttached = false;
if ([m_native.menu isKindOfClass:[QCocoaNSMenu class]]) {
auto parentMenu = static_cast<QCocoaNSMenu *>(m_native.menu);
setAttached = parentMenu.platformMenu && parentMenu.platformMenu->isAboutToShow();
}
if (m_menu && m_menu->menuParent() == this) { if (m_menu && m_menu->menuParent() == this) {
m_menu->setMenuParent(nullptr); m_menu->setMenuParent(nullptr);
// Free the menu from its parent's influence // Free the menu from its parent's influence
@ -154,6 +160,8 @@ void QCocoaMenuItem::setMenu(QPlatformMenu *menu)
if (m_menu) { if (m_menu) {
m_menu->setMenuParent(this); m_menu->setMenuParent(this);
m_menu->propagateEnabledState(isEnabled()); m_menu->propagateEnabledState(isEnabled());
if (setAttached)
m_menu->setAttachedItem(m_native);
} else { } else {
// we previously had a menu, but no longer // we previously had a menu, but no longer
// clear out our item so the nexy sync() call builds a new one // clear out our item so the nexy sync() call builds a new one

View File

@ -195,7 +195,9 @@ static NSString *qt_mac_removePrivateUnicode(NSString *string)
return; return;
platformMenu->setIsOpen(true); platformMenu->setIsOpen(true);
platformMenu->setIsAboutToShow(true);
emit platformMenu->aboutToShow(); emit platformMenu->aboutToShow();
platformMenu->setIsAboutToShow(false);
} }
- (void)menuDidClose:(NSMenu *)menu - (void)menuDidClose:(NSMenu *)menu

View File

@ -1011,16 +1011,16 @@ void QCocoaWindow::setMask(const QRegion &region)
} else { } else {
m_view.layer.mask = nil; m_view.layer.mask = nil;
} }
} } else {
if (isContentView()) {
if (isContentView()) { // Setting the mask requires invalidating the NSWindow shadow, but that needs
// Setting the mask requires invalidating the NSWindow shadow, but that needs // to happen after the backingstore has been redrawn, so that AppKit can pick
// 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
// 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
// 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.
// time, and so would not result in an updated backingstore. m_needsInvalidateShadow = true;
m_needsInvalidateShadow = true; [m_view setNeedsDisplay:YES];
[m_view setNeedsDisplay:YES]; }
} }
} }

View File

@ -101,6 +101,8 @@
- (id)accessibilityElementAtIndex:(NSInteger)index - (id)accessibilityElementAtIndex:(NSInteger)index
{ {
[self initAccessibility]; [self initAccessibility];
if (index >= [m_accessibleElements count])
return nil;
return m_accessibleElements[index]; return m_accessibleElements[index];
} }
@ -110,4 +112,10 @@
return [m_accessibleElements indexOfObject:element]; return [m_accessibleElements indexOfObject:element];
} }
- (NSArray *)accessibilityElements
{
[self initAccessibility];
return m_accessibleElements;
}
@end @end

View File

@ -77,6 +77,7 @@
#include <QtCore/qoperatingsystemversion.h> #include <QtCore/qoperatingsystemversion.h>
#include <QtCore/qsysinfo.h> #include <QtCore/qsysinfo.h>
#include <QtCore/qscopedpointer.h> #include <QtCore/qscopedpointer.h>
#include <QtCore/quuid.h>
#include <QtCore/private/qsystemlibrary_p.h> #include <QtCore/private/qsystemlibrary_p.h>
#include <QtEventDispatcherSupport/private/qwindowsguieventdispatcher_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 // each one has to have window class names with a unique name
// The first instance gets the unmodified name; if the class // The first instance gets the unmodified name; if the class
// has already been registered by another instance of Qt then // 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; static int classExists = -1;
const auto appInstance = static_cast<HINSTANCE>(GetModuleHandle(nullptr)); const auto appInstance = static_cast<HINSTANCE>(GetModuleHandle(nullptr));
@ -555,7 +556,7 @@ QString QWindowsContext::registerWindowClass(QString cname,
} }
if (classExists) if (classExists)
cname += QString::number(reinterpret_cast<quintptr>(proc)); cname += QUuid::createUuid().toString();
if (d->m_registeredWindowClassNames.contains(cname)) // already registered in our list if (d->m_registeredWindowClassNames.contains(cname)) // already registered in our list
return cname; return cname;

View File

@ -204,7 +204,6 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
, m_shareContext(0) , m_shareContext(0)
, m_format(format) , m_format(format)
, m_isPBufferCurrent(false) , m_isPBufferCurrent(false)
, m_swapInterval(-1)
, m_ownsContext(nativeHandle.isNull()) , m_ownsContext(nativeHandle.isNull())
, m_getGraphicsResetStatus(0) , m_getGraphicsResetStatus(0)
, m_lost(false) , m_lost(false)
@ -567,9 +566,9 @@ bool QGLXContext::makeCurrent(QPlatformSurface *surface)
if (success && surfaceClass == QSurface::Window) { if (success && surfaceClass == QSurface::Window) {
int interval = surface->format().swapInterval(); int interval = surface->format().swapInterval();
QXcbWindow *window = static_cast<QXcbWindow *>(surface);
QXcbScreen *screen = screenForPlatformSurface(surface); QXcbScreen *screen = screenForPlatformSurface(surface);
if (interval >= 0 && m_swapInterval != interval && screen) { if (interval >= 0 && interval != window->swapInterval() && screen) {
m_swapInterval = interval;
typedef void (*qt_glXSwapIntervalEXT)(Display *, GLXDrawable, int); typedef void (*qt_glXSwapIntervalEXT)(Display *, GLXDrawable, int);
typedef void (*qt_glXSwapIntervalMESA)(unsigned int); typedef void (*qt_glXSwapIntervalMESA)(unsigned int);
static qt_glXSwapIntervalEXT glXSwapIntervalEXT = 0; static qt_glXSwapIntervalEXT glXSwapIntervalEXT = 0;
@ -588,6 +587,7 @@ bool QGLXContext::makeCurrent(QPlatformSurface *surface)
glXSwapIntervalEXT(m_display, glxDrawable, interval); glXSwapIntervalEXT(m_display, glxDrawable, interval);
else if (glXSwapIntervalMESA) else if (glXSwapIntervalMESA)
glXSwapIntervalMESA(interval); glXSwapIntervalMESA(interval);
window->setSwapInterval(interval);
} }
} }

View File

@ -87,7 +87,6 @@ private:
GLXContext m_shareContext; GLXContext m_shareContext;
QSurfaceFormat m_format; QSurfaceFormat m_format;
bool m_isPBufferCurrent; bool m_isPBufferCurrent;
int m_swapInterval;
bool m_ownsContext; bool m_ownsContext;
GLenum (APIENTRY * m_getGraphicsResetStatus)(); GLenum (APIENTRY * m_getGraphicsResetStatus)();
bool m_lost; bool m_lost;

View File

@ -658,16 +658,24 @@ QImage::Format QXcbScreen::format() const
return format; return format;
} }
QDpi QXcbScreen::logicalDpi() const int QXcbScreen::forcedDpi() const
{ {
static const int overrideDpi = qEnvironmentVariableIntValue("QT_FONT_DPI"); static const int overrideDpi = qEnvironmentVariableIntValue("QT_FONT_DPI");
if (overrideDpi) if (overrideDpi)
return QDpi(overrideDpi, overrideDpi); return overrideDpi;
const int forcedDpi = m_virtualDesktop->forcedDpi(); const int forcedDpi = m_virtualDesktop->forcedDpi();
if (forcedDpi > 0) { if (forcedDpi > 0)
return forcedDpi;
return 0;
}
QDpi QXcbScreen::logicalDpi() const
{
const int forcedDpi = this->forcedDpi();
if (forcedDpi > 0)
return QDpi(forcedDpi, forcedDpi); return QDpi(forcedDpi, forcedDpi);
}
return m_virtualDesktop->dpi(); return m_virtualDesktop->dpi();
} }
@ -739,7 +747,9 @@ void QXcbScreen::updateGeometry(const QRect &geometry, uint8_t rotation)
if (m_sizeMillimeters.isEmpty()) if (m_sizeMillimeters.isEmpty())
m_sizeMillimeters = sizeInMillimeters(geometry.size(), m_virtualDesktop->dpi()); m_sizeMillimeters = sizeInMillimeters(geometry.size(), m_virtualDesktop->dpi());
qreal dpi = geometry.width() / physicalSize().width() * qreal(25.4); qreal dpi = forcedDpi();
if (dpi <= 0)
dpi = geometry.width() / physicalSize().width() * qreal(25.4);
// Use 128 as a reference DPI on small screens. This favors "small UI" over "large UI". // Use 128 as a reference DPI on small screens. This favors "small UI" over "large UI".
qreal referenceDpi = physicalSize().width() <= 320 ? 128 : 96; qreal referenceDpi = physicalSize().width() <= 320 ? 128 : 96;

View File

@ -208,6 +208,7 @@ public:
private: private:
void sendStartupMessage(const QByteArray &message) const; void sendStartupMessage(const QByteArray &message) const;
int forcedDpi() const;
QByteArray getOutputProperty(xcb_atom_t atom) const; QByteArray getOutputProperty(xcb_atom_t atom) const;
QByteArray getEdid() const; QByteArray getEdid() const;

View File

@ -184,6 +184,9 @@ public:
static void setWindowTitle(const QXcbConnection *conn, xcb_window_t window, const QString &title); static void setWindowTitle(const QXcbConnection *conn, xcb_window_t window, const QString &title);
static QString windowTitle(const QXcbConnection *conn, xcb_window_t window); 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: public Q_SLOTS:
void updateSyncRequestCounter(); void updateSyncRequestCounter();
@ -276,6 +279,7 @@ protected:
SyncState m_syncState = NoSyncNeeded; SyncState m_syncState = NoSyncNeeded;
QXcbSyncWindowRequest *m_pendingSyncRequest = nullptr; QXcbSyncWindowRequest *m_pendingSyncRequest = nullptr;
int m_swapInterval = -1;
}; };
class QXcbForeignWindow : public QXcbWindow class QXcbForeignWindow : public QXcbWindow

View File

@ -2001,7 +2001,8 @@ QMacStyle::QMacStyle()
Q_D(QMacStyle); Q_D(QMacStyle);
// FIXME: Tie this logic into theme change, or even polish/unpolish // FIXME: Tie this logic into theme change, or even polish/unpolish
if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSMojave) { if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSMojave) {
d->appearanceObserver = QMacKeyValueObserver(NSApp, @"effectiveAppearance", [&d] { d->appearanceObserver = QMacKeyValueObserver(NSApp, @"effectiveAppearance", [this] {
Q_D(QMacStyle);
for (NSView *b : d->cocoaControls) for (NSView *b : d->cocoaControls)
[b release]; [b release];
d->cocoaControls.clear(); d->cocoaControls.clear();
@ -2495,11 +2496,12 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
QPalette QMacStyle::standardPalette() const QPalette QMacStyle::standardPalette() const
{ {
QPalette pal = QCommonStyle::standardPalette(); auto platformTheme = QGuiApplicationPrivate::platformTheme();
pal.setColor(QPalette::Disabled, QPalette::Dark, QColor(191, 191, 191)); auto styleNames = platformTheme->themeHint(QPlatformTheme::StyleNames);
pal.setColor(QPalette::Active, QPalette::Dark, QColor(191, 191, 191)); if (styleNames.toStringList().contains("macintosh"))
pal.setColor(QPalette::Inactive, QPalette::Dark, QColor(191, 191, 191)); return *platformTheme->palette();
return pal; else
return QStyle::standardPalette();
} }
int QMacStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget *w, int QMacStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget *w,

View File

@ -381,8 +381,6 @@ QWidget *QApplication::topLevelAt(const QPoint &pos)
0 if there is no such widget. 0 if there is no such widget.
*/ */
void qt_init(QApplicationPrivate *priv, int type
);
void qt_init_tooltip_palette(); void qt_init_tooltip_palette();
void qt_cleanup(); void qt_cleanup();
@ -428,16 +426,10 @@ bool Q_WIDGETS_EXPORT qt_tab_all_widgets()
// ######## move to QApplicationPrivate // ######## move to QApplicationPrivate
// Default application palettes and fonts (per widget type) // Default application palettes and fonts (per widget type)
Q_GLOBAL_STATIC(PaletteHash, app_palettes) Q_GLOBAL_STATIC(PaletteHash, app_palettes)
PaletteHash *qt_app_palettes_hash()
{
return app_palettes();
}
Q_GLOBAL_STATIC(FontHash, app_fonts) Q_GLOBAL_STATIC(FontHash, app_fonts)
FontHash *qt_app_fonts_hash() // Exported accessors for use outside of this file
{ PaletteHash *qt_app_palettes_hash() { return app_palettes(); }
return app_fonts(); FontHash *qt_app_fonts_hash() { return app_fonts(); }
}
QWidgetList *QApplicationPrivate::popupWidgets = 0; // has keyboard input focus QWidgetList *QApplicationPrivate::popupWidgets = 0; // has keyboard input focus
@ -571,7 +563,10 @@ void QApplicationPrivate::init()
process_cmdline(); process_cmdline();
// Must be called before initialize() // Must be called before initialize()
qt_init(this, application_type); QColormap::initialize();
qt_init_tooltip_palette();
QApplicationPrivate::initializeWidgetFontHash();
initialize(); initialize();
eventDispatcher->startingUp(); eventDispatcher->startingUp();
@ -582,18 +577,6 @@ void QApplicationPrivate::init()
} }
void qt_init(QApplicationPrivate *priv, int type)
{
Q_UNUSED(priv);
Q_UNUSED(type);
QColormap::initialize();
qt_init_tooltip_palette();
QApplicationPrivate::initializeWidgetFontHash();
}
void qt_init_tooltip_palette() void qt_init_tooltip_palette()
{ {
#ifndef QT_NO_TOOLTIP #ifndef QT_NO_TOOLTIP
@ -659,7 +642,7 @@ void QApplicationPrivate::initializeWidgetPaletteHash()
QPlatformTheme *platformTheme = QGuiApplicationPrivate::platformTheme(); QPlatformTheme *platformTheme = QGuiApplicationPrivate::platformTheme();
if (!platformTheme) if (!platformTheme)
return; return;
qt_app_palettes_hash()->clear(); app_palettes()->clear();
setPossiblePalette(platformTheme->palette(QPlatformTheme::ToolButtonPalette), "QToolButton"); setPossiblePalette(platformTheme->palette(QPlatformTheme::ToolButtonPalette), "QToolButton");
setPossiblePalette(platformTheme->palette(QPlatformTheme::ButtonPalette), "QAbstractButton"); setPossiblePalette(platformTheme->palette(QPlatformTheme::ButtonPalette), "QAbstractButton");
@ -683,7 +666,7 @@ void QApplicationPrivate::initializeWidgetFontHash()
const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme(); const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme();
if (!theme) if (!theme)
return; return;
FontHash *fontHash = qt_app_fonts_hash(); FontHash *fontHash = app_fonts();
fontHash->clear(); fontHash->clear();
if (const QFont *font = theme->font(QPlatformTheme::MenuFont)) if (const QFont *font = theme->font(QPlatformTheme::MenuFont))
@ -1162,9 +1145,7 @@ void QApplication::setStyle(QStyle *style)
} else if (QApplicationPrivate::sys_pal) { } else if (QApplicationPrivate::sys_pal) {
clearSystemPalette(); clearSystemPalette();
initSystemPalette(); initSystemPalette();
QApplicationPrivate::initializeWidgetPaletteHash();
QApplicationPrivate::initializeWidgetFontHash(); QApplicationPrivate::initializeWidgetFontHash();
QApplicationPrivate::setPalette_helper(*QApplicationPrivate::sys_pal, /*className=*/0, /*clearWidgetPaletteHash=*/false);
} else if (!QApplicationPrivate::sys_pal) { } else if (!QApplicationPrivate::sys_pal) {
// Initialize the sys_pal if it hasn't happened yet... // Initialize the sys_pal if it hasn't happened yet...
QApplicationPrivate::setSystemPalette(QApplicationPrivate::app_style->standardPalette()); QApplicationPrivate::setSystemPalette(QApplicationPrivate::app_style->standardPalette());
@ -1462,28 +1443,10 @@ void QApplication::setPalette(const QPalette &palette, const char* className)
void QApplicationPrivate::setSystemPalette(const QPalette &pal) void QApplicationPrivate::setSystemPalette(const QPalette &pal)
{ {
QPalette adjusted;
#if 0
// adjust the system palette to avoid dithering
QColormap cmap = QColormap::instance();
if (cmap.depths() > 4 && cmap.depths() < 24) {
for (int g = 0; g < QPalette::NColorGroups; g++)
for (int i = 0; i < QPalette::NColorRoles; i++) {
QColor color = pal.color((QPalette::ColorGroup)g, (QPalette::ColorRole)i);
color = cmap.colorAt(cmap.pixel(color));
adjusted.setColor((QPalette::ColorGroup)g, (QPalette::ColorRole) i, color);
}
}
#else
adjusted = pal;
#endif
if (!sys_pal) if (!sys_pal)
sys_pal = new QPalette(adjusted); sys_pal = new QPalette(pal);
else else
*sys_pal = adjusted; *sys_pal = pal;
if (!QApplicationPrivate::set_pal) if (!QApplicationPrivate::set_pal)
QApplication::setPalette(*sys_pal); QApplication::setPalette(*sys_pal);

View File

@ -1,4 +1,4 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2017 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation. ** Copyright (C) 2016 Intel Corporation.
@ -2617,14 +2617,27 @@ bool QWidgetPrivate::setScreenForPoint(const QPoint &pos)
Q_Q(QWidget); Q_Q(QWidget);
if (!q->isWindow()) if (!q->isWindow())
return false; return false;
// Find the screen for pos and make the widget undertand it is on that screen. // Find the screen for pos and make the widget understand it is on that screen.
return setScreen(QGuiApplication::screenAt(pos));
}
/*!
\internal
Ensures that the widget's QWindow is set to be on the given \a screen.
Returns true if the screen was changed.
*/
bool QWidgetPrivate::setScreen(QScreen *screen)
{
Q_Q(QWidget);
if (!screen || !q->isWindow())
return false;
const QScreen *currentScreen = windowHandle() ? windowHandle()->screen() : nullptr; const QScreen *currentScreen = windowHandle() ? windowHandle()->screen() : nullptr;
QScreen *actualScreen = QGuiApplication::screenAt(pos); if (currentScreen != screen) {
if (actualScreen && currentScreen != actualScreen) {
if (!windowHandle()) // Try to create a window handle if not created. if (!windowHandle()) // Try to create a window handle if not created.
createWinId(); createWinId();
if (windowHandle()) if (windowHandle())
windowHandle()->setScreen(actualScreen); windowHandle()->setScreen(screen);
return true; return true;
} }
return false; return false;
@ -7025,37 +7038,41 @@ void QWidget::setTabOrder(QWidget* first, QWidget *second)
lastFocusChild = focusNext; lastFocusChild = focusNext;
} }
}; };
auto setPrev = [](QWidget *w, QWidget *prev)
{
w->d_func()->focus_prev = prev;
};
auto setNext = [](QWidget *w, QWidget *next)
{
w->d_func()->focus_next = next;
};
QWidget *lastFocusChildOfFirst, *lastFocusChildOfSecond; // remove the second widget from the chain
determineLastFocusChild(first, lastFocusChildOfFirst); QWidget *lastFocusChildOfSecond;
determineLastFocusChild(second, lastFocusChildOfSecond); determineLastFocusChild(second, lastFocusChildOfSecond);
{
// If the tab order is already correct, exit early QWidget *oldPrev = second->d_func()->focus_prev;
if (lastFocusChildOfFirst == second || QWidget *prevWithFocus = oldPrev;
lastFocusChildOfFirst->d_func()->focus_next == second) { while (prevWithFocus->focusPolicy() == Qt::NoFocus)
return; prevWithFocus = prevWithFocus->d_func()->focus_prev;
// only widgets between first and second -> all is fine
if (prevWithFocus == first)
return;
QWidget *oldNext = lastFocusChildOfSecond->d_func()->focus_next;
setPrev(oldNext, oldPrev);
setNext(oldPrev, oldNext);
} }
// Note that we need to handle two different sections in the tab chain; The section // insert the second widget into the chain
// that 'first' belongs to (firstSection), where we are about to insert 'second', and QWidget *lastFocusChildOfFirst;
// the section that 'second' used be a part of (secondSection). When we pull 'second' determineLastFocusChild(first, lastFocusChildOfFirst);
// out of the second section and insert it into the first, we also need to ensure {
// that we leave the second section in a connected state. QWidget *oldNext = lastFocusChildOfFirst->d_func()->focus_next;
QWidget *firstChainOldSecond = lastFocusChildOfFirst->d_func()->focus_next; setPrev(second, lastFocusChildOfFirst);
QWidget *secondChainNewFirst = second->d_func()->focus_prev; setNext(lastFocusChildOfFirst, second);
QWidget *secondChainNewSecond = lastFocusChildOfSecond->d_func()->focus_next; setPrev(oldNext, lastFocusChildOfSecond);
setNext(lastFocusChildOfSecond, oldNext);
// Insert 'second' after 'first' }
lastFocusChildOfFirst->d_func()->focus_next = second;
second->d_func()->focus_prev = lastFocusChildOfFirst;
// The widget that used to be 'second' in the first section, should now become 'third'
lastFocusChildOfSecond->d_func()->focus_next = firstChainOldSecond;
firstChainOldSecond->d_func()->focus_prev = lastFocusChildOfSecond;
// Repair the second section after we pulled 'second' out of it
secondChainNewFirst->d_func()->focus_next = secondChainNewSecond;
secondChainNewSecond->d_func()->focus_prev = secondChainNewFirst;
} }
/*!\internal /*!\internal

View File

@ -181,6 +181,7 @@ struct QTLWExtra {
QRect frameStrut; QRect frameStrut;
QRect normalGeometry; // used by showMin/maximized/FullScreen QRect normalGeometry; // used by showMin/maximized/FullScreen
Qt::WindowFlags savedFlags; // Save widget flags while showing fullscreen Qt::WindowFlags savedFlags; // Save widget flags while showing fullscreen
// ### TODO replace initialScreenIndex with QScreen *, in case the screens change at runtime
int initialScreenIndex; // Screen number when passing a QDesktop[Screen]Widget as parent. int initialScreenIndex; // Screen number when passing a QDesktop[Screen]Widget as parent.
QVector<QPlatformTextureList *> widgetTextures; QVector<QPlatformTextureList *> widgetTextures;
@ -364,6 +365,7 @@ public:
void createWinId(); void createWinId();
bool setScreenForPoint(const QPoint &pos); bool setScreenForPoint(const QPoint &pos);
bool setScreen(QScreen *screen);
void createTLExtra(); void createTLExtra();
void createExtra(); void createExtra();

View File

@ -3706,17 +3706,6 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q
bool dis = !(opt->state & QStyle::State_Enabled), bool dis = !(opt->state & QStyle::State_Enabled),
act = opt->state & QStyle::State_Selected; 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()) { if (!mi.icon.isNull()) {
QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal; QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;
if (act && !dis) 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); QRect iconRect = positionRect(w, subRule, iconRule, PseudoElement_MenuIcon, opt->rect, opt->direction);
if (opt->direction == Qt::LeftToRight) if (opt->direction == Qt::LeftToRight)
iconRect.moveLeft(iconRect.left() + checkableOffset); iconRect.moveLeft(iconRect.left());
else else
iconRect.moveRight(iconRect.right() - checkableOffset); iconRect.moveRight(iconRect.right());
iconRule.drawRule(p, iconRect); iconRule.drawRule(p, iconRect);
QRect pmr(0, 0, pixw, pixh); QRect pmr(0, 0, pixw, pixh);
pmr.moveCenter(iconRect.center()); pmr.moveCenter(iconRect.center());
p->drawPixmap(pmr.topLeft(), pixmap); 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); QRect textRect = subRule.contentsRect(opt->rect);
textRect.setLeft(textRect.left() + textOffset); textRect.setLeft(textRect.left() + m->maxIconWidth);
textRect.setWidth(textRect.width() - mi.tabWidth); textRect.setWidth(textRect.width() - mi.tabWidth);
const QRect vTextRect = visualRect(opt->direction, m->rect, textRect); const QRect vTextRect = visualRect(opt->direction, m->rect, textRect);
@ -5106,27 +5099,20 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op
if (mi->text.contains(QLatin1Char('\t'))) if (mi->text.contains(QLatin1Char('\t')))
sz.rwidth() += 12; //as in QCommonStyle sz.rwidth() += 12; //as in QCommonStyle
bool checkable = mi->checkType != QStyleOptionMenuItem::NotCheckable; bool checkable = mi->checkType != QStyleOptionMenuItem::NotCheckable;
int checkableWidth = 0; if (!mi->icon.isNull()) {
if (checkable) { 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); QRenderRule subSubRule = renderRule(w, opt, PseudoElement_MenuCheckMark);
QRect checkmarkRect = positionRect(w, subRule, subSubRule, PseudoElement_MenuCheckMark, opt->rect, opt->direction); QRect checkmarkRect = positionRect(w, subRule, subSubRule, PseudoElement_MenuCheckMark, opt->rect, opt->direction);
checkableWidth = std::max(mi->maxIconWidth, checkmarkRect.width()); sz.rwidth() += std::max(mi->maxIconWidth, checkmarkRect.width()) + 4;
}
if (!mi->icon.isNull()) {
QPixmap pixmap = mi->icon.pixmap(pixelMetric(PM_SmallIconSize));
sz.rwidth() += pixmap.width();
} }
if (subRule.hasFont) { if (subRule.hasFont) {
QFontMetrics fm(subRule.font); QFontMetrics fm(subRule.font);
const QRect r = fm.boundingRect(QRect(), Qt::TextSingleLine | Qt::TextShowMnemonic, mi->text); const QRect r = fm.boundingRect(QRect(), Qt::TextSingleLine | Qt::TextShowMnemonic, mi->text);
sz = sz.expandedTo(r.size()); 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)); return subRule.boxSize(subRule.adjustSize(sz));
} }
} }

View File

@ -3141,8 +3141,6 @@ void QMdiSubWindow::paintEvent(QPaintEvent *paintEvent)
} }
Q_D(QMdiSubWindow); Q_D(QMdiSubWindow);
if (isMaximized() && !d->drawTitleBarWhenMaximized())
return;
if (d->resizeTimerId != -1) { if (d->resizeTimerId != -1) {
// Only update the style option rect and the window title. // Only update the style option rect and the window title.
@ -3162,6 +3160,17 @@ void QMdiSubWindow::paintEvent(QPaintEvent *paintEvent)
} }
QStylePainter painter(this); QStylePainter painter(this);
QStyleOptionFrame frameOptions;
frameOptions.initFrom(this);
frameOptions.state.setFlag(QStyle::State_Active, d->isActive);
if (isMaximized() && !d->drawTitleBarWhenMaximized()) {
if (!autoFillBackground() && (!widget() || !qt_widget_private(widget())->isOpaque)) {
// make sure we paint all pixels of a maximized QMdiSubWindow if no-one else does
painter.drawPrimitive(QStyle::PE_FrameWindow, frameOptions);
}
return;
}
if (!d->windowTitle.isEmpty()) if (!d->windowTitle.isEmpty())
painter.setFont(d->font); painter.setFont(d->font);
painter.drawComplexControl(QStyle::CC_TitleBar, d->cachedStyleOptions); painter.drawComplexControl(QStyle::CC_TitleBar, d->cachedStyleOptions);
@ -3169,10 +3178,7 @@ void QMdiSubWindow::paintEvent(QPaintEvent *paintEvent)
if (isMinimized() && !d->hasBorder(d->cachedStyleOptions)) if (isMinimized() && !d->hasBorder(d->cachedStyleOptions))
return; return;
QStyleOptionFrame frameOptions;
frameOptions.initFrom(this);
frameOptions.lineWidth = style()->pixelMetric(QStyle::PM_MdiSubWindowFrameWidth, 0, this); frameOptions.lineWidth = style()->pixelMetric(QStyle::PM_MdiSubWindowFrameWidth, 0, this);
frameOptions.state.setFlag(QStyle::State_Active, d->isActive);
// ### Ensure that we do not require setting the cliprect for 4.4 // ### Ensure that we do not require setting the cliprect for 4.4
if (!isMinimized() && !d->hasBorder(d->cachedStyleOptions)) if (!isMinimized() && !d->hasBorder(d->cachedStyleOptions))

View File

@ -2331,8 +2331,18 @@ void QMenu::popup(const QPoint &p, QAction *atAction)
d->updateLayoutDirection(); d->updateLayoutDirection();
// Ensure that we get correct sizeHints by placing this window on the correct screen. // Ensure that we get correct sizeHints by placing this window on the correct screen.
if (d->setScreenForPoint(p)) // However if the QMenu was constructed with a QDesktopScreenWidget as its parent,
// then initialScreenIndex was set, so we should respect that for the lifetime of this menu.
// Use d->popupScreen to remember, because initialScreenIndex will be reset after the first showing.
const int screenIndex = d->topData()->initialScreenIndex;
if (screenIndex >= 0)
d->popupScreen = screenIndex;
if (auto s = QGuiApplication::screens().value(d->popupScreen)) {
if (d->setScreen(s))
d->itemsDirty = true;
} else if (d->setScreenForPoint(p)) {
d->itemsDirty = true; d->itemsDirty = true;
}
const bool contextMenu = d->isContextMenu(); const bool contextMenu = d->isContextMenu();
if (d->lastContextMenu != contextMenu) { if (d->lastContextMenu != contextMenu) {

View File

@ -515,6 +515,8 @@ public:
bool tearoffHighlighted : 1; bool tearoffHighlighted : 1;
//menu fading/scrolling effects //menu fading/scrolling effects
bool doChildEffects : 1; bool doChildEffects : 1;
int popupScreen = -1;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -68,6 +68,7 @@
#include "qmenu_p.h" #include "qmenu_p.h"
#include "qmenubar_p.h" #include "qmenubar_p.h"
#include <private/qscreen_p.h>
#include "qdebug.h" #include "qdebug.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -322,11 +323,18 @@ void QMenuBarPrivate::popupAction(QAction *action, bool activateFirst)
QRect adjustedActionRect = actionRect(action); QRect adjustedActionRect = actionRect(action);
QPoint pos(q->mapToGlobal(QPoint(adjustedActionRect.left(), adjustedActionRect.bottom() + 1))); QPoint pos(q->mapToGlobal(QPoint(adjustedActionRect.left(), adjustedActionRect.bottom() + 1)));
QSize popup_size = activeMenu->sizeHint(); QSize popup_size = activeMenu->sizeHint();
//we put the popup menu on the screen containing the bottom-center of the action rect //we put the popup menu on the screen containing the bottom-center of the action rect
QRect screenRect = QDesktopWidgetPrivate::screenGeometry(pos + QPoint(adjustedActionRect.width() / 2, 0)); QScreen *popupScreen = q->window()->windowHandle()->screen();
QPoint bottomMiddlePos = pos + QPoint(adjustedActionRect.width() / 2, 0);
const auto &siblings = popupScreen->virtualSiblings();
for (QScreen *sibling : siblings) {
if (sibling->geometry().contains(bottomMiddlePos)) {
popupScreen = sibling;
break;
}
}
QRect screenRect = popupScreen->geometry();
pos = QPoint(qMax(pos.x(), screenRect.x()), qMax(pos.y(), screenRect.y())); pos = QPoint(qMax(pos.x(), screenRect.x()), qMax(pos.y(), screenRect.y()));
const bool fitUp = (pos.y() - popup_size.height() >= screenRect.top()); const bool fitUp = (pos.y() - popup_size.height() >= screenRect.top());
const bool fitDown = (pos.y() + popup_size.height() <= screenRect.bottom()); const bool fitDown = (pos.y() + popup_size.height() <= screenRect.bottom());
const bool rtl = q->isRightToLeft(); const bool rtl = q->isRightToLeft();
@ -352,6 +360,7 @@ void QMenuBarPrivate::popupAction(QAction *action, bool activateFirst)
if(!defaultPopDown || (fitUp && !fitDown)) if(!defaultPopDown || (fitUp && !fitDown))
pos.setY(qMax(screenRect.y(), q->mapToGlobal(QPoint(0, adjustedActionRect.top()-popup_size.height())).y())); pos.setY(qMax(screenRect.y(), q->mapToGlobal(QPoint(0, adjustedActionRect.top()-popup_size.height())).y()));
QMenuPrivate::get(activeMenu)->topData()->initialScreenIndex = QGuiApplication::screens().indexOf(popupScreen);
activeMenu->popup(pos); activeMenu->popup(pos);
if(activateFirst) if(activateFirst)
activeMenu->d_func()->setFirstActionActive(); activeMenu->d_func()->setFirstActionActive();

View File

@ -83,6 +83,21 @@ void tst_QAbstractAnimation::destruction()
{ {
TestableQAbstractAnimation *anim = new TestableQAbstractAnimation; TestableQAbstractAnimation *anim = new TestableQAbstractAnimation;
delete anim; delete anim;
// Animations should stop when deleted
auto *stopWhenDeleted = new TestableQAbstractAnimation;
QAbstractAnimation::State lastOldState, lastNewState;
QObject::connect(stopWhenDeleted, &QAbstractAnimation::stateChanged,
[&](QAbstractAnimation::State newState, QAbstractAnimation::State oldState) {
lastNewState = newState;
lastOldState = oldState;
});
stopWhenDeleted->start();
QCOMPARE(lastOldState, QAbstractAnimation::Stopped);
QCOMPARE(lastNewState, QAbstractAnimation::Running);
delete stopWhenDeleted;
QCOMPARE(lastOldState, QAbstractAnimation::Running);
QCOMPARE(lastNewState, QAbstractAnimation::Stopped);
} }
void tst_QAbstractAnimation::currentLoop() void tst_QAbstractAnimation::currentLoop()

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -164,6 +164,9 @@ private slots:
void preserveTexts_data(); void preserveTexts_data();
void preserveTexts(); void preserveTexts();
void devicePixelRatio_data();
void devicePixelRatio();
private: private:
QString prefix; QString prefix;
QTemporaryDir m_temporaryDir; QTemporaryDir m_temporaryDir;
@ -1976,6 +1979,28 @@ void tst_QImageReader::preserveTexts()
QCOMPARE(r.text(key3), text3.simplified()); 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) QTEST_MAIN(tst_QImageReader)
#include "tst_qimagereader.moc" #include "tst_qimagereader.moc"

View File

@ -340,7 +340,7 @@ void tst_Http2::flowControlServerSide()
clearHTTP2State(); clearHTTP2State();
serverPort = 0; serverPort = 0;
nRequests = 30; nRequests = 10;
const Http2::RawSettings serverSettings = {{Settings::MAX_CONCURRENT_STREAMS_ID, 7}}; const Http2::RawSettings serverSettings = {{Settings::MAX_CONCURRENT_STREAMS_ID, 7}};

View File

@ -2366,7 +2366,7 @@ void tst_QFtp::loginURL()
ftp = newFtp(); ftp = newFtp();
addCommand(QFtp::ConnectToHost, addCommand(QFtp::ConnectToHost,
ftp->connectToHost(QHostInfo::localHostName(), port)); ftp->connectToHost("127.0.0.1", port));
addCommand(QFtp::Login, ftp->login(user, password)); addCommand(QFtp::Login, ftp->login(user, password));
QTestEventLoop::instance().enterLoop(5); QTestEventLoop::instance().enterLoop(5);
@ -2374,7 +2374,7 @@ void tst_QFtp::loginURL()
ftp = nullptr; ftp = nullptr;
server.stopServer(); server.stopServer();
if (QTestEventLoop::instance().timeout()) if (QTestEventLoop::instance().timeout())
QFAIL(msgTimedOut(QHostInfo::localHostName(), port)); QFAIL(msgTimedOut("127.0.0.1", port));
QCOMPARE(server.getRawUser(), rawUser); QCOMPARE(server.getRawUser(), rawUser);
QCOMPARE(server.getRawPassword(), rawPass); QCOMPARE(server.getRawPassword(), rawPass);

View File

@ -1,17 +1,17 @@
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIICrTCCAhYCCQCdDn5rci6VDjANBgkqhkiG9w0BAQQFADCBmjEOMAwGA1UEChMF MIICpzCCAhACCQCzAF1hyRVzAjANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC
Tm9raWExFDASBgNVBAsTC1F0IFNvZnR3YXJlMSIwIAYJKoZIhvcNAQkBFhNub2Jv Tk8xDTALBgNVBAgTBE9zbG8xDTALBgNVBAcTBE9zbG8xDjAMBgNVBAoTBU5va2lh
ZHlAbm9kb21haW4ub3JnMQ0wCwYDVQQHEwRPc2xvMQ0wCwYDVQQIEwRPc2xvMQsw MTUwMwYDVQQLFCxRdCBTb2Z0d2FyZS9lbWFpbEFkZHJlc3M9bm9ib2R5QG5vZG9t
CQYDVQQGEwJOTzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQw YWluLm9yZzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQwHhcN
HhcNMDkwNzEwMDc0MTIzWhcNMTkwNzA4MDc0MTIzWjCBmjEOMAwGA1UEChMFTm9r MTkwNjI0MTI0OTIxWhcNMjIwNjIzMTI0OTIxWjCBlzELMAkGA1UEBhMCTk8xDTAL
aWExFDASBgNVBAsTC1F0IFNvZnR3YXJlMSIwIAYJKoZIhvcNAQkBFhNub2JvZHlA BgNVBAgTBE9zbG8xDTALBgNVBAcTBE9zbG8xDjAMBgNVBAoTBU5va2lhMTUwMwYD
bm9kb21haW4ub3JnMQ0wCwYDVQQHEwRPc2xvMQ0wCwYDVQQIEwRPc2xvMQswCQYD VQQLFCxRdCBTb2Z0d2FyZS9lbWFpbEFkZHJlc3M9bm9ib2R5QG5vZG9tYWluLm9y
VQQGEwJOTzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQwgZ8w ZzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQwgZ8wDQYJKoZI
DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM2q22/WNMmn8cC+5EEYGeICySLmp9W6 hvcNAQEBBQADgY0AMIGJAoGBAM2q22/WNMmn8cC+5EEYGeICySLmp9W6Ay6eKHr0
Ay6eKHr0Xxp3X3epETuPfvAuxp7rOtkS18EMUegkUj8jw0IMEcbyHKFC/rTCaYOt Xxp3X3epETuPfvAuxp7rOtkS18EMUegkUj8jw0IMEcbyHKFC/rTCaYOt93CxGBXM
93CxGBXMIChiMPAsFeYzGa/D6xzAkfcRaJRQ+Ek3CDLXPnXfo7xpABXezYcPXAJr IChiMPAsFeYzGa/D6xzAkfcRaJRQ+Ek3CDLXPnXfo7xpABXezYcPXAJrgsgBfWrw
gsgBfWrwHdxzAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAy7YOLCZABQy2Ygkchq1I HdxzAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEASCKbqEX5ysC549mq90ydk4jyDW3m
+TUpvMn+gLwAyW8TNErM1V4lNY2+K78RawzKx3SqM97ymCy4TD45EA3A2gmi32NI PUyet01fKpcRqVs+OJxdExFBTra3gho6WzzpTSPsuX2ZKOLF5k6KkCvdCGvhC1Kv
xSKBNjFyzngUqsXBdcSasALiowlZCiJrGwlGX5qCkBlxXvJeUEbuJLPYVl5FBjXZ HHPIExurfzvdlSRzj6HbKyPuSfxyOloH0bBp7/Gg5RIuBPKlbmfbnTLtwEjhhbMU
6o00K4cSPCqtqUez7WSmDZU= SoYI8HZd3HfY87c=
-----END CERTIFICATE----- -----END CERTIFICATE-----

View File

@ -1,17 +1,17 @@
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIICrTCCAhYCCQCdDn5rci6VDjANBgkqhkiG9w0BAQQFADCBmjEOMAwGA1UEChMF MIICpzCCAhACCQCzAF1hyRVzAjANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMC
Tm9raWExFDASBgNVBAsTC1F0IFNvZnR3YXJlMSIwIAYJKoZIhvcNAQkBFhNub2Jv Tk8xDTALBgNVBAgTBE9zbG8xDTALBgNVBAcTBE9zbG8xDjAMBgNVBAoTBU5va2lh
ZHlAbm9kb21haW4ub3JnMQ0wCwYDVQQHEwRPc2xvMQ0wCwYDVQQIEwRPc2xvMQsw MTUwMwYDVQQLFCxRdCBTb2Z0d2FyZS9lbWFpbEFkZHJlc3M9bm9ib2R5QG5vZG9t
CQYDVQQGEwJOTzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQw YWluLm9yZzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQwHhcN
HhcNMDkwNzEwMDc0MTIzWhcNMTkwNzA4MDc0MTIzWjCBmjEOMAwGA1UEChMFTm9r MTkwNjI0MTI0OTIxWhcNMjIwNjIzMTI0OTIxWjCBlzELMAkGA1UEBhMCTk8xDTAL
aWExFDASBgNVBAsTC1F0IFNvZnR3YXJlMSIwIAYJKoZIhvcNAQkBFhNub2JvZHlA BgNVBAgTBE9zbG8xDTALBgNVBAcTBE9zbG8xDjAMBgNVBAoTBU5va2lhMTUwMwYD
bm9kb21haW4ub3JnMQ0wCwYDVQQHEwRPc2xvMQ0wCwYDVQQIEwRPc2xvMQswCQYD VQQLFCxRdCBTb2Z0d2FyZS9lbWFpbEFkZHJlc3M9bm9ib2R5QG5vZG9tYWluLm9y
VQQGEwJOTzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQwgZ8w ZzEjMCEGA1UEAxMacXQtdGVzdC1zZXJ2ZXIucXQtdGVzdC1uZXQwgZ8wDQYJKoZI
DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM2q22/WNMmn8cC+5EEYGeICySLmp9W6 hvcNAQEBBQADgY0AMIGJAoGBAM2q22/WNMmn8cC+5EEYGeICySLmp9W6Ay6eKHr0
Ay6eKHr0Xxp3X3epETuPfvAuxp7rOtkS18EMUegkUj8jw0IMEcbyHKFC/rTCaYOt Xxp3X3epETuPfvAuxp7rOtkS18EMUegkUj8jw0IMEcbyHKFC/rTCaYOt93CxGBXM
93CxGBXMIChiMPAsFeYzGa/D6xzAkfcRaJRQ+Ek3CDLXPnXfo7xpABXezYcPXAJr IChiMPAsFeYzGa/D6xzAkfcRaJRQ+Ek3CDLXPnXfo7xpABXezYcPXAJrgsgBfWrw
gsgBfWrwHdxzAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAy7YOLCZABQy2Ygkchq1I HdxzAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEASCKbqEX5ysC549mq90ydk4jyDW3m
+TUpvMn+gLwAyW8TNErM1V4lNY2+K78RawzKx3SqM97ymCy4TD45EA3A2gmi32NI PUyet01fKpcRqVs+OJxdExFBTra3gho6WzzpTSPsuX2ZKOLF5k6KkCvdCGvhC1Kv
xSKBNjFyzngUqsXBdcSasALiowlZCiJrGwlGX5qCkBlxXvJeUEbuJLPYVl5FBjXZ HHPIExurfzvdlSRzj6HbKyPuSfxyOloH0bBp7/Gg5RIuBPKlbmfbnTLtwEjhhbMU
6o00K4cSPCqtqUez7WSmDZU= SoYI8HZd3HfY87c=
-----END CERTIFICATE----- -----END CERTIFICATE-----

View File

@ -2755,6 +2755,7 @@ void tst_QSslSocket::encryptWithoutConnecting()
void tst_QSslSocket::resume_data() void tst_QSslSocket::resume_data()
{ {
QSKIP("Temporary skip while updating certificates");
QTest::addColumn<bool>("ignoreErrorsAfterPause"); QTest::addColumn<bool>("ignoreErrorsAfterPause");
QTest::addColumn<QList<QSslError> >("errorsToIgnore"); QTest::addColumn<QList<QSslError> >("errorsToIgnore");
QTest::addColumn<bool>("expectSuccess"); QTest::addColumn<bool>("expectSuccess");
@ -3592,12 +3593,7 @@ protected:
socket = new QSslSocket(this); socket = new QSslSocket(this);
socket->setSslConfiguration(config); socket->setSslConfiguration(config);
socket->setPeerVerifyMode(peerVerifyMode); socket->setPeerVerifyMode(peerVerifyMode);
if (QSslSocket::sslLibraryVersionNumber() > 0x10101000L) { socket->setProtocol(protocol);
// FIXME. With OpenSSL 1.1.1 and TLS 1.3 PSK auto-test is broken.
socket->setProtocol(QSsl::TlsV1_2);
} else {
socket->setProtocol(protocol);
}
if (ignoreSslErrors) if (ignoreSslErrors)
connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(ignoreErrorSlot())); connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(ignoreErrorSlot()));
@ -3941,11 +3937,6 @@ void tst_QSslSocket::pskServer()
return; return;
QSslSocket socket; QSslSocket socket;
#ifdef TLS1_3_VERSION
// FIXME: with OpenSSL 1.1.1 (thus TLS 1.3) test is known to fail
// due to the different PSK mechanism (?) - to be investigated ASAP.
socket.setProtocol(QSsl::TlsV1_2);
#endif
this->socket = &socket; this->socket = &socket;
QSignalSpy connectedSpy(&socket, SIGNAL(connected())); QSignalSpy connectedSpy(&socket, SIGNAL(connected()));

View File

@ -34,3 +34,14 @@ setPen blue 40 solidline roundcap
drawPath revbez drawPath revbez
setPen red 0 setPen red 0
drawPath revbez 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

View File

@ -180,6 +180,7 @@ private slots:
void tabOrderWithProxy(); void tabOrderWithProxy();
void tabOrderWithCompoundWidgets(); void tabOrderWithCompoundWidgets();
void tabOrderNoChange(); void tabOrderNoChange();
void tabOrderNoChange2();
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
void activation(); void activation();
#endif #endif
@ -1942,6 +1943,24 @@ static QVector<QWidget*> getFocusChain(QWidget *start, bool bForward)
return ret; return ret;
} }
//#define DEBUG_FOCUS_CHAIN
static void dumpFocusChain(QWidget *start, bool bForward, const char *desc = nullptr)
{
#ifdef DEBUG_FOCUS_CHAIN
qDebug() << "Dump focus chain, start:" << start << "isForward:" << bForward << desc;
QWidget *cur = start;
do {
qDebug() << cur;
auto widgetPrivate = static_cast<QWidgetPrivate *>(qt_widget_private(cur));
cur = bForward ? widgetPrivate->focus_next : widgetPrivate->focus_prev;
} while (cur != start);
#else
Q_UNUSED(start)
Q_UNUSED(bForward)
Q_UNUSED(desc)
#endif
}
void tst_QWidget::tabOrderNoChange() void tst_QWidget::tabOrderNoChange()
{ {
QWidget w; QWidget w;
@ -1953,7 +1972,61 @@ void tst_QWidget::tabOrderNoChange()
const auto focusChainForward = getFocusChain(&w, true); const auto focusChainForward = getFocusChain(&w, true);
const auto focusChainBackward = getFocusChain(&w, false); const auto focusChainBackward = getFocusChain(&w, false);
dumpFocusChain(&w, true);
QWidget::setTabOrder(tabWidget, tv); QWidget::setTabOrder(tabWidget, tv);
dumpFocusChain(&w, true);
QCOMPARE(focusChainForward, getFocusChain(&w, true));
QCOMPARE(focusChainBackward, getFocusChain(&w, false));
}
void tst_QWidget::tabOrderNoChange2()
{
QWidget w;
auto *verticalLayout = new QVBoxLayout(&w);
auto *tabWidget = new QTabWidget(&w);
tabWidget->setObjectName("tabWidget");
verticalLayout->addWidget(tabWidget);
auto *tab1 = new QWidget(tabWidget);
tab1->setObjectName("tab1");
auto *vLay1 = new QVBoxLayout(tab1);
auto *le1 = new QLineEdit(tab1);
le1->setObjectName("le1");
auto *le2 = new QLineEdit(tab1);
le2->setObjectName("le2");
vLay1->addWidget(le1);
vLay1->addWidget(le2);
tabWidget->addTab(tab1, QStringLiteral("Tab 1"));
auto *tab2 = new QWidget(tabWidget);
tab2->setObjectName("tab2");
auto *vLay2 = new QVBoxLayout(tab2);
auto *le3 = new QLineEdit(tab2);
le3->setObjectName("le3");
auto *le4 = new QLineEdit(tab2);
le4->setObjectName("le4");
vLay2->addWidget(le3);
vLay2->addWidget(le4);
tabWidget->addTab(tab2, QStringLiteral("Tab 2"));
const auto focusChainForward = getFocusChain(&w, true);
const auto focusChainBackward = getFocusChain(&w, false);
dumpFocusChain(&w, true);
dumpFocusChain(&w, false);
// this will screw up the focus chain order without visible changes,
// so don't call it here for the simplicity of the test
//QWidget::setTabOrder(tabWidget, le1);
QWidget::setTabOrder(le1, le2);
dumpFocusChain(&w, true, "QWidget::setTabOrder(le1, le2)");
QWidget::setTabOrder(le2, le3);
dumpFocusChain(&w, true, "QWidget::setTabOrder(le2, le3)");
QWidget::setTabOrder(le3, le4);
dumpFocusChain(&w, true, "QWidget::setTabOrder(le3, le4)");
QWidget::setTabOrder(le4, tabWidget);
dumpFocusChain(&w, true, "QWidget::setTabOrder(le4, tabWidget)");
dumpFocusChain(&w, false);
QCOMPARE(focusChainForward, getFocusChain(&w, true)); QCOMPARE(focusChainForward, getFocusChain(&w, true));
QCOMPARE(focusChainBackward, getFocusChain(&w, false)); QCOMPARE(focusChainBackward, getFocusChain(&w, false));
} }

View File

@ -735,6 +735,7 @@ void tst_QSplitter::replaceWidget()
// Configure splitter // Configure splitter
QWidget *oldWidget = sp.widget(index); QWidget *oldWidget = sp.widget(index);
QTest::qWait(100); // Make sure we record the right original size (after the window manager adds the frame)
const QRect oldGeom = oldWidget ? oldWidget->geometry() : QRect(); const QRect oldGeom = oldWidget ? oldWidget->geometry() : QRect();
if (oldWidget) { if (oldWidget) {
// Collapse first, then hide, if necessary // Collapse first, then hide, if necessary