mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-30 00:25:59 +01:00
feat: add resizing on rounded corners
This commit is contained in:
parent
f41b69f69d
commit
8b1eba2795
5 changed files with 43 additions and 3 deletions
|
@ -381,3 +381,33 @@ void CWindow::updateDynamicRules() {
|
||||||
applyDynamicRule(r);
|
applyDynamicRule(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if the point is "hidden" under a rounded corner of the window
|
||||||
|
bool CWindow::isInCurvedCorner(double x, double y) {
|
||||||
|
static auto* const ROUNDING = &g_pConfigManager->getConfigValuePtr("decoration:rounding")->intValue;
|
||||||
|
static auto* const BORDERSIZE = &g_pConfigManager->getConfigValuePtr("general:border_size")->intValue;
|
||||||
|
|
||||||
|
if (BORDERSIZE >= ROUNDING || ROUNDING == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// (x0, y0), (x0, y1), ... are the center point of rounding at each corner
|
||||||
|
double x0 = m_vRealPosition.vec().x + *ROUNDING;
|
||||||
|
double y0 = m_vRealPosition.vec().y + *ROUNDING;
|
||||||
|
double x1 = m_vRealPosition.vec().x + m_vRealSize.vec().x - *ROUNDING;
|
||||||
|
double y1 = m_vRealPosition.vec().y + m_vRealSize.vec().y - *ROUNDING;
|
||||||
|
|
||||||
|
if (x < x0 && y < y0) {
|
||||||
|
return Vector2D{x0, y0}.distance(Vector2D{x, y}) > (double)*ROUNDING;
|
||||||
|
}
|
||||||
|
if (x > x1 && y < y0) {
|
||||||
|
return Vector2D{x1, y0}.distance(Vector2D{x, y}) > (double)*ROUNDING;
|
||||||
|
}
|
||||||
|
if (x < x0 && y > y1) {
|
||||||
|
return Vector2D{x0, y1}.distance(Vector2D{x, y}) > (double)*ROUNDING;
|
||||||
|
}
|
||||||
|
if (x > x1 && y > y1) {
|
||||||
|
return Vector2D{x1, y1}.distance(Vector2D{x, y}) > (double)*ROUNDING;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -218,6 +218,7 @@ class CWindow {
|
||||||
bool isHidden();
|
bool isHidden();
|
||||||
void applyDynamicRule(const SWindowRule& r);
|
void applyDynamicRule(const SWindowRule& r);
|
||||||
void updateDynamicRules();
|
void updateDynamicRules();
|
||||||
|
bool isInCurvedCorner(double x, double y);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// For hidden windows and stuff
|
// For hidden windows and stuff
|
||||||
|
|
|
@ -30,3 +30,9 @@ Vector2D Vector2D::floor() {
|
||||||
Vector2D Vector2D::clamp(const Vector2D& min, const Vector2D& max) {
|
Vector2D Vector2D::clamp(const Vector2D& min, const Vector2D& max) {
|
||||||
return Vector2D(std::clamp(this->x, min.x, max.x == 0 ? INFINITY : max.x), std::clamp(this->y, min.y, max.y == 0 ? INFINITY : max.y));
|
return Vector2D(std::clamp(this->x, min.x, max.x == 0 ? INFINITY : max.x), std::clamp(this->y, min.y, max.y == 0 ? INFINITY : max.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Vector2D::distance(const Vector2D& other) {
|
||||||
|
double dx = x - other.x;
|
||||||
|
double dy = y - other.y;
|
||||||
|
return std::sqrt(dx * dx + dy * dy);
|
||||||
|
}
|
||||||
|
|
|
@ -39,6 +39,8 @@ class Vector2D {
|
||||||
return Vector2D(this->x * a.x, this->y * a.y);
|
return Vector2D(this->x * a.x, this->y * a.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double distance(const Vector2D& other);
|
||||||
|
|
||||||
Vector2D clamp(const Vector2D& min, const Vector2D& max = Vector2D());
|
Vector2D clamp(const Vector2D& min, const Vector2D& max = Vector2D());
|
||||||
|
|
||||||
Vector2D floor();
|
Vector2D floor();
|
||||||
|
|
|
@ -404,7 +404,8 @@ void CInputManager::processMouseDownNormal(wlr_pointer_button_event* e) {
|
||||||
// check if clicked on gaps/border (borders are hard to click on, doesn't matter how thick it is)
|
// check if clicked on gaps/border (borders are hard to click on, doesn't matter how thick it is)
|
||||||
// TODO take curved corners into consideration
|
// TODO take curved corners into consideration
|
||||||
const auto mouseCoords = g_pInputManager->getMouseCoordsInternal();
|
const auto mouseCoords = g_pInputManager->getMouseCoordsInternal();
|
||||||
if (wlr_box_contains_point(&box, mouseCoords.x, mouseCoords.y) && !wlr_box_contains_point(&real, mouseCoords.x, mouseCoords.y)) {
|
if (wlr_box_contains_point(&box, mouseCoords.x, mouseCoords.y) &&
|
||||||
|
(!wlr_box_contains_point(&real, mouseCoords.x, mouseCoords.y) || w->isInCurvedCorner(mouseCoords.x, mouseCoords.y))) {
|
||||||
g_pKeybindManager->onGapDragEvent(e);
|
g_pKeybindManager->onGapDragEvent(e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue