Skip to content

Commit

Permalink
Disable moving window via viewport when maximized/full screen
Browse files Browse the repository at this point in the history
And make compatible with Qt 6.9
  • Loading branch information
jdpurcell committed Jan 4, 2025
1 parent 8170c20 commit 8b962f3
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 16 deletions.
16 changes: 8 additions & 8 deletions src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -553,18 +553,18 @@ bool MainWindow::getTitlebarHidden() const
return false;

#if defined COCOA_LOADED && QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
return QVCocoaFunctions::getTitlebarHidden(windowHandle());
return QVCocoaFunctions::getTitlebarHidden(this);
#else
return !windowFlags().testFlag(Qt::WindowTitleHint);
#endif
}

void MainWindow::setTitlebarHidden(const bool shouldHide)
void MainWindow::setTitlebarHidden(const bool hide)
{
if (!windowHandle())
return;

auto customizeWindowFlags = [this](const Qt::WindowFlags flagsToChange, const bool on) {
const auto customizeWindowFlags = [this](const Qt::WindowFlags flagsToChange, const bool on) {
Qt::WindowFlags newFlags = windowFlags() | Qt::CustomizeWindowHint;
if (on)
newFlags |= flagsToChange;
Expand All @@ -575,18 +575,18 @@ void MainWindow::setTitlebarHidden(const bool shouldHide)
};

#if defined COCOA_LOADED && QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QVCocoaFunctions::setTitlebarHidden(windowHandle(), shouldHide);
customizeWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowMinMaxButtonsHint | Qt::WindowFullscreenButtonHint, !shouldHide);
QVCocoaFunctions::setTitlebarHidden(this, hide);
customizeWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowMinMaxButtonsHint | Qt::WindowFullscreenButtonHint, !hide);
#elif defined WIN32_LOADED
customizeWindowFlags(Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint, !shouldHide);
customizeWindowFlags(Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint, !hide);
#else
customizeWindowFlags(Qt::WindowTitleHint, !shouldHide);
customizeWindowFlags(Qt::WindowTitleHint, !hide);
#endif

const auto toggleTitlebarActions = qvApp->getActionManager().getAllClonesOfAction("toggletitlebar", this);
for (const auto &toggleTitlebarAction : toggleTitlebarActions)
{
toggleTitlebarAction->setText(shouldHide ? tr("Show Title&bar") : tr("Hide Title&bar"));
toggleTitlebarAction->setText(hide ? tr("Show Title&bar") : tr("Hide Title&bar"));
}

updateWindowFilePath();
Expand Down
2 changes: 1 addition & 1 deletion src/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class MainWindow : public QMainWindow

bool getTitlebarHidden() const;

void setTitlebarHidden(const bool shouldHide);
void setTitlebarHidden(const bool hide);

void setWindowSize();

Expand Down
4 changes: 2 additions & 2 deletions src/qvcocoafunctions.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ class QVCocoaFunctions

static void setFullSizeContentView(QWindow *window, const bool enable);

static bool getTitlebarHidden(QWindow *window);
static bool getTitlebarHidden(const QWidget *window);

static void setTitlebarHidden(QWindow *window, const bool shouldHide);
static void setTitlebarHidden(QWidget *window, const bool hide);

static void setVibrancy(bool alwaysDark, QWindow *window);

Expand Down
18 changes: 14 additions & 4 deletions src/qvcocoafunctions.mm
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,27 @@ static void fixNativeMenuEccentricities(QMenu *menu, NSMenu *nativeMenu)
#endif
}

bool QVCocoaFunctions::getTitlebarHidden(QWindow *window)
bool QVCocoaFunctions::getTitlebarHidden(const QWidget *window)
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)
return window->windowFlags().testFlags(Qt::NoTitleBarBackgroundHint);
#else
auto *view = reinterpret_cast<NSView*>(window->winId());
return view.window.titleVisibility == NSWindowTitleHidden;
#endif
}

void QVCocoaFunctions::setTitlebarHidden(QWindow *window, const bool shouldHide)
void QVCocoaFunctions::setTitlebarHidden(QWidget *window, const bool hide)
{
auto *view = reinterpret_cast<NSView*>(window->winId());
view.window.titleVisibility = shouldHide ? NSWindowTitleHidden : NSWindowTitleVisible;
view.window.titlebarAppearsTransparent = shouldHide;
#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)
Qt::WindowFlags newFlags = window->windowFlags().setFlag(Qt::NoTitleBarBackgroundHint, hide);
window->overrideWindowFlags(newFlags);
window->windowHandle()->setFlags(newFlags);
#else
view.window.titlebarAppearsTransparent = hide;
#endif
view.window.titleVisibility = hide ? NSWindowTitleHidden : NSWindowTitleVisible;
}

void QVCocoaFunctions::setVibrancy(bool alwaysDark, QWindow *window)
Expand Down
4 changes: 3 additions & 1 deletion src/qvgraphicsview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,9 @@ void QVGraphicsView::mousePressEvent(QMouseEvent *event)

if (event->button() == Qt::LeftButton && event->modifiers().testFlag(Qt::ControlModifier))
{
initializeDrag();
const auto windowState = window()->windowState();
if (!windowState.testFlag(Qt::WindowFullScreen) && !windowState.testFlag(Qt::WindowMaximized))
initializeDrag();
return;
}

Expand Down

0 comments on commit 8b962f3

Please sign in to comment.