Keep the window on screen after screen changes

Re-fits on a resolution change or a move to another screen, without
overwriting the saved geometry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-15 10:13:49 +02:00
co-authored by Claude Opus 5.5
parent 9f3940514b
commit cb7cf1e04d
2 changed files with 19 additions and 1 deletions
+14
View File
@@ -36,6 +36,20 @@ FloatingWindow::FloatingWindow(QWindow *window, QObject *parent)
}
m_position = defaultPosition();
apply();
followScreen(window->screen());
connect(window, &QWindow::screenChanged, this, &FloatingWindow::followScreen);
}
// Re-fits the window (not saved: the stored geometry is the user's choice).
void FloatingWindow::followScreen(QScreen *screen)
{
if (m_screen)
disconnect(m_screen, nullptr, this, nullptr);
m_screen = screen;
if (!m_screen)
return;
connect(m_screen, &QScreen::geometryChanged, this, [this] { setGeometry(geometry()); });
setGeometry(geometry());
}
QRect FloatingWindow::geometry() const
+5 -1
View File
@@ -4,13 +4,15 @@
#include <QRect>
#include <QRectF>
class QScreen;
class QWindow;
namespace LayerShellQt { class Window; }
// Places a keyboard window as a free-floating overlay that never takes focus.
// On Wayland: a layer-shell surface anchored top-left, positioned via margins.
// On X11: a frameless, non-focusable, always-on-top tool window.
// Geometry is relative to the window's screen and always kept on it.
// Geometry is relative to the window's screen and always kept on it, also
// when the screen's resolution changes or the window moves to another one.
class FloatingWindow : public QObject
{
Q_OBJECT
@@ -42,8 +44,10 @@ private:
QPoint clamped(QPoint position, QSize size) const;
QPoint defaultPosition() const;
void apply();
void followScreen(QScreen *screen);
QWindow *m_window;
LayerShellQt::Window *m_layerSurface = nullptr;
QPoint m_position;
QScreen *m_screen = nullptr;
};