summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZebra2711 <89755535+Zebra2711@users.noreply.github.com>2026-05-01 01:38:05 +0700
committerGitHub <noreply@github.com>2026-04-30 19:38:05 +0100
commitbac49db9a11d5398963f4ad3265a577f8e94dc66 (patch)
treea17fb1e35c0440d5f03c309de83d04cc78dd9c2e
parent859bbb11e16029bfa5ad6a1418bde23f29bd7d86 (diff)
monitor: fix centered floating windows off-screen in special workspace (#14203)
Signed-off-by: Zebra2711 <zebra2711t@gmail.com>
-rw-r--r--hyprtester/src/tests/main/window.cpp22
-rw-r--r--src/helpers/Monitor.cpp2
2 files changed, 23 insertions, 1 deletions
diff --git a/hyprtester/src/tests/main/window.cpp b/hyprtester/src/tests/main/window.cpp
index 4a4da0cc..fab4ab76 100644
--- a/hyprtester/src/tests/main/window.cpp
+++ b/hyprtester/src/tests/main/window.cpp
@@ -588,6 +588,28 @@ TEST_CASE(issue14038) {
// this should not crash hyprland. If we are alive, we good.
}
+TEST_CASE(specialFloatRecenters) {
+ if (!spawnKitty("kitty_special_float_recenter"))
+ FAIL_TEST("Could not spawn kitty");
+
+ OK(getFromSocket("/dispatch hl.dsp.window.float({ action = 'set', window = 'class:kitty_special_float_recenter' })"));
+ OK(getFromSocket("/dispatch hl.dsp.window.resize({ x = 10, y = 10, window = 'class:kitty_special_float_recenter' })"));
+ OK(getFromSocket("/dispatch hl.dsp.window.move({ workspace = 'special:recenter', follow = false, window = 'class:kitty_special_float_recenter' })"));
+ OK(getFromSocket("/dispatch hl.dsp.window.move({ x = 50000, y = 50000, window = 'class:kitty_special_float_recenter' })"));
+
+ OK(getFromSocket("/dispatch hl.dsp.workspace.toggle_special('recenter')"));
+ OK(getFromSocket("/dispatch hl.dsp.focus({ window = 'class:kitty_special_float_recenter' })"));
+
+ const auto active = getFromSocket("/activewindow");
+ EXPECT_CONTAINS(active, "class: kitty_special_float_recenter");
+ EXPECT_CONTAINS(active, "size: 10,10");
+ EXPECT_CONTAINS(active, "at: 955,535");
+
+ OK(getFromSocket("/dispatch hl.dsp.workspace.toggle_special('recenter')"));
+ Tests::killAllWindows();
+ ASSERT(Tests::windowCount(), 0);
+}
+
// TODO: decompose this into multiple test cases
TEST_CASE(windows) {
// test on workspace "window"
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp
index 657a8c11..a5195a94 100644
--- a/src/helpers/Monitor.cpp
+++ b/src/helpers/Monitor.cpp
@@ -1564,7 +1564,7 @@ void CMonitor::setSpecialWorkspace(const PHLWORKSPACE& pWorkspace) {
if (VECNOTINRECT(MIDDLE, PMONFROMMIDDLE->m_position.x, PMONFROMMIDDLE->m_position.y, PMONFROMMIDDLE->m_position.x + PMONFROMMIDDLE->m_size.x,
PMONFROMMIDDLE->m_position.y + PMONFROMMIDDLE->m_size.y)) {
// not on any monitor, center
- pos = middle() / 2.f - w->m_realSize->goal() / 2.f;
+ pos = middle() - w->m_realSize->goal() / 2.f;
} else
pos = pos - PMONFROMMIDDLE->m_position + m_position;