mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-29 22:20:48 +00:00
input: Allow mapping keys to basic mouse buttons
This commit is contained in:
parent
9407974c10
commit
7e03828f35
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user