enable set window later

This commit is contained in:
Altair Wei 2021-10-07 20:46:13 +08:00
parent 50dafa0c5e
commit fdf38d4c80
2 changed files with 40 additions and 3 deletions

View File

@ -43,6 +43,8 @@
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE
#define ENSURE_WINDOW(x) if (!m_window) return x
FramelessHelper::FramelessHelper(QWindow *window) FramelessHelper::FramelessHelper(QWindow *window)
: QObject(window) : QObject(window)
, m_window(window) , m_window(window)
@ -51,19 +53,29 @@ FramelessHelper::FramelessHelper(QWindow *window)
, m_titleBarHeight(-1) , m_titleBarHeight(-1)
, m_resizeBorderThickness(-1) , m_resizeBorderThickness(-1)
{ {
Q_ASSERT(window != nullptr && window->isTopLevel());
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
if(qEnvironmentVariable("QT_MAC_WANTS_LAYER") != QStringLiteral("1")) if(qEnvironmentVariable("QT_MAC_WANTS_LAYER") != QStringLiteral("1"))
qputenv("QT_MAC_WANTS_LAYER", "1"); qputenv("QT_MAC_WANTS_LAYER", "1");
#endif #endif
} }
void FramelessHelper::setWindow(QWindow *w)
{
if (m_window == w)
return;
Q_ASSERT(w != nullptr && w->isTopLevel());
m_window = w;
}
/*! /*!
Setup the window, make it frameless. Setup the window, make it frameless.
*/ */
void FramelessHelper::install() void FramelessHelper::install()
{ {
ENSURE_WINDOW((void)0);
if (!QCoreApplication::testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)) { if (!QCoreApplication::testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)) {
QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
} }
@ -109,6 +121,8 @@ void FramelessHelper::install()
*/ */
void FramelessHelper::uninstall() void FramelessHelper::uninstall()
{ {
ENSURE_WINDOW((void)0);
m_window->setFlags(m_origWindowFlags); m_window->setFlags(m_origWindowFlags);
m_origWindowFlags = Qt::WindowFlags(); m_origWindowFlags = Qt::WindowFlags();
resizeWindow(QSize()); resizeWindow(QSize());
@ -143,6 +157,8 @@ void FramelessHelper::resizeWindow(const QSize& windowSize)
int FramelessHelper::titleBarHeight() int FramelessHelper::titleBarHeight()
{ {
ENSURE_WINDOW(0);
if (m_titleBarHeight == -1) { if (m_titleBarHeight == -1) {
return Utilities::getSystemMetric(m_window, SystemMetric::TitleBarHeight, true, false); return Utilities::getSystemMetric(m_window, SystemMetric::TitleBarHeight, true, false);
} }
@ -187,6 +203,8 @@ QRegion FramelessHelper::titleBarRegion()
int FramelessHelper::resizeBorderThickness() int FramelessHelper::resizeBorderThickness()
{ {
ENSURE_WINDOW(0);
if (m_resizeBorderThickness == -1) { if (m_resizeBorderThickness == -1) {
return Utilities::getSystemMetric(m_window, SystemMetric::ResizeBorderThickness, true, false); return Utilities::getSystemMetric(m_window, SystemMetric::ResizeBorderThickness, true, false);
} }
@ -251,6 +269,8 @@ static const int kCornerFactor = 2;
*/ */
Qt::WindowFrameSection FramelessHelper::mapPosToFrameSection(const QPoint& pos) Qt::WindowFrameSection FramelessHelper::mapPosToFrameSection(const QPoint& pos)
{ {
ENSURE_WINDOW(Qt::NoSection);
int border = 0; int border = 0;
// On MacOS we use native resize border. // On MacOS we use native resize border.
@ -366,12 +386,16 @@ QCursor FramelessHelper::cursorForFrameSection(Qt::WindowFrameSection frameSecti
void FramelessHelper::setCursor(const QCursor& cursor) void FramelessHelper::setCursor(const QCursor& cursor)
{ {
ENSURE_WINDOW((void)0);
m_window->setCursor(cursor); m_window->setCursor(cursor);
m_cursorChanged = true; m_cursorChanged = true;
} }
void FramelessHelper::unsetCursor() void FramelessHelper::unsetCursor()
{ {
ENSURE_WINDOW((void)0);
if (!m_cursorChanged) if (!m_cursorChanged)
return; return;
@ -381,6 +405,8 @@ void FramelessHelper::unsetCursor()
void FramelessHelper::updateCursor() void FramelessHelper::updateCursor()
{ {
ENSURE_WINDOW((void)0);
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
if (isHoverResizeHandler()) { if (isHoverResizeHandler()) {
Utilities::setX11CursorShape(m_window, Utilities::setX11CursorShape(m_window,
@ -414,6 +440,8 @@ void FramelessHelper::updateHoverStates(const QPoint& pos)
void FramelessHelper::startMove(const QPoint &globalPos) void FramelessHelper::startMove(const QPoint &globalPos)
{ {
ENSURE_WINDOW((void)0);
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
// On HiDPI screen, X11 ButtonRelease is likely to trigger // On HiDPI screen, X11 ButtonRelease is likely to trigger
// a QEvent::MouseMove, so we reset m_clickedFrameSection in advance. // a QEvent::MouseMove, so we reset m_clickedFrameSection in advance.
@ -429,6 +457,8 @@ void FramelessHelper::startMove(const QPoint &globalPos)
void FramelessHelper::startResize(const QPoint &globalPos, Qt::WindowFrameSection frameSection) void FramelessHelper::startResize(const QPoint &globalPos, Qt::WindowFrameSection frameSection)
{ {
ENSURE_WINDOW((void)0);
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
// On HiDPI screen, X11 ButtonRelease is likely to trigger // On HiDPI screen, X11 ButtonRelease is likely to trigger
// a QEvent::MouseMove, so we reset m_clickedFrameSection in advance. // a QEvent::MouseMove, so we reset m_clickedFrameSection in advance.
@ -485,6 +515,8 @@ QRect FramelessHelper::getHTVObjectRect(QObject *obj)
bool FramelessHelper::eventFilter(QObject *object, QEvent *event) bool FramelessHelper::eventFilter(QObject *object, QEvent *event)
{ {
ENSURE_WINDOW(false);
bool filterOut = false; bool filterOut = false;
if (object == m_window) { if (object == m_window) {
@ -574,6 +606,8 @@ bool FramelessHelper::eventFilter(QObject *object, QEvent *event)
void FramelessHelper::handleResizeHandlerDblClicked() void FramelessHelper::handleResizeHandlerDblClicked()
{ {
ENSURE_WINDOW((void)0);
QRect screenRect = m_window->screen()->availableGeometry(); QRect screenRect = m_window->screen()->availableGeometry();
QRect winRect = m_window->geometry(); QRect winRect = m_window->geometry();
@ -640,6 +674,8 @@ bool FramelessHelper::handleNativeEvent(QWindow *window, const QByteArray &event
bool FramelessHelper::handleNativeEvent(QWindow *window, const QByteArray &eventType, void *message, long *result) bool FramelessHelper::handleNativeEvent(QWindow *window, const QByteArray &eventType, void *message, long *result)
#endif #endif
{ {
ENSURE_WINDOW(false);
if ((eventType != QByteArrayLiteral("windows_generic_MSG")) || !message || !result) { if ((eventType != QByteArrayLiteral("windows_generic_MSG")) || !message || !result) {
return false; return false;
} }

View File

@ -42,12 +42,13 @@ class FRAMELESSHELPER_API FramelessHelper : public QObject
Q_DISABLE_COPY_MOVE(FramelessHelper) Q_DISABLE_COPY_MOVE(FramelessHelper)
public: public:
explicit FramelessHelper(QWindow *window); explicit FramelessHelper(QWindow *window = nullptr);
~FramelessHelper() override = default; ~FramelessHelper() override = default;
void install(); void install();
void uninstall(); void uninstall();
void setWindow(QWindow *w);
QWindow *window() { return m_window; } QWindow *window() { return m_window; }
QSize windowSize() { return m_windowSize; } QSize windowSize() { return m_windowSize; }