Minor tweaks.

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2020-11-12 11:34:41 +08:00
parent f597b64f46
commit c783bc1fe2
6 changed files with 137 additions and 156 deletions

View File

@ -66,7 +66,7 @@ WinNativeEventFilter::addFramelessWindow(&widget, &data);
// Or // Or
WinNativeEventFilter::setWindowData(&widget, &data); WinNativeEventFilter::setWindowData(&widget, &data);
// Or modify the window data of a specific window directly: // Or modify the window data of a specific window directly:
const auto data = WinNativeEventFilter::windowData(&widget); const auto data = WinNativeEventFilter::getWindowData(&widget);
if (data) { if (data) {
data->borderWidth = 5; data->borderWidth = 5;
data->borderHeight = 5; data->borderHeight = 5;

View File

@ -313,18 +313,18 @@ bool Widget::shouldDrawBorder(const bool ignoreWindowState) const
bool Widget::shouldDrawThemedBorder(const bool ignoreWindowState) const bool Widget::shouldDrawThemedBorder(const bool ignoreWindowState) const
{ {
return (shouldDrawBorder(ignoreWindowState) && WinNativeEventFilter::colorizationEnabled()); return (shouldDrawBorder(ignoreWindowState) && WinNativeEventFilter::isColorizationEnabled());
} }
bool Widget::shouldDrawThemedTitleBar() const bool Widget::shouldDrawThemedTitleBar() const
{ {
return m_bIsWin10OrGreater && WinNativeEventFilter::colorizationEnabled(); return m_bIsWin10OrGreater && WinNativeEventFilter::isColorizationEnabled();
} }
QColor Widget::activeBorderColor() QColor Widget::activeBorderColor()
{ {
return WinNativeEventFilter::colorizationEnabled() ? g_cColorizationColor return WinNativeEventFilter::isColorizationEnabled() ? g_cColorizationColor
: g_cDefaultActiveBorderColor; : g_cDefaultActiveBorderColor;
} }
QColor Widget::inactiveBorderColor() QColor Widget::inactiveBorderColor()
@ -583,7 +583,7 @@ void Widget::setupConnections()
} }
WinNativeEventFilter::setBlurEffectEnabled(rawHandle(), enable, color); WinNativeEventFilter::setBlurEffectEnabled(rawHandle(), enable, color);
updateWindow(); updateWindow();
if (useAcrylicEffect && enable && WinNativeEventFilter::transparencyEffectEnabled()) { if (useAcrylicEffect && enable && WinNativeEventFilter::isTransparencyEffectEnabled()) {
QMessageBox::warning(this, QMessageBox::warning(this,
tr("BUG Warning!"), tr("BUG Warning!"),
tr("You have enabled the transparency effect in the personalize " tr("You have enabled the transparency effect in the personalize "
@ -630,7 +630,7 @@ void Widget::initializeVariables()
m_bIsWin10OrGreater = isWin10OrGreater(); m_bIsWin10OrGreater = isWin10OrGreater();
if (m_bIsWin10OrGreater) { if (m_bIsWin10OrGreater) {
m_bCanAcrylicBeEnabled = isWin10OrGreater(g_vAcrylicEffectVersion); m_bCanAcrylicBeEnabled = isWin10OrGreater(g_vAcrylicEffectVersion);
g_cColorizationColor = WinNativeEventFilter::colorizationColor(); g_cColorizationColor = WinNativeEventFilter::getColorizationColor();
} }
} }

View File

@ -111,37 +111,37 @@ bool FramelessQuickHelper::canHaveWindowFrame() const
bool FramelessQuickHelper::colorizationEnabled() const bool FramelessQuickHelper::colorizationEnabled() const
{ {
return WinNativeEventFilter::colorizationEnabled(); return WinNativeEventFilter::isColorizationEnabled();
} }
QColor FramelessQuickHelper::colorizationColor() const QColor FramelessQuickHelper::colorizationColor() const
{ {
return WinNativeEventFilter::colorizationColor(); return WinNativeEventFilter::getColorizationColor();
} }
bool FramelessQuickHelper::lightThemeEnabled() const bool FramelessQuickHelper::lightThemeEnabled() const
{ {
return WinNativeEventFilter::lightThemeEnabled(); return WinNativeEventFilter::isLightThemeEnabled();
} }
bool FramelessQuickHelper::darkThemeEnabled() const bool FramelessQuickHelper::darkThemeEnabled() const
{ {
return WinNativeEventFilter::darkThemeEnabled(); return WinNativeEventFilter::isDarkThemeEnabled();
} }
bool FramelessQuickHelper::highContrastModeEnabled() const bool FramelessQuickHelper::highContrastModeEnabled() const
{ {
return WinNativeEventFilter::highContrastModeEnabled(); return WinNativeEventFilter::isHighContrastModeEnabled();
} }
bool FramelessQuickHelper::darkFrameEnabled() const bool FramelessQuickHelper::darkFrameEnabled() const
{ {
return WinNativeEventFilter::darkFrameEnabled(rawHandle()); return WinNativeEventFilter::isDarkFrameEnabled(rawHandle());
} }
bool FramelessQuickHelper::transparencyEffectEnabled() const bool FramelessQuickHelper::transparencyEffectEnabled() const
{ {
return WinNativeEventFilter::transparencyEffectEnabled(); return WinNativeEventFilter::isTransparencyEffectEnabled();
} }
#endif #endif

View File

@ -201,7 +201,7 @@ void FramelessWindowsManager::addIgnoreArea(QObject *window, const QRect &area)
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
if (data) { if (data) {
data->ignoreAreas.append(area); data->ignoreAreas.append(area);
} }
@ -214,7 +214,7 @@ void FramelessWindowsManager::addDraggableArea(QObject *window, const QRect &are
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
if (data) { if (data) {
data->draggableAreas.append(area); data->draggableAreas.append(area);
} }
@ -227,7 +227,7 @@ void FramelessWindowsManager::addIgnoreObject(QObject *window, QObject *object)
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
if (data) { if (data) {
data->ignoreObjects.append(object); data->ignoreObjects.append(object);
} }
@ -240,7 +240,7 @@ void FramelessWindowsManager::addDraggableObject(QObject *window, QObject *objec
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
if (data) { if (data) {
data->draggableObjects.append(object); data->draggableObjects.append(object);
} }
@ -265,7 +265,7 @@ void FramelessWindowsManager::setBorderWidth(QObject *window, const int value)
{ {
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
Q_ASSERT(window); Q_ASSERT(window);
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
if (data) { if (data) {
data->borderWidth = value; data->borderWidth = value;
} }
@ -291,7 +291,7 @@ void FramelessWindowsManager::setBorderHeight(QObject *window, const int value)
{ {
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
Q_ASSERT(window); Q_ASSERT(window);
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
if (data) { if (data) {
data->borderHeight = value; data->borderHeight = value;
} }
@ -317,7 +317,7 @@ void FramelessWindowsManager::setTitleBarHeight(QObject *window, const int value
{ {
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
Q_ASSERT(window); Q_ASSERT(window);
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
if (data) { if (data) {
data->titleBarHeight = value; data->titleBarHeight = value;
} }
@ -331,7 +331,7 @@ bool FramelessWindowsManager::getResizable(QObject *window)
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
return data ? !data->fixedSize : true; return data ? !data->fixedSize : true;
#else #else
return coreData()->framelessHelper.getResizable(window); return coreData()->framelessHelper.getResizable(window);
@ -352,7 +352,7 @@ QSize FramelessWindowsManager::getMinimumSize(QObject *window)
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
return data ? data->minimumSize : QSize(); return data ? data->minimumSize : QSize();
#else #else
if (window->isWindowType()) { if (window->isWindowType()) {
@ -374,7 +374,7 @@ void FramelessWindowsManager::setMinimumSize(QObject *window, const QSize &value
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
if (data) { if (data) {
data->minimumSize = value; data->minimumSize = value;
} }
@ -397,7 +397,7 @@ QSize FramelessWindowsManager::getMaximumSize(QObject *window)
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
return data ? data->maximumSize : QSize(); return data ? data->maximumSize : QSize();
#else #else
if (window->isWindowType()) { if (window->isWindowType()) {
@ -419,7 +419,7 @@ void FramelessWindowsManager::setMaximumSize(QObject *window, const QSize &value
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
if (data) { if (data) {
data->maximumSize = value; data->maximumSize = value;
} }
@ -442,7 +442,7 @@ bool FramelessWindowsManager::getTitleBarEnabled(QObject *window)
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
return data ? !data->disableTitleBar : true; return data ? !data->disableTitleBar : true;
#else #else
return coreData()->framelessHelper.getTitleBarEnabled(window); return coreData()->framelessHelper.getTitleBarEnabled(window);
@ -453,7 +453,7 @@ void FramelessWindowsManager::setTitleBarEnabled(QObject *window, const bool val
{ {
Q_ASSERT(window); Q_ASSERT(window);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
const auto data = WinNativeEventFilter::windowData(window); const auto data = WinNativeEventFilter::getWindowData(window);
if (data) { if (data) {
data->disableTitleBar = !value; data->disableTitleBar = !value;
} }

View File

@ -698,7 +698,6 @@ using WNEF_CORE_DATA = struct _WNEF_CORE_DATA
int m_borderWidth = -1, m_borderHeight = -1, m_titleBarHeight = -1; int m_borderWidth = -1, m_borderHeight = -1, m_titleBarHeight = -1;
QScopedPointer<WinNativeEventFilter> m_instance; QScopedPointer<WinNativeEventFilter> m_instance;
QList<HWND> m_framelessWindows = {};
}; };
} // namespace } // namespace
@ -1226,9 +1225,6 @@ void install()
qApp->removeNativeEventFilter(coreData()->m_instance.data()); qApp->removeNativeEventFilter(coreData()->m_instance.data());
coreData()->m_instance.reset(); coreData()->m_instance.reset();
} }
if (!coreData()->m_framelessWindows.isEmpty()) {
coreData()->m_framelessWindows.clear();
}
} }
// The standard values of border width, border height and title bar height // The standard values of border width, border height and title bar height
@ -1261,10 +1257,18 @@ void WinNativeEventFilter::addFramelessWindow(void *window,
Q_ASSERT(window); Q_ASSERT(window);
qCoreAppFixup(); qCoreAppFixup();
const auto hwnd = reinterpret_cast<HWND>(window); const auto hwnd = reinterpret_cast<HWND>(window);
if (WNEF_EXECUTE_WINAPI_RETURN(IsWindow, FALSE, hwnd) if (WNEF_EXECUTE_WINAPI_RETURN(IsWindow, FALSE, hwnd)) {
&& !coreData()->m_framelessWindows.contains(hwnd)) { createUserData(hwnd);
coreData()->m_framelessWindows.append(hwnd); const auto oldData = getWindowData(window);
createUserData(hwnd, data); if (oldData && oldData->framelessModeEnabled) {
return;
}
const auto newData = new WINDOWDATA;
if (data) {
*newData = *data;
}
newData->framelessModeEnabled = true;
createUserData(hwnd, newData);
install(); install();
updateQtFrame_internal(hwnd); updateQtFrame_internal(hwnd);
if ((x > 0) && (y > 0) && (width > 0) && (height > 0)) { if ((x > 0) && (y > 0) && (width > 0) && (height > 0)) {
@ -1291,9 +1295,10 @@ void WinNativeEventFilter::addFramelessWindow(QObject *window,
void WinNativeEventFilter::removeFramelessWindow(void *window) void WinNativeEventFilter::removeFramelessWindow(void *window)
{ {
Q_ASSERT(window); Q_ASSERT(window);
const auto hwnd = reinterpret_cast<HWND>(window); createUserData(reinterpret_cast<HWND>(window));
if (coreData()->m_framelessWindows.contains(hwnd)) { const auto data = getWindowData(window);
coreData()->m_framelessWindows.removeAll(hwnd); if (data) {
data->framelessModeEnabled = false;
} }
} }
@ -1303,13 +1308,6 @@ void WinNativeEventFilter::removeFramelessWindow(QObject *window)
removeFramelessWindow(getHWNDFromQObject(window)); removeFramelessWindow(getHWNDFromQObject(window));
} }
void WinNativeEventFilter::clearFramelessWindows()
{
if (!coreData()->m_framelessWindows.isEmpty()) {
coreData()->m_framelessWindows.clear();
}
}
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType, bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
void *message, void *message,
@ -1343,14 +1341,6 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
// Anyway, we should skip it in this case. // Anyway, we should skip it in this case.
return false; return false;
} }
if (coreData()->m_framelessWindows.isEmpty()) {
// Only top level windows can be frameless.
if (!IsTopLevel(msg->hwnd)) {
return false;
}
} else if (!coreData()->m_framelessWindows.contains(msg->hwnd)) {
return false;
}
const auto data = reinterpret_cast<WINDOWDATA *>( const auto data = reinterpret_cast<WINDOWDATA *>(
WNEF_EXECUTE_WINAPI_RETURN(GetWindowLongPtrW, 0, msg->hwnd, GWLP_USERDATA)); WNEF_EXECUTE_WINAPI_RETURN(GetWindowLongPtrW, 0, msg->hwnd, GWLP_USERDATA));
if (!data) { if (!data) {
@ -1379,6 +1369,9 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
msg->lParam); msg->lParam);
return false; return false;
} }
if (!data->framelessModeEnabled) {
return false;
}
if (!data->initialized) { if (!data->initialized) {
// Avoid initializing a same window twice. // Avoid initializing a same window twice.
data->initialized = true; data->initialized = true;
@ -1803,99 +1796,89 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
return true; return true;
} }
const auto isInSpecificAreas = const auto isInSpecificAreas =
[](const int x, const int y, const QList<QRect> &areas, const qreal dpr) -> bool { [](const QPointF &mousePos, const QList<QRect> &areas, const qreal dpr) -> bool {
if (!areas.isEmpty()) { if (areas.isEmpty()) {
for (auto &&area : qAsConst(areas)) { return false;
if (!area.isValid()) { }
continue; for (auto &&area : qAsConst(areas)) {
} if (!area.isValid()) {
if (QRectF(area.x() * dpr, continue;
area.y() * dpr, }
area.width() * dpr, if (QRectF(area.x() * dpr,
area.height() * dpr) area.y() * dpr,
.contains(x, y)) { area.width() * dpr,
return true; area.height() * dpr)
} .contains(mousePos)) {
return true;
} }
} }
return false; return false;
}; };
#if defined(QT_WIDGETS_LIB) || defined(QT_QUICK_LIB) #if defined(QT_WIDGETS_LIB) || defined(QT_QUICK_LIB)
const auto isInSpecificObjects = [](const int x, const auto isInSpecificObjects = [](const QPointF &mousePos,
const int y,
const QList<QObject *> &objects, const QList<QObject *> &objects,
const qreal dpr) -> bool { const qreal dpr) -> bool {
if (!objects.isEmpty()) { if (objects.isEmpty()) {
for (auto &&object : qAsConst(objects)) { return false;
if (!object) { }
continue; for (auto &&object : qAsConst(objects)) {
} if (!object) {
continue;
}
#ifdef QT_WIDGETS_LIB #ifdef QT_WIDGETS_LIB
const auto widget = qobject_cast<QWidget *>(object); const auto widget = qobject_cast<QWidget *>(object);
if (widget) { if (widget) {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
const QPointF pos = widget->mapToGlobal(QPointF{0, 0}); const QPointF pos = widget->mapToGlobal(QPointF{0, 0});
#else #else
const QPoint pos = widget->mapToGlobal(QPoint{0, 0}); const QPoint pos = widget->mapToGlobal(QPoint{0, 0});
#endif #endif
if (QRectF(pos.x() * dpr, if (QRectF(pos.x() * dpr,
pos.y() * dpr, pos.y() * dpr,
widget->width() * dpr, widget->width() * dpr,
widget->height() * dpr) widget->height() * dpr)
.contains(x, y)) { .contains(mousePos)) {
return true; return true;
}
} }
}
#endif #endif
#ifdef QT_QUICK_LIB #ifdef QT_QUICK_LIB
const auto quickItem = qobject_cast<QQuickItem *>(object); const auto quickItem = qobject_cast<QQuickItem *>(object);
if (quickItem) { if (quickItem) {
const QPointF pos = quickItem->mapToGlobal(QPointF{0, 0}); const QPointF pos = quickItem->mapToGlobal(QPointF{0, 0});
if (QRectF(pos.x() * dpr, if (QRectF(pos.x() * dpr,
pos.y() * dpr, pos.y() * dpr,
quickItem->width() * dpr, quickItem->width() * dpr,
quickItem->height() * dpr) quickItem->height() * dpr)
.contains(x, y)) { .contains(mousePos)) {
return true; return true;
}
} }
#endif
} }
#endif
} }
return false; return false;
}; };
#endif #endif
// Don't use HIWORD(lParam) and LOWORD(lParam) to get cursor
// coordinates because their results are unsigned numbers,
// however the cursor position may be negative due to in a
// different monitor.
const POINT globalMouse{GET_X_LPARAM(msg->lParam), GET_Y_LPARAM(msg->lParam)};
POINT localMouse = globalMouse;
WNEF_EXECUTE_WINAPI(ScreenToClient, msg->hwnd, &localMouse)
const qreal dpr = GetDevicePixelRatioForWindow(msg->hwnd); const qreal dpr = GetDevicePixelRatioForWindow(msg->hwnd);
const bool isInIgnoreAreas = isInSpecificAreas(localMouse.x, const QPointF globalMouse = QCursor::pos() * dpr;
localMouse.y, POINT winLocalMouse = {qRound(globalMouse.x()), qRound(globalMouse.y())};
data->ignoreAreas, WNEF_EXECUTE_WINAPI(ScreenToClient, msg->hwnd, &winLocalMouse)
dpr); const QPointF localMouse = {static_cast<qreal>(winLocalMouse.x),
static_cast<qreal>(winLocalMouse.y)};
const bool isInIgnoreAreas = isInSpecificAreas(localMouse, data->ignoreAreas, dpr);
const bool customDragAreas = !data->draggableAreas.isEmpty(); const bool customDragAreas = !data->draggableAreas.isEmpty();
const bool isInDraggableAreas = customDragAreas const bool isInDraggableAreas = customDragAreas
? isInSpecificAreas(localMouse.x, ? isInSpecificAreas(localMouse,
localMouse.y,
data->draggableAreas, data->draggableAreas,
dpr) dpr)
: true; : true;
#if defined(QT_WIDGETS_LIB) || defined(QT_QUICK_LIB) #if defined(QT_WIDGETS_LIB) || defined(QT_QUICK_LIB)
// For this purpose, QCursor give more accurate position const bool isInIgnoreObjects = isInSpecificObjects(globalMouse,
// than windows when using several monitors.
const auto qtGlobalMousePos = QCursor::pos() * dpr;
const bool isInIgnoreObjects = isInSpecificObjects(qtGlobalMousePos.x(),
qtGlobalMousePos.y(),
data->ignoreObjects, data->ignoreObjects,
dpr); dpr);
const bool customDragObjects = !data->draggableObjects.isEmpty(); const bool customDragObjects = !data->draggableObjects.isEmpty();
const bool isInDraggableObjects = customDragObjects const bool isInDraggableObjects = customDragObjects
? isInSpecificObjects(qtGlobalMousePos.x(), ? isInSpecificObjects(globalMouse,
qtGlobalMousePos.y(),
data->draggableObjects, data->draggableObjects,
dpr) dpr)
: true; : true;
@ -1909,12 +1892,12 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
#endif #endif
const bool customDrag = customDragAreas || customDragObjects; const bool customDrag = customDragAreas || customDragObjects;
const bool isResizePermitted = !isInIgnoreAreas && !isInIgnoreObjects; const bool isResizePermitted = !isInIgnoreAreas && !isInIgnoreObjects;
const LONG bh = getSystemMetric(msg->hwnd, SystemMetric::BorderHeight, true); const int bh = getSystemMetric(msg->hwnd, SystemMetric::BorderHeight, true);
const LONG tbh = getSystemMetric(msg->hwnd, SystemMetric::TitleBarHeight, true); const int tbh = getSystemMetric(msg->hwnd, SystemMetric::TitleBarHeight, true);
const bool isTitleBar = (customDrag ? (isInDraggableAreas && isInDraggableObjects) const bool isTitleBar = (customDrag ? (isInDraggableAreas && isInDraggableObjects)
: (localMouse.y <= (tbh + bh))) : (localMouse.y() <= (tbh + bh)))
&& isResizePermitted && !data->disableTitleBar; && isResizePermitted && !data->disableTitleBar;
const bool isTop = (localMouse.y <= bh) && isResizePermitted; const bool isTop = (localMouse.y() <= bh) && isResizePermitted;
if (shouldHaveWindowFrame()) { if (shouldHaveWindowFrame()) {
// This will handle the left, right and bottom parts of the frame // This will handle the left, right and bottom parts of the frame
// because we didn't change them. // because we didn't change them.
@ -1944,28 +1927,26 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
*result = HTCLIENT; *result = HTCLIENT;
return true; return true;
} else { } else {
const auto getHTResult = const auto getHitTestResult =
[isTitleBar, localMouse, bh, isTop](const HWND _hWnd, [msg, isTitleBar, &localMouse, bh, isTop, data]() -> LRESULT {
const WINDOWDATA &_data) -> LRESULT {
Q_ASSERT(_hWnd);
RECT clientRect = {0, 0, 0, 0}; RECT clientRect = {0, 0, 0, 0};
WNEF_EXECUTE_WINAPI(GetClientRect, _hWnd, &clientRect) WNEF_EXECUTE_WINAPI(GetClientRect, msg->hwnd, &clientRect)
const LONG ww = clientRect.right; const LONG ww = clientRect.right;
const LONG wh = clientRect.bottom; const LONG wh = clientRect.bottom;
const LONG bw = getSystemMetric(_hWnd, SystemMetric::BorderWidth, true); const int bw = getSystemMetric(msg->hwnd, SystemMetric::BorderWidth, true);
if (IsMaximized(_hWnd)) { if (IsMaximized(msg->hwnd)) {
if (isTitleBar) { if (isTitleBar) {
return HTCAPTION; return HTCAPTION;
} }
return HTCLIENT; return HTCLIENT;
} }
const bool isBottom = (localMouse.y >= (wh - bh)); const bool isBottom = (localMouse.y() >= (wh - bh));
// Make the border a little wider to let the user easy to resize // Make the border a little wider to let the user easy to resize
// on corners. // on corners.
const int factor = (isTop || isBottom) ? 2 : 1; const int factor = (isTop || isBottom) ? 2 : 1;
const bool isLeft = (localMouse.x <= (bw * factor)); const bool isLeft = (localMouse.x() <= (bw * factor));
const bool isRight = (localMouse.x >= (ww - (bw * factor))); const bool isRight = (localMouse.x() >= (ww - (bw * factor)));
const bool fixedSize = _data.fixedSize; const bool fixedSize = data->fixedSize;
const auto getBorderValue = [fixedSize](int value) -> int { const auto getBorderValue = [fixedSize](int value) -> int {
// HTBORDER: non-resizeable window border. // HTBORDER: non-resizeable window border.
return fixedSize ? HTBORDER : value; return fixedSize ? HTBORDER : value;
@ -1999,7 +1980,7 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
} }
return HTCLIENT; return HTCLIENT;
}; };
*result = getHTResult(msg->hwnd, *data); *result = getHitTestResult();
return true; return true;
} }
} }
@ -2155,7 +2136,7 @@ void WinNativeEventFilter::setWindowData(QObject *window, const WINDOWDATA *data
setWindowData(getHWNDFromQObject(window), data); setWindowData(getHWNDFromQObject(window), data);
} }
WinNativeEventFilter::WINDOWDATA *WinNativeEventFilter::windowData(void *window) WinNativeEventFilter::WINDOWDATA *WinNativeEventFilter::getWindowData(void *window)
{ {
Q_ASSERT(window); Q_ASSERT(window);
const auto hwnd = reinterpret_cast<HWND>(window); const auto hwnd = reinterpret_cast<HWND>(window);
@ -2167,10 +2148,10 @@ WinNativeEventFilter::WINDOWDATA *WinNativeEventFilter::windowData(void *window)
return nullptr; return nullptr;
} }
WinNativeEventFilter::WINDOWDATA *WinNativeEventFilter::windowData(QObject *window) WinNativeEventFilter::WINDOWDATA *WinNativeEventFilter::getWindowData(QObject *window)
{ {
Q_ASSERT(window); Q_ASSERT(window);
return windowData(getHWNDFromQObject(window)); return getWindowData(getHWNDFromQObject(window));
} }
void WinNativeEventFilter::setBorderWidth(const int bw) void WinNativeEventFilter::setBorderWidth(const int bw)
@ -2386,7 +2367,7 @@ bool WinNativeEventFilter::displaySystemMenu(void *handle,
WNEF_EXECUTE_WINAPI(SetMenuItemInfoW, hMenu, SC_MAXIMIZE, FALSE, &mii) WNEF_EXECUTE_WINAPI(SetMenuItemInfoW, hMenu, SC_MAXIMIZE, FALSE, &mii)
WNEF_EXECUTE_WINAPI(SetMenuItemInfoW, hMenu, SC_MINIMIZE, FALSE, &mii) WNEF_EXECUTE_WINAPI(SetMenuItemInfoW, hMenu, SC_MINIMIZE, FALSE, &mii)
mii.fState = MF_GRAYED; mii.fState = MF_GRAYED;
const auto data = windowData(hwnd); const auto data = getWindowData(hwnd);
const bool fixedSize = data ? data->fixedSize : false; const bool fixedSize = data ? data->fixedSize : false;
if (fixedSize) { if (fixedSize) {
WNEF_EXECUTE_WINAPI(SetMenuItemInfoW, hMenu, SC_SIZE, FALSE, &mii) WNEF_EXECUTE_WINAPI(SetMenuItemInfoW, hMenu, SC_SIZE, FALSE, &mii)
@ -2515,7 +2496,7 @@ void WinNativeEventFilter::setWindowResizable(void *handle, const bool resizable
Q_ASSERT(handle); Q_ASSERT(handle);
const auto hwnd = reinterpret_cast<HWND>(handle); const auto hwnd = reinterpret_cast<HWND>(handle);
if (WNEF_EXECUTE_WINAPI_RETURN(IsWindow, FALSE, hwnd)) { if (WNEF_EXECUTE_WINAPI_RETURN(IsWindow, FALSE, hwnd)) {
const auto data = windowData(hwnd); const auto data = getWindowData(hwnd);
if (data) { if (data) {
data->fixedSize = !resizable; data->fixedSize = !resizable;
} }
@ -2532,7 +2513,7 @@ void WinNativeEventFilter::setWindowResizable(void *handle, const bool resizable
} }
} }
bool WinNativeEventFilter::colorizationEnabled() bool WinNativeEventFilter::isColorizationEnabled()
{ {
if (!isWin10OrGreater()) { if (!isWin10OrGreater()) {
return false; return false;
@ -2544,7 +2525,7 @@ bool WinNativeEventFilter::colorizationEnabled()
return (ok && colorPrevalence); return (ok && colorPrevalence);
} }
QColor WinNativeEventFilter::colorizationColor() QColor WinNativeEventFilter::getColorizationColor()
{ {
DWORD color = 0; DWORD color = 0;
BOOL opaqueBlend = FALSE; BOOL opaqueBlend = FALSE;
@ -2554,18 +2535,18 @@ QColor WinNativeEventFilter::colorizationColor()
: Qt::white; : Qt::white;
} }
bool WinNativeEventFilter::lightThemeEnabled() bool WinNativeEventFilter::isLightThemeEnabled()
{ {
return !darkThemeEnabled(); return !isDarkThemeEnabled();
} }
bool WinNativeEventFilter::darkThemeEnabled() bool WinNativeEventFilter::isDarkThemeEnabled()
{ {
return coreData()->m_lpShouldSystemUseDarkMode ? coreData()->m_lpShouldSystemUseDarkMode() return coreData()->m_lpShouldSystemUseDarkMode ? coreData()->m_lpShouldSystemUseDarkMode()
: false; : false;
} }
bool WinNativeEventFilter::highContrastModeEnabled() bool WinNativeEventFilter::isHighContrastModeEnabled()
{ {
HIGHCONTRASTW hc; HIGHCONTRASTW hc;
SecureZeroMemory(&hc, sizeof(hc)); SecureZeroMemory(&hc, sizeof(hc));
@ -2575,7 +2556,7 @@ bool WinNativeEventFilter::highContrastModeEnabled()
: false; : false;
} }
bool WinNativeEventFilter::darkFrameEnabled(void *handle) bool WinNativeEventFilter::isDarkFrameEnabled(void *handle)
{ {
Q_ASSERT(handle); Q_ASSERT(handle);
if (!isWin10OrGreater(17763)) { if (!isWin10OrGreater(17763)) {
@ -2601,7 +2582,7 @@ bool WinNativeEventFilter::darkFrameEnabled(void *handle)
return false; return false;
} }
bool WinNativeEventFilter::transparencyEffectEnabled() bool WinNativeEventFilter::isTransparencyEffectEnabled()
{ {
if (!isWin10OrGreater()) { if (!isWin10OrGreater()) {
return false; return false;

View File

@ -54,7 +54,8 @@ public:
{ {
bool initialized = false /* Internal use only, don't modify it from outside */, bool initialized = false /* Internal use only, don't modify it from outside */,
fixedSize = false, mouseTransparent = false, restoreDefaultWindowStyle = false, fixedSize = false, mouseTransparent = false, restoreDefaultWindowStyle = false,
enableLayeredWindow = false, disableTitleBar = false, enableBlurBehindWindow = false; enableLayeredWindow = false, disableTitleBar = false, enableBlurBehindWindow = false,
framelessModeEnabled = false;
int borderWidth = -1, borderHeight = -1, titleBarHeight = -1; int borderWidth = -1, borderHeight = -1, titleBarHeight = -1;
QList<QRect> ignoreAreas = {}, draggableAreas = {}; QList<QRect> ignoreAreas = {}, draggableAreas = {};
QList<QObject *> ignoreObjects = {}, draggableObjects = {}; QList<QObject *> ignoreObjects = {}, draggableObjects = {};
@ -87,7 +88,6 @@ public:
const int height = -1); const int height = -1);
static void removeFramelessWindow(void *window /* HWND */); static void removeFramelessWindow(void *window /* HWND */);
static void removeFramelessWindow(QObject *window); static void removeFramelessWindow(QObject *window);
static void clearFramelessWindows();
// Set borderWidth, borderHeight or titleBarHeight to a negative value to // Set borderWidth, borderHeight or titleBarHeight to a negative value to
// restore default behavior. // restore default behavior.
@ -97,8 +97,8 @@ public:
static void setWindowData(QObject *window, const WINDOWDATA *data); static void setWindowData(QObject *window, const WINDOWDATA *data);
// You can modify the given window's data directly, it's the same with using // You can modify the given window's data directly, it's the same with using
// setWindowData. // setWindowData.
static WINDOWDATA *windowData(void *window /* HWND */); static WINDOWDATA *getWindowData(void *window /* HWND */);
static WINDOWDATA *windowData(QObject *window); static WINDOWDATA *getWindowData(QObject *window);
// Change settings globally, not a specific window. // Change settings globally, not a specific window.
// These values will be scaled automatically according to DPI, don't scale // These values will be scaled automatically according to DPI, don't scale
@ -154,25 +154,25 @@ public:
static void setWindowResizable(void *handle /* HWND */, const bool resizable = true); static void setWindowResizable(void *handle /* HWND */, const bool resizable = true);
// Query whether colorization is enabled or not. // Query whether colorization is enabled or not.
static bool colorizationEnabled(); static bool isColorizationEnabled();
// Acquire the theme/colorization color set by the user. // Acquire the theme/colorization color set by the user.
static QColor colorizationColor(); static QColor getColorizationColor();
// Query whether the user is using the light theme or not. // Query whether the user is using the light theme or not.
static bool lightThemeEnabled(); static bool isLightThemeEnabled();
// Query whether the user is using the dark theme or not. // Query whether the user is using the dark theme or not.
static bool darkThemeEnabled(); static bool isDarkThemeEnabled();
// Query whether the high contrast mode is enabled or not. // Query whether the high contrast mode is enabled or not.
static bool highContrastModeEnabled(); static bool isHighContrastModeEnabled();
// Query whether the given window is using dark frame or not. // Query whether the given window is using dark frame or not.
static bool darkFrameEnabled(void *handle /* HWND */); static bool isDarkFrameEnabled(void *handle /* HWND */);
// Query whether the transparency effect is enabled or not. // Query whether the transparency effect is enabled or not.
static bool transparencyEffectEnabled(); static bool isTransparencyEffectEnabled();
/////////////////////////////////////////////// ///////////////////////////////////////////////
/// CORE FUNCTION - THE SOUL OF THIS CODE /// CORE FUNCTION - THE SOUL OF THIS CODE