mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-10-02 16:18:31 +00:00
tablet: take active_area_size
into account when sending tip event (#9325)
* fixes #9322, take `active_area_size` into account when sending tip event * check if `relative_input` is set As suggested by @y47s5s68tq870r7tc1xpp755pabopg * refactoring active area in own function to keep it DRY * coding style * making transformation static --------- Co-authored-by: clamydo <clamydo@users.noreply.github.com>
This commit is contained in:
@@ -88,6 +88,20 @@ static void refocusTablet(SP<CTablet> tab, SP<CTabletTool> tool, bool motion = f
|
|||||||
PROTO::tablet->motion(tool, local);
|
PROTO::tablet->motion(tool, local);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Vector2D transformToActiveRegion(const Vector2D pos, const CBox activeArea) {
|
||||||
|
auto newPos = pos;
|
||||||
|
|
||||||
|
//Calculate transformations if active area is set
|
||||||
|
if (!activeArea.empty()) {
|
||||||
|
if (!std::isnan(pos.x))
|
||||||
|
newPos.x = (pos.x - activeArea.x) / (activeArea.w - activeArea.x);
|
||||||
|
if (!std::isnan(pos.y))
|
||||||
|
newPos.y = (pos.y - activeArea.y) / (activeArea.h - activeArea.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
return newPos;
|
||||||
|
}
|
||||||
|
|
||||||
void CInputManager::onTabletAxis(CTablet::SAxisEvent e) {
|
void CInputManager::onTabletAxis(CTablet::SAxisEvent e) {
|
||||||
const auto PTAB = e.tablet;
|
const auto PTAB = e.tablet;
|
||||||
const auto PTOOL = ensureTabletToolPresent(e.tool);
|
const auto PTOOL = ensureTabletToolPresent(e.tool);
|
||||||
@@ -113,16 +127,9 @@ void CInputManager::onTabletAxis(CTablet::SAxisEvent e) {
|
|||||||
|
|
||||||
if (PTAB->relativeInput)
|
if (PTAB->relativeInput)
|
||||||
g_pPointerManager->move(delta);
|
g_pPointerManager->move(delta);
|
||||||
else {
|
else
|
||||||
//Calculate transformations if active area is set
|
g_pPointerManager->warpAbsolute(transformToActiveRegion({x, y}, PTAB->activeArea), PTAB);
|
||||||
if (!PTAB->activeArea.empty()) {
|
|
||||||
if (!std::isnan(x))
|
|
||||||
x = (x - PTAB->activeArea.x) / (PTAB->activeArea.w - PTAB->activeArea.x);
|
|
||||||
if (!std::isnan(y))
|
|
||||||
y = (y - PTAB->activeArea.y) / (PTAB->activeArea.h - PTAB->activeArea.y);
|
|
||||||
}
|
|
||||||
g_pPointerManager->warpAbsolute({x, y}, PTAB);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -160,7 +167,12 @@ void CInputManager::onTabletTip(CTablet::STipEvent e) {
|
|||||||
const auto PTAB = e.tablet;
|
const auto PTAB = e.tablet;
|
||||||
const auto PTOOL = ensureTabletToolPresent(e.tool);
|
const auto PTOOL = ensureTabletToolPresent(e.tool);
|
||||||
const auto POS = e.tip;
|
const auto POS = e.tip;
|
||||||
g_pPointerManager->warpAbsolute(POS, PTAB);
|
|
||||||
|
if (PTAB->relativeInput)
|
||||||
|
g_pPointerManager->move({0, 0});
|
||||||
|
else
|
||||||
|
g_pPointerManager->warpAbsolute(transformToActiveRegion(POS, PTAB->activeArea), PTAB);
|
||||||
|
|
||||||
refocusTablet(PTAB, PTOOL, true);
|
refocusTablet(PTAB, PTOOL, true);
|
||||||
|
|
||||||
if (e.in)
|
if (e.in)
|
||||||
|
Reference in New Issue
Block a user