KEYMAPPER: Remove DefaultEventMapper
Now the keymapper is enabled by default, it does not make sense to have a separate class anymore.
This commit is contained in:
parent
d2f09a4bfc
commit
ec9c394787
6 changed files with 115 additions and 161 deletions
|
@ -33,12 +33,14 @@ namespace Common {
|
||||||
static const uint32 kDelayKeyboardEventMillis = 250;
|
static const uint32 kDelayKeyboardEventMillis = 250;
|
||||||
static const uint32 kDelayMouseEventMillis = 50;
|
static const uint32 kDelayMouseEventMillis = 50;
|
||||||
|
|
||||||
Keymapper::Keymapper(EventManager *evtMgr) :
|
Keymapper::Keymapper(EventManager *eventMan) :
|
||||||
_eventMan(evtMgr),
|
_eventMan(eventMan),
|
||||||
_enabled(true),
|
_enabled(true),
|
||||||
_enabledKeymapType(Keymap::kKeymapTypeGlobal),
|
_enabledKeymapType(Keymap::kKeymapTypeGlobal),
|
||||||
_hardwareInputs(nullptr),
|
_hardwareInputs(nullptr),
|
||||||
_backendDefaultBindings(nullptr) {
|
_backendDefaultBindings(nullptr),
|
||||||
|
_delayedEventSource(new DelayedEventSource()) {
|
||||||
|
_eventMan->getEventDispatcher()->registerSource(_delayedEventSource, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Keymapper::~Keymapper() {
|
Keymapper::~Keymapper() {
|
||||||
|
@ -138,12 +140,18 @@ void Keymapper::setEnabledKeymapType(Keymap::KeymapType type) {
|
||||||
|
|
||||||
List<Event> Keymapper::mapEvent(const Event &ev) {
|
List<Event> Keymapper::mapEvent(const Event &ev) {
|
||||||
if (!_enabled) {
|
if (!_enabled) {
|
||||||
return DefaultEventMapper::mapEvent(ev);
|
List<Event> originalEvent;
|
||||||
|
originalEvent.push_back(ev);
|
||||||
|
return originalEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hardcodedEventMapping(ev);
|
||||||
|
|
||||||
const HardwareInput *hwInput = findHardwareInput(ev);
|
const HardwareInput *hwInput = findHardwareInput(ev);
|
||||||
if (!hwInput) {
|
if (!hwInput) {
|
||||||
return DefaultEventMapper::mapEvent(ev);
|
List<Event> originalEvent;
|
||||||
|
originalEvent.push_back(ev);
|
||||||
|
return originalEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
IncomingEventType incomingEventType = convertToIncomingEventType(ev);
|
IncomingEventType incomingEventType = convertToIncomingEventType(ev);
|
||||||
|
@ -173,7 +181,8 @@ List<Event> Keymapper::mapEvent(const Event &ev) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mappedEvents.empty()) {
|
if (mappedEvents.empty()) {
|
||||||
return DefaultEventMapper::mapEvent(ev);
|
// if it didn't get mapped, just pass it through
|
||||||
|
mappedEvents.push_back(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mappedEvents;
|
return mappedEvents;
|
||||||
|
@ -205,14 +214,14 @@ Event Keymapper::executeAction(const Action *action, IncomingEventType incomingT
|
||||||
if (incomingType == kIncomingEventInstant && convertedType != EVENT_INVALID) {
|
if (incomingType == kIncomingEventInstant && convertedType != EVENT_INVALID) {
|
||||||
// WORKAROUND: Delay the down events coming from non-key hardware events
|
// WORKAROUND: Delay the down events coming from non-key hardware events
|
||||||
// with a zero delay. This is to prevent DOWN1 DOWN2 UP1 UP2.
|
// with a zero delay. This is to prevent DOWN1 DOWN2 UP1 UP2.
|
||||||
addDelayedEvent(0, evt);
|
_delayedEventSource->scheduleEvent(evt, 0);
|
||||||
|
|
||||||
// non-keys need to send up as well
|
// non-keys need to send up as well
|
||||||
// WORKAROUND: Delay the up events coming from non-key hardware events
|
// WORKAROUND: Delay the up events coming from non-key hardware events
|
||||||
// This is for engines that run scripts that check on key being down
|
// This is for engines that run scripts that check on key being down
|
||||||
evt.type = convertedType;
|
evt.type = convertedType;
|
||||||
const uint32 delay = (convertedType == EVENT_KEYUP ? kDelayKeyboardEventMillis : kDelayMouseEventMillis);
|
const uint32 delay = (convertedType == EVENT_KEYUP ? kDelayKeyboardEventMillis : kDelayMouseEventMillis);
|
||||||
addDelayedEvent(delay, evt);
|
_delayedEventSource->scheduleEvent(evt, delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
return evt;
|
return evt;
|
||||||
|
@ -254,4 +263,69 @@ const HardwareInput *Keymapper::findHardwareInput(const Event &event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Keymapper::hardcodedEventMapping(Event ev) {
|
||||||
|
// TODO: Either add support for long presses to the keymapper
|
||||||
|
// or move this elsewhere as an event observer + source
|
||||||
|
#ifdef ENABLE_VKEYBD
|
||||||
|
// Trigger virtual keyboard on long press of more than 1 second
|
||||||
|
// of middle mouse button.
|
||||||
|
const uint32 vkeybdTime = 1000;
|
||||||
|
|
||||||
|
static uint32 vkeybdThen = 0;
|
||||||
|
|
||||||
|
if (ev.type == EVENT_MBUTTONDOWN) {
|
||||||
|
vkeybdThen = g_system->getMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ev.type == EVENT_MBUTTONUP) {
|
||||||
|
if ((g_system->getMillis() - vkeybdThen) >= vkeybdTime) {
|
||||||
|
Event vkeybdEvent;
|
||||||
|
vkeybdEvent.type = EVENT_VIRTUAL_KEYBOARD;
|
||||||
|
|
||||||
|
// Avoid blocking event from engine.
|
||||||
|
_delayedEventSource->scheduleEvent(vkeybdEvent, 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ev.type == EVENT_JOYBUTTON_DOWN) {
|
||||||
|
if (ev.joystick.button == JOYSTICK_BUTTON_START || ev.joystick.button == JOYSTICK_BUTTON_GUIDE) {
|
||||||
|
ev.type = EVENT_MAINMENU;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DelayedEventSource::scheduleEvent(const Event &ev, uint32 delayMillis) {
|
||||||
|
if (_delayedEvents.empty()) {
|
||||||
|
_delayedEffectiveTime = g_system->getMillis() + delayMillis;
|
||||||
|
delayMillis = 0;
|
||||||
|
}
|
||||||
|
DelayedEventsEntry entry = DelayedEventsEntry(delayMillis, ev);
|
||||||
|
_delayedEvents.push(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DelayedEventSource::pollEvent(Event &event) {
|
||||||
|
if (_delayedEvents.empty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 now = g_system->getMillis();
|
||||||
|
|
||||||
|
if (now >= _delayedEffectiveTime) {
|
||||||
|
event = _delayedEvents.pop().event;
|
||||||
|
|
||||||
|
if (!_delayedEvents.empty()) {
|
||||||
|
_delayedEffectiveTime += _delayedEvents.front().timerOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DelayedEventSource::allowMapping() const {
|
||||||
|
return false; // Events from this source have already been mapped, and should not be mapped again
|
||||||
|
}
|
||||||
|
|
||||||
} // End of namespace Common
|
} // End of namespace Common
|
||||||
|
|
|
@ -37,13 +37,14 @@ const char *const kGuiKeymapName = "gui";
|
||||||
const char *const kGlobalKeymapName = "global";
|
const char *const kGlobalKeymapName = "global";
|
||||||
|
|
||||||
class Action;
|
class Action;
|
||||||
|
class DelayedEventSource;
|
||||||
struct HardwareInput;
|
struct HardwareInput;
|
||||||
class HardwareInputSet;
|
class HardwareInputSet;
|
||||||
class KeymapperDefaultBindings;
|
class KeymapperDefaultBindings;
|
||||||
|
|
||||||
typedef Array<Keymap *> KeymapArray;
|
typedef Array<Keymap *> KeymapArray;
|
||||||
|
|
||||||
class Keymapper : public Common::DefaultEventMapper {
|
class Keymapper : public Common::EventMapper {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Keymapper(EventManager *eventMan);
|
Keymapper(EventManager *eventMan);
|
||||||
|
@ -125,6 +126,10 @@ public:
|
||||||
void initKeymap(Keymap *keymap, ConfigManager::Domain *domain);
|
void initKeymap(Keymap *keymap, ConfigManager::Domain *domain);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
EventManager *_eventMan;
|
||||||
|
HardwareInputSet *_hardwareInputs;
|
||||||
|
const KeymapperDefaultBindings *_backendDefaultBindings;
|
||||||
|
DelayedEventSource *_delayedEventSource;
|
||||||
|
|
||||||
enum IncomingEventType {
|
enum IncomingEventType {
|
||||||
kIncomingEventStart,
|
kIncomingEventStart,
|
||||||
|
@ -132,20 +137,38 @@ private:
|
||||||
kIncomingEventInstant
|
kIncomingEventInstant
|
||||||
};
|
};
|
||||||
|
|
||||||
HardwareInputSet *_hardwareInputs;
|
|
||||||
const KeymapperDefaultBindings *_backendDefaultBindings;
|
|
||||||
|
|
||||||
Event executeAction(const Action *act, IncomingEventType incomingType);
|
|
||||||
EventType convertStartToEnd(EventType eventType);
|
|
||||||
IncomingEventType convertToIncomingEventType(const Event &ev) const;
|
|
||||||
|
|
||||||
EventManager *_eventMan;
|
|
||||||
|
|
||||||
bool _enabled;
|
bool _enabled;
|
||||||
Keymap::KeymapType _enabledKeymapType;
|
Keymap::KeymapType _enabledKeymapType;
|
||||||
|
|
||||||
KeymapArray _keymaps;
|
KeymapArray _keymaps;
|
||||||
|
|
||||||
|
Event executeAction(const Action *act, IncomingEventType incomingType);
|
||||||
|
EventType convertStartToEnd(EventType eventType);
|
||||||
|
IncomingEventType convertToIncomingEventType(const Event &ev) const;
|
||||||
|
|
||||||
|
void hardcodedEventMapping(Event ev);
|
||||||
|
};
|
||||||
|
|
||||||
|
class DelayedEventSource : public EventSource {
|
||||||
|
public:
|
||||||
|
// EventSource API
|
||||||
|
bool pollEvent(Event &event) override;
|
||||||
|
bool allowMapping() const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule an event to be produced after the specified delay
|
||||||
|
*/
|
||||||
|
void scheduleEvent(const Event &ev, uint32 delayMillis);
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct DelayedEventsEntry {
|
||||||
|
const uint32 timerOffset;
|
||||||
|
const Event event;
|
||||||
|
DelayedEventsEntry(const uint32 offset, const Event ev) : timerOffset(offset), event(ev) { }
|
||||||
|
};
|
||||||
|
|
||||||
|
Queue<DelayedEventsEntry> _delayedEvents;
|
||||||
|
uint32 _delayedEffectiveTime;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // End of namespace Common
|
} // End of namespace Common
|
||||||
|
|
|
@ -72,12 +72,6 @@ void EventDispatcher::dispatch() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Event> delayedEvents = _mapper->getDelayedEvents();
|
|
||||||
for (List<Event>::iterator k = delayedEvents.begin(); k != delayedEvents.end(); ++k) {
|
|
||||||
const Event delayedEvent = *k;
|
|
||||||
dispatchEvent(delayedEvent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventDispatcher::clearEvents() {
|
void EventDispatcher::clearEvents() {
|
||||||
|
|
|
@ -1,115 +0,0 @@
|
||||||
/* ScummVM - Graphic Adventure Engine
|
|
||||||
*
|
|
||||||
* ScummVM is the legal property of its developers, whose names
|
|
||||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
||||||
* file distributed with this source distribution.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "common/events.h"
|
|
||||||
|
|
||||||
#include "common/system.h"
|
|
||||||
#include "common/textconsole.h"
|
|
||||||
|
|
||||||
namespace Common {
|
|
||||||
|
|
||||||
List<Event> DefaultEventMapper::mapEvent(const Event &ev) {
|
|
||||||
List<Event> events;
|
|
||||||
Event mappedEvent;
|
|
||||||
#ifdef ENABLE_VKEYBD
|
|
||||||
// Trigger virtual keyboard on long press of more than 1 second
|
|
||||||
// of middle mouse button.
|
|
||||||
const uint32 vkeybdTime = 1000;
|
|
||||||
|
|
||||||
static uint32 vkeybdThen = 0;
|
|
||||||
|
|
||||||
if (ev.type == EVENT_MBUTTONDOWN) {
|
|
||||||
vkeybdThen = g_system->getMillis();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ev.type == EVENT_MBUTTONUP) {
|
|
||||||
if ((g_system->getMillis() - vkeybdThen) >= vkeybdTime) {
|
|
||||||
mappedEvent.type = EVENT_VIRTUAL_KEYBOARD;
|
|
||||||
|
|
||||||
// Avoid blocking event from engine.
|
|
||||||
addDelayedEvent(100, ev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ev.type == EVENT_KEYDOWN) {
|
|
||||||
if (ev.kbd.hasFlags(KBD_CTRL) && ev.kbd.keycode == KEYCODE_F5) {
|
|
||||||
mappedEvent.type = EVENT_MAINMENU;
|
|
||||||
}
|
|
||||||
#ifdef ENABLE_VKEYBD
|
|
||||||
else if (ev.kbd.hasFlags(KBD_CTRL) && ev.kbd.keycode == KEYCODE_F7) {
|
|
||||||
mappedEvent.type = EVENT_VIRTUAL_KEYBOARD;
|
|
||||||
|
|
||||||
// Avoid blocking CTRL-F7 events from engine.
|
|
||||||
addDelayedEvent(100, ev);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ev.type == EVENT_JOYBUTTON_DOWN) {
|
|
||||||
if (ev.joystick.button == JOYSTICK_BUTTON_START || ev.joystick.button == JOYSTICK_BUTTON_GUIDE) {
|
|
||||||
mappedEvent.type = EVENT_MAINMENU;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if it didn't get mapped, just pass it through
|
|
||||||
if (mappedEvent.type == EVENT_INVALID)
|
|
||||||
mappedEvent = ev;
|
|
||||||
|
|
||||||
// TODO: this check is not needed post-split
|
|
||||||
if (mappedEvent.type == EVENT_CUSTOM_BACKEND_HARDWARE) {
|
|
||||||
warning("EVENT_CUSTOM_BACKEND_HARDWARE was not mapped");
|
|
||||||
return List<Event>();
|
|
||||||
}
|
|
||||||
|
|
||||||
events.push_back(mappedEvent);
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DefaultEventMapper::addDelayedEvent(uint32 millis, Event ev) {
|
|
||||||
if (_delayedEvents.empty()) {
|
|
||||||
_delayedEffectiveTime = g_system->getMillis() + millis;
|
|
||||||
millis = 0;
|
|
||||||
}
|
|
||||||
DelayedEventsEntry entry = DelayedEventsEntry(millis, ev);
|
|
||||||
_delayedEvents.push(entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Event> DefaultEventMapper::getDelayedEvents() {
|
|
||||||
List<Event> events;
|
|
||||||
|
|
||||||
if (_delayedEvents.empty())
|
|
||||||
return events;
|
|
||||||
|
|
||||||
uint32 now = g_system->getMillis();
|
|
||||||
|
|
||||||
while (!_delayedEvents.empty() && now >= _delayedEffectiveTime) {
|
|
||||||
DelayedEventsEntry entry = _delayedEvents.pop();
|
|
||||||
if (!_delayedEvents.empty())
|
|
||||||
_delayedEffectiveTime += _delayedEvents.front().timerOffset;
|
|
||||||
events.push_back(entry.event);
|
|
||||||
}
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Common
|
|
|
@ -283,27 +283,6 @@ public:
|
||||||
* Map an incoming event to one or more action events
|
* Map an incoming event to one or more action events
|
||||||
*/
|
*/
|
||||||
virtual List<Event> mapEvent(const Event &ev) = 0;
|
virtual List<Event> mapEvent(const Event &ev) = 0;
|
||||||
|
|
||||||
virtual List<Event> getDelayedEvents() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class DefaultEventMapper : public EventMapper {
|
|
||||||
public:
|
|
||||||
DefaultEventMapper() : _delayedEvents(), _delayedEffectiveTime(0) {}
|
|
||||||
// EventMapper interface
|
|
||||||
virtual List<Event> mapEvent(const Event &ev);
|
|
||||||
virtual List<Event> getDelayedEvents();
|
|
||||||
protected:
|
|
||||||
virtual void addDelayedEvent(uint32 millis, Event ev);
|
|
||||||
|
|
||||||
struct DelayedEventsEntry {
|
|
||||||
const uint32 timerOffset;
|
|
||||||
const Event event;
|
|
||||||
DelayedEventsEntry(const uint32 offset, const Event ev) : timerOffset(offset), event(ev) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
Queue<DelayedEventsEntry> _delayedEvents;
|
|
||||||
uint32 _delayedEffectiveTime;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -8,7 +8,6 @@ MODULE_OBJS := \
|
||||||
debug.o \
|
debug.o \
|
||||||
error.o \
|
error.o \
|
||||||
EventDispatcher.o \
|
EventDispatcher.o \
|
||||||
EventMapper.o \
|
|
||||||
file.o \
|
file.o \
|
||||||
fs.o \
|
fs.o \
|
||||||
gui_options.o \
|
gui_options.o \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue