Skip to content

Commit

Permalink
[SUTK] Added support for modifiers in on keyboard event
Browse files Browse the repository at this point in the history
  • Loading branch information
ravi688 committed Aug 9, 2024
1 parent dbdb0cc commit fdba7bc
Show file tree
Hide file tree
Showing 6 changed files with 106 additions and 6 deletions.
2 changes: 1 addition & 1 deletion dependencies/Common
29 changes: 28 additions & 1 deletion sutk/include/sutk/IInputDriver.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,33 @@

namespace SUTK
{
enum class ModifierKeyBits : u32
{
ShiftBit = BIT32(0),
CtrlBit = BIT32(1),
AltBit = BIT32(2),
WinBit = BIT32(3),
CapsLockBit = BIT32(4),
NumLockBit = BIT32(5)
};

struct ModifierKeys
{
ModifierKeyBits bits;

constexpr ModifierKeys(ModifierKeyBits _bits) noexcept : bits(_bits) { }

bool shift() const noexcept { return HAS_FLAG(bits, ModifierKeyBits::ShiftBit); }
bool ctrl() const noexcept { return HAS_FLAG(bits, ModifierKeyBits::CtrlBit); }
bool alt() const noexcept { return HAS_FLAG(bits, ModifierKeyBits::AltBit); }
bool win() const noexcept { return HAS_FLAG(bits, ModifierKeyBits::WinBit); }
bool capsLock() const noexcept { return HAS_FLAG(bits, ModifierKeyBits::CapsLockBit); }
bool numLock() const noexcept { return HAS_FLAG(bits, ModifierKeyBits::NumLockBit); }
};

std::ostream& operator <<(std::ostream& stream, ModifierKeys v);
std::ostream&& operator <<(std::ostream&& stream, ModifierKeys v);

enum class KeyCode
{
Undefined,
Expand Down Expand Up @@ -181,7 +208,7 @@ namespace SUTK
typedef com::Event<IInputDriver, Vec2Df> OnMouseMoveEvent;
typedef com::Event<IInputDriver, MouseButton, KeyEvent> OnMouseButtonEvent;
typedef com::Event<IInputDriver, Vec2Df> OnMouseScrollEvent;
typedef com::Event<IInputDriver, KeyCode, KeyEvent> OnKeyboardEvent;
typedef com::Event<IInputDriver, KeyCode, KeyEvent, ModifierKeys> OnKeyboardEvent;
typedef com::Event<IInputDriver, bool> OnMouseEnterExitEvent;
private:
OnMouseMoveEvent m_onCursorMoveEvent;
Expand Down
2 changes: 1 addition & 1 deletion sutk/include/sutk/InputEventHandlerObject.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ namespace SUTK
class KeyboardHandlerObject : public TInputEventHandlerObject<IInputDriver::OnKeyboardEvent>
{
protected:
virtual void onKey(KeyCode keycode, KeyEvent action) = 0;
virtual void onKey(KeyCode keycode, KeyEvent action, ModifierKeys modifiers) = 0;

KeyboardHandlerObject(UIDriver& driver) noexcept;

Expand Down
55 changes: 55 additions & 0 deletions sutk/source/IInputDriver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,61 @@

namespace SUTK
{

std::ostream&& operator <<(std::ostream&& stream, ModifierKeys v)
{
auto& _stream = operator <<(stream, v);
return std::move(_stream);
}

std::ostream& operator <<(std::ostream& stream, ModifierKeys v)
{
bool isPrev = false;
if(v.shift())
{
stream << "Shift";
isPrev = true;
}
if(v.ctrl())
{
if(isPrev)
stream << " | ";
stream << "Ctrl";
isPrev = true;
}
if(v.alt())
{
if(isPrev)
stream << " | ";
stream << "Atl";
isPrev = true;
}
if(v.win())
{
if(isPrev)
stream << " | ";
stream << "Win";
isPrev = true;
}
if(v.capsLock())
{
if(isPrev)
stream << " | ";
stream << "CapsLock";
isPrev = true;
}
if(v.numLock())
{
if(isPrev)
stream << " | ";
stream << "NumLock";
isPrev = true;
}
if(!isPrev)
stream << "<No Modifiers>";
return stream;
}

std::ostream&& operator <<(std::ostream&& stream, KeyCode v)
{
auto& _stream = operator <<(stream, v);
Expand Down
4 changes: 2 additions & 2 deletions sutk/source/InputEventHandlerObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ namespace SUTK

KeyboardHandlerObject::KeyboardHandlerObject(UIDriver& driver) noexcept : TInputEventHandlerObject<IInputDriver::OnKeyboardEvent>(driver.getInputDriver().getOnKeyEvent())
{
IInputDriver::OnKeyboardEvent::SubscriptionID id = getEvent().subscribe([this](IInputDriver* inputDriver, KeyCode keycode, KeyEvent action)
IInputDriver::OnKeyboardEvent::SubscriptionID id = getEvent().subscribe([this](IInputDriver* inputDriver, KeyCode keycode, KeyEvent action, ModifierKeys modifiers)
{
onKey(keycode, action);
onKey(keycode, action, modifiers);
});
setSubscriptionID(id);
}
Expand Down
20 changes: 19 additions & 1 deletion sutk/source/SGEInputDriver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,24 @@ namespace SUTK
}
}

static ModifierKeys getModifierKeys(modifier_key_bits_t bits)
{
ModifierKeyBits _bits = com::ForceIntToEnumClass<ModifierKeyBits>(0);
if(HAS_FLAG(bits, MODIFIER_KEY_SHIFT_BIT))
_bits |= ModifierKeyBits::ShiftBit;;
if(HAS_FLAG(bits, MODIFIER_KEY_CONTROL_BIT))
_bits |= ModifierKeyBits::CtrlBit;
if(HAS_FLAG(bits, MODIFIER_KEY_ALT_BIT))
_bits |= ModifierKeyBits::AltBit;
if(HAS_FLAG(bits, MODIFIER_KEY_WINDOWS_BIT))
_bits |= ModifierKeyBits::WinBit;
if(HAS_FLAG(bits, MODIFIER_KEY_CAPSLOCK_BIT))
_bits |= ModifierKeyBits::CapsLockBit;
if(HAS_FLAG(bits, MODIFIER_KEY_NUMLOCK_BIT))
_bits |= ModifierKeyBits::NumLockBit;
return { _bits };
}

static KeyCode getKeyCode(key_code_t keycode)
{
switch(keycode)
Expand Down Expand Up @@ -210,7 +228,7 @@ namespace SUTK
auto* inputDriver = reinterpret_cast<SGEInputDriver*>(handlerData);
auto data = reinterpret_cast<event_publisher_arg_data_t*>(publisherData);
auto keyData = reinterpret_cast<key_event_data_t*>(data->arg);
inputDriver->getOnKeyEvent().publish(getKeyCode(keyData->keycode), SUTK::getKeyEventType(keyData->event_type));
inputDriver->getOnKeyEvent().publish(getKeyCode(keyData->keycode), SUTK::getKeyEventType(keyData->event_type), getModifierKeys(keyData->modifiers));
}, reinterpret_cast<void*>(this));
}

Expand Down

0 comments on commit fdba7bc

Please sign in to comment.