enable set window later
This commit is contained in:
parent
50dafa0c5e
commit
fdf38d4c80
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
Loading…
Reference in New Issue