forked from github_mirror/framelesshelper
Minor improvements.
Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
parent
a3d4df1ebf
commit
a49a134f24
|
@ -36,6 +36,9 @@
|
||||||
#endif
|
#endif
|
||||||
#include <QtMath>
|
#include <QtMath>
|
||||||
|
|
||||||
|
// All the following constants and macros are copied from Windows 10 SDK
|
||||||
|
// directly, without any modifications.
|
||||||
|
|
||||||
#ifdef IsMinimized
|
#ifdef IsMinimized
|
||||||
#undef IsMinimized
|
#undef IsMinimized
|
||||||
#endif
|
#endif
|
||||||
|
@ -164,6 +167,9 @@
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
// All the following enums, structs and function prototypes are copied from
|
||||||
|
// Windows 10 SDK directly, without any modifications.
|
||||||
|
|
||||||
const UINT m_defaultDotsPerInch = USER_DEFAULT_SCREEN_DPI;
|
const UINT m_defaultDotsPerInch = USER_DEFAULT_SCREEN_DPI;
|
||||||
|
|
||||||
const qreal m_defaultDevicePixelRatio = 1.0;
|
const qreal m_defaultDevicePixelRatio = 1.0;
|
||||||
|
@ -215,10 +221,12 @@ using BLENDFUNCTION = struct _BLENDFUNCTION {
|
||||||
using BP_PAINTPARAMS = struct _BP_PAINTPARAMS {
|
using BP_PAINTPARAMS = struct _BP_PAINTPARAMS {
|
||||||
DWORD cbSize;
|
DWORD cbSize;
|
||||||
DWORD dwFlags;
|
DWORD dwFlags;
|
||||||
const RECT *prcExclude;
|
CONST RECT *prcExclude;
|
||||||
const BLENDFUNCTION *pBlendFunction;
|
CONST BLENDFUNCTION *pBlendFunction;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Some of the following functions are not used by this code anymore,
|
||||||
|
// but we don't remove them completely because we may still need them later.
|
||||||
WNEF_GENERATE_WINAPI(GetSystemDpiForProcess, UINT, HANDLE)
|
WNEF_GENERATE_WINAPI(GetSystemDpiForProcess, UINT, HANDLE)
|
||||||
WNEF_GENERATE_WINAPI(GetDpiForWindow, UINT, HWND)
|
WNEF_GENERATE_WINAPI(GetDpiForWindow, UINT, HWND)
|
||||||
WNEF_GENERATE_WINAPI(GetDpiForSystem, UINT)
|
WNEF_GENERATE_WINAPI(GetDpiForSystem, UINT)
|
||||||
|
@ -312,16 +320,23 @@ WNEF_GENERATE_WINAPI(EndBufferedPaint, HRESULT, HPAINTBUFFER, BOOL)
|
||||||
WNEF_GENERATE_WINAPI(BeginBufferedPaint, HPAINTBUFFER, HDC, CONST RECT *,
|
WNEF_GENERATE_WINAPI(BeginBufferedPaint, HPAINTBUFFER, HDC, CONST RECT *,
|
||||||
BP_BUFFERFORMAT, BP_PAINTPARAMS *, HDC *)
|
BP_BUFFERFORMAT, BP_PAINTPARAMS *, HDC *)
|
||||||
WNEF_GENERATE_WINAPI(CreateRectRgnIndirect, HRGN, CONST RECT *)
|
WNEF_GENERATE_WINAPI(CreateRectRgnIndirect, HRGN, CONST RECT *)
|
||||||
|
WNEF_GENERATE_WINAPI(GetDCEx, HDC, HWND, HRGN, DWORD)
|
||||||
|
WNEF_GENERATE_WINAPI(GetWindowDC, HDC, HWND)
|
||||||
|
WNEF_GENERATE_WINAPI(OffsetRect, BOOL, LPRECT, int, int)
|
||||||
|
|
||||||
// Some APIs are not available on old systems, so we will load them
|
// Some APIs are not available on old systems, so we will load them
|
||||||
// dynamically at run-time to get maximum compatibility.
|
// dynamically at run-time to get maximum compatibility.
|
||||||
void ResolveWin32APIs() {
|
void ResolveWin32APIs() {
|
||||||
static bool resolved = false;
|
static bool resolved = false;
|
||||||
if (resolved) {
|
if (resolved) {
|
||||||
|
// Don't resolve twice.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
resolved = true;
|
resolved = true;
|
||||||
// Available since Windows 2000.
|
// Available since Windows 2000.
|
||||||
|
WNEF_RESOLVE_WINAPI(User32, OffsetRect)
|
||||||
|
WNEF_RESOLVE_WINAPI(User32, GetWindowDC)
|
||||||
|
WNEF_RESOLVE_WINAPI(User32, GetDCEx)
|
||||||
WNEF_RESOLVE_WINAPI(User32, AdjustWindowRectEx)
|
WNEF_RESOLVE_WINAPI(User32, AdjustWindowRectEx)
|
||||||
WNEF_RESOLVE_WINAPI(User32, EndPaint)
|
WNEF_RESOLVE_WINAPI(User32, EndPaint)
|
||||||
WNEF_RESOLVE_WINAPI(User32, BeginPaint)
|
WNEF_RESOLVE_WINAPI(User32, BeginPaint)
|
||||||
|
@ -842,7 +857,7 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
|
||||||
m_lpSetWindowLongPtrW(msg->hwnd, GWL_STYLE,
|
m_lpSetWindowLongPtrW(msg->hwnd, GWL_STYLE,
|
||||||
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN |
|
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN |
|
||||||
WS_CLIPSIBLINGS);
|
WS_CLIPSIBLINGS);
|
||||||
if (data->windowData.layeredWindow) {
|
if (!data->windowData.notLayeredWindow) {
|
||||||
// Turn our window into a layered window to get better
|
// Turn our window into a layered window to get better
|
||||||
// performance and hopefully, to get rid of some strange bugs at
|
// performance and hopefully, to get rid of some strange bugs at
|
||||||
// the same time. But this will break the Arcylic effect
|
// the same time. But this will break the Arcylic effect
|
||||||
|
@ -1180,6 +1195,7 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
#if defined(QT_WIDGETS_LIB) || defined(QT_QUICK_LIB)
|
||||||
const auto isInSpecificObjects =
|
const auto isInSpecificObjects =
|
||||||
[](const int x, const int y,
|
[](const int x, const int y,
|
||||||
const QVector<QPointer<QObject>> &objects,
|
const QVector<QPointer<QObject>> &objects,
|
||||||
|
@ -1218,6 +1234,7 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
RECT clientRect = {0, 0, 0, 0};
|
RECT clientRect = {0, 0, 0, 0};
|
||||||
m_lpGetClientRect(_hWnd, &clientRect);
|
m_lpGetClientRect(_hWnd, &clientRect);
|
||||||
const LONG ww = clientRect.right;
|
const LONG ww = clientRect.right;
|
||||||
|
@ -1245,6 +1262,7 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
|
||||||
? true
|
? true
|
||||||
: isInSpecificAreas(mouse.x, mouse.y,
|
: isInSpecificAreas(mouse.x, mouse.y,
|
||||||
_data->windowData.draggableAreas, dpr);
|
_data->windowData.draggableAreas, dpr);
|
||||||
|
#if defined(QT_WIDGETS_LIB) || defined(QT_QUICK_LIB)
|
||||||
const bool isInIgnoreObjects = isInSpecificObjects(
|
const bool isInIgnoreObjects = isInSpecificObjects(
|
||||||
mouse.x, mouse.y, _data->windowData.ignoreObjects, dpr);
|
mouse.x, mouse.y, _data->windowData.ignoreObjects, dpr);
|
||||||
const bool isInDraggableObjects =
|
const bool isInDraggableObjects =
|
||||||
|
@ -1253,6 +1271,13 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
|
||||||
: isInSpecificObjects(mouse.x, mouse.y,
|
: isInSpecificObjects(mouse.x, mouse.y,
|
||||||
_data->windowData.draggableObjects,
|
_data->windowData.draggableObjects,
|
||||||
dpr);
|
dpr);
|
||||||
|
#else
|
||||||
|
// Don't block resizing if both of the Qt Widgets module and Qt
|
||||||
|
// Quick module are not compiled in, although there's not much
|
||||||
|
// significance of using this code in this case.
|
||||||
|
const bool isInIgnoreObjects = false;
|
||||||
|
const bool isInDraggableObjects = true;
|
||||||
|
#endif
|
||||||
const bool isResizePermitted = !isInIgnoreAreas &&
|
const bool isResizePermitted = !isInIgnoreAreas &&
|
||||||
isInDraggableAreas && !isInIgnoreObjects &&
|
isInDraggableAreas && !isInIgnoreObjects &&
|
||||||
isInDraggableObjects;
|
isInDraggableObjects;
|
||||||
|
|
|
@ -39,10 +39,11 @@ class WinNativeEventFilter : public QAbstractNativeEventFilter {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using WINDOWDATA = struct _WINDOWDATA {
|
using WINDOWDATA = struct _WINDOWDATA {
|
||||||
BOOL fixedSize = FALSE, mouseTransparent = FALSE, layeredWindow = TRUE;
|
BOOL fixedSize = FALSE, mouseTransparent = FALSE,
|
||||||
|
notLayeredWindow = FALSE;
|
||||||
int borderWidth = -1, borderHeight = -1, titlebarHeight = -1;
|
int borderWidth = -1, borderHeight = -1, titlebarHeight = -1;
|
||||||
QVector<QRect> ignoreAreas, draggableAreas;
|
QVector<QRect> ignoreAreas = {}, draggableAreas = {};
|
||||||
QVector<QPointer<QObject>> ignoreObjects, draggableObjects;
|
QVector<QPointer<QObject>> ignoreObjects = {}, draggableObjects = {};
|
||||||
QSize maximumSize = {-1, -1}, minimumSize = {-1, -1};
|
QSize maximumSize = {-1, -1}, minimumSize = {-1, -1};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue