neoGFX
Cross-platform C++ app/game engine
Loading...
Searching...
No Matches
i_keyboard.hpp
Go to the documentation of this file.
1// i_keyboard.hpp
2// Parts of this source file based on Simple DirectMedia Layer, Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
3/*
4 neogfx C++ App/Game Engine
5 Copyright (c) 2015, 2020 Leigh Johnston. All Rights Reserved.
6
7 This program is free software: you can redistribute it and / or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
19*/
20/*
21 Simple DirectMedia Layer
22 Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
23
24 This software is provided 'as-is', without any express or implied
25 warranty. In no event will the authors be held liable for any damages
26 arising from the use of this software.
27
28 Permission is granted to anyone to use this software for any purpose,
29 including commercial applications, and to alter it and redistribute it
30 freely, subject to the following restrictions:
31
32 1. The origin of this software must not be misrepresented; you must not
33 claim that you wrote the original software. If you use this software
34 in a product, an acknowledgment in the product documentation would be
35 appreciated but is not required.
36 2. Altered source versions must be plainly marked as such, and must not be
37 misrepresented as being the original software.
38 3. This notice may not be removed or altered from any source distribution.
39*/
40
41#pragma once
42
43#include <neogfx/neogfx.hpp>
44#include <optional>
48#include <neogfx/core/event.hpp>
50
51namespace neogfx
52{
53 enum scan_code_e : int32_t
54 {
82
93
99
105
113
115
128
142
160
164
192
196
199
231
278
289
307
311
317
320
323
324 ScanCodeCount = 512
325 };
326
327 #define NEOGFX_SCANCODE_MASK (1<<30)
328 #define NEOGFX_SCANCODE_TO_KEYCODE(X) (X | NEOGFX_SCANCODE_MASK)
329
330 enum key_code_e : int32_t
331 {
333
371
404
406
419
433
451
483
496
543
552
554
572
585 };
586
608
610 {
611 public:
612 virtual bool key_pressed(scan_code_e aScanCode, key_code_e aKeyCode, key_modifiers_e aKeyModifiers) = 0;
613 virtual bool key_released(scan_code_e aScanCode, key_code_e aKeyCode, key_modifiers_e aKeyModifiers) = 0;
614 virtual bool text_input(i_string const& aText) = 0;
615 virtual bool sys_text_input(i_string const& aText) = 0;
616 };
617
618 enum class keyboard_locks : uint32_t
619 {
620 None = 0x0000,
621 CapsLock = 0x0001,
622 NumLock = 0x0002,
623 ScrollLock = 0x0004,
624 InsertLock = 0x0008
625 };
626
628 {
629 return static_cast<keyboard_locks>(static_cast<uint32_t>(aLhs) | static_cast<uint32_t>(aRhs));
630 }
631
633 {
634 return static_cast<keyboard_locks>(static_cast<uint32_t>(aLhs) & static_cast<uint32_t>(aRhs));
635 }
636
637 class i_widget;
638
640 {
641 public:
642 struct ime_not_open : std::logic_error { ime_not_open() : std::logic_error("neogfx::i_keyboard_layout::ime_not_open") {} };
643 struct ime_not_active : std::logic_error { ime_not_active() : std::logic_error("neogfx::i_keyboard_layout::ime_not_active") {} };
644 struct ime_activation_failure : std::runtime_error { ime_activation_failure() : std::runtime_error("neogfx::i_keyboard_layout::ime_activation_failure") {} };
645 public:
646 virtual ~i_keyboard_layout() = default;
647 public:
648 virtual bool has_ime() const = 0;
649 virtual bool ime_open() const = 0;
650 virtual bool ime_active() const = 0;
651 virtual bool ime_active(i_widget const& aInputWidget) const = 0;
652 virtual i_widget const& input_widget() const = 0;
653 virtual point const& position() const = 0;
654 virtual void open_ime() = 0;
655 virtual void close_ime() = 0;
656 virtual void activate_ime(i_widget const& aInputWidget, optional_point const& aPosition = {}) = 0;
657 virtual void deactivate_ime(i_widget const& aInputWidget) = 0;
658 virtual void update_ime_position(point const& aPosition) = 0;
659 };
660
661 class i_keyboard : public i_hid_device, public i_service
662 {
663 public:
665 public:
668 declare_event(text_input, std::string const&)
669 declare_event(sys_text_input, std::string const&)
670 declare_event(input_language_changed)
671 public:
672 struct no_grab : std::logic_error { no_grab() : std::logic_error("neogfx::i_keyboard::no_grab") {} };
673 struct already_grabbed : std::logic_error { already_grabbed() : std::logic_error("neogfx::i_keyboard::already_grabbed") {} };
674 public:
675 virtual i_keyboard_layout& layout() const = 0;
676 public:
677 virtual bool is_key_pressed(scan_code_e aScanCode) const = 0;
678 virtual keyboard_locks locks() const = 0;
679 virtual key_modifiers_e modifiers() const = 0;
680 virtual key_modifiers_e event_modifiers() const = 0;
681 virtual void set_event_modifiers(key_modifiers_e aModifiers) = 0;
682 virtual void clear_event_modifiers() = 0;
683 public:
684 virtual bool is_keyboard_grabbed() const = 0;
685 virtual bool is_keyboard_grabbed_by(i_keyboard_handler& aKeyboardHandler) const = 0;
686 virtual bool is_front_grabber(i_keyboard_handler& aKeyboardHandler) const = 0;
687 virtual void grab_keyboard(i_keyboard_handler& aKeyboardHandler) = 0;
688 virtual void ungrab_keyboard(i_keyboard_handler& aKeyboardHandler) = 0;
689 virtual i_keyboard_handler& grabber() const = 0;
690 public:
691 virtual key_code_e scan_code_to_key_code(scan_code_e aScanCode) const = 0;
692 public:
693 static uuid const& iid() { static uuid const sIid{ 0x878ef7c6, 0x8d4b, 0x4c0d, 0x81dd, { 0x70, 0xd1, 0x74, 0x3c, 0x6b, 0x82 } }; return sIid; }
694 };
695
697 {
698 public:
699 enum class match
700 {
701 No,
702 Partial,
703 Full,
704 };
705 private:
706 typedef std::pair<key_code_e, std::set<key_modifiers_e>> combo_type;
707 typedef std::vector<combo_type> sequence_type;
708 public:
709 explicit key_sequence(std::string const& aSequence) : iText{ aSequence }
710 {
711 std::vector<neolib::ci_string> sequenceBits;
712 neolib::tokens(neolib::make_ci_string(aSequence), neolib::ci_string(", "), sequenceBits);
713 for (auto const& combo : sequenceBits)
714 {
715 combo_type nextCombo;
717 neolib::tokens(combo, neolib::ci_string("+"), comboBits, comboBits.max_size(), false);
718 for (std::size_t i = 0; i < comboBits.size(); ++i)
719 {
720 if (i < comboBits.size() - 1)
721 {
722 if (comboBits[i] == "Ctrl")
723 nextCombo.second.insert(KeyModifier_CTRL);
724 else if (comboBits[i] == "Alt")
725 nextCombo.second.insert(KeyModifier_ALT);
726 else if (comboBits[i] == "Shift")
727 nextCombo.second.insert(KeyModifier_SHIFT);
728 }
729 else
730 {
731 static const std::map<neolib::ci_string, key_code_e> sKeyNames
732 {
733 { "Esc", KeyCode_ESCAPE },
734 { "Escape", KeyCode_ESCAPE },
735 { "Return", KeyCode_RETURN },
736 { "Enter", KeyCode_KP_ENTER },
737 { "Tab", KeyCode_TAB },
738 { "Space", KeyCode_SPACE },
739 { "Backspace", KeyCode_BACKSPACE },
740 { "Ins", KeyCode_INSERT },
741 { "Insert", KeyCode_INSERT },
742 { "Del", KeyCode_DELETE },
743 { "Delete", KeyCode_DELETE },
744 { "Home", KeyCode_HOME },
745 { "End", KeyCode_END },
746 { "Up", KeyCode_UP },
747 { "Arrow Up", KeyCode_UP },
748 { "Down", KeyCode_DOWN },
749 { "Arrow Down", KeyCode_DOWN },
750 { "Left", KeyCode_LEFT },
751 { "Arrow Left", KeyCode_LEFT },
752 { "Right", KeyCode_RIGHT },
753 { "Arrow Right", KeyCode_RIGHT },
754 { "PgUp", KeyCode_PAGEUP },
755 { "Page Up", KeyCode_PAGEUP },
756 { "PgDn", KeyCode_PAGEDOWN },
757 { "PgDown", KeyCode_PAGEDOWN },
758 { "Page Down", KeyCode_PAGEDOWN },
759 { "F1", KeyCode_F1 },
760 { "F2", KeyCode_F2 },
761 { "F3", KeyCode_F3 },
762 { "F4", KeyCode_F4 },
763 { "F5", KeyCode_F5 },
764 { "F6", KeyCode_F6 },
765 { "F7", KeyCode_F7 },
766 { "F8", KeyCode_F8 },
767 { "F9", KeyCode_F9 },
768 { "F10", KeyCode_F10 },
769 { "F11", KeyCode_F11 },
770 { "F12", KeyCode_F12 },
771 { "F13", KeyCode_F13 },
772 { "F14", KeyCode_F14 },
773 { "F15", KeyCode_F15 },
774 { "F16", KeyCode_F16 },
775 { "F17", KeyCode_F17 },
776 { "F18", KeyCode_F18 },
777 { "F19", KeyCode_F19 },
778 { "F20", KeyCode_F20 },
779 { "F21", KeyCode_F21 },
780 { "F22", KeyCode_F22 },
781 { "F23", KeyCode_F23 },
782 { "F24", KeyCode_F24 }
783 };
784 if (!comboBits[i].empty())
785 {
786 auto name = sKeyNames.find(comboBits[i]);
787 if (name == sKeyNames.end())
788 nextCombo.first = static_cast<key_code_e>(neolib::to_lower(neolib::make_string(comboBits[i]))[0]);
789 else
790 nextCombo.first = name->second;
791 }
792 else
793 nextCombo.first = KeyCode_PLUS;
794 }
795 }
796 iSequence.push_back(nextCombo);
797 }
798 }
799 public:
800 bool operator==(const key_sequence& aRhs) const
801 {
802 return iSequence == aRhs.iSequence;
803 }
804 bool operator!=(const key_sequence& aRhs) const
805 {
806 return !(*this == aRhs);
807 }
808 public:
809 template <typename Iter> // iterator to std::pair<key_code_e, key_modifiers_e>
810 match matches(Iter aFirst, Iter aLast) const
811 {
812 std::size_t index = 0;
813 for (Iter next = aFirst; next != aLast; ++next, ++index)
814 if (matches(index, next->first, next->second) == match::No)
815 return match::No;
816 return (index == iSequence.size() ? match::Full : match::Partial);
817 }
818 match matches(key_code_e aKeyCode, key_modifiers_e aKeyModifiers) const
819 {
820 return matches(0, aKeyCode, aKeyModifiers);
821 }
822 const i_string& as_text() const
823 {
824 return iText;
825 }
826 private:
827 match matches(std::size_t aIndex, key_code_e aKeyCode, key_modifiers_e aKeyModifiers) const
828 {
829 if (iSequence[aIndex].first != aKeyCode)
830 return match::No;
831 for (auto m : iSequence[aIndex].second)
832 if ((aKeyModifiers & m) != 0)
833 aKeyModifiers = static_cast<key_modifiers_e>(aKeyModifiers & ~m);
834 else
835 return match::No;
836 if ((aKeyModifiers & ~KeyModifier_LOCKS) == 0)
837 return (iSequence.size() == 1 ? match::Full : match::Partial);
838 else
839 return match::No;
840 }
841 private:
842 string iText;
843 sequence_type iSequence;
844 };
845
846 typedef std::optional<key_sequence> optional_key_sequence;
847}
virtual bool key_released(scan_code_e aScanCode, key_code_e aKeyCode, key_modifiers_e aKeyModifiers)=0
virtual bool key_pressed(scan_code_e aScanCode, key_code_e aKeyCode, key_modifiers_e aKeyModifiers)=0
virtual bool sys_text_input(i_string const &aText)=0
virtual bool text_input(i_string const &aText)=0
virtual bool ime_open() const =0
virtual void open_ime()=0
virtual bool ime_active() const =0
virtual bool ime_active(i_widget const &aInputWidget) const =0
virtual void activate_ime(i_widget const &aInputWidget, optional_point const &aPosition={})=0
virtual point const & position() const =0
virtual void close_ime()=0
virtual void deactivate_ime(i_widget const &aInputWidget)=0
virtual i_widget const & input_widget() const =0
virtual void update_ime_position(point const &aPosition)=0
virtual bool has_ime() const =0
virtual ~i_keyboard_layout()=default
virtual bool is_keyboard_grabbed_by(i_keyboard_handler &aKeyboardHandler) const =0
virtual void ungrab_keyboard(i_keyboard_handler &aKeyboardHandler)=0
virtual key_code_e scan_code_to_key_code(scan_code_e aScanCode) const =0
virtual void grab_keyboard(i_keyboard_handler &aKeyboardHandler)=0
virtual i_keyboard_layout & layout() const =0
virtual key_modifiers_e event_modifiers() const =0
virtual bool is_keyboard_grabbed() const =0
virtual keyboard_locks locks() const =0
i_keyboard abstract_type
virtual void clear_event_modifiers()=0
virtual bool is_key_pressed(scan_code_e aScanCode) const =0
virtual bool is_front_grabber(i_keyboard_handler &aKeyboardHandler) const =0
virtual key_modifiers_e modifiers() const =0
virtual void set_event_modifiers(key_modifiers_e aModifiers)=0
declare_event(key_pressed, scan_code_e, key_code_e, key_modifiers_e) declare_event(key_released
virtual i_keyboard_handler & grabber() const =0
static uuid const & iid()
bool operator!=(const key_sequence &aRhs) const
key_sequence(std::string const &aSequence)
bool operator==(const key_sequence &aRhs) const
const i_string & as_text() const
match matches(key_code_e aKeyCode, key_modifiers_e aKeyModifiers) const
match matches(Iter aFirst, Iter aLast) const
size_type max_size() const
Definition vecarray.hpp:444
size_type size() const
Definition vecarray.hpp:441
#define NEOGFX_SCANCODE_TO_KEYCODE(X)
@ KeyModifier_RALT
@ KeyModifier_NUM
@ KeyModifier_LCTRL
@ KeyModifier_NONE
@ KeyModifier_LGUI
@ KeyModifier_RESERVED
@ KeyModifier_MODE
@ KeyModifier_CAPS
@ KeyModifier_LOCKS
@ KeyModifier_CTRL
@ KeyModifier_RSHIFT
@ KeyModifier_ALT
@ KeyModifier_SHIFT
@ KeyModifier_LSHIFT
@ KeyModifier_LALT
@ KeyModifier_GUI
@ KeyModifier_RGUI
@ KeyModifier_RCTRL
constexpr style_aspect operator&(style_aspect aLhs, style_aspect aRhs)
Definition i_style.hpp:60
@ KeyCode_AUDIOMUTE
@ KeyCode_SYSREQ
@ KeyCode_SEMICOLON
@ KeyCode_COMMA
@ KeyCode_THOUSANDSSEPARATOR
@ KeyCode_RETURN2
@ KeyCode_KP_LESS
@ KeyCode_CLEAR
@ KeyCode_RIGHT
@ KeyCode_SLEEP
@ KeyCode_KP_DBLVERTICALBAR
@ KeyCode_KP_LEFTPAREN
@ KeyCode_AC_STOP
@ KeyCode_KP_EQUALS
@ KeyCode_AUDIOREWIND
@ KeyCode_BRIGHTNESSUP
@ KeyCode_CURRENCYUNIT
@ KeyCode_KP_XOR
@ KeyCode_KP_EXCLAM
@ KeyCode_POWER
@ KeyCode_BACKSLASH
@ KeyCode_NUMLOCKCLEAR
@ KeyCode_CANCEL
@ KeyCode_PAGEDOWN
@ KeyCode_AC_HOME
@ KeyCode_QUESTION
@ KeyCode_EQUALS
@ KeyCode_PASTE
@ KeyCode_KBDILLUMUP
@ KeyCode_KP_COMMA
@ KeyCode_LCTRL
@ KeyCode_PAGEUP
@ KeyCode_BACKSPACE
@ KeyCode_RIGHTPAREN
@ KeyCode_LSHIFT
@ KeyCode_AC_SEARCH
@ KeyCode_KP_00
@ KeyCode_CARET
@ KeyCode_KP_RIGHTBRACE
@ KeyCode_KP_EQUALSAS400
@ KeyCode_CRSEL
@ KeyCode_KP_DIVIDE
@ KeyCode_AC_FORWARD
@ KeyCode_PERCENT
@ KeyCode_KP_ENTER
@ KeyCode_RSHIFT
@ KeyCode_AMPERSAND
@ KeyCode_BACKQUOTE
@ KeyCode_AC_BACK
@ KeyCode_APPLICATION
@ KeyCode_KBDILLUMTOGGLE
@ KeyCode_KP_PLUSMINUS
@ KeyCode_KP_MEMSTORE
@ KeyCode_KP_PLUS
@ KeyCode_KP_MULTIPLY
@ KeyCode_KP_MEMSUBTRACT
@ KeyCode_KP_POWER
@ KeyCode_BRIGHTNESSDOWN
@ KeyCode_KP_AT
@ KeyCode_KP_DECIMAL
@ KeyCode_CAPSLOCK
@ KeyCode_KP_MEMRECALL
@ KeyCode_KBDILLUMDOWN
@ KeyCode_SCROLLLOCK
@ KeyCode_COLON
@ KeyCode_PRIOR
@ KeyCode_VOLUMEDOWN
@ KeyCode_EXSEL
@ KeyCode_KP_LEFTBRACE
@ KeyCode_AC_BOOKMARKS
@ KeyCode_KP_PERIOD
@ KeyCode_UNKNOWN
@ KeyCode_KP_OCTAL
@ KeyCode_CURRENCYSUBUNIT
@ KeyCode_KP_COLON
@ KeyCode_SEPARATOR
@ KeyCode_RCTRL
@ KeyCode_VOLUMEUP
@ KeyCode_MINUS
@ KeyCode_AUDIOPLAY
@ KeyCode_KP_PERCENT
@ KeyCode_PRINTSCREEN
@ KeyCode_QUOTEDBL
@ KeyCode_KP_TAB
@ KeyCode_KP_MEMADD
@ KeyCode_KP_MEMDIVIDE
@ KeyCode_UNDERSCORE
@ KeyCode_LEFTPAREN
@ KeyCode_AUDIOPREV
@ KeyCode_KP_CLEARENTRY
@ KeyCode_QUOTE
@ KeyCode_INSERT
@ KeyCode_SPACE
@ KeyCode_PERIOD
@ KeyCode_KP_AMPERSAND
@ KeyCode_LEFTBRACKET
@ KeyCode_KP_MEMCLEAR
@ KeyCode_AUDIOSTOP
@ KeyCode_DECIMALSEPARATOR
@ KeyCode_AC_REFRESH
@ KeyCode_KP_CLEAR
@ KeyCode_DELETE
@ KeyCode_KP_MEMMULTIPLY
@ KeyCode_SLASH
@ KeyCode_DOLLAR
@ KeyCode_AGAIN
@ KeyCode_ASTERISK
@ KeyCode_PAUSE
@ KeyCode_GREATER
@ KeyCode_KP_BINARY
@ KeyCode_DISPLAYSWITCH
@ KeyCode_KP_GREATER
@ KeyCode_MEDIASELECT
@ KeyCode_COMPUTER
@ KeyCode_EXECUTE
@ KeyCode_SELECT
@ KeyCode_AUDIONEXT
@ KeyCode_CALCULATOR
@ KeyCode_KP_DBLAMPERSAND
@ KeyCode_KP_SPACE
@ KeyCode_CLEARAGAIN
@ KeyCode_KP_000
@ KeyCode_KP_HEXADECIMAL
@ KeyCode_EXCLAIM
@ KeyCode_KP_MINUS
@ KeyCode_KP_HASH
@ KeyCode_KP_RIGHTPAREN
@ KeyCode_ALTERASE
@ KeyCode_EJECT
@ KeyCode_KP_VERTICALBAR
@ KeyCode_AUDIOFASTFORWARD
@ KeyCode_RETURN
@ KeyCode_KP_BACKSPACE
@ KeyCode_ESCAPE
@ KeyCode_RIGHTBRACKET
std::optional< key_sequence > optional_key_sequence
@ ScanCode_LANG6
@ ScanCode_INTERNATIONAL5
@ ScanCode_KBDILLUMDOWN
@ ScanCode_AUDIOREWIND
@ ScanCode_INTERNATIONAL7
@ ScanCode_KP_F
@ ScanCode_INTERNATIONAL3
@ ScanCode_KP_PERCENT
@ ScanCode_LCTRL
@ ScanCode_KP_00
@ ScanCode_RCTRL
@ ScanCode_KP_000
@ ScanCode_KP_HEXADECIMAL
@ ScanCode_KP_DBLVERTICALBAR
@ ScanCode_INTERNATIONAL6
@ ScanCode_KP_LESS
@ ScanCode_AUDIONEXT
@ ScanCode_COMPUTER
@ ScanCode_LGUI
@ ScanCode_KP_AT
@ ScanCode_SYSREQ
@ ScanCode_KP_CLEARENTRY
@ ScanCode_KP_ENTER
@ ScanCode_LANG3
@ ScanCode_LOCKINGNUMLOCK
@ ScanCode_MENU
@ ScanCode_KP_A
@ ScanCode_HELP
@ ScanCode_KP_MEMSTORE
@ ScanCode_APP2
@ ScanCode_KP_DECIMAL
@ ScanCode_KP_GREATER
@ ScanCode_KP_RIGHTBRACE
@ ScanCode_AUDIOSTOP
@ ScanCode_BRIGHTNESSDOWN
@ ScanCode_KP_BINARY
@ ScanCode_MAIL
@ ScanCode_PASTE
@ ScanCode_KP_PERIOD
@ ScanCode_RSHIFT
@ ScanCode_KP_MEMCLEAR
@ ScanCode_SEPARATOR
@ ScanCode_RIGHT
@ ScanCode_AC_FORWARD
@ ScanCode_KP_VERTICALBAR
@ ScanCode_KP_MEMADD
@ ScanCode_KP_LEFTBRACE
@ ScanCode_LEFTBRACKET
@ ScanCode_CALCULATOR
@ ScanCode_FIND
@ ScanCode_KP_SPACE
@ ScanCode_KP_4
@ ScanCode_CAPSLOCK
@ ScanCode_INTERNATIONAL2
@ ScanCode_KBDILLUMTOGGLE
@ ScanCode_CANCEL
@ ScanCode_KP_RIGHTPAREN
@ ScanCode_ESCAPE
@ ScanCode_CURRENCYUNIT
@ ScanCode_LANG2
@ ScanCode_AUDIOMUTE
@ ScanCode_LANG8
@ ScanCode_PERIOD
@ ScanCode_RIGHTBRACKET
@ ScanCode_MEDIASELECT
@ ScanCode_AC_REFRESH
@ ScanCode_KP_D
@ ScanCode_KP_7
@ ScanCode_THOUSANDSSEPARATOR
@ ScanCode_KP_2
@ ScanCode_KP_COLON
@ ScanCode_DECIMALSEPARATOR
@ ScanCode_STOP
@ ScanCode_NUMLOCKCLEAR
@ ScanCode_DOWN
@ ScanCode_DELETE
@ ScanCode_SELECT
@ ScanCode_RGUI
@ ScanCode_EXSEL
@ ScanCode_TAB
@ ScanCode_GRAVE
@ ScanCode_PRIOR
@ ScanCode_AUDIOFASTFORWARD
@ ScanCodeCount
@ ScanCode_KP_AMPERSAND
@ ScanCode_KP_EQUALSAS400
@ ScanCode_SEMICOLON
@ ScanCode_DISPLAYSWITCH
@ ScanCode_SPACE
@ ScanCode_KP_TAB
@ ScanCode_KP_MEMSUBTRACT
@ ScanCode_CLEARAGAIN
@ ScanCode_UNDO
@ ScanCode_LOCKINGSCROLLLOCK
@ ScanCode_MODE
@ ScanCode_KP_9
@ ScanCode_BRIGHTNESSUP
@ ScanCode_LSHIFT
@ ScanCode_LANG4
@ ScanCode_NONUSHASH
@ ScanCode_AC_STOP
@ ScanCode_LANG9
@ ScanCode_LANG1
@ ScanCode_RETURN
@ ScanCode_MUTE
@ ScanCode_KP_3
@ ScanCode_KP_OCTAL
@ ScanCode_PAUSE
@ ScanCode_VOLUMEDOWN
@ ScanCode_SLASH
@ ScanCode_KP_XOR
@ ScanCode_LANG7
@ ScanCode_KP_EQUALS
@ ScanCode_LANG5
@ ScanCode_RETURN2
@ ScanCode_COMMA
@ ScanCode_KP_DBLAMPERSAND
@ ScanCode_CRSEL
@ ScanCode_KP_MEMRECALL
@ ScanCode_KP_HASH
@ ScanCode_KP_CLEAR
@ ScanCode_APPLICATION
@ ScanCode_EQUALS
@ ScanCode_AC_SEARCH
@ ScanCode_UNKNOWN
@ ScanCode_KP_0
@ ScanCode_BACKSLASH
@ ScanCode_KP_1
@ ScanCode_KP_MEMMULTIPLY
@ ScanCode_LALT
@ ScanCode_POWER
@ ScanCode_INTERNATIONAL4
@ ScanCode_SLEEP
@ ScanCode_KP_6
@ ScanCode_HOME
@ ScanCode_EXECUTE
@ ScanCode_KP_PLUSMINUS
@ ScanCode_OPER
@ ScanCode_ALTERASE
@ ScanCode_INTERNATIONAL9
@ ScanCode_KP_C
@ ScanCode_KP_BACKSPACE
@ ScanCode_COPY
@ ScanCode_KP_MULTIPLY
@ ScanCode_KP_8
@ ScanCode_KP_COMMA
@ ScanCode_APOSTROPHE
@ ScanCode_PRINTSCREEN
@ ScanCode_KP_5
@ ScanCode_AC_HOME
@ ScanCode_KP_MINUS
@ ScanCode_CLEAR
@ ScanCode_AGAIN
@ ScanCode_KP_DIVIDE
@ ScanCode_EJECT
@ ScanCode_KP_PLUS
@ ScanCode_MINUS
@ ScanCode_KP_B
@ ScanCode_KP_E
@ ScanCode_INSERT
@ ScanCode_BACKSPACE
@ ScanCode_KP_LEFTPAREN
@ ScanCode_LOCKINGCAPSLOCK
@ ScanCode_AC_BOOKMARKS
@ ScanCode_NONUSBACKSLASH
@ ScanCode_VOLUMEUP
@ ScanCode_AC_BACK
@ ScanCode_AUDIOPREV
@ ScanCode_CURRENCYSUBUNIT
@ ScanCode_INTERNATIONAL8
@ ScanCode_APP1
@ ScanCode_INTERNATIONAL1
@ ScanCode_KP_EXCLAM
@ ScanCode_AUDIOPLAY
@ ScanCode_SCROLLLOCK
@ ScanCode_PAGEDOWN
@ ScanCode_KBDILLUMUP
@ ScanCode_KP_MEMDIVIDE
@ ScanCode_PAGEUP
@ ScanCode_RALT
@ ScanCode_LEFT
@ ScanCode_KP_POWER
constexpr style_aspect operator|(style_aspect aLhs, style_aspect aRhs)
Definition i_style.hpp:55
FwdIter1 tokens(FwdIter1 aFirst, FwdIter1 aLast, FwdIter2 aDelimeterFirst, FwdIter2 aDelimiterLast, ResultContainer &aTokens, std::size_t aMaxTokens=0, bool aSkipEmptyTokens=true, bool aDelimeterIsSubsequence=false)
ci_string make_ci_string(const std::string &s)
Definition string_ci.hpp:92
std::basic_string< char, ci_char_traits< std::char_traits< char > > > ci_string
Definition string_ci.hpp:89
std::basic_string< CharT, Traits, Alloc > to_lower(const std::basic_string< CharT, Traits, Alloc > &aString)
std::string make_string(const ci_string &s)
Definition plf_hive.h:79
#define declare_event(declName,...)
Definition i_event.hpp:305