From d9937fcdba978af4f36be6cb20311e08f43841f5 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 4 Sep 2023 17:34:19 +0200 Subject: input: minor constraint fixes fixes the confined region, warping issues, etc. Closes #3158 --- src/helpers/Region.cpp | 31 +++++++++++++++++++++++++++++++ src/helpers/Region.hpp | 1 + src/helpers/WLClasses.hpp | 4 ++-- 3 files changed, 34 insertions(+), 2 deletions(-) (limited to 'src/helpers') diff --git a/src/helpers/Region.cpp b/src/helpers/Region.cpp index 38a3760b..644bd5d4 100644 --- a/src/helpers/Region.cpp +++ b/src/helpers/Region.cpp @@ -104,3 +104,34 @@ bool CRegion::containsPoint(const Vector2D& vec) { bool CRegion::empty() { return !pixman_region32_not_empty(&m_rRegion); } + +Vector2D CRegion::closestPoint(const Vector2D& vec) { + double bestDist = __FLT_MAX__; + Vector2D leader = vec; + + for (auto& box : getRects()) { + double x = 0, y = 0; + + if (vec.x >= box.x2) + x = box.x2 - 1; + else if (vec.x < box.x1) + x = box.x1; + else + x = vec.x; + + if (vec.y >= box.y2) + y = box.y2 - 1; + else if (vec.y < box.y1) + y = box.y1; + else + y = vec.y; + + double distance = sqrt(pow(x, 2) + pow(y, 2)); + if (distance < bestDist) { + bestDist = distance; + leader = {x, y}; + } + } + + return leader; +} \ No newline at end of file diff --git a/src/helpers/Region.hpp b/src/helpers/Region.hpp index 42458234..e5a99da2 100644 --- a/src/helpers/Region.hpp +++ b/src/helpers/Region.hpp @@ -45,6 +45,7 @@ class CRegion { wlr_box getExtents(); bool containsPoint(const Vector2D& vec); bool empty(); + Vector2D closestPoint(const Vector2D& vec); std::vector getRects() const; diff --git a/src/helpers/WLClasses.hpp b/src/helpers/WLClasses.hpp index dca7f1e0..84f6d898 100644 --- a/src/helpers/WLClasses.hpp +++ b/src/helpers/WLClasses.hpp @@ -168,8 +168,8 @@ struct SConstraint { bool active = false; - bool hintSet = false; - Vector2D positionHint; // the position hint, but will be set to the current cursor pos if not set. + bool hintSet = false; + Vector2D positionHint = {-1, -1}; // the position hint, but will be set to the current cursor pos if not set. DYNLISTENER(setConstraintRegion); DYNLISTENER(destroyConstraint); -- cgit v1.2.3