input: minor constraint fixes
fixes the confined region, warping issues, etc. Closes #3158
This commit is contained in:
parent
e3c83ab2e0
commit
d9937fcdba
4 changed files with 50 additions and 11 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -45,6 +45,7 @@ class CRegion {
|
|||
wlr_box getExtents();
|
||||
bool containsPoint(const Vector2D& vec);
|
||||
bool empty();
|
||||
Vector2D closestPoint(const Vector2D& vec);
|
||||
|
||||
std::vector<pixman_box32_t> getRects() const;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue