Mesen-X/Libretro/LibretroKeyManager.h

145 lines
3.5 KiB
C
Raw Permalink Normal View History

2018-01-04 19:03:47 -05:00
#pragma once
#include "libretro.h"
#include "../Core/IKeyManager.h"
#include "../Core/KeyManager.h"
#include "../Core/FdsSystemActionManager.h"
#include "../Core/VsSystemActionManager.h"
#include "../Core/Console.h"
2018-01-04 19:03:47 -05:00
class LibretroKeyManager : public IKeyManager
{
private:
shared_ptr<Console> _console;
2018-01-04 23:09:07 -05:00
retro_input_state_t _getInputState = nullptr;
retro_input_poll_t _pollInput = nullptr;
2018-01-04 19:03:47 -05:00
bool _mouseButtons[3] = { false, false, false };
bool _wasPushed[16] = { };
bool ProcessAction(uint32_t button)
{
if(_getInputState(0, RETRO_DEVICE_JOYPAD, 0, button)) {
if(!_wasPushed[button]) {
//Newly pressed, process action
_wasPushed[button] = true;
return true;
}
} else {
_wasPushed[button] = false;
}
return false;
}
2018-01-04 19:03:47 -05:00
public:
LibretroKeyManager(shared_ptr<Console> console)
2018-01-04 19:03:47 -05:00
{
_console = console;
2018-01-04 19:03:47 -05:00
KeyManager::RegisterKeyManager(this);
}
~LibretroKeyManager()
{
KeyManager::RegisterKeyManager(nullptr);
}
2018-01-04 23:09:07 -05:00
void SetGetInputState(retro_input_state_t getInputState)
{
_getInputState = getInputState;
}
void SetPollInput(retro_input_poll_t pollInput)
{
_pollInput = pollInput;
}
2018-01-04 19:03:47 -05:00
// Inherited via IKeyManager
virtual void RefreshState() override
{
if(_pollInput) {
_pollInput();
}
2018-01-04 23:09:07 -05:00
if(_getInputState) {
int32_t x = _getInputState(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X);
int32_t y = _getInputState(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y);
x += 0x8000;
y += 0x8000;
KeyManager::SetMousePosition((double)x / 0x10000, (double)y / 0x10000);
int16_t dx = _getInputState(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
int16_t dy = _getInputState(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
KeyManager::SetMouseMovement(dx, dy);
_mouseButtons[(int)MouseButton::LeftButton] = _getInputState(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT) != 0;
_mouseButtons[(int)MouseButton::RightButton] = _getInputState(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT) != 0;
_mouseButtons[(int)MouseButton::MiddleButton] = _getInputState(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE) != 0;
shared_ptr<FdsSystemActionManager> fdsSam = _console->GetSystemActionManager<FdsSystemActionManager>();
2018-01-04 23:09:07 -05:00
if(fdsSam) {
if(ProcessAction(RETRO_DEVICE_ID_JOYPAD_L)) {
2018-01-04 23:09:07 -05:00
fdsSam->InsertNextDisk();
}
if(ProcessAction(RETRO_DEVICE_ID_JOYPAD_R)) {
2018-01-04 23:09:07 -05:00
fdsSam->SwitchDiskSide();
}
2018-01-04 19:03:47 -05:00
}
2018-01-04 23:09:07 -05:00
shared_ptr<VsSystemActionManager> vsSam = _console->GetSystemActionManager<VsSystemActionManager>();
2018-01-04 23:09:07 -05:00
if(vsSam) {
if(ProcessAction(RETRO_DEVICE_ID_JOYPAD_L2)) {
2018-01-04 23:09:07 -05:00
vsSam->InsertCoin(0);
}
if(ProcessAction(RETRO_DEVICE_ID_JOYPAD_R2)) {
2018-01-04 23:09:07 -05:00
vsSam->InsertCoin(1);
}
2018-01-04 19:03:47 -05:00
}
}
}
virtual bool IsKeyPressed(uint32_t keyCode) override
{
2018-01-04 23:09:07 -05:00
if(keyCode > 0 && _getInputState) {
2018-01-04 19:03:47 -05:00
return _getInputState(keyCode >> 8, RETRO_DEVICE_JOYPAD, 0, (keyCode - 1) & 0xFF) != 0;
} else {
return false;
}
}
virtual void UpdateDevices() override
{
}
virtual bool IsMouseButtonPressed(MouseButton button) override
{
return _mouseButtons[(int)button];
}
virtual vector<uint32_t> GetPressedKeys() override
{
return vector<uint32_t>();
}
virtual string GetKeyName(uint32_t keyCode) override
{
return string();
}
virtual uint32_t GetKeyCode(string keyName) override
{
return 0;
}
virtual void SetKeyState(uint16_t scanCode, bool state) override
{
}
virtual void ResetKeyState() override
{
}
virtual void SetDisabled(bool disabled) override
{
}
};