Remove ambiguity in handling of registry keys from setupAPI.h
QWindowsScreen uses setupAPI.h's SetupDiOpenDevRegKey function to read EDID data for monitors. This function is documented as returning INVALID_HANDLE_VALUE in case of failure. The QWindowsScreen code was ambiguous in the sense that it considered both nullptr and INVALID_HANDLE_VALUE as being invalid handle values. This inconsistency is likely not a bug, but makes the code harder to understand. This patch removes this ambiguity, and QWindowsScreen now follows the documented behavior when SetupDiOpenDevRegKey fails. In addition, we replace use of unique_ptr with the new QUniqueHandle template class because HKEY is a handle type, not a regular pointer type. Pick-to: 6.5 6.6 Change-Id: Ia863bda504077e59833f6f7a0f855e7915e4edd9 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
923d09f3f1
commit
55141c59cd
@ -19,6 +19,7 @@
|
||||
#include <private/qhighdpiscaling_p.h>
|
||||
#include <private/qwindowsfontdatabasebase_p.h>
|
||||
#include <private/qpixmap_win_p.h>
|
||||
#include <private/quniquehandle_p.h>
|
||||
|
||||
#include <QtGui/qscreen.h>
|
||||
|
||||
@ -116,16 +117,22 @@ static float getMonitorSDRWhiteLevel(DISPLAYCONFIG_PATH_TARGET_INFO *targetInfo)
|
||||
|
||||
using WindowsScreenDataList = QList<QWindowsScreenData>;
|
||||
|
||||
struct RegistryHandleDeleter
|
||||
namespace {
|
||||
|
||||
struct DiRegKeyHandleTraits
|
||||
{
|
||||
void operator()(HKEY handle) const noexcept
|
||||
using Type = HKEY;
|
||||
static Type invalidValue()
|
||||
{
|
||||
if (handle != nullptr && handle != INVALID_HANDLE_VALUE)
|
||||
RegCloseKey(handle);
|
||||
// The setupapi.h functions return INVALID_HANDLE_VALUE when failing to open a registry key
|
||||
return reinterpret_cast<HKEY>(INVALID_HANDLE_VALUE);
|
||||
}
|
||||
static bool close(Type handle) { return RegCloseKey(handle) == ERROR_SUCCESS; }
|
||||
};
|
||||
|
||||
using RegistryHandlePtr = std::unique_ptr<std::remove_pointer_t<HKEY>, RegistryHandleDeleter>;
|
||||
using DiRegKeyHandle = QUniqueHandle<DiRegKeyHandleTraits>;
|
||||
|
||||
}
|
||||
|
||||
static void setMonitorDataFromSetupApi(QWindowsScreenData &data,
|
||||
const std::vector<DISPLAYCONFIG_PATH_INFO> &pathGroup)
|
||||
@ -207,10 +214,10 @@ static void setMonitorDataFromSetupApi(QWindowsScreenData &data,
|
||||
continue;
|
||||
}
|
||||
|
||||
const RegistryHandlePtr edidRegistryKey{ SetupDiOpenDevRegKey(
|
||||
const DiRegKeyHandle edidRegistryKey{ SetupDiOpenDevRegKey(
|
||||
devInfo, &deviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ) };
|
||||
|
||||
if (!edidRegistryKey || edidRegistryKey.get() == INVALID_HANDLE_VALUE)
|
||||
if (!edidRegistryKey.isValid())
|
||||
continue;
|
||||
|
||||
DWORD edidDataSize{ 0 };
|
||||
|
Loading…
Reference in New Issue
Block a user