2015-05-24 06:55:12 +02:00
|
|
|
// Copyright 2015 Dolphin Emulator Project
|
2015-05-18 01:08:10 +02:00
|
|
|
// Licensed under GPLv2+
|
2015-01-27 12:24:47 +11:00
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
2015-05-08 17:28:03 -04:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
2015-09-28 10:57:16 -05:00
|
|
|
#include "Common/Common.h"
|
2015-01-27 12:24:47 +11:00
|
|
|
#include "Core/ConfigManager.h"
|
|
|
|
#include "Core/HotkeyManager.h"
|
2015-10-25 22:28:15 -04:00
|
|
|
#include "InputCommon/GCPadStatus.h"
|
2015-01-27 12:24:47 +11:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
const std::string hotkey_labels[] = {
|
|
|
|
_trans("Open"),
|
|
|
|
_trans("Change Disc"),
|
|
|
|
_trans("Refresh List"),
|
|
|
|
|
|
|
|
_trans("Toggle Pause"),
|
|
|
|
_trans("Stop"),
|
|
|
|
_trans("Reset"),
|
|
|
|
_trans("Frame Advance"),
|
|
|
|
_trans("Frame Advance Decrease Speed"),
|
|
|
|
_trans("Frame Advance Increase Speed"),
|
|
|
|
_trans("Frame Advance Reset Speed"),
|
|
|
|
|
|
|
|
_trans("Start Recording"),
|
|
|
|
_trans("Play Recording"),
|
|
|
|
_trans("Export Recording"),
|
|
|
|
_trans("Read-only mode"),
|
|
|
|
|
|
|
|
_trans("Toggle Fullscreen"),
|
|
|
|
_trans("Take Screenshot"),
|
|
|
|
_trans("Exit"),
|
|
|
|
|
2016-08-23 16:19:30 +02:00
|
|
|
_trans("Press Sync Button"),
|
2016-06-24 10:43:46 +02:00
|
|
|
_trans("Connect Wiimote 1"),
|
|
|
|
_trans("Connect Wiimote 2"),
|
|
|
|
_trans("Connect Wiimote 3"),
|
|
|
|
_trans("Connect Wiimote 4"),
|
|
|
|
_trans("Connect Balance Board"),
|
|
|
|
|
|
|
|
_trans("Volume Down"),
|
|
|
|
_trans("Volume Up"),
|
|
|
|
_trans("Volume Toggle Mute"),
|
|
|
|
|
|
|
|
_trans("Increase IR"),
|
|
|
|
_trans("Decrease IR"),
|
|
|
|
|
|
|
|
_trans("Toggle Crop"),
|
|
|
|
_trans("Toggle Aspect Ratio"),
|
|
|
|
_trans("Toggle EFB Copies"),
|
|
|
|
_trans("Toggle Fog"),
|
|
|
|
_trans("Disable Emulation Speed Limit"),
|
2016-08-19 23:14:56 -05:00
|
|
|
_trans("Toggle Custom Textures"),
|
2016-06-24 10:43:46 +02:00
|
|
|
_trans("Decrease Emulation Speed"),
|
|
|
|
_trans("Increase Emulation Speed"),
|
|
|
|
|
|
|
|
_trans("Freelook Decrease Speed"),
|
|
|
|
_trans("Freelook Increase Speed"),
|
|
|
|
_trans("Freelook Reset Speed"),
|
|
|
|
_trans("Freelook Move Up"),
|
|
|
|
_trans("Freelook Move Down"),
|
|
|
|
_trans("Freelook Move Left"),
|
|
|
|
_trans("Freelook Move Right"),
|
|
|
|
_trans("Freelook Zoom In"),
|
|
|
|
_trans("Freelook Zoom Out"),
|
|
|
|
_trans("Freelook Reset"),
|
|
|
|
|
|
|
|
_trans("Toggle 3D Side-by-side"),
|
|
|
|
_trans("Toggle 3D Top-bottom"),
|
|
|
|
_trans("Toggle 3D Anaglyph"),
|
|
|
|
_trans("Toggle 3D Vision"),
|
|
|
|
|
|
|
|
_trans("Decrease Depth"),
|
|
|
|
_trans("Increase Depth"),
|
|
|
|
_trans("Decrease Convergence"),
|
|
|
|
_trans("Increase Convergence"),
|
|
|
|
|
|
|
|
_trans("Load State Slot 1"),
|
|
|
|
_trans("Load State Slot 2"),
|
|
|
|
_trans("Load State Slot 3"),
|
|
|
|
_trans("Load State Slot 4"),
|
|
|
|
_trans("Load State Slot 5"),
|
|
|
|
_trans("Load State Slot 6"),
|
|
|
|
_trans("Load State Slot 7"),
|
|
|
|
_trans("Load State Slot 8"),
|
|
|
|
_trans("Load State Slot 9"),
|
|
|
|
_trans("Load State Slot 10"),
|
|
|
|
|
|
|
|
_trans("Save State Slot 1"),
|
|
|
|
_trans("Save State Slot 2"),
|
|
|
|
_trans("Save State Slot 3"),
|
|
|
|
_trans("Save State Slot 4"),
|
|
|
|
_trans("Save State Slot 5"),
|
|
|
|
_trans("Save State Slot 6"),
|
|
|
|
_trans("Save State Slot 7"),
|
|
|
|
_trans("Save State Slot 8"),
|
|
|
|
_trans("Save State Slot 9"),
|
|
|
|
_trans("Save State Slot 10"),
|
|
|
|
|
|
|
|
_trans("Select State Slot 1"),
|
|
|
|
_trans("Select State Slot 2"),
|
|
|
|
_trans("Select State Slot 3"),
|
|
|
|
_trans("Select State Slot 4"),
|
|
|
|
_trans("Select State Slot 5"),
|
|
|
|
_trans("Select State Slot 6"),
|
|
|
|
_trans("Select State Slot 7"),
|
|
|
|
_trans("Select State Slot 8"),
|
|
|
|
_trans("Select State Slot 9"),
|
|
|
|
_trans("Select State Slot 10"),
|
|
|
|
|
|
|
|
_trans("Save to selected slot"),
|
|
|
|
_trans("Load from selected slot"),
|
|
|
|
|
|
|
|
_trans("Load State Last 1"),
|
|
|
|
_trans("Load State Last 2"),
|
|
|
|
_trans("Load State Last 3"),
|
|
|
|
_trans("Load State Last 4"),
|
|
|
|
_trans("Load State Last 5"),
|
|
|
|
_trans("Load State Last 6"),
|
|
|
|
_trans("Load State Last 7"),
|
|
|
|
_trans("Load State Last 8"),
|
|
|
|
_trans("Load State Last 9"),
|
|
|
|
_trans("Load State Last 10"),
|
|
|
|
|
|
|
|
_trans("Save Oldest State"),
|
|
|
|
_trans("Undo Load State"),
|
|
|
|
_trans("Undo Save State"),
|
|
|
|
_trans("Save State"),
|
|
|
|
_trans("Load State"),
|
2015-01-27 12:24:47 +11:00
|
|
|
};
|
2016-06-24 10:43:46 +02:00
|
|
|
static_assert(NUM_HOTKEYS == sizeof(hotkey_labels) / sizeof(hotkey_labels[0]),
|
|
|
|
"Wrong count of hotkey_labels");
|
2015-01-27 12:24:47 +11:00
|
|
|
|
|
|
|
namespace HotkeyManagerEmu
|
|
|
|
{
|
2015-06-11 22:20:44 +02:00
|
|
|
static u32 s_hotkeyDown[(NUM_HOTKEYS + 31) / 32];
|
2015-03-23 08:40:18 -04:00
|
|
|
static HotkeyStatus s_hotkey;
|
|
|
|
static bool s_enabled;
|
2015-02-04 20:19:16 +01:00
|
|
|
|
2015-03-23 08:40:18 -04:00
|
|
|
static InputConfig s_config("Hotkeys", _trans("Hotkeys"), "Hotkeys");
|
2015-03-05 19:49:10 +11:00
|
|
|
|
2015-01-27 12:24:47 +11:00
|
|
|
InputConfig* GetConfig()
|
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
return &s_config;
|
2015-01-27 12:24:47 +11:00
|
|
|
}
|
|
|
|
|
2015-03-01 07:43:34 +11:00
|
|
|
void GetStatus()
|
2015-01-27 12:24:47 +11:00
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
s_hotkey.err = PAD_ERR_NONE;
|
2015-01-27 12:24:47 +11:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
// Get input
|
|
|
|
static_cast<HotkeyManager*>(s_config.GetController(0))->GetInput(&s_hotkey);
|
2015-03-01 07:43:34 +11:00
|
|
|
}
|
|
|
|
|
2015-03-05 19:49:10 +11:00
|
|
|
bool IsEnabled()
|
2015-03-01 07:43:34 +11:00
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
return s_enabled;
|
2015-03-05 19:49:10 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
void Enable(bool enable_toggle)
|
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
s_enabled = enable_toggle;
|
2015-01-27 12:24:47 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
bool IsPressed(int Id, bool held)
|
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
unsigned int set = Id / 32;
|
|
|
|
unsigned int setKey = Id % 32;
|
|
|
|
if (s_hotkey.button[set] & (1 << setKey))
|
|
|
|
{
|
|
|
|
bool pressed = !!(s_hotkeyDown[set] & (1 << setKey));
|
|
|
|
s_hotkeyDown[set] |= (1 << setKey);
|
|
|
|
if (!pressed || held)
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
s_hotkeyDown[set] &= ~(1 << setKey);
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
2015-01-27 12:24:47 +11:00
|
|
|
}
|
|
|
|
|
2016-10-11 12:54:35 -07:00
|
|
|
void Initialize()
|
2015-01-27 12:24:47 +11:00
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
if (s_config.ControllersNeedToBeCreated())
|
|
|
|
s_config.CreateController<HotkeyManager>();
|
2015-01-27 12:24:47 +11:00
|
|
|
|
2016-06-13 11:11:47 +02:00
|
|
|
g_controller_interface.RegisterHotplugCallback(LoadConfig);
|
2015-01-27 12:24:47 +11:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
// load the saved controller config
|
|
|
|
s_config.LoadConfig(true);
|
2015-01-27 12:24:47 +11:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
for (u32& key : s_hotkeyDown)
|
|
|
|
key = 0;
|
2015-03-05 19:49:10 +11:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
s_enabled = true;
|
2015-03-05 19:49:10 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
void LoadConfig()
|
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
s_config.LoadConfig(true);
|
2015-01-27 12:24:47 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
void Shutdown()
|
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
s_config.ClearControllers();
|
2015-01-27 12:24:47 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
HotkeyManager::HotkeyManager()
|
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
for (int key = 0; key < NUM_HOTKEYS; key++)
|
|
|
|
{
|
|
|
|
int set = key / 32;
|
2015-06-11 22:20:44 +02:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
if (key % 32 == 0)
|
|
|
|
groups.emplace_back(m_keys[set] = new Buttons(_trans("Keys")));
|
2015-01-27 12:24:47 +11:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
m_keys[set]->controls.emplace_back(new ControlGroup::Input(hotkey_labels[key]));
|
|
|
|
}
|
2015-01-27 12:24:47 +11:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
groups.emplace_back(m_options = new ControlGroup(_trans("Options")));
|
2016-07-11 19:35:32 +02:00
|
|
|
m_options->boolean_settings.emplace_back(
|
|
|
|
std::make_unique<ControlGroup::BackgroundInputSetting>(_trans("Background Input")));
|
|
|
|
m_options->boolean_settings.emplace_back(std::make_unique<ControlGroup::BooleanSetting>(
|
|
|
|
_trans("Iterative Input"), false, ControlGroup::SettingType::VIRTUAL));
|
2015-01-27 12:24:47 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
HotkeyManager::~HotkeyManager()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string HotkeyManager::GetName() const
|
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
return std::string("Hotkeys") + char('1' + 0);
|
2015-01-27 12:24:47 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
void HotkeyManager::GetInput(HotkeyStatus* const kb)
|
|
|
|
{
|
2016-07-14 17:45:59 +02:00
|
|
|
auto lock = ControllerEmu::GetStateLock();
|
2016-06-24 10:43:46 +02:00
|
|
|
for (int set = 0; set < (NUM_HOTKEYS + 31) / 32; set++)
|
|
|
|
{
|
|
|
|
std::vector<u32> bitmasks;
|
|
|
|
for (int key = 0; key < std::min(32, NUM_HOTKEYS - set * 32); key++)
|
|
|
|
bitmasks.push_back(1 << key);
|
|
|
|
|
|
|
|
kb->button[set] = 0;
|
|
|
|
m_keys[set]->GetState(&kb->button[set], bitmasks.data());
|
|
|
|
}
|
2015-01-27 12:24:47 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
void HotkeyManager::LoadDefaults(const ControllerInterface& ciface)
|
|
|
|
{
|
2016-06-24 10:43:46 +02:00
|
|
|
ControllerEmu::LoadDefaults(ciface);
|
2015-06-02 09:42:30 +02:00
|
|
|
|
|
|
|
#ifdef _WIN32
|
2016-06-24 10:43:46 +02:00
|
|
|
const std::string NON = "(!(LMENU | RMENU) & !(LSHIFT | RSHIFT) & !(LCONTROL | RCONTROL))";
|
|
|
|
const std::string ALT = "((LMENU | RMENU) & !(LSHIFT | RSHIFT) & !(LCONTROL | RCONTROL))";
|
|
|
|
const std::string SHIFT = "(!(LMENU | RMENU) & (LSHIFT | RSHIFT) & !(LCONTROL | RCONTROL))";
|
|
|
|
const std::string CTRL = "(!(LMENU | RMENU) & !(LSHIFT | RSHIFT) & (LCONTROL | RCONTROL))";
|
2015-06-02 09:42:30 +02:00
|
|
|
#else
|
2016-06-24 10:43:46 +02:00
|
|
|
const std::string NON = "(!`Alt_L` & !(`Shift_L` | `Shift_R`) & !(`Control_L` | `Control_R` ))";
|
|
|
|
const std::string ALT = "(`Alt_L` & !(`Shift_L` | `Shift_R`) & !(`Control_L` | `Control_R` ))";
|
|
|
|
const std::string SHIFT = "(!`Alt_L` & (`Shift_L` | `Shift_R`) & !(`Control_L` | `Control_R` ))";
|
|
|
|
const std::string CTRL = "(!`Alt_L` & !(`Shift_L` | `Shift_R`) & (`Control_L` | `Control_R` ))";
|
2015-06-02 09:42:30 +02:00
|
|
|
#endif
|
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
auto set_key_expression = [this](int index, const std::string& expression) {
|
|
|
|
m_keys[index / 32]->controls[index % 32]->control_ref->expression = expression;
|
|
|
|
};
|
2015-06-02 09:42:30 +02:00
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
// General hotkeys
|
|
|
|
set_key_expression(HK_OPEN, CTRL + " & O");
|
|
|
|
set_key_expression(HK_PLAY_PAUSE, "`F10`");
|
2015-06-02 09:42:30 +02:00
|
|
|
#ifdef _WIN32
|
2016-06-24 10:43:46 +02:00
|
|
|
set_key_expression(HK_STOP, "ESCAPE");
|
|
|
|
set_key_expression(HK_FULLSCREEN, ALT + " & RETURN");
|
2015-06-02 09:42:30 +02:00
|
|
|
#else
|
2016-06-24 10:43:46 +02:00
|
|
|
set_key_expression(HK_STOP, "Escape");
|
|
|
|
set_key_expression(HK_FULLSCREEN, ALT + " & Return");
|
2015-06-02 09:42:30 +02:00
|
|
|
#endif
|
2016-06-24 10:43:46 +02:00
|
|
|
set_key_expression(HK_SCREENSHOT, NON + " & `F9`");
|
|
|
|
set_key_expression(HK_WIIMOTE1_CONNECT, ALT + " & `F5`");
|
|
|
|
set_key_expression(HK_WIIMOTE2_CONNECT, ALT + " & `F6`");
|
|
|
|
set_key_expression(HK_WIIMOTE3_CONNECT, ALT + " & `F7`");
|
|
|
|
set_key_expression(HK_WIIMOTE4_CONNECT, ALT + " & `F8`");
|
|
|
|
set_key_expression(HK_BALANCEBOARD_CONNECT, ALT + " & `F9`");
|
2015-06-02 09:42:30 +02:00
|
|
|
#ifdef _WIN32
|
2016-06-24 10:43:46 +02:00
|
|
|
set_key_expression(HK_TOGGLE_THROTTLE, "TAB");
|
2015-06-02 09:42:30 +02:00
|
|
|
#else
|
2016-06-24 10:43:46 +02:00
|
|
|
set_key_expression(HK_TOGGLE_THROTTLE, "Tab");
|
2015-06-02 09:42:30 +02:00
|
|
|
#endif
|
|
|
|
|
2016-06-24 10:43:46 +02:00
|
|
|
// Freelook
|
|
|
|
set_key_expression(HK_FREELOOK_DECREASE_SPEED, SHIFT + " & `1`");
|
|
|
|
set_key_expression(HK_FREELOOK_INCREASE_SPEED, SHIFT + " & `2`");
|
|
|
|
set_key_expression(HK_FREELOOK_RESET_SPEED, SHIFT + " & F");
|
|
|
|
set_key_expression(HK_FREELOOK_UP, SHIFT + " & E");
|
|
|
|
set_key_expression(HK_FREELOOK_DOWN, SHIFT + " & Q");
|
|
|
|
set_key_expression(HK_FREELOOK_LEFT, SHIFT + " & A");
|
|
|
|
set_key_expression(HK_FREELOOK_RIGHT, SHIFT + " & D");
|
|
|
|
set_key_expression(HK_FREELOOK_ZOOM_IN, SHIFT + " & W");
|
|
|
|
set_key_expression(HK_FREELOOK_ZOOM_OUT, SHIFT + " & S");
|
|
|
|
set_key_expression(HK_FREELOOK_RESET, SHIFT + " & R");
|
|
|
|
|
|
|
|
// Savestates
|
|
|
|
for (int i = 0; i < 8; i++)
|
|
|
|
{
|
|
|
|
set_key_expression(HK_LOAD_STATE_SLOT_1 + i,
|
|
|
|
StringFromFormat((NON + " & `F%d`").c_str(), i + 1));
|
|
|
|
set_key_expression(HK_SAVE_STATE_SLOT_1 + i,
|
|
|
|
StringFromFormat((SHIFT + " & `F%d`").c_str(), i + 1));
|
|
|
|
}
|
|
|
|
set_key_expression(HK_UNDO_LOAD_STATE, NON + " & `F12`");
|
|
|
|
set_key_expression(HK_UNDO_SAVE_STATE, SHIFT + " & `F12`");
|
2015-01-27 12:24:47 +11:00
|
|
|
}
|