refactor: server Store button info by value

based on: 55e727be14
This commit is contained in:
sithlord48 2025-11-12 19:26:37 -05:00 committed by Chris Rizzitello
parent f372ccd2b8
commit cbc74d99b0
5 changed files with 29 additions and 30 deletions

View file

@ -24,6 +24,10 @@ public:
class ButtonInfo
{
public:
ButtonInfo(ButtonID button, KeyModifierMask mask) : m_button{button}, m_mask{mask}
{
// do nothing
}
static ButtonInfo *alloc(ButtonID, KeyModifierMask);
static ButtonInfo *alloc(const ButtonInfo &);

View file

@ -936,7 +936,7 @@ Config::parseCondition(const ConfigReadContext &s, const std::string &name, cons
throw ServerConfigReadException(s, "syntax for condition: mousebutton(modifiers+button)");
}
IPlatformScreen::ButtonInfo *mouseInfo = s.parseMouse(args[0]);
auto mouseInfo = s.parseMouse(args[0]);
return new InputFilter::MouseButtonCondition(m_events, mouseInfo);
}
@ -998,11 +998,10 @@ void Config::parseAction(
throw ServerConfigReadException(s, "syntax for action: mousebutton(modifiers+button)");
}
IPlatformScreen::ButtonInfo *mouseInfo = s.parseMouse(args[0]);
auto mouseInfo = s.parseMouse(args[0]);
if (name == "mousebutton") {
IPlatformScreen::ButtonInfo *mouseInfo2 = IPlatformScreen::ButtonInfo::alloc(*mouseInfo);
action = new InputFilter::MouseButtonAction(m_events, mouseInfo2, true);
action = new InputFilter::MouseButtonAction(m_events, mouseInfo, true);
rule.adoptAction(action, true);
action = new InputFilter::MouseButtonAction(m_events, mouseInfo, false);
activate = false;
@ -2016,7 +2015,7 @@ ConfigReadContext::parseKeystroke(const std::string &keystroke, const std::set<s
return IPlatformScreen::KeyInfo::alloc(key, mask, 0, 0, screens);
}
IPlatformScreen::ButtonInfo *ConfigReadContext::parseMouse(const std::string &mouse) const
IPlatformScreen::ButtonInfo ConfigReadContext::parseMouse(const std::string &mouse) const
{
std::string s = mouse;
@ -2034,7 +2033,7 @@ IPlatformScreen::ButtonInfo *ConfigReadContext::parseMouse(const std::string &mo
throw ServerConfigReadException(*this, "invalid button");
}
return IPlatformScreen::ButtonInfo::alloc(button, mask);
return IPlatformScreen::ButtonInfo{button, mask};
}
KeyModifierMask ConfigReadContext::parseModifier(const std::string &modifiers) const

View file

@ -506,7 +506,7 @@ public:
) const;
IPlatformScreen::KeyInfo *parseKeystroke(const std::string &keystroke) const;
IPlatformScreen::KeyInfo *parseKeystroke(const std::string &keystroke, const std::set<std::string> &screens) const;
IPlatformScreen::ButtonInfo *parseMouse(const std::string &mouse) const;
IPlatformScreen::ButtonInfo parseMouse(const std::string &mouse) const;
KeyModifierMask parseModifier(const std::string &modifiers) const;
std::istream &getStream() const
{

View file

@ -100,12 +100,12 @@ void InputFilter::KeystrokeCondition::disablePrimary(PrimaryClient *primary)
m_id = 0;
}
InputFilter::MouseButtonCondition::MouseButtonCondition(IEventQueue *events, IPlatformScreen::ButtonInfo *info)
: m_button(info->m_button),
m_mask(info->m_mask),
InputFilter::MouseButtonCondition::MouseButtonCondition(IEventQueue *events, const IPlatformScreen::ButtonInfo &info)
: m_button(info.m_button),
m_mask(info.m_mask),
m_events(events)
{
free(info);
// do nothing
}
InputFilter::MouseButtonCondition::MouseButtonCondition(IEventQueue *events, ButtonID button, KeyModifierMask mask)
@ -492,7 +492,9 @@ const char *InputFilter::KeystrokeAction::formatName() const
return (m_press ? "keyDown" : "keyUp");
}
InputFilter::MouseButtonAction::MouseButtonAction(IEventQueue *events, IPlatformScreen::ButtonInfo *info, bool press)
InputFilter::MouseButtonAction::MouseButtonAction(
IEventQueue *events, const IPlatformScreen::ButtonInfo &info, bool press
)
: m_buttonInfo(info),
m_press(press),
m_events(events)
@ -500,12 +502,7 @@ InputFilter::MouseButtonAction::MouseButtonAction(IEventQueue *events, IPlatform
// do nothing
}
InputFilter::MouseButtonAction::~MouseButtonAction()
{
free(m_buttonInfo);
}
const IPlatformScreen::ButtonInfo *InputFilter::MouseButtonAction::getInfo() const
const IPlatformScreen::ButtonInfo &InputFilter::MouseButtonAction::getInfo() const
{
return m_buttonInfo;
}
@ -517,16 +514,15 @@ bool InputFilter::MouseButtonAction::isOnPress() const
InputFilter::Action *InputFilter::MouseButtonAction::clone() const
{
IPlatformScreen::ButtonInfo *info = IPrimaryScreen::ButtonInfo::alloc(*m_buttonInfo);
return new MouseButtonAction(m_events, info, m_press);
return new MouseButtonAction(m_events, m_buttonInfo, m_press);
}
std::string InputFilter::MouseButtonAction::format() const
{
const char *type = formatName();
std::string key = deskflow::KeyMap::formatKey(kKeyNone, m_buttonInfo->m_mask);
return deskflow::string::sprintf("%s(%s%s%d)", type, key.c_str(), key.empty() ? "" : "+", m_buttonInfo->m_button);
std::string key = deskflow::KeyMap::formatKey(kKeyNone, m_buttonInfo.m_mask);
return deskflow::string::sprintf("%s(%s%s%d)", type, key.c_str(), key.empty() ? "" : "+", m_buttonInfo.m_button);
}
void InputFilter::MouseButtonAction::perform(const Event &event)
@ -535,16 +531,16 @@ void InputFilter::MouseButtonAction::perform(const Event &event)
// send modifiers
using enum EventTypes;
IPlatformScreen::KeyInfo *modifierInfo = nullptr;
if (m_buttonInfo->m_mask != 0) {
if (m_buttonInfo.m_mask != 0) {
KeyID key = m_press ? kKeySetModifiers : kKeyClearModifiers;
modifierInfo = IKeyState::KeyInfo::alloc(key, m_buttonInfo->m_mask, 0, 1);
modifierInfo = IKeyState::KeyInfo::alloc(key, m_buttonInfo.m_mask, 0, 1);
m_events->addEvent(Event(KeyStateKeyDown, event.getTarget(), modifierInfo, Event::EventFlags::DeliverImmediately));
}
// send button
EventTypes type = m_press ? PrimaryScreenButtonDown : PrimaryScreenButtonUp;
m_events->addEvent(Event(
type, event.getTarget(), m_buttonInfo, Event::EventFlags::DeliverImmediately | Event::EventFlags::DontFreeData
type, event.getTarget(), &m_buttonInfo, Event::EventFlags::DeliverImmediately | Event::EventFlags::DontFreeData
));
}

View file

@ -76,7 +76,7 @@ public:
class MouseButtonCondition : public Condition
{
public:
MouseButtonCondition(IEventQueue *events, IPlatformScreen::ButtonInfo *);
MouseButtonCondition(IEventQueue *events, const IPlatformScreen::ButtonInfo &);
MouseButtonCondition(IEventQueue *events, ButtonID, KeyModifierMask mask);
~MouseButtonCondition() override = default;
@ -286,15 +286,15 @@ public:
class MouseButtonAction : public Action
{
public:
MouseButtonAction(IEventQueue *events, IPlatformScreen::ButtonInfo *adoptedInfo, bool press);
MouseButtonAction(IEventQueue *events, const IPlatformScreen::ButtonInfo &adoptedInfo, bool press);
MouseButtonAction(MouseButtonAction const &) = delete;
MouseButtonAction(MouseButtonAction &&) = delete;
~MouseButtonAction() override;
~MouseButtonAction() override = default;
MouseButtonAction &operator=(MouseButtonAction const &) = delete;
MouseButtonAction &operator=(MouseButtonAction &&) = delete;
const IPlatformScreen::ButtonInfo *getInfo() const;
const IPlatformScreen::ButtonInfo &getInfo() const;
bool isOnPress() const;
// Action overrides
@ -306,7 +306,7 @@ public:
virtual const char *formatName() const;
private:
IPlatformScreen::ButtonInfo *m_buttonInfo;
IPlatformScreen::ButtonInfo m_buttonInfo;
bool m_press;
IEventQueue *m_events;
};