From 6938d88ae0884683fb5788ec0c4e8a1cc5980587 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Sat, 19 Aug 2023 03:56:34 -0700 Subject: [PATCH] Fix incorrect logical positioning of windows Logical window positions, used for mouse interaction, previously did not match up with real window positions, leaving areas near the edges of windows impossible to select with the mouse with window gaps active or tab bars onscreen. --- src/Hy3Layout.cpp | 19 ++++++------ src/Hy3Node.cpp | 79 ++++++++++++++++++++++++++--------------------- src/Hy3Node.hpp | 4 +-- src/TabGroup.cpp | 4 +-- 4 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp index cb386ff..d627af4 100644 --- a/src/Hy3Layout.cpp +++ b/src/Hy3Layout.cpp @@ -320,16 +320,16 @@ void Hy3Layout::recalculateMonitor(const int& monitor_id) { // clang-format on int outer_gaps = -(*gaps_in - *gaps_out); - auto gap_pos_offset = Vector2D(outer_gaps, outer_gaps); - auto gap_size_offset = Vector2D(outer_gaps * 2, outer_gaps * 2); + auto gap_topleft_offset = Vector2D(outer_gaps, outer_gaps); + auto gap_bottomright_offset = Vector2D(outer_gaps, outer_gaps); Debug::log(LOG, "FS gaps: %d", outer_gaps); Hy3Node fakeNode = { .data = window, .position = monitor->vecPosition + monitor->vecReservedTopLeft, .size = monitor->vecSize - monitor->vecReservedTopLeft - monitor->vecReservedBottomRight, - .gap_pos_offset = gap_pos_offset, - .gap_size_offset = gap_size_offset, + .gap_topleft_offset = gap_topleft_offset, + .gap_bottomright_offset = gap_bottomright_offset, .workspace_id = window->m_iWorkspaceID, }; @@ -629,8 +629,8 @@ void Hy3Layout::fullscreenRequestForWindow( .data = window, .position = monitor->vecPosition + monitor->vecReservedTopLeft, .size = monitor->vecSize - monitor->vecReservedTopLeft - monitor->vecReservedBottomRight, - .gap_pos_offset = gap_pos_offset, - .gap_size_offset = gap_size_offset, + .gap_topleft_offset = gap_pos_offset, + .gap_bottomright_offset = gap_size_offset, .workspace_id = window->m_iWorkspaceID, }; @@ -909,7 +909,7 @@ Hy3Node* findTabBarAt(Hy3Node& node, Vector2D pos, Hy3Node** focused_node) { if (node.data.as_group.layout == Hy3GroupLayout::Tabbed && node.data.as_group.tab_bar != nullptr) { - if (pos.y < node.position.y + node.gap_pos_offset.y + inset) { + if (pos.y < node.position.y + node.gap_topleft_offset.y + inset) { auto& children = node.data.as_group.children; auto& tab_bar = *node.data.as_group.tab_bar; @@ -1333,8 +1333,9 @@ void Hy3Layout::applyNodeDataToWindow(Hy3Node* node, bool no_animation) { window->m_sSpecialRenderData.border = true; window->m_sSpecialRenderData.decorate = true; - auto gaps_offset_topleft = Vector2D(*gaps_in, *gaps_in) + node->gap_pos_offset; - auto gaps_offset_bottomright = Vector2D(*gaps_in * 2, *gaps_in * 2) + node->gap_size_offset; + auto gaps_offset_topleft = Vector2D(*gaps_in, *gaps_in) + node->gap_topleft_offset; + auto gaps_offset_bottomright = Vector2D(*gaps_in * 2, *gaps_in * 2) + + node->gap_bottomright_offset + node->gap_topleft_offset; calcPos = calcPos + gaps_offset_topleft; calcSize = calcSize - gaps_offset_bottomright; diff --git a/src/Hy3Node.cpp b/src/Hy3Node.cpp index 19a8ee1..3c8f99a 100644 --- a/src/Hy3Node.cpp +++ b/src/Hy3Node.cpp @@ -269,16 +269,16 @@ void Hy3Node::recalcSizePosRecursive(bool no_animation) { // clang-format on int outer_gaps = 0; - Vector2D gap_pos_offset; - Vector2D gap_size_offset; + Vector2D gap_topleft_offset; + Vector2D gap_bottomright_offset; if (this->parent == nullptr) { outer_gaps = -(*gaps_in - *gaps_out); - gap_pos_offset = Vector2D(outer_gaps, outer_gaps); - gap_size_offset = Vector2D(outer_gaps * 2, outer_gaps * 2); + gap_topleft_offset = Vector2D(outer_gaps, outer_gaps); + gap_bottomright_offset = Vector2D(outer_gaps, outer_gaps); } else { - gap_pos_offset = this->gap_pos_offset; - gap_size_offset = this->gap_size_offset; + gap_topleft_offset = this->gap_topleft_offset; + gap_bottomright_offset = this->gap_bottomright_offset; } auto tpos = this->position; @@ -296,8 +296,12 @@ void Hy3Node::recalcSizePosRecursive(bool no_animation) { double constraint; switch (group->layout) { - case Hy3GroupLayout::SplitH: constraint = tsize.x - gap_size_offset.x; break; - case Hy3GroupLayout::SplitV: constraint = tsize.y - gap_size_offset.y; break; + case Hy3GroupLayout::SplitH: + constraint = tsize.x - gap_topleft_offset.x - gap_bottomright_offset.x; + break; + case Hy3GroupLayout::SplitV: + constraint = tsize.y - gap_topleft_offset.y - gap_bottomright_offset.y; + break; case Hy3GroupLayout::Tabbed: break; } @@ -341,8 +345,8 @@ void Hy3Node::recalcSizePosRecursive(bool no_animation) { expanded_node->size = tsize; expanded_node->setHidden(this->hidden); - expanded_node->gap_pos_offset = gap_pos_offset; - expanded_node->gap_size_offset = gap_size_offset; + expanded_node->gap_topleft_offset = gap_topleft_offset; + expanded_node->gap_bottomright_offset = gap_bottomright_offset; expanded_node->recalcSizePosRecursive(no_animation); } @@ -368,21 +372,22 @@ void Hy3Node::recalcSizePosRecursive(bool no_animation) { child->hidden = this->hidden || expand_focused; if (group->children.size() == 1) { - child->gap_pos_offset = gap_pos_offset; - child->gap_size_offset = gap_size_offset; - if (this->parent != nullptr) child->gap_size_offset.x += *group_inset; - child->size.x += gap_size_offset.x; + child->gap_topleft_offset = gap_topleft_offset; + child->gap_bottomright_offset = gap_bottomright_offset; + child->size.x = tsize.x; + if (this->parent != nullptr) child->gap_bottomright_offset.x += *group_inset; } else if (child == group->children.front()) { - child->gap_pos_offset = gap_pos_offset; - child->gap_size_offset = Vector2D(0, gap_size_offset.y); - offset += gap_pos_offset.x; + child->gap_topleft_offset = gap_topleft_offset; + child->gap_bottomright_offset = Vector2D(0, gap_bottomright_offset.y); + child->size.x += gap_topleft_offset.x; + offset += gap_topleft_offset.x; } else if (child == group->children.back()) { - child->gap_pos_offset = Vector2D(0, gap_pos_offset.y); - child->gap_size_offset = gap_size_offset; - child->size.x += gap_size_offset.x; + child->gap_topleft_offset = Vector2D(0, gap_topleft_offset.y); + child->gap_bottomright_offset = gap_bottomright_offset; + child->size.x += gap_bottomright_offset.x; } else { - child->gap_pos_offset = Vector2D(0, gap_pos_offset.y); - child->gap_size_offset = Vector2D(0, gap_size_offset.y); + child->gap_topleft_offset = Vector2D(0, gap_topleft_offset.y); + child->gap_bottomright_offset = Vector2D(0, gap_bottomright_offset.y); } child->recalcSizePosRecursive(no_animation); @@ -396,21 +401,22 @@ void Hy3Node::recalcSizePosRecursive(bool no_animation) { child->hidden = this->hidden || expand_focused; if (group->children.size() == 1) { - child->gap_pos_offset = gap_pos_offset; - child->gap_size_offset = gap_size_offset; - if (this->parent != nullptr) child->gap_size_offset.y += *group_inset; - child->size.y += gap_size_offset.y; + child->gap_topleft_offset = gap_topleft_offset; + child->gap_bottomright_offset = gap_bottomright_offset; + child->size.y = tsize.y; + if (this->parent != nullptr) child->gap_bottomright_offset.y += *group_inset; } else if (child == group->children.front()) { - child->gap_pos_offset = gap_pos_offset; - child->gap_size_offset = Vector2D(gap_size_offset.x, 0); - offset += gap_pos_offset.y; + child->gap_topleft_offset = gap_topleft_offset; + child->gap_bottomright_offset = Vector2D(gap_bottomright_offset.x, 0); + child->size.y += gap_topleft_offset.y; + offset += gap_topleft_offset.y; } else if (child == group->children.back()) { - child->gap_pos_offset = Vector2D(gap_pos_offset.x, 0); - child->gap_size_offset = gap_size_offset; - child->size.y += gap_size_offset.y; + child->gap_topleft_offset = Vector2D(gap_topleft_offset.x, 0); + child->gap_bottomright_offset = gap_bottomright_offset; + child->size.y += gap_bottomright_offset.y; } else { - child->gap_pos_offset = Vector2D(gap_pos_offset.x, 0); - child->gap_size_offset = Vector2D(gap_size_offset.x, 0); + child->gap_topleft_offset = Vector2D(gap_topleft_offset.x, 0); + child->gap_bottomright_offset = Vector2D(gap_bottomright_offset.x, 0); } child->recalcSizePosRecursive(no_animation); @@ -420,8 +426,9 @@ void Hy3Node::recalcSizePosRecursive(bool no_animation) { child->size = tsize; child->hidden = this->hidden || expand_focused || group->focused_child != child; - child->gap_pos_offset = Vector2D(gap_pos_offset.x, gap_pos_offset.y + tab_height_offset); - child->gap_size_offset = Vector2D(gap_size_offset.x, gap_size_offset.y + tab_height_offset); + child->gap_topleft_offset + = Vector2D(gap_topleft_offset.x, gap_topleft_offset.y + tab_height_offset); + child->gap_bottomright_offset = gap_bottomright_offset; child->recalcSizePosRecursive(no_animation); break; diff --git a/src/Hy3Node.hpp b/src/Hy3Node.hpp index 89da918..111d8cd 100644 --- a/src/Hy3Node.hpp +++ b/src/Hy3Node.hpp @@ -79,8 +79,8 @@ struct Hy3Node { Hy3NodeData data; Vector2D position; Vector2D size; - Vector2D gap_pos_offset; - Vector2D gap_size_offset; + Vector2D gap_topleft_offset; + Vector2D gap_bottomright_offset; float size_ratio = 1.0; int workspace_id = -1; bool hidden = false; diff --git a/src/TabGroup.cpp b/src/TabGroup.cpp index 9232916..6d3504a 100644 --- a/src/TabGroup.cpp +++ b/src/TabGroup.cpp @@ -456,8 +456,8 @@ void Hy3TabGroup::updateWithGroup(Hy3Node& node, bool warp) { = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:hy3:tabs:height")->intValue; auto gaps = node.parent == nullptr ? *gaps_out : *gaps_in; - auto tpos = node.position + Vector2D(gaps, gaps) + node.gap_pos_offset; - auto tsize = Vector2D(node.size.x - node.gap_size_offset.x - gaps * 2, *bar_height); + auto tpos = node.position + Vector2D(gaps, gaps) + node.gap_topleft_offset; + auto tsize = Vector2D(node.size.x - node.gap_bottomright_offset.x - gaps * 2, *bar_height); this->hidden = node.hidden; if (this->pos.goalv() != tpos) {