input: Allow mapping keys to basic mouse buttons

This commit is contained in:
Megamouse 2025-01-09 18:20:33 +01:00
parent 9407974c10
commit 7e03828f35
5 changed files with 64 additions and 17 deletions

View File

@ -34,7 +34,7 @@ void MouseHandlerBase::save(utils::serial& ar)
bool MouseHandlerBase::is_time_for_update(double elapsed_time) bool MouseHandlerBase::is_time_for_update(double elapsed_time)
{ {
steady_clock::time_point now = steady_clock::now(); steady_clock::time_point now = steady_clock::now();
double elapsed = (now - last_update).count() / 1000'000.; const double elapsed = (now - last_update).count() / 1000'000.;
if (elapsed > elapsed_time) if (elapsed > elapsed_time)
{ {

View File

@ -108,10 +108,10 @@ bool basic_mouse_handler::eventFilter(QObject* target, QEvent* ev)
switch (ev->type()) switch (ev->type())
{ {
case QEvent::MouseButtonPress: case QEvent::MouseButtonPress:
MouseButtonDown(static_cast<QMouseEvent*>(ev)); MouseButton(static_cast<QMouseEvent*>(ev), true);
break; break;
case QEvent::MouseButtonRelease: case QEvent::MouseButtonRelease:
MouseButtonUp(static_cast<QMouseEvent*>(ev)); MouseButton(static_cast<QMouseEvent*>(ev), false);
break; break;
case QEvent::MouseMove: case QEvent::MouseMove:
MouseMove(static_cast<QMouseEvent*>(ev)); MouseMove(static_cast<QMouseEvent*>(ev));
@ -119,6 +119,12 @@ bool basic_mouse_handler::eventFilter(QObject* target, QEvent* ev)
case QEvent::Wheel: case QEvent::Wheel:
MouseScroll(static_cast<QWheelEvent*>(ev)); MouseScroll(static_cast<QWheelEvent*>(ev));
break; break;
case QEvent::KeyPress:
Key(static_cast<QKeyEvent*>(ev), true);
break;
case QEvent::KeyRelease:
Key(static_cast<QKeyEvent*>(ev), false);
break;
default: default:
return false; return false;
} }
@ -126,22 +132,22 @@ bool basic_mouse_handler::eventFilter(QObject* target, QEvent* ev)
return false; return false;
} }
void basic_mouse_handler::MouseButtonDown(QMouseEvent* event) void basic_mouse_handler::Key(QKeyEvent* event, bool pressed)
{ {
if (!event) [[unlikely]] if (!event) [[unlikely]]
{ {
return; return;
} }
const int button = event->button(); const int key = event->key();
if (const auto it = std::find_if(m_buttons.cbegin(), m_buttons.cend(), [button](const auto& entry){ return entry.second == button; }); if (const auto it = std::find_if(m_buttons.cbegin(), m_buttons.cend(), [key](const auto& entry){ return entry.second.code == key && entry.second.is_key; });
it != m_buttons.cend()) it != m_buttons.cend())
{ {
MouseHandlerBase::Button(0, it->first, true); MouseHandlerBase::Button(0, it->first, pressed);
} }
} }
void basic_mouse_handler::MouseButtonUp(QMouseEvent* event) void basic_mouse_handler::MouseButton(QMouseEvent* event, bool pressed)
{ {
if (!event) [[unlikely]] if (!event) [[unlikely]]
{ {
@ -149,10 +155,10 @@ void basic_mouse_handler::MouseButtonUp(QMouseEvent* event)
} }
const int button = event->button(); const int button = event->button();
if (const auto it = std::find_if(m_buttons.cbegin(), m_buttons.cend(), [button](const auto& entry){ return entry.second == button; }); if (const auto it = std::find_if(m_buttons.cbegin(), m_buttons.cend(), [button](const auto& entry){ return entry.second.code == button && !entry.second.is_key; });
it != m_buttons.cend()) it != m_buttons.cend())
{ {
MouseHandlerBase::Button(0, it->first, false); MouseHandlerBase::Button(0, it->first, pressed);
} }
} }
@ -176,17 +182,31 @@ bool basic_mouse_handler::get_mouse_lock_state() const
return false; return false;
} }
int basic_mouse_handler::get_mouse_button(const cfg::string& button) basic_mouse_handler::mouse_button basic_mouse_handler::get_mouse_button(const cfg::string& button)
{ {
const std::string name = button.to_string(); const std::string name = button.to_string();
const auto it = std::find_if(mouse_list.cbegin(), mouse_list.cend(), [&name](const auto& entry){ return entry.second == name; }); const auto it = std::find_if(mouse_list.cbegin(), mouse_list.cend(), [&name](const auto& entry){ return entry.second == name; });
if (it != mouse_list.cend()) if (it != mouse_list.cend())
{ {
return it->first; return mouse_button{
.code = static_cast<int>(it->first),
.is_key = false
};
} }
return Qt::MouseButton::NoButton; if (const u32 key = keyboard_pad_handler::GetKeyCode(QString::fromStdString(name)))
{
return mouse_button{
.code = static_cast<int>(key),
.is_key = true
};
}
return mouse_button{
.code = Qt::MouseButton::NoButton,
.is_key = false
};
} }
void basic_mouse_handler::MouseMove(QMouseEvent* event) void basic_mouse_handler::MouseMove(QMouseEvent* event)

View File

@ -20,8 +20,8 @@ public:
void Init(const u32 max_connect) override; void Init(const u32 max_connect) override;
void SetTargetWindow(QWindow* target); void SetTargetWindow(QWindow* target);
void MouseButtonDown(QMouseEvent* event); void Key(QKeyEvent* event, bool pressed);
void MouseButtonUp(QMouseEvent* event); void MouseButton(QMouseEvent* event, bool pressed);
void MouseScroll(QWheelEvent* event); void MouseScroll(QWheelEvent* event);
void MouseMove(QMouseEvent* event); void MouseMove(QMouseEvent* event);
@ -29,8 +29,14 @@ public:
private: private:
void reload_config(); void reload_config();
bool get_mouse_lock_state() const; bool get_mouse_lock_state() const;
static int get_mouse_button(const cfg::string& button);
struct mouse_button
{
int code = Qt::MouseButton::NoButton;
bool is_key = false;
};
static mouse_button get_mouse_button(const cfg::string& button);
QWindow* m_target = nullptr; QWindow* m_target = nullptr;
std::map<u8, int> m_buttons; std::map<u8, mouse_button> m_buttons;
}; };

View File

@ -190,6 +190,26 @@ void basic_mouse_settings_dialog::on_button_click(int id)
m_remap_timer.start(1000); m_remap_timer.start(1000);
} }
void basic_mouse_settings_dialog::keyPressEvent(QKeyEvent* event)
{
if (m_button_id < 0)
{
// We are not remapping a button, so pass the event to the base class.
QDialog::keyPressEvent(event);
return;
}
const std::string name = keyboard_pad_handler::GetKeyName(event, false);
g_cfg_mouse.get_button(m_button_id).from_string(name);
if (auto button = m_buttons->button(m_button_id))
{
button->setText(QString::fromStdString(name));
}
reactivate_buttons();
}
void basic_mouse_settings_dialog::mouseReleaseEvent(QMouseEvent* event) void basic_mouse_settings_dialog::mouseReleaseEvent(QMouseEvent* event)
{ {
if (m_button_id < 0) if (m_button_id < 0)

View File

@ -39,6 +39,7 @@ private:
QTimer m_remap_timer; QTimer m_remap_timer;
protected: protected:
void keyPressEvent(QKeyEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override;
bool eventFilter(QObject* object, QEvent* event) override; bool eventFilter(QObject* object, QEvent* event) override;
}; };