mirror of
https://github.com/ItsDrike/hyprland-dwindle-autogroup.git
synced 2024-12-26 05:34:35 +00:00
Merge pull request #8 from ItsDrike/better-ungroup
Improve ungroupping behavior
This commit is contained in:
commit
49b45918db
|
@ -160,8 +160,67 @@ void newDestroyGroup(CWindow* self)
|
|||
return;
|
||||
}
|
||||
|
||||
// TODO: Add proper ungroupping logic instead of this fallback
|
||||
// (Tracked by github issue #1)
|
||||
Debug::log(LOG, "[dwindle-autogroup] Falling back to original ungroupping behavior (temporary)");
|
||||
((createGroupFuncT)g_pDestroyGroupHook->m_pOriginal)(self);
|
||||
std::deque<CWindow*> dGroupWindows;
|
||||
collectGroupWindows(&dGroupWindows, self);
|
||||
|
||||
// If the group head window is in fullscreen, unfullscreen it.
|
||||
// We need to have the window placed in the layout, to figure out where
|
||||
// to ungroup the rest of the windows.
|
||||
g_pCompositor->setWindowFullscreen(self, false, FULLSCREEN_FULL);
|
||||
|
||||
Debug::log(LOG, "[dwindle-autogroup] Ungroupping {} windows", dGroupWindows.size());
|
||||
|
||||
const bool GROUPS_LOCKED_PREV = g_pKeybindManager->m_bGroupsLocked;
|
||||
g_pKeybindManager->m_bGroupsLocked = true;
|
||||
|
||||
for (auto& pWindow : dGroupWindows) {
|
||||
Debug::log(LOG, "[dwindle-autogroup] Ungroupping window {:x}", pWindow);
|
||||
pWindow->m_sGroupData.pNextWindow = nullptr;
|
||||
pWindow->m_sGroupData.head = false;
|
||||
|
||||
// Current / Visible window (this isn't always the head)
|
||||
if (!pWindow->isHidden()) {
|
||||
Debug::log(LOG, "[dwindle-autogroup] -> Visible window ungroup");
|
||||
|
||||
// This window is already visible in the layout, we don't need to create
|
||||
// a new layout window for it.
|
||||
//
|
||||
// The original destroyGroup removes the window from the layout here,
|
||||
// which is what causes the weird ungroupping behavior as this window
|
||||
// is then recreated, which spawns it in a potentially unexpected place
|
||||
// (often determined by the cursor position).
|
||||
|
||||
// Update the window decorations (removing group bar)
|
||||
pWindow->updateWindowDecos();
|
||||
}
|
||||
else {
|
||||
pWindow->setHidden(false);
|
||||
|
||||
g_pLayoutManager->getCurrentLayout()->onWindowCreatedTiling(pWindow);
|
||||
pWindow->updateWindowDecos();
|
||||
|
||||
// Focus the window that we just spawned, so that on the next iteration
|
||||
// the window created will be it's dwindle child node.
|
||||
// This allows the original group head to remain a parent window to all
|
||||
// of the other (groupped) nodes.
|
||||
//
|
||||
// Note that this won't preserve the exact original layout of the group
|
||||
// but it will make sure all of the groupped windows will extend from
|
||||
// the dwindle node of the group head window. Preserving the original
|
||||
// layout isn't really possible, since new windows can be added into
|
||||
// groups after they were created.
|
||||
g_pCompositor->focusWindow(pWindow);
|
||||
}
|
||||
}
|
||||
|
||||
g_pKeybindManager->m_bGroupsLocked = GROUPS_LOCKED_PREV;
|
||||
|
||||
Debug::log(LOG, "[dwindle-autogroup] All windows ungroupped");
|
||||
|
||||
g_pCompositor->updateAllWindowsAnimatedDecorationValues();
|
||||
|
||||
// Leave with the focus the original (main) window
|
||||
g_pCompositor->focusWindow(self);
|
||||
|
||||
Debug::log(LOG, "[dwindle-autogroup] Ungroupping done");
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue