Visual indication for single-window groups & more

- Fix being able to create multiple levels of groups around a single
window
- Destroy single-member groups when they loose focus
This commit is contained in:
outfoxxed 2023-04-12 03:33:45 -07:00
parent b171721e66
commit 0e854287ff
No known key found for this signature in database
GPG key ID: 4C88A185FB89301E
3 changed files with 75 additions and 1 deletions

View file

@ -20,7 +20,6 @@ pkg_check_modules(DEPS REQUIRED pixman-1 libdrm)
add_library(hy3 SHARED
src/main.cpp
src/Hy3Layout.cpp
src/Hy3SpawnLocDecoration.cpp
)
target_include_directories(hy3 PRIVATE

View file

@ -103,6 +103,47 @@ void Hy3Node::recalcSizePosRecursive(bool force) {
}
auto* group = &this->data.as_group;
if (group->children.size() == 1 && this->parent != nullptr) {
auto& child = group->children.front();
double distortOut;
double distortIn;
const auto* gaps_in = &g_pConfigManager->getConfigValuePtr("general:gaps_in")->intValue;
const auto* gaps_out = &g_pConfigManager->getConfigValuePtr("general:gaps_out")->intValue;
if (gaps_in > gaps_out) {
distortOut = *gaps_out - 1.0;
} else {
distortOut = *gaps_in - 1.0;
}
if (distortOut < 0) distortOut = 0.0;
distortIn = *gaps_in * 2;
switch (group->layout) {
case Hy3GroupLayout::SplitH:
child->position.x = this->position.x - distortOut;
child->size.x = this->size.x - distortIn;
child->position.y = this->position.y;
child->size.y = this->size.y;
break;
case Hy3GroupLayout::SplitV:
child->position.y = this->position.y - distortOut;
child->size.y = this->size.y - distortIn;
child->position.x = this->position.x;
child->size.x = this->size.x;
case Hy3GroupLayout::Tabbed:
// TODO
break;
}
child->recalcSizePosRecursive();
return;
}
int constraint;
switch (group->layout) {
case Hy3GroupLayout::SplitH:
@ -371,6 +412,28 @@ void Hy3Layout::onWindowRemovedTiling(CWindow* window) {
if (parent != nullptr) parent->recalcSizePosRecursive();
}
void Hy3Layout::onWindowFocusChange(CWindow* window) {
Debug::log(LOG, "Switched windows from %p to %p", this->lastActiveWindow, window);
auto* node = this->getNodeFromWindow(this->lastActiveWindow);
while (node != nullptr
&& node->parent != nullptr
&& node->parent->parent != nullptr
&& node->parent->data.as_group.children.size() == 1)
{
auto parent = node->parent;
std::swap(parent->data, node->data);
this->nodes.remove(*node);
node = parent;
}
if (node != nullptr) {
node->recalcSizePosRecursive();
}
this->lastActiveWindow = window;
}
bool Hy3Layout::isWindowTiled(CWindow* window) {
return this->getNodeFromWindow(window) != nullptr;
}
@ -402,6 +465,16 @@ std::any Hy3Layout::layoutMessage(SLayoutMessageHeader header, std::string conte
layout = Hy3GroupLayout::SplitV;
}
if (node->parent != nullptr
&& node->parent->data.as_group.children.size() == 1
&& (node->parent->data.as_group.layout == Hy3GroupLayout::SplitH
|| node->parent->data.as_group.layout == Hy3GroupLayout::SplitV))
{
node->parent->data.as_group.layout = layout;
node->parent->recalcSizePosRecursive();
return "";
}
Hy3NodeData node_data = Hy3NodeData(Hy3GroupData(layout));
std::swap(node->data, node_data);

View file

@ -56,6 +56,7 @@ class Hy3Layout: public IHyprLayout {
public:
virtual void onWindowCreatedTiling(CWindow*);
virtual void onWindowRemovedTiling(CWindow*);
virtual void onWindowFocusChange(CWindow*);
virtual bool isWindowTiled(CWindow*);
virtual void recalculateMonitor(const int&);
virtual void recalculateWindow(CWindow*);
@ -75,6 +76,7 @@ private:
// std::list is used over std::vector because it does not invalidate references
// when mutated.
std::list<Hy3Node> nodes;
CWindow* lastActiveWindow = nullptr;
int getWorkspaceNodeCount(const int&);
Hy3Node* getNodeFromWindow(CWindow*);