scrolling: make new windows columns by default

ref #348
This commit is contained in:
Vaxry 2025-05-24 14:28:11 +02:00
parent d4df48ee95
commit 19dc215230
Signed by: vaxry
GPG key ID: 665806380871D640
2 changed files with 62 additions and 13 deletions

View file

@ -3,6 +3,7 @@
#include <algorithm>
#include <hyprland/src/Compositor.hpp>
#include <hyprland/src/managers/input/InputManager.hpp>
#include <hyprland/src/config/ConfigManager.hpp>
#include <hyprland/src/config/ConfigValue.hpp>
#include <hyprland/src/render/Renderer.hpp>
@ -106,6 +107,24 @@ SP<SColumnData> SWorkspaceData::add() {
return col;
}
SP<SColumnData> SWorkspaceData::add(size_t after) {
static const auto PCOLWIDTH = CConfigValue<Hyprlang::FLOAT>("plugin:hyprscrolling:column_width");
auto col = makeShared<SColumnData>(self.lock());
col->self = col;
col->columnWidth = *PCOLWIDTH;
columns.insert(columns.begin() + after + 1, col);
return col;
}
int64_t SWorkspaceData::idx(SP<SColumnData> c) {
for (size_t i = 0; i < columns.size(); ++i) {
if (columns[i] == c)
return i;
}
return -1;
}
void SWorkspaceData::remove(SP<SColumnData> c) {
std::erase(columns, c);
}
@ -160,6 +179,28 @@ void SWorkspaceData::centerCol(SP<SColumnData> c) {
}
}
void SWorkspaceData::fitCol(SP<SColumnData> c) {
if (!c)
return;
static const auto PFSONONE = CConfigValue<Hyprlang::INT>("plugin:hyprscrolling:fullscreen_on_one_column");
PHLMONITOR PMONITOR = workspace->m_monitor.lock();
double currentLeft = 0;
const auto USABLE = layout->usableAreaFor(PMONITOR);
for (const auto& COL : columns) {
const double ITEM_WIDTH = *PFSONONE && columns.size() == 1 ? USABLE.w : USABLE.w * COL->columnWidth;
if (COL != c)
currentLeft += ITEM_WIDTH;
else {
leftOffset = std::clamp((double)leftOffset, currentLeft - USABLE.w + ITEM_WIDTH, currentLeft);
return;
}
}
}
SP<SColumnData> SWorkspaceData::atCenter() {
static const auto PFSONONE = CConfigValue<Hyprlang::INT>("plugin:hyprscrolling:fullscreen_on_one_column");
@ -409,26 +450,31 @@ void CScrollingLayout::onWindowCreatedTiling(PHLWINDOW window, eDirection direct
workspaceData->self = workspaceData;
}
const auto PLASTFOCUS = g_pCompositor->m_lastWindow.lock();
const SP<SScrollingWindowData> LAST_FOCUS_DATA = PLASTFOCUS ? dataFor(PLASTFOCUS) : nullptr;
const auto PMONITOR = window->m_monitor;
auto droppingOn = g_pCompositor->m_lastWindow.lock();
bool addNewColumn = !PLASTFOCUS || !LAST_FOCUS_DATA || PLASTFOCUS->m_workspace != window->m_workspace || workspaceData->columns.size() <= 1;
if (droppingOn == window)
droppingOn = g_pCompositor->vectorToWindowUnified(g_pInputManager->getMouseCoordsInternal(), RESERVED_EXTENTS | INPUT_EXTENTS);
if (!addNewColumn && PMONITOR) {
if (workspaceData->atCenter() == nullptr)
addNewColumn = true;
}
SP<SScrollingWindowData> droppingData = droppingOn ? dataFor(droppingOn) : nullptr;
SP<SColumnData> droppingColumn = droppingData ? droppingData->column.lock() : nullptr;
Debug::log(LOG, "[scrolling] new window {:x}, addNewColumn: {}, columns before: {}", (uintptr_t)window.get(), addNewColumn, workspaceData->columns.size());
Debug::log(LOG, "[scrolling] new window {:x}, droppingColumn: {:x}, columns before: {}", (uintptr_t)window.get(), (uintptr_t)droppingColumn.get(),
workspaceData->columns.size());
if (addNewColumn) {
if (!droppingColumn) {
auto col = workspaceData->add();
col->add(window);
workspaceData->fitCol(col);
} else {
// LAST_FOCUS_DATA has to be valid
auto col = LAST_FOCUS_DATA->column;
col->add(window);
if (window->m_draggingTiled) {
droppingColumn->add(window);
workspaceData->fitCol(droppingColumn);
} else {
auto idx = workspaceData->idx(droppingColumn);
auto col = idx == -1 ? workspaceData->add() : workspaceData->add(idx);
col->add(window);
workspaceData->fitCol(col);
}
}
workspaceData->recalculate();

View file

@ -57,6 +57,8 @@ struct SWorkspaceData {
int leftOffset = 0;
SP<SColumnData> add();
SP<SColumnData> add(size_t after);
int64_t idx(SP<SColumnData> c);
void remove(SP<SColumnData> c);
double maxWidth();
SP<SColumnData> next(SP<SColumnData> c);
@ -65,6 +67,7 @@ struct SWorkspaceData {
bool visible(SP<SColumnData> c);
void centerCol(SP<SColumnData> c);
void fitCol(SP<SColumnData> c);
void recalculate();