algo/dwindle: fix focal point not being properly used in movedTarget (#13373)
This commit is contained in:
parent
1e06ab464f
commit
0e9196867b
3 changed files with 59 additions and 10 deletions
|
|
@ -34,6 +34,51 @@ static void testFloatClamp() {
|
||||||
// clean up
|
// clean up
|
||||||
NLog::log("{}Killing all windows", Colors::YELLOW);
|
NLog::log("{}Killing all windows", Colors::YELLOW);
|
||||||
Tests::killAllWindows();
|
Tests::killAllWindows();
|
||||||
|
|
||||||
|
OK(getFromSocket("/reload"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test13349() {
|
||||||
|
|
||||||
|
// Test if dwindle properly uses a focal point to place a new window.
|
||||||
|
// exposed by #13349 as a regression from #12890
|
||||||
|
|
||||||
|
for (auto const& win : {"a", "b", "c"}) {
|
||||||
|
if (!Tests::spawnKitty(win)) {
|
||||||
|
NLog::log("{}Failed to spawn kitty with win class `{}`", Colors::RED, win);
|
||||||
|
++TESTS_FAILED;
|
||||||
|
ret = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OK(getFromSocket("/dispatch focuswindow class:c"));
|
||||||
|
|
||||||
|
{
|
||||||
|
auto str = getFromSocket("/activewindow");
|
||||||
|
EXPECT_CONTAINS(str, "at: 967,547");
|
||||||
|
EXPECT_CONTAINS(str, "size: 931,511");
|
||||||
|
}
|
||||||
|
|
||||||
|
OK(getFromSocket("/dispatch movewindow l"));
|
||||||
|
|
||||||
|
{
|
||||||
|
auto str = getFromSocket("/activewindow");
|
||||||
|
EXPECT_CONTAINS(str, "at: 22,547");
|
||||||
|
EXPECT_CONTAINS(str, "size: 931,511");
|
||||||
|
}
|
||||||
|
|
||||||
|
OK(getFromSocket("/dispatch movewindow r"));
|
||||||
|
|
||||||
|
{
|
||||||
|
auto str = getFromSocket("/activewindow");
|
||||||
|
EXPECT_CONTAINS(str, "at: 967,547");
|
||||||
|
EXPECT_CONTAINS(str, "size: 931,511");
|
||||||
|
}
|
||||||
|
|
||||||
|
// clean up
|
||||||
|
NLog::log("{}Killing all windows", Colors::YELLOW);
|
||||||
|
Tests::killAllWindows();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool test() {
|
static bool test() {
|
||||||
|
|
@ -43,6 +88,9 @@ static bool test() {
|
||||||
NLog::log("{}Testing float clamp", Colors::GREEN);
|
NLog::log("{}Testing float clamp", Colors::GREEN);
|
||||||
testFloatClamp();
|
testFloatClamp();
|
||||||
|
|
||||||
|
NLog::log("{}Testing #13349", Colors::GREEN);
|
||||||
|
test13349();
|
||||||
|
|
||||||
// clean up
|
// clean up
|
||||||
NLog::log("Cleaning up", Colors::YELLOW);
|
NLog::log("Cleaning up", Colors::YELLOW);
|
||||||
getFromSocket("/dispatch workspace 1");
|
getFromSocket("/dispatch workspace 1");
|
||||||
|
|
|
||||||
|
|
@ -100,16 +100,14 @@ void CDwindleAlgorithm::addTarget(SP<ITarget> target, bool newTarget) {
|
||||||
OPENINGON = getClosestNode(MOUSECOORDS);
|
OPENINGON = getClosestNode(MOUSECOORDS);
|
||||||
|
|
||||||
} else if (*PUSEACTIVE) {
|
} else if (*PUSEACTIVE) {
|
||||||
if (Desktop::focusState()->window() && !Desktop::focusState()->window()->m_isFloating && Desktop::focusState()->window() != target->window() &&
|
const auto ACTIVE_WINDOW = Desktop::focusState()->window();
|
||||||
Desktop::focusState()->window()->m_workspace == PWORKSPACE && Desktop::focusState()->window()->m_isMapped) {
|
|
||||||
OPENINGON = getNodeFromWindow(Desktop::focusState()->window());
|
|
||||||
} else {
|
|
||||||
OPENINGON = getNodeFromWindow(g_pCompositor->vectorToWindowUnified(MOUSECOORDS, Desktop::View::RESERVED_EXTENTS | Desktop::View::INPUT_EXTENTS));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!OPENINGON && g_pCompositor->isPointOnReservedArea(MOUSECOORDS, ACTIVE_MON))
|
if (!m_overrideFocalPoint && ACTIVE_WINDOW && !ACTIVE_WINDOW->m_isFloating && ACTIVE_WINDOW != target->window() && ACTIVE_WINDOW->m_workspace == PWORKSPACE &&
|
||||||
OPENINGON = getClosestNode(MOUSECOORDS);
|
ACTIVE_WINDOW->m_isMapped)
|
||||||
|
OPENINGON = getNodeFromWindow(ACTIVE_WINDOW);
|
||||||
|
|
||||||
|
if (!OPENINGON)
|
||||||
|
OPENINGON = getClosestNode(MOUSECOORDS, target);
|
||||||
} else
|
} else
|
||||||
OPENINGON = getFirstNode();
|
OPENINGON = getFirstNode();
|
||||||
|
|
||||||
|
|
@ -635,10 +633,13 @@ SP<SDwindleNodeData> CDwindleAlgorithm::getFirstNode() {
|
||||||
return m_dwindleNodesData.empty() ? nullptr : m_dwindleNodesData.at(0);
|
return m_dwindleNodesData.empty() ? nullptr : m_dwindleNodesData.at(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SP<SDwindleNodeData> CDwindleAlgorithm::getClosestNode(const Vector2D& point) {
|
SP<SDwindleNodeData> CDwindleAlgorithm::getClosestNode(const Vector2D& point, SP<ITarget> skip) {
|
||||||
SP<SDwindleNodeData> res = nullptr;
|
SP<SDwindleNodeData> res = nullptr;
|
||||||
double distClosest = -1;
|
double distClosest = -1;
|
||||||
for (auto& n : m_dwindleNodesData) {
|
for (auto& n : m_dwindleNodesData) {
|
||||||
|
if (skip && n->pTarget == skip)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (n->pTarget && Desktop::View::validMapped(n->pTarget->window())) {
|
if (n->pTarget && Desktop::View::validMapped(n->pTarget->window())) {
|
||||||
auto distAnother = vecToRectDistanceSquared(point, n->box.pos(), n->box.pos() + n->box.size());
|
auto distAnother = vecToRectDistanceSquared(point, n->box.pos(), n->box.pos() + n->box.size());
|
||||||
if (!res || distAnother < distClosest) {
|
if (!res || distAnother < distClosest) {
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ namespace Layout::Tiled {
|
||||||
SP<SDwindleNodeData> getNodeFromWindow(PHLWINDOW w);
|
SP<SDwindleNodeData> getNodeFromWindow(PHLWINDOW w);
|
||||||
int getNodes();
|
int getNodes();
|
||||||
SP<SDwindleNodeData> getFirstNode();
|
SP<SDwindleNodeData> getFirstNode();
|
||||||
SP<SDwindleNodeData> getClosestNode(const Vector2D&);
|
SP<SDwindleNodeData> getClosestNode(const Vector2D&, SP<ITarget> skip = nullptr);
|
||||||
SP<SDwindleNodeData> getMasterNode();
|
SP<SDwindleNodeData> getMasterNode();
|
||||||
|
|
||||||
void toggleSplit(SP<SDwindleNodeData>);
|
void toggleSplit(SP<SDwindleNodeData>);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue