Windows: Only set the touch flags if the window is not already registered
It is possible for there to be a HCBT_CREATEWND hook which can set the touch window flags already while the window is being created. Therefore we want to defer to those settings instead as they should take precedence. Change-Id: If8dcbd34db2b3bbbfb1bc36731665fb17fb87c24 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
This commit is contained in:
parent
3b30a8215e
commit
c87f8a3797
@ -173,7 +173,7 @@ static inline QWindowsSessionManager *platformSessionManager() {
|
||||
QWindowsUser32DLL::QWindowsUser32DLL() :
|
||||
setLayeredWindowAttributes(0), updateLayeredWindow(0),
|
||||
updateLayeredWindowIndirect(0),
|
||||
isHungAppWindow(0),
|
||||
isHungAppWindow(0), isTouchWindow(0),
|
||||
registerTouchWindow(0), unregisterTouchWindow(0),
|
||||
getTouchInputInfo(0), closeTouchInputHandle(0), setProcessDPIAware(0),
|
||||
addClipboardFormatListener(0), removeClipboardFormatListener(0)
|
||||
@ -202,11 +202,12 @@ void QWindowsUser32DLL::init()
|
||||
bool QWindowsUser32DLL::initTouch()
|
||||
{
|
||||
QSystemLibrary library(QStringLiteral("user32"));
|
||||
isTouchWindow = (IsTouchWindow)(library.resolve("IsTouchWindow"));
|
||||
registerTouchWindow = (RegisterTouchWindow)(library.resolve("RegisterTouchWindow"));
|
||||
unregisterTouchWindow = (UnregisterTouchWindow)(library.resolve("UnregisterTouchWindow"));
|
||||
getTouchInputInfo = (GetTouchInputInfo)(library.resolve("GetTouchInputInfo"));
|
||||
closeTouchInputHandle = (CloseTouchInputHandle)(library.resolve("CloseTouchInputHandle"));
|
||||
return registerTouchWindow && unregisterTouchWindow && getTouchInputInfo && closeTouchInputHandle;
|
||||
return isTouchWindow && registerTouchWindow && unregisterTouchWindow && getTouchInputInfo && closeTouchInputHandle;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -76,6 +76,7 @@ struct QWindowsUser32DLL
|
||||
inline void init();
|
||||
inline bool initTouch();
|
||||
|
||||
typedef BOOL (WINAPI *IsTouchWindow)(HWND, PULONG);
|
||||
typedef BOOL (WINAPI *RegisterTouchWindow)(HWND, ULONG);
|
||||
typedef BOOL (WINAPI *UnregisterTouchWindow)(HWND);
|
||||
typedef BOOL (WINAPI *GetTouchInputInfo)(HANDLE, UINT, PVOID, int);
|
||||
@ -99,6 +100,7 @@ struct QWindowsUser32DLL
|
||||
IsHungAppWindow isHungAppWindow;
|
||||
|
||||
// Touch functions from Windows 7 onwards (also for use with Q_CC_MSVC).
|
||||
IsTouchWindow isTouchWindow;
|
||||
RegisterTouchWindow registerTouchWindow;
|
||||
UnregisterTouchWindow unregisterTouchWindow;
|
||||
GetTouchInputInfo getTouchInputInfo;
|
||||
|
@ -2294,6 +2294,12 @@ void QWindowsWindow::registerTouchWindow(QWindowsWindowFunctions::TouchWindowTou
|
||||
#ifndef Q_OS_WINCE
|
||||
if ((QWindowsContext::instance()->systemInfo() & QWindowsContext::SI_SupportsTouch)
|
||||
&& window()->type() != Qt::ForeignWindow) {
|
||||
ULONG touchFlags = 0;
|
||||
const bool ret = QWindowsContext::user32dll.isTouchWindow(m_data.hwnd, &touchFlags);
|
||||
// Return if it is not a touch window or the flags are already set by a hook
|
||||
// such as HCBT_CREATEWND
|
||||
if (!ret || touchFlags != 0)
|
||||
return;
|
||||
if (QWindowsContext::user32dll.registerTouchWindow(m_data.hwnd, (ULONG)touchTypes))
|
||||
setFlag(TouchRegistered);
|
||||
else
|
||||
|
Loading…
x
Reference in New Issue
Block a user