@@ -67,12 +67,12 @@ public: | |||
m_timer = -1.0f; | |||
mode = 0; | |||
m_controller = new Controller("Default"); | |||
m_controller->GetKey(KEY_ESC).Bind("Keyboard", "Escape"); | |||
m_controller->GetKey(KEY_PUSH).Bind("Keyboard", "p"); | |||
m_controller->GetKey(KEY_POP).Bind("Keyboard", "o"); | |||
m_controller->GetKey(KEY_F1).Bind("Keyboard", "F1"); | |||
m_controller->GetKey(KEY_F2).Bind("Keyboard", "F2"); | |||
m_controller->GetKey(KEY_F3).Bind("Keyboard", "F3"); | |||
m_controller->GetKey(KEY_ESC).Bind(g_name_keyboard, "Escape"); | |||
m_controller->GetKey(KEY_PUSH).Bind(g_name_keyboard, "p"); | |||
m_controller->GetKey(KEY_POP).Bind(g_name_keyboard, "o"); | |||
m_controller->GetKey(KEY_F1).Bind(g_name_keyboard, "F1"); | |||
m_controller->GetKey(KEY_F2).Bind(g_name_keyboard, "F2"); | |||
m_controller->GetKey(KEY_F3).Bind(g_name_keyboard, "F3"); | |||
} | |||
virtual void tick_game(float seconds) | |||
@@ -113,7 +113,7 @@ | |||
#endif | |||
#ifdef LOL_FEATURE_CXX17_ATTRIBUTE_FALLTHROUGH | |||
# define LOL_ATTR_FALLTHROUGH [[fallthrough]] | |||
# define LOL_ATTR_FALLTHROUGH [[fallthrough]]; | |||
#else | |||
# define LOL_ATTR_FALLTHROUGH /* */ | |||
#endif | |||
@@ -275,7 +275,7 @@ template<> real::Real(char const *str) | |||
finished = true; | |||
break; | |||
} | |||
LOL_ATTR_FALLTHROUGH; | |||
LOL_ATTR_FALLTHROUGH | |||
case 'a': case 'b': case 'c': case 'd': case 'f': | |||
case 'A': case 'B': case 'C': case 'D': case 'F': | |||
case '0': case '1': case '2': case '3': case '4': | |||
@@ -241,13 +241,15 @@ void gui::tick_game(float seconds) | |||
for (input::key k : input::all_keys()) | |||
io.KeysDown[(int)k] = m_controller->IsKeyPressed((int)k); | |||
keyboard->SetTextInputActive(io.WantTextInput); | |||
//Update text input | |||
std::string text = keyboard->GetText(); | |||
//text.case_change(io.KeyShift); | |||
for (auto ch : text) | |||
io.AddInputCharacter(ch); | |||
// Update text input | |||
if (io.WantTextInput) | |||
{ | |||
std::string text = keyboard->text(); | |||
//text.case_change(io.KeyShift); | |||
for (auto ch : text) | |||
io.AddInputCharacter(ch); | |||
} | |||
keyboard->capture_text(io.WantTextInput); | |||
// Update mouse | |||
vec2 cursor = mouse->GetCursor(0); | |||
@@ -22,6 +22,14 @@ | |||
namespace lol | |||
{ | |||
const std::string g_name_mouse("mouse"); | |||
const std::string g_name_keyboard("keyboard"); | |||
std::string g_name_joystick(const uint64_t num) | |||
{ | |||
return format("joystick%d", (int)num); | |||
} | |||
std::shared_ptr<input> input::get() | |||
{ | |||
static auto instance = new input(); | |||
@@ -91,27 +99,19 @@ input::key input::name_to_key(std::string const &name) | |||
array<InputDevice*> InputDevice::devices; | |||
array<std::string> InputDevice::GetAvailableDevices() | |||
{ | |||
array<std::string> result; | |||
for (auto const &device : devices) | |||
result.push(device->m_name); | |||
return result; | |||
} | |||
std::string InputDevice::GetText() | |||
std::string InputDevice::text() | |||
{ | |||
std::string ret = m_text; | |||
m_text = ""; | |||
return ret; | |||
} | |||
bool InputDevice::IsTextInputActive() | |||
bool InputDevice::capture_text() | |||
{ | |||
return m_input_active; | |||
} | |||
void InputDevice::SetTextInputActive(bool status) | |||
void InputDevice::capture_text(bool status) | |||
{ | |||
m_input_active = status; | |||
} | |||
@@ -20,13 +20,9 @@ | |||
namespace lol | |||
{ | |||
const std::string g_name_mouse("Mouse"); | |||
const std::string g_name_keyboard("Keyboard"); | |||
static std::string g_name_joystick(const uint64_t num) | |||
{ | |||
return format("Joystick%d", (int)num); | |||
} | |||
extern const std::string g_name_mouse; | |||
extern const std::string g_name_keyboard; | |||
extern std::string g_name_joystick(const uint64_t num); | |||
// Mouse default buttons/axis | |||
const std::string g_name_mouse_key_left("Left"); | |||
@@ -86,6 +82,10 @@ public: | |||
return GetItemIndex(name, m_cursor_names); | |||
} | |||
// | |||
// Keyboard-specific section | |||
// | |||
/** Get the names of all available keys on this device */ | |||
std::vector<std::string> const& key_names() const { return m_key_names; } | |||
@@ -97,9 +97,12 @@ public: | |||
bool key(ptrdiff_t index) const { return m_keys[index]; } | |||
/** Gets the latest contents of text input. */ | |||
std::string GetText(); | |||
bool IsTextInputActive(); | |||
void SetTextInputActive(bool status); | |||
std::string text(); | |||
bool capture_text(); | |||
void capture_text(bool status); | |||
/** Gets the current value of the given axis. Devices should try to | |||
* clamp this value between -1 and 1, though it is not guaranteed. */ | |||
@@ -149,9 +152,6 @@ public: | |||
return m_cursor_names; | |||
} | |||
/** Gets a list of the name of all available input devices */ | |||
static array<std::string> GetAvailableDevices(); | |||
/** Gets an input device by its name */ | |||
static InputDevice* Get(std::string const &name) | |||
{ | |||
@@ -39,37 +39,6 @@ | |||
namespace lol | |||
{ | |||
//------------------------------------------------------------------------- | |||
/* DEBUG STUFF | |||
static String ScanCodeToText(int sc) | |||
{ | |||
switch (sc) | |||
{ | |||
#define _SC(id, str, name) \ | |||
case id: return String(str); | |||
#include "ui/keys.inc" | |||
default: | |||
msg::error("ScanCodeToText unknown scancode %0d\n", sc); | |||
} | |||
return String(); | |||
} | |||
*/ | |||
//------------------------------------------------------------------------- | |||
/* DEBUG STUFF | |||
static String ScanCodeToName(int sc) | |||
{ | |||
switch (sc) | |||
{ | |||
#define _SC(id, str, name) \ | |||
case id: return String(#name); | |||
#include "ui/keys.inc" | |||
default: | |||
msg::error("ScanCodeToText unknown scancode %0d\n", sc); | |||
} | |||
return String(); | |||
} | |||
*/ | |||
/* | |||
* Public SdlInput class | |||
*/ | |||
@@ -179,7 +148,7 @@ void SdlInput::tick(float seconds) | |||
mouse->internal_set_axis(4, 0); | |||
if (keyboard->IsTextInputActive()) | |||
if (keyboard->capture_text()) | |||
SDL_StartTextInput(); | |||
else | |||
SDL_StopTextInput(); | |||
@@ -219,12 +188,8 @@ void SdlInput::tick(float seconds) | |||
break; | |||
} | |||
keyboard->internal_set_key(sc2, !keyboard->key((int)sc2)); | |||
/* DEBUG STUFF | |||
msg::debug("Repeat: 0x%02x : %s/%s/%s/%i\n", | |||
(int)keyboard, ScanCodeToText(sc2).C(), ScanCodeToName(sc2).C(), | |||
keyboard->GetKey(sc2) ? "up" : "down", event.key.repeat); | |||
*/ | |||
} | |||
LOL_ATTR_FALLTHROUGH | |||
default: | |||
// Set key updates the corresponding key | |||
keyboard->internal_set_key(sc, event.type == SDL_KEYDOWN); | |||
@@ -298,7 +263,7 @@ void SdlInput::tick(float seconds) | |||
//We need the max if we want coherent mouse speed between axis | |||
float max_screen_size = lol::max(m_screen.x, m_screen.y); | |||
vec2 vmouse = vec2(mouse_pos); | |||
vec2 vprevmouse = vec2(m_prevmouse); | |||
vec2 vprevmouse = vec2(m_prev_mouse_pos); | |||
mouse->SetCursor(0, vmouse / m_app, mouse_pos); | |||
// Note: 100.0f is an arbitrary value that makes it feel about the same than an xbox controller joystick | |||
mouse->internal_set_axis(0, (mouse_pos.x - vprevmouse.x) * MOUSE_SPEED_MOD / max_screen_size); | |||
@@ -315,7 +280,7 @@ void SdlInput::tick(float seconds) | |||
//SDL_WarpMouse((uint16_t)mouse_pos.x, (uint16_t)mouse_pos.y); | |||
} | |||
m_prevmouse = mouse_pos; | |||
m_prev_mouse_pos = mouse_pos; | |||
#else | |||
UNUSED(seconds); | |||
@@ -48,7 +48,7 @@ private: | |||
array<SDL_Joystick *, class InputDevice *> m_joysticks; | |||
ivec2 m_prevmouse = ivec2::zero; | |||
ivec2 m_prev_mouse_pos = ivec2::zero; | |||
vec2 m_app; | |||
vec2 m_screen; | |||