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:
commit
ef37ab9970
@ -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
83
dist/changes-5.12.4
vendored
Normal 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
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
142
src/3rdparty/angle/src/libEGL/libEGL_mingw32.def
vendored
142
src/3rdparty/angle/src/libEGL/libEGL_mingw32.def
vendored
@ -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
|
||||||
|
142
src/3rdparty/angle/src/libEGL/libEGLd_mingw32.def
vendored
142
src/3rdparty/angle/src/libEGL/libEGLd_mingw32.def
vendored
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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}
|
||||||
*/
|
*/
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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:
|
||||||
|
@ -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)))
|
||||||
|
@ -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:
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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) {
|
||||||
|
3
src/dbus/doc/snippets/cmake/examples.cmake
Normal file
3
src/dbus/doc/snippets/cmake/examples.cmake
Normal 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]
|
224
src/dbus/doc/src/qtdbus-cmake.qdoc
Normal file
224
src/dbus/doc/src/qtdbus-cmake.qdoc
Normal 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
|
||||||
|
*/
|
@ -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).
|
||||||
|
@ -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
|
||||||
|
@ -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());
|
||||||
|
@ -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
|
||||||
|
@ -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 ®ion, 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
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -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();
|
||||||
|
@ -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 ¤tError : lastErrors) {
|
for (const auto ¤tError : 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);
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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") }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -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:
|
||||||
|
@ -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 ®ion, 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) {
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -1011,16 +1011,16 @@ void QCocoaWindow::setMask(const QRegion ®ion)
|
|||||||
} 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];
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
@ -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()
|
||||||
|
BIN
tests/auto/gui/image/qimagereader/images/qticon16.png
Normal file
BIN
tests/auto/gui/image/qimagereader/images/qticon16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
BIN
tests/auto/gui/image/qimagereader/images/qticon16@2x.png
Normal file
BIN
tests/auto/gui/image/qimagereader/images/qticon16@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
BIN
tests/auto/gui/image/qimagereader/images/qticon16@3x.png
Normal file
BIN
tests/auto/gui/image/qimagereader/images/qticon16@3x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.2 KiB |
@ -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"
|
||||||
|
@ -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}};
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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-----
|
||||||
|
@ -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-----
|
||||||
|
@ -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()));
|
||||||
|
@ -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
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user