mirror of
https://github.com/hyprwm/Hyprland
synced 2025-01-11 14:29:49 +01:00
windowrules: add rules for mouse and touchpad scroll factors (#8655)
This commit is contained in:
parent
33f271c29a
commit
df956a0f6f
6 changed files with 40 additions and 4 deletions
|
@ -2309,14 +2309,15 @@ bool windowRuleValid(const std::string& RULE) {
|
||||||
"float", "fullscreen", "maximize", "noinitialfocus", "pin", "stayfocused", "tile", "renderunfocused",
|
"float", "fullscreen", "maximize", "noinitialfocus", "pin", "stayfocused", "tile", "renderunfocused",
|
||||||
};
|
};
|
||||||
static const auto rulesPrefix = std::vector<std::string>{
|
static const auto rulesPrefix = std::vector<std::string>{
|
||||||
"animation", "bordercolor", "bordersize", "center", "fullscreenstate", "group", "idleinhibit", "maxsize", "minsize", "monitor",
|
"animation", "bordercolor", "bordersize", "center", "fullscreenstate", "group", "idleinhibit", "maxsize", "minsize", "monitor", "move",
|
||||||
"move", "opacity", "plugin:", "pseudo", "rounding", "size", "suppressevent", "tag", "workspace", "xray",
|
"opacity", "plugin:", "pseudo", "rounding", "scrollmouse", "scrolltouchpad", "size", "suppressevent", "tag", "workspace", "xray",
|
||||||
};
|
};
|
||||||
|
|
||||||
const auto VALS = CVarList(RULE, 2, ' ');
|
const auto VALS = CVarList(RULE, 2, ' ');
|
||||||
return rules.contains(RULE) || std::any_of(rulesPrefix.begin(), rulesPrefix.end(), [&RULE](auto prefix) { return RULE.starts_with(prefix); }) ||
|
return rules.contains(RULE) || std::any_of(rulesPrefix.begin(), rulesPrefix.end(), [&RULE](auto prefix) { return RULE.starts_with(prefix); }) ||
|
||||||
(g_pConfigManager->mbWindowProperties.find(VALS[0]) != g_pConfigManager->mbWindowProperties.end()) ||
|
(g_pConfigManager->mbWindowProperties.find(VALS[0]) != g_pConfigManager->mbWindowProperties.end()) ||
|
||||||
(g_pConfigManager->miWindowProperties.find(VALS[0]) != g_pConfigManager->miWindowProperties.end());
|
(g_pConfigManager->miWindowProperties.find(VALS[0]) != g_pConfigManager->miWindowProperties.end()) ||
|
||||||
|
(g_pConfigManager->mfWindowProperties.find(VALS[0]) != g_pConfigManager->mfWindowProperties.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool layerRuleValid(const std::string& RULE) {
|
bool layerRuleValid(const std::string& RULE) {
|
||||||
|
|
|
@ -263,6 +263,10 @@ class CConfigManager {
|
||||||
{"bordersize", [](const PHLWINDOW& pWindow) { return &pWindow->m_sWindowData.borderSize; }},
|
{"bordersize", [](const PHLWINDOW& pWindow) { return &pWindow->m_sWindowData.borderSize; }},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::unordered_map<std::string, std::function<CWindowOverridableVar<float>*(PHLWINDOW)>> mfWindowProperties = {
|
||||||
|
{"scrollmouse", [](const PHLWINDOW& pWindow) { return &pWindow->m_sWindowData.scrollMouse; }},
|
||||||
|
{"scrolltouchpad", [](const PHLWINDOW& pWindow) { return &pWindow->m_sWindowData.scrollTouchpad; }}};
|
||||||
|
|
||||||
bool m_bWantsMonitorReload = false;
|
bool m_bWantsMonitorReload = false;
|
||||||
bool m_bForceReload = false;
|
bool m_bForceReload = false;
|
||||||
bool m_bNoMonitorReload = false;
|
bool m_bNoMonitorReload = false;
|
||||||
|
|
|
@ -718,6 +718,10 @@ void CWindow::applyDynamicRule(const SWindowRule& r) {
|
||||||
try {
|
try {
|
||||||
*(search->second(m_pSelf.lock())) = CWindowOverridableVar(std::stoi(VARS[1]), priority);
|
*(search->second(m_pSelf.lock())) = CWindowOverridableVar(std::stoi(VARS[1]), priority);
|
||||||
} catch (std::exception& e) { Debug::log(ERR, "Rule \"{}\" failed with: {}", r.szRule, e.what()); }
|
} catch (std::exception& e) { Debug::log(ERR, "Rule \"{}\" failed with: {}", r.szRule, e.what()); }
|
||||||
|
} else if (auto search = g_pConfigManager->mfWindowProperties.find(VARS[0]); search != g_pConfigManager->mfWindowProperties.end()) {
|
||||||
|
try {
|
||||||
|
*(search->second(m_pSelf.lock())) = CWindowOverridableVar(std::stof(VARS[1]), priority);
|
||||||
|
} catch (std::exception& e) { Debug::log(ERR, "Rule \"{}\" failed with: {}", r.szRule, e.what()); }
|
||||||
} else if (r.szRule.starts_with("idleinhibit")) {
|
} else if (r.szRule.starts_with("idleinhibit")) {
|
||||||
auto IDLERULE = r.szRule.substr(r.szRule.find_first_of(' ') + 1);
|
auto IDLERULE = r.szRule.substr(r.szRule.find_first_of(' ') + 1);
|
||||||
|
|
||||||
|
@ -1178,6 +1182,16 @@ int CWindow::getRealBorderSize() {
|
||||||
return m_sWindowData.borderSize.valueOr(*PBORDERSIZE);
|
return m_sWindowData.borderSize.valueOr(*PBORDERSIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float CWindow::getScrollMouse() {
|
||||||
|
static auto PINPUTSCROLLFACTOR = CConfigValue<Hyprlang::FLOAT>("input:scroll_factor");
|
||||||
|
return m_sWindowData.scrollMouse.valueOr(*PINPUTSCROLLFACTOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
float CWindow::getScrollTouchpad() {
|
||||||
|
static auto PTOUCHPADSCROLLFACTOR = CConfigValue<Hyprlang::FLOAT>("input:touchpad:scroll_factor");
|
||||||
|
return m_sWindowData.scrollTouchpad.valueOr(*PTOUCHPADSCROLLFACTOR);
|
||||||
|
}
|
||||||
|
|
||||||
bool CWindow::canBeTorn() {
|
bool CWindow::canBeTorn() {
|
||||||
static auto PTEARING = CConfigValue<Hyprlang::INT>("general:allow_tearing");
|
static auto PTEARING = CConfigValue<Hyprlang::INT>("general:allow_tearing");
|
||||||
return m_sWindowData.tearing.valueOr(m_bTearingHint) && *PTEARING;
|
return m_sWindowData.tearing.valueOr(m_bTearingHint) && *PTEARING;
|
||||||
|
@ -1602,6 +1616,9 @@ void CWindow::unsetWindowData(eOverridePriority priority) {
|
||||||
for (auto const& element : g_pConfigManager->miWindowProperties) {
|
for (auto const& element : g_pConfigManager->miWindowProperties) {
|
||||||
element.second(m_pSelf.lock())->unset(priority);
|
element.second(m_pSelf.lock())->unset(priority);
|
||||||
}
|
}
|
||||||
|
for (auto const& element : g_pConfigManager->mfWindowProperties) {
|
||||||
|
element.second(m_pSelf.lock())->unset(priority);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWindow::isX11OverrideRedirect() {
|
bool CWindow::isX11OverrideRedirect() {
|
||||||
|
|
|
@ -184,6 +184,9 @@ struct SWindowData {
|
||||||
CWindowOverridableVar<int> rounding;
|
CWindowOverridableVar<int> rounding;
|
||||||
CWindowOverridableVar<int> borderSize;
|
CWindowOverridableVar<int> borderSize;
|
||||||
|
|
||||||
|
CWindowOverridableVar<float> scrollMouse;
|
||||||
|
CWindowOverridableVar<float> scrollTouchpad;
|
||||||
|
|
||||||
CWindowOverridableVar<std::string> animationStyle;
|
CWindowOverridableVar<std::string> animationStyle;
|
||||||
CWindowOverridableVar<Vector2D> maxSize;
|
CWindowOverridableVar<Vector2D> maxSize;
|
||||||
CWindowOverridableVar<Vector2D> minSize;
|
CWindowOverridableVar<Vector2D> minSize;
|
||||||
|
@ -442,6 +445,8 @@ class CWindow {
|
||||||
bool isFullscreen();
|
bool isFullscreen();
|
||||||
bool isEffectiveInternalFSMode(const eFullscreenMode);
|
bool isEffectiveInternalFSMode(const eFullscreenMode);
|
||||||
int getRealBorderSize();
|
int getRealBorderSize();
|
||||||
|
float getScrollMouse();
|
||||||
|
float getScrollTouchpad();
|
||||||
void updateWindowData();
|
void updateWindowData();
|
||||||
void updateWindowData(const struct SWorkspaceRule&);
|
void updateWindowData(const struct SWorkspaceRule&);
|
||||||
void onBorderAngleAnimEnd(void* ptr);
|
void onBorderAngleAnimEnd(void* ptr);
|
||||||
|
|
|
@ -3014,6 +3014,13 @@ SDispatchResult CKeybindManager::setProp(std::string args) {
|
||||||
search->second(PWINDOW)->unset(PRIORITY_SET_PROP);
|
search->second(PWINDOW)->unset(PRIORITY_SET_PROP);
|
||||||
else if (const auto V = configStringToInt(VAL); V)
|
else if (const auto V = configStringToInt(VAL); V)
|
||||||
*(search->second(PWINDOW)) = CWindowOverridableVar((int)*V, PRIORITY_SET_PROP);
|
*(search->second(PWINDOW)) = CWindowOverridableVar((int)*V, PRIORITY_SET_PROP);
|
||||||
|
} else if (auto search = g_pConfigManager->mfWindowProperties.find(PROP); search != g_pConfigManager->mfWindowProperties.end()) {
|
||||||
|
if (VAL == "unset")
|
||||||
|
search->second(PWINDOW)->unset(PRIORITY_SET_PROP);
|
||||||
|
else {
|
||||||
|
const auto V = std::stof(VAL);
|
||||||
|
*(search->second(PWINDOW)) = CWindowOverridableVar(V, PRIORITY_SET_PROP);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
return {.success = false, .error = "Prop not found"};
|
return {.success = false, .error = "Prop not found"};
|
||||||
} catch (std::exception& e) { return {.success = false, .error = std::format("Error parsing prop value: {}", std::string(e.what()))}; }
|
} catch (std::exception& e) { return {.success = false, .error = std::format("Error parsing prop value: {}", std::string(e.what()))}; }
|
||||||
|
|
|
@ -761,7 +761,8 @@ void CInputManager::onMouseWheel(IPointer::SAxisEvent e) {
|
||||||
static auto PEMULATEDISCRETE = CConfigValue<Hyprlang::INT>("input:emulate_discrete_scroll");
|
static auto PEMULATEDISCRETE = CConfigValue<Hyprlang::INT>("input:emulate_discrete_scroll");
|
||||||
static auto PFOLLOWMOUSE = CConfigValue<Hyprlang::INT>("input:follow_mouse");
|
static auto PFOLLOWMOUSE = CConfigValue<Hyprlang::INT>("input:follow_mouse");
|
||||||
|
|
||||||
auto factor = (*PTOUCHPADSCROLLFACTOR <= 0.f || e.source == WL_POINTER_AXIS_SOURCE_FINGER ? *PTOUCHPADSCROLLFACTOR : *PINPUTSCROLLFACTOR);
|
const bool ISTOUCHPADSCROLL = *PTOUCHPADSCROLLFACTOR <= 0.f || e.source == WL_POINTER_AXIS_SOURCE_FINGER;
|
||||||
|
auto factor = ISTOUCHPADSCROLL ? *PTOUCHPADSCROLLFACTOR : *PINPUTSCROLLFACTOR;
|
||||||
|
|
||||||
const auto EMAP = std::unordered_map<std::string, std::any>{{"event", e}};
|
const auto EMAP = std::unordered_map<std::string, std::any>{{"event", e}};
|
||||||
EMIT_HOOK_EVENT_CANCELLABLE("mouseAxis", EMAP);
|
EMIT_HOOK_EVENT_CANCELLABLE("mouseAxis", EMAP);
|
||||||
|
@ -803,6 +804,7 @@ void CInputManager::onMouseWheel(IPointer::SAxisEvent e) {
|
||||||
if (*PFOLLOWMOUSE == 1 && PCURRWINDOW && PWINDOW != PCURRWINDOW)
|
if (*PFOLLOWMOUSE == 1 && PCURRWINDOW && PWINDOW != PCURRWINDOW)
|
||||||
simulateMouseMovement();
|
simulateMouseMovement();
|
||||||
}
|
}
|
||||||
|
factor = ISTOUCHPADSCROLL ? PWINDOW->getScrollTouchpad() : PWINDOW->getScrollMouse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue