macos: add initial implementation

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2022-04-18 16:50:33 +08:00
parent dee635c0b9
commit 5173fb51af
11 changed files with 314 additions and 92 deletions

View File

@ -311,6 +311,8 @@ using GetWindowDevicePixelRatioCallback = std::function<qreal()>;
using SetSystemButtonStateCallback = std::function<void(const SystemButtonType, const ButtonState)>;
using GetWindowIdCallback = std::function<WId()>;
struct UserSettings
{
QPoint startupPosition = {};
@ -327,8 +329,6 @@ struct UserSettings
struct SystemParameters
{
WId windowId = 0;
GetWindowFlagsCallback getWindowFlags = nullptr;
SetWindowFlagsCallback setWindowFlags = nullptr;
@ -358,15 +358,17 @@ struct SystemParameters
SetSystemButtonStateCallback setSystemButtonState = nullptr;
GetWindowIdCallback getWindowId = nullptr;
[[nodiscard]] inline bool isValid() const
{
return (windowId && getWindowFlags && setWindowFlags && getWindowSize
return (getWindowFlags && setWindowFlags && getWindowSize
&& setWindowSize && getWindowPosition && setWindowPosition
&& getWindowScreen && isWindowFixedSize && setWindowFixedSize
&& getWindowState && setWindowState && getWindowHandle
&& windowToScreen && screenToWindow && isInsideSystemButtons
&& isInsideTitleBarDraggableArea && getWindowDevicePixelRatio
&& setSystemButtonState);
&& setSystemButtonState && getWindowId);
}
};

View File

@ -36,8 +36,8 @@ namespace Utils
const QPoint &pos);
[[nodiscard]] FRAMELESSHELPER_CORE_API Qt::Edges calculateWindowEdges(const QWindow *window,
const QPoint &pos);
FRAMELESSHELPER_CORE_API void startSystemMove(QWindow *window);
FRAMELESSHELPER_CORE_API void startSystemResize(QWindow *window, const Qt::Edges edges);
FRAMELESSHELPER_CORE_API void startSystemMove(QWindow *window, const QPoint &globalPos);
FRAMELESSHELPER_CORE_API void startSystemResize(QWindow *window, const Qt::Edges edges, const QPoint &globalPos);
[[nodiscard]] FRAMELESSHELPER_CORE_API QVariant
getSystemButtonIconResource(const Global::SystemButtonType button,
const Global::SystemTheme theme,
@ -113,6 +113,11 @@ FRAMELESSHELPER_CORE_API void tryToEnableHighestDpiAwarenessLevel();
FRAMELESSHELPER_CORE_API void updateGlobalWin32ControlsTheme(const WId windowId, const bool dark);
#endif // Q_OS_WINDOWS
#ifdef Q_OS_MACOS
FRAMELESSHELPER_CORE_API void setWindowHook(const WId windowId);
FRAMELESSHELPER_CORE_API void unsetWindowHook(const WId windowId);
FRAMELESSHELPER_CORE_API void removeWindowFrame(const WId windowId);
#endif // Q_OS_MACOS
} // namespace Utils
FRAMELESSHELPER_END_NAMESPACE

View File

@ -100,7 +100,7 @@ private Q_SLOTS:
void updateSystemMaximizeButton();
private:
QPointer<QWidget> q = nullptr;
QWidget *q = nullptr;
bool m_initialized = false;
QScopedPointer<QWidget> m_systemTitleBarWidget;
QScopedPointer<QLabel> m_systemWindowTitleLabel;
@ -114,7 +114,6 @@ private:
QScopedPointer<QWidget> m_userContentContainerWidget;
QScopedPointer<QVBoxLayout> m_userContentContainerLayout;
Qt::WindowState m_savedWindowState = {};
QPointer<QWindow> m_window = nullptr;
Global::UserSettings m_settings = {};
Global::SystemParameters m_params = {};
bool m_windowExposed = false;

View File

@ -53,7 +53,7 @@ if(WIN32)
framelesshelper_win.cpp
)
elseif(APPLE)
list(APPEND SOURCES utils_mac.cpp)
list(APPEND SOURCES utils_mac.mm)
elseif(UNIX)
list(APPEND SOURCES utils_linux.cpp)
endif()
@ -121,6 +121,13 @@ if(UNIX AND NOT APPLE)
)
endif()
if(APPLE)
target_link_libraries(${SUB_PROJ_NAME} PRIVATE
"-framework Cocoa"
"-framework Carbon"
)
endif()
target_link_libraries(${SUB_PROJ_NAME} PRIVATE
Qt${QT_VERSION_MAJOR}::CorePrivate
Qt${QT_VERSION_MAJOR}::GuiPrivate

View File

@ -59,8 +59,9 @@ void FramelessHelperQt::addWindow(const UserSettings &settings, const SystemPara
if (!params.isValid()) {
return;
}
const WId windowId = params.getWindowId();
g_qtHelper()->mutex.lock();
if (g_qtHelper()->data.contains(params.windowId)) {
if (g_qtHelper()->data.contains(windowId)) {
g_qtHelper()->mutex.unlock();
return;
}
@ -70,10 +71,16 @@ void FramelessHelperQt::addWindow(const UserSettings &settings, const SystemPara
QWindow *window = params.getWindowHandle();
// Give it a parent so that it can be deleted even if we forget to do so.
data.eventFilter = new FramelessHelperQt(window);
g_qtHelper()->data.insert(params.windowId, data);
g_qtHelper()->data.insert(windowId, data);
g_qtHelper()->mutex.unlock();
#ifndef Q_OS_MACOS
params.setWindowFlags(params.getWindowFlags() | Qt::FramelessWindowHint);
#endif
window->installEventFilter(data.eventFilter);
#ifdef Q_OS_MACOS
Utils::setWindowHook(windowId);
Utils::removeWindowFrame(windowId);
#endif
}
bool FramelessHelperQt::eventFilter(QObject *object, QEvent *event)
@ -115,8 +122,10 @@ bool FramelessHelperQt::eventFilter(QObject *object, QEvent *event)
const auto mouseEvent = static_cast<QMouseEvent *>(event);
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
const QPoint scenePos = mouseEvent->scenePosition().toPoint();
const QPoint globalPos = mouseEvent->globalPosition().toPoint();
#else
const QPoint scenePos = mouseEvent->windowPos().toPoint();
const QPoint globalPos = mouseEvent->globalPos();
#endif
switch (type) {
case QEvent::MouseMove: {
@ -138,7 +147,7 @@ bool FramelessHelperQt::eventFilter(QObject *object, QEvent *event)
if (edges == Qt::Edges{}) {
return false;
}
Utils::startSystemResize(window, edges);
Utils::startSystemResize(window, edges, globalPos);
return true;
}
default:

View File

@ -50,6 +50,9 @@ Q_GLOBAL_STATIC(FramelessWindowsManagerHelper, g_helper)
Q_GLOBAL_STATIC(FramelessWindowsManager, g_manager)
static constexpr const char MAC_LAYER_ENV_VAR[] = "QT_MAC_WANTS_LAYER";
FRAMELESSHELPER_BYTEARRAY_CONSTANT2(OptionEnabled, "1")
FramelessWindowsManagerPrivate::FramelessWindowsManagerPrivate(FramelessWindowsManager *q) : QObject(q)
{
Q_ASSERT(q);
@ -80,7 +83,7 @@ const FramelessWindowsManagerPrivate *FramelessWindowsManagerPrivate::get(const
return pub->d_func();
}
bool FramelessWindowsManagerPrivate::usePureQtImplementation() const
bool FramelessWindowsManagerPrivate::usePureQtImplementation()
{
#ifdef Q_OS_WINDOWS
static const bool result = []() -> bool {
@ -108,12 +111,13 @@ void FramelessWindowsManagerPrivate::addWindow(const UserSettings &settings, con
if (!params.isValid()) {
return;
}
const WId windowId = params.getWindowId();
g_helper()->mutex.lock();
if (g_helper()->windowIds.contains(params.windowId)) {
if (g_helper()->windowIds.contains(windowId)) {
g_helper()->mutex.unlock();
return;
}
g_helper()->windowIds.append(params.windowId);
g_helper()->windowIds.append(windowId);
g_helper()->mutex.unlock();
static const bool pureQt = usePureQtImplementation();
#ifdef Q_OS_WINDOWS
@ -121,11 +125,11 @@ void FramelessWindowsManagerPrivate::addWindow(const UserSettings &settings, con
// Work-around Win32 multi-monitor artifacts.
QWindow * const window = params.getWindowHandle();
Q_ASSERT(window);
connect(window, &QWindow::screenChanged, window, [&params, window](QScreen *screen){
connect(window, &QWindow::screenChanged, window, [windowId, window](QScreen *screen){
Q_UNUSED(screen);
// Force a WM_NCCALCSIZE event to inform Windows about our custom window frame,
// this is only necessary when the window is being moved cross monitors.
Utils::triggerFrameChange(params.windowId);
Utils::triggerFrameChange(windowId);
// For some reason the window is not repainted correctly when moving cross monitors,
// we workaround this issue by force a re-paint and re-layout of the window by triggering
// a resize event manually. Although the actual size does not change, the issue we
@ -142,8 +146,12 @@ void FramelessWindowsManagerPrivate::addWindow(const UserSettings &settings, con
FramelessHelperWin::addWindow(settings, params);
}
if (!(settings.options & Option::DontInstallSystemMenuHook)) {
Utils::installSystemMenuHook(params.windowId, settings.options,
settings.systemMenuOffset, params.isWindowFixedSize);
Utils::installSystemMenuHook(windowId, settings.options, settings.systemMenuOffset, params.isWindowFixedSize);
}
#endif
#ifdef Q_OS_MACOS
if (qEnvironmentVariableIntValue(MAC_LAYER_ENV_VAR) != 1) {
qputenv(MAC_LAYER_ENV_VAR, kOptionEnabled);
}
#endif
}

View File

@ -44,11 +44,11 @@ public:
Q_NODISCARD static FramelessWindowsManagerPrivate *get(FramelessWindowsManager *pub);
Q_NODISCARD static const FramelessWindowsManagerPrivate *get(const FramelessWindowsManager *pub);
Q_NODISCARD bool usePureQtImplementation() const;
Q_NODISCARD static bool usePureQtImplementation();
Q_NODISCARD Global::SystemTheme systemTheme() const;
public Q_SLOTS:
void addWindow(const Global::UserSettings &settings, const Global::SystemParameters &params);
static void addWindow(const Global::UserSettings &settings, const Global::SystemParameters &params);
void notifySystemThemeHasChangedOrNot();
private:

View File

@ -1,31 +0,0 @@
/*
* MIT License
*
* Copyright (C) 2022 by wangwenx190 (Yuhang Zhao)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "utils.h"
FRAMELESSHELPER_BEGIN_NAMESPACE
FRAMELESSHELPER_END_NAMESPACE

250
src/core/utils_mac.mm Normal file
View File

@ -0,0 +1,250 @@
/*
* MIT License
*
* Copyright (C) 2022 by wangwenx190 (Yuhang Zhao)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "utils.h"
#include <QtCore/qdebug.h>
#include <QtCore/qhash.h>
#include <QtGui/qwindow.h>
#include <objc/runtime.h>
#include <Cocoa/Cocoa.h>
FRAMELESSHELPER_BEGIN_NAMESPACE
using namespace Global;
[[nodiscard]] bool shouldAppsUseDarkMode_macos()
{
#if QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
if (__builtin_available(macOS 10.14, *)) {
const auto appearance = [NSApp.effectiveAppearance bestMatchFromAppearancesWithNames:
@[NSAppearanceNameAqua, NSAppearanceNameDarkAqua]];
return [appearance isEqualToString:NSAppearanceNameDarkAqua];
}
#endif
return false;
}
class NSWindowProxy
{
Q_DISABLE_COPY_MOVE(NSWindowProxy)
public:
explicit NSWindowProxy(NSWindow *window)
{
Q_ASSERT(window);
if (!window) {
return;
}
nswindow = window;
saveState();
}
~NSWindowProxy()
{
restoreState();
nswindow = nullptr;
}
void saveState()
{
oldStyleMask = nswindow.styleMask;
oldTitlebarAppearsTransparent = nswindow.titlebarAppearsTransparent;
oldTitleVisibility = nswindow.titleVisibility;
oldHasShadow = nswindow.hasShadow;
oldShowsToolbarButton = nswindow.showsToolbarButton;
oldMovableByWindowBackground = nswindow.movableByWindowBackground;
oldMovable = nswindow.movable;
oldCloseButtonVisible = ![nswindow standardWindowButton:NSWindowCloseButton].hidden;
oldMiniaturizeButtonVisible = ![nswindow standardWindowButton:NSWindowMiniaturizeButton].hidden;
oldZoomButtonVisible = ![nswindow standardWindowButton:NSWindowZoomButton].hidden;
}
void restoreState()
{
nswindow.styleMask = oldStyleMask;
nswindow.titlebarAppearsTransparent = oldTitlebarAppearsTransparent;
nswindow.titleVisibility = oldTitleVisibility;
nswindow.hasShadow = oldHasShadow;
nswindow.showsToolbarButton = oldShowsToolbarButton;
nswindow.movableByWindowBackground = oldMovableByWindowBackground;
nswindow.movable = oldMovable;
[nswindow standardWindowButton:NSWindowCloseButton].hidden = !oldCloseButtonVisible;
[nswindow standardWindowButton:NSWindowMiniaturizeButton].hidden = !oldMiniaturizeButtonVisible;
[nswindow standardWindowButton:NSWindowZoomButton].hidden = !oldZoomButtonVisible;
}
void removeWindowFrame()
{
NSView *nsview = [nswindow contentView];
Q_ASSERT(nsview);
if (!nsview) {
return;
}
nsview.wantsLayer = YES;
nswindow.styleMask |= NSWindowStyleMaskFullSizeContentView;
nswindow.titlebarAppearsTransparent = true;
nswindow.titleVisibility = NSWindowTitleHidden;
nswindow.hasShadow = true;
nswindow.showsToolbarButton = false;
nswindow.movableByWindowBackground = false;
nswindow.movable = false;
[nswindow standardWindowButton:NSWindowCloseButton].hidden = true;
[nswindow standardWindowButton:NSWindowMiniaturizeButton].hidden = true;
[nswindow standardWindowButton:NSWindowZoomButton].hidden = true;
}
private:
NSWindow *nswindow;
NSWindowStyleMask oldStyleMask;
BOOL oldTitlebarAppearsTransparent;
BOOL oldHasShadow;
BOOL oldShowsToolbarButton;
BOOL oldMovableByWindowBackground;
BOOL oldMovable;
BOOL oldCloseButtonVisible;
BOOL oldMiniaturizeButtonVisible;
BOOL oldZoomButtonVisible;
NSWindowTitleVisibility oldTitleVisibility;
};
using NSWindowProxyHash = QHash<WId, NSWindowProxy *>;
Q_GLOBAL_STATIC(NSWindowProxyHash, g_nswindowOverrideHash);
[[nodiscard]] static inline NSWindow *mac_getNSWindow(const WId windowId)
{
Q_ASSERT(windowId);
if (!windowId) {
return nullptr;
}
const auto nsview = reinterpret_cast<NSView *>(windowId);
Q_ASSERT(nsview);
if (!nsview) {
return nullptr;
}
return [nsview window];
}
static inline void mac_windowStartNativeDrag(const WId windowId, const QPoint &globalPos)
{
Q_ASSERT(windowId);
if (!windowId) {
return;
}
const NSWindow * const nswindow = mac_getNSWindow(windowId);
if (!nswindow) {
return;
}
const CGEventRef clickDown = CGEventCreateMouseEvent(
NULL, kCGEventLeftMouseDown, CGPointMake(globalPos.x(), globalPos.y()), kCGMouseButtonLeft);
NSEvent * const nsevent = [NSEvent eventWithCGEvent:clickDown];
Q_ASSERT(nsevent);
if (!nsevent) {
CFRelease(clickDown);
return;
}
[nswindow performWindowDragWithEvent:nsevent];
CFRelease(clickDown);
}
SystemTheme Utils::getSystemTheme()
{
// ### TODO: how to detect high contrast mode on macOS?
return (shouldAppsUseDarkMode() ? SystemTheme::Dark : SystemTheme::Light);
}
void Utils::setWindowHook(const WId windowId)
{
Q_ASSERT(windowId);
if (!windowId) {
return;
}
if (g_nswindowOverrideHash()->contains(windowId)) {
return;
}
NSWindow * const nswindow = mac_getNSWindow(windowId);
if (!nswindow) {
return;
}
const auto proxy = new NSWindowProxy(nswindow);
g_nswindowOverrideHash()->insert(windowId, proxy);
}
void Utils::unsetWindowHook(const WId windowId)
{
Q_ASSERT(windowId);
if (!windowId) {
return;
}
if (!g_nswindowOverrideHash()->contains(windowId)) {
return;
}
const NSWindowProxy * const proxy = g_nswindowOverrideHash()->value(windowId);
g_nswindowOverrideHash()->remove(windowId);
Q_ASSERT(proxy);
if (!proxy) {
return;
}
delete proxy;
}
void Utils::removeWindowFrame(const WId windowId)
{
Q_ASSERT(windowId);
if (!windowId) {
return;
}
if (!g_nswindowOverrideHash()->contains(windowId)) {
return;
}
NSWindowProxy * const proxy = g_nswindowOverrideHash()->value(windowId);
Q_ASSERT(proxy);
if (!proxy) {
return;
}
proxy->removeWindowFrame();
}
void Utils::startSystemMove(QWindow *window, const QPoint &globalPos)
{
Q_ASSERT(window);
if (!window) {
return;
}
mac_windowStartNativeDrag(window->winId(), globalPos);
}
void Utils::startSystemResize(QWindow *window, const Qt::Edges edges, const QPoint &globalPos)
{
Q_ASSERT(window);
if (!window) {
return;
}
if (edges == Qt::Edges{}) {
return;
}
mac_windowStartNativeDrag(window->winId(), globalPos);
}
FRAMELESSHELPER_END_NAMESPACE

View File

@ -24,6 +24,7 @@
#include "framelessquickwindow.h"
#include "framelessquickwindow_p.h"
#include <QtGui/qcursor.h>
#include <QtQuick/private/qquickitem_p.h>
#include <QtQuick/private/qquickrectangle_p.h>
#include <QtQuick/private/qquickanchors_p.h>
@ -373,11 +374,7 @@ void FramelessQuickWindowPrivate::showSystemMenu(const QPoint &pos)
void FramelessQuickWindowPrivate::startSystemMove2()
{
Q_Q(FramelessQuickWindow);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
q->startSystemMove();
#else
Utils::startSystemMove(q);
#endif
Utils::startSystemMove(q, QCursor::pos(q->screen()));
}
void FramelessQuickWindowPrivate::startSystemResize2(const Qt::Edges edges)
@ -389,11 +386,7 @@ void FramelessQuickWindowPrivate::startSystemResize2(const Qt::Edges edges)
return;
}
Q_Q(FramelessQuickWindow);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
q->startSystemResize(edges);
#else
Utils::startSystemResize(q, edges);
#endif
Utils::startSystemResize(q, edges, QCursor::pos(q->screen()));
}
void FramelessQuickWindowPrivate::initialize()
@ -403,12 +396,7 @@ void FramelessQuickWindowPrivate::initialize()
}
m_initialized = true;
Q_Q(FramelessQuickWindow);
const WId windowId = q->winId();
Q_ASSERT(windowId);
if (!windowId) {
return;
}
m_params.windowId = windowId;
m_params.getWindowId = [q]() -> WId { return q->winId(); };
m_params.getWindowFlags = [q]() -> Qt::WindowFlags { return q->flags(); };
m_params.setWindowFlags = [q](const Qt::WindowFlags flags) -> void { q->setFlags(flags); };
m_params.getWindowSize = [q]() -> QSize { return q->size(); };

View File

@ -27,6 +27,7 @@
#include <QtCore/qdebug.h>
#include <QtGui/qpainter.h>
#include <QtGui/qevent.h>
#include <QtGui/qcursor.h>
#include <QtWidgets/qboxlayout.h>
#include <QtWidgets/qlabel.h>
#include <framelesswindowsmanager.h>
@ -356,17 +357,7 @@ void FramelessWidgetsHelper::initialize()
// Force the widget become a native window now so that we can deal with its
// win32 events as soon as possible.
q->setAttribute(Qt::WA_NativeWindow);
const WId windowId = q->winId();
Q_ASSERT(windowId);
if (!windowId) {
return;
}
m_window = q->windowHandle();
Q_ASSERT(m_window);
if (!m_window) {
return;
}
m_params.windowId = windowId;
m_params.getWindowId = [this]() -> WId { return q->winId(); };
m_params.getWindowFlags = [this]() -> Qt::WindowFlags { return q->windowFlags(); };
m_params.setWindowFlags = [this](const Qt::WindowFlags flags) -> void { q->setWindowFlags(flags); };
m_params.getWindowSize = [this]() -> QSize { return q->size(); };
@ -377,14 +368,14 @@ void FramelessWidgetsHelper::initialize()
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
return q->screen();
#else
return m_window->screen();
return q->windowHandle()->screen();
#endif
};
m_params.isWindowFixedSize = [this]() -> bool { return isFixedSize(); };
m_params.setWindowFixedSize = [this](const bool value) -> void { setFixedSize(value); };
m_params.getWindowState = [this]() -> Qt::WindowState { return Utils::windowStatesToWindowState(q->windowState()); };
m_params.setWindowState = [this](const Qt::WindowState state) -> void { q->setWindowState(state); };
m_params.getWindowHandle = [this]() -> QWindow * { return m_window; };
m_params.getWindowHandle = [this]() -> QWindow * { return q->windowHandle(); };
m_params.windowToScreen = [this](const QPoint &pos) -> QPoint { return q->mapToGlobal(pos); };
m_params.screenToWindow = [this](const QPoint &pos) -> QPoint { return q->mapFromGlobal(pos); };
m_params.isInsideSystemButtons = [this](const QPoint &pos, SystemButtonType *button) -> bool { return isInSystemButtons(pos, button); };
@ -474,7 +465,7 @@ void FramelessWidgetsHelper::initialize()
}
QMetaObject::invokeMethod(q, "systemThemeChanged");
});
connect(m_window, &QWindow::visibilityChanged, this, [this](){
connect(q->windowHandle(), &QWindow::visibilityChanged, this, [this](){
QMetaObject::invokeMethod(q, "hiddenChanged");
QMetaObject::invokeMethod(q, "normalChanged");
QMetaObject::invokeMethod(q, "zoomedChanged");
@ -787,20 +778,14 @@ void FramelessWidgetsHelper::showSystemMenu(const QPoint &pos)
void FramelessWidgetsHelper::startSystemMove2()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
m_window->startSystemMove();
#else
Utils::startSystemMove(m_window);
#endif
QWindow * const window = q->windowHandle();
Utils::startSystemMove(window, QCursor::pos(window->screen()));
}
void FramelessWidgetsHelper::startSystemResize2(const Qt::Edges edges)
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
m_window->startSystemResize(edges);
#else
Utils::startSystemResize(m_window, edges);
#endif
QWindow * const window = q->windowHandle();
Utils::startSystemResize(window, edges, QCursor::pos(window->screen()));
}
bool FramelessWidgetsHelper::eventFilter(QObject *object, QEvent *event)