diff --git a/include/eepp/ui/doc/textdocument.hpp b/include/eepp/ui/doc/textdocument.hpp index fd54adf29..5de4bf6ea 100644 --- a/include/eepp/ui/doc/textdocument.hpp +++ b/include/eepp/ui/doc/textdocument.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -19,8 +20,6 @@ namespace EE { namespace UI { namespace Doc { class EE_API TextDocumentLine { public: - typedef std::function DocumentCommand; - TextDocumentLine( const String& text ) : mText( text ) { updateHash(); } void setText( const String& text ) { @@ -78,6 +77,8 @@ class EE_API TextDocumentLine { class EE_API TextDocument { public: + typedef std::function DocumentCommand; + class EE_API Client { public: virtual ~Client(); @@ -196,7 +197,7 @@ class EE_API TextDocument { void moveToNextWord(); - void moveToPreviousLine( Int64 lastColIndex = 0 ); + void moveToPreviousLine(); void moveToNextLine(); @@ -264,6 +265,14 @@ class EE_API TextDocument { void moveLinesDown(); + void undo(); + + void redo(); + + void execute( const std::string& command ); + + void setCommand( const std::string& command, DocumentCommand func ); + String getIndentString(); const Uint32& getTabWidth() const; @@ -276,10 +285,6 @@ class EE_API TextDocument { void setIndentType( const IndentType& indentType ); - void undo(); - - void redo(); - const SyntaxDefinition& getSyntaxDefinition() const; Uint64 getCurrentChangeId() const; @@ -292,6 +297,10 @@ class EE_API TextDocument { bool isDirty() const; + const Uint32& getPageSize() const; + + void setPageSize( const Uint32& pageSize ); + protected: friend class UndoStack; UndoStack mUndoStack; @@ -307,6 +316,10 @@ class EE_API TextDocument { SyntaxDefinition mSyntaxDefinition; std::string mDefaultFileName; Uint64 mCleanChangeId; + Uint32 mPageSize{10}; + std::map mCommands; + + void initializeCommands(); void cleanChangeId(); diff --git a/include/eepp/ui/uicodeeditor.hpp b/include/eepp/ui/uicodeeditor.hpp index b76016916..17f70a41c 100644 --- a/include/eepp/ui/uicodeeditor.hpp +++ b/include/eepp/ui/uicodeeditor.hpp @@ -98,6 +98,10 @@ class EE_API UICodeEditor : public UIWidget, public TextDocument::Client { void setCaretColor( const Color& caretColor ); + const Color& getIndentationGuideColor() const; + + void setIndentationGuideColor( const Color& color ); + const SyntaxColorScheme& getColorScheme() const; void setColorScheme( const SyntaxColorScheme& colorScheme ); @@ -116,6 +120,14 @@ class EE_API UICodeEditor : public UIWidget, public TextDocument::Client { void setLocked( bool locked ); + const Color& getLineNumberFontColor() const; + + void setLineNumberFontColor( const Color& lineNumberFontColor ); + + const Color& getLineNumberActiveFontColor() const; + + void setLineNumberActiveFontColor( const Color& lineNumberActiveFontColor ); + protected: struct LastXOffset { TextPosition position; @@ -130,6 +142,7 @@ class EE_API UICodeEditor : public UIWidget, public TextDocument::Client { bool mCursorVisible; bool mMouseDown; bool mShowLineNumber; + bool mShowIndentationGuide; bool mLocked; Uint32 mTabWidth; Int64 mLastColOffset; @@ -143,6 +156,7 @@ class EE_API UICodeEditor : public UIWidget, public TextDocument::Client { Color mLineNumberBackgroundColor; Color mCurrentLineBackgroundColor; Color mCaretColor; + Color mIndentationGuideColor; SyntaxColorScheme mColorScheme; SyntaxHighlighter mHighlighter; UIScrollBar* mVScrollBar; diff --git a/include/eepp/ui/uicommondialog.hpp b/include/eepp/ui/uicommondialog.hpp index c6a676ba4..a6725a91f 100644 --- a/include/eepp/ui/uicommondialog.hpp +++ b/include/eepp/ui/uicommondialog.hpp @@ -103,6 +103,10 @@ class EE_API UICommonDialog : public UIWindow { std::string getTempFullPath(); void disableButtons(); + + void openFileOrFolder(); + + void goFolderUp(); }; }} // namespace EE::UI diff --git a/include/eepp/window/input.hpp b/include/eepp/window/input.hpp index f818a6eca..7f610e7a4 100644 --- a/include/eepp/window/input.hpp +++ b/include/eepp/window/input.hpp @@ -44,17 +44,44 @@ class EE_API Input { /** @return If mouse is captured. */ virtual bool isMouseCaptured() const = 0; - /** @return If keyboard key was released */ - bool isKeyUp( const KeyTable& Key ); + /** @return Get the key name. */ + virtual std::string getKeyName( const Keycode& keycode ) const = 0; - /** @return If keyboard key it's pressed */ - bool isKeyDown( const KeyTable& Key ); + /** @return The corresponding keycode from a name. */ + virtual Keycode getKeyFromName( const std::string& keycode ) const = 0; - /** Inject the key state of a key as KEY UP or RELEASE */ - void injectKeyUp( const KeyTable& Key ); + /** @return Get the scancode name. */ + virtual std::string getScancodeName( const Scancode& scancode ) const = 0; - /** Inject the key state of a key as KEY DOWN or PRESSED */ - void injectKeyDown( const KeyTable& Key ); + /** @return The corresponding scancode from a name. */ + virtual Scancode getScancodeFromName( const std::string& scancode ) const = 0; + + /** @return The key from the scancode. */ + virtual Keycode getKeyFromScancode( const Scancode& scancode ) const = 0; + + /** @return The scancode from a key. */ + virtual Scancode getScancodeFromKey( const Keycode& scancode ) const = 0; + + /** @return If keyboard key was released. */ + bool isKeyUp( const Keycode& Key ); + + /** @return If keyboard key is pressed. */ + bool isKeyDown( const Keycode& Key ); + + /** @return If scancode was released. */ + bool isScancodeUp( const Scancode& scancode ); + + /** @return If scancode it's pressed. */ + bool isScancodeDown( const Scancode& scancode ); + + /** Inject the key state of a key as key up or released. */ + void injectKeyUp( const Keycode& Key ); + + /** Inject the scancode state of a scancode as pressed. */ + void injectScancodeDown( const Scancode& scancode ); + + /** Inject the key state of a key as released. */ + void injectScancodeUp( const Scancode& scancode ); /** Inject the mouse position given */ void injectMousePos( const Vector2i& Pos ); @@ -183,15 +210,15 @@ class EE_API Input { InputFinger* getFinger( const Int64& fingerId ); /** @return A list of the input finders that are currently down */ - std::list getFingersDown(); + std::vector getFingersDown(); /** @return A list of the input finders that were down in the last update */ - std::list getFingersWasDown(); + std::vector getFingersWasDown(); /** @return the state of the mod keys. */ - const Uint32& getKeyMod() const; + const Uint32& getModState() const; - protected: + protected: friend class Window; Input( EE::Window::Window* window, JoystickManager* joystickmanager ); @@ -200,8 +227,8 @@ class EE_API Input { EE::Window::Window* mWindow; JoystickManager* mJoystickManager; - Uint8 mKeysDown[EE_KEYS_SPACE]; - Uint8 mKeysUp[EE_KEYS_SPACE]; + Uint8 mScancodeDown[SCANCODES_NUM]; + Uint8 mScancodeUp[SCANCODES_NUM]; Uint32 mPressTrigger; Uint32 mReleaseTrigger; Uint32 mLastPressTrigger; diff --git a/include/eepp/window/inputevent.hpp b/include/eepp/window/inputevent.hpp index 9694f0378..567ef21b1 100644 --- a/include/eepp/window/inputevent.hpp +++ b/include/eepp/window/inputevent.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace EE { namespace Window { @@ -39,7 +40,8 @@ class InputEvent { inline InputEvent( Uint32 type ) : Type( type ) {} struct KeySym { - Uint32 sym; /** virtual keysym */ + Scancode scancode; /**< physical key code - see ::Scancode for details */ + Keycode sym; /**< virtual key code - see ::Keycode for details */ Uint32 mod; /** current key modifiers */ Uint32 unicode; /** translated character */ }; diff --git a/include/eepp/window/inputhelper.hpp b/include/eepp/window/inputhelper.hpp index 11fb4cf60..1dbd3e1f6 100644 --- a/include/eepp/window/inputhelper.hpp +++ b/include/eepp/window/inputhelper.hpp @@ -5,13 +5,9 @@ namespace EE { namespace Window { -#define EE_KEYS_NUM ( 336 ) -#define EE_KEYS_SPACE ( EE_KEYS_NUM / 8 ) - class InputHelper { public: - static Uint32 EE_API convertKeyCharacter( const Uint32& KeyCode, const Uint16& Unicode, - const Uint32& Modifiers ); + static Uint32 EE_API convertKeyCharacter( const Uint32& KeyCode, const Uint16& Unicode ); }; }} // namespace EE::Window diff --git a/include/eepp/window/keycodes.hpp b/include/eepp/window/keycodes.hpp index 204a058fa..f0896fcc1 100644 --- a/include/eepp/window/keycodes.hpp +++ b/include/eepp/window/keycodes.hpp @@ -3,260 +3,662 @@ namespace EE { namespace Window { -/** @enum KeyTable Enum of keyboard keys. */ -enum KeyTable { +// This is a exact copy from the SDL_keycode and SDL_scancode. +// But since eepp abstracts the library we need to copy them into eepp. +// eepp used to support several backends (SDL, SFML, Allegro), but ended up +// always using SDL2 since it became the most stable and feature rich of them +// So now the architecture is still open to new backends but I decided to +// deprecate all the other backends since it was just a waste of time mantaining +// them. + +/** + * @brief The keyboard scancode representation. + * + * Values of this type are used to represent keyboard keys, among other places + * in the @link KeySym::scancode key.keysym.scancode @endlink field of the + * InputEvent structure. + * + * The values in this enumeration are based on the USB usage page standard: + * https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf + */ +enum Scancode { + SCANCODE_UNKNOWN = 0, + + /** + * \name Usage page 0x07 + * + * These values are from usage page 0x07 (USB keyboard page). + */ + /* @{ */ + + SCANCODE_A = 4, + SCANCODE_B = 5, + SCANCODE_C = 6, + SCANCODE_D = 7, + SCANCODE_E = 8, + SCANCODE_F = 9, + SCANCODE_G = 10, + SCANCODE_H = 11, + SCANCODE_I = 12, + SCANCODE_J = 13, + SCANCODE_K = 14, + SCANCODE_L = 15, + SCANCODE_M = 16, + SCANCODE_N = 17, + SCANCODE_O = 18, + SCANCODE_P = 19, + SCANCODE_Q = 20, + SCANCODE_R = 21, + SCANCODE_S = 22, + SCANCODE_T = 23, + SCANCODE_U = 24, + SCANCODE_V = 25, + SCANCODE_W = 26, + SCANCODE_X = 27, + SCANCODE_Y = 28, + SCANCODE_Z = 29, + + SCANCODE_1 = 30, + SCANCODE_2 = 31, + SCANCODE_3 = 32, + SCANCODE_4 = 33, + SCANCODE_5 = 34, + SCANCODE_6 = 35, + SCANCODE_7 = 36, + SCANCODE_8 = 37, + SCANCODE_9 = 38, + SCANCODE_0 = 39, + + SCANCODE_RETURN = 40, + SCANCODE_ESCAPE = 41, + SCANCODE_BACKSPACE = 42, + SCANCODE_TAB = 43, + SCANCODE_SPACE = 44, + + SCANCODE_MINUS = 45, + SCANCODE_EQUALS = 46, + SCANCODE_LEFTBRACKET = 47, + SCANCODE_RIGHTBRACKET = 48, + SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return + * key on ISO keyboards and at the right end + * of the QWERTY row on ANSI keyboards. + * Produces REVERSE SOLIDUS (backslash) and + * VERTICAL LINE in a US layout, REVERSE + * SOLIDUS and VERTICAL LINE in a UK Mac + * layout, NUMBER SIGN and TILDE in a UK + * Windows layout, DOLLAR SIGN and POUND SIGN + * in a Swiss German layout, NUMBER SIGN and + * APOSTROPHE in a German layout, GRAVE + * ACCENT and POUND SIGN in a French Mac + * layout, and ASTERISK and MICRO SIGN in a + * French Windows layout. + */ + SCANCODE_NONUSHASH = 50, /**< ISO USB keyboards actually use this code + * instead of 49 for the same key, but all + * OSes I've seen treat the two codes + * identically. So, as an implementor, unless + * your keyboard generates both of those + * codes and your OS treats them differently, + * you should generate SCANCODE_BACKSLASH + * instead of this code. As a user, you + * should not rely on this code because SDL + * will never generate it with most (all?) + * keyboards. + */ + SCANCODE_SEMICOLON = 51, + SCANCODE_APOSTROPHE = 52, + SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI + * and ISO keyboards). Produces GRAVE ACCENT and + * TILDE in a US Windows layout and in US and UK + * Mac layouts on ANSI keyboards, GRAVE ACCENT + * and NOT SIGN in a UK Windows layout, SECTION + * SIGN and PLUS-MINUS SIGN in US and UK Mac + * layouts on ISO keyboards, SECTION SIGN and + * DEGREE SIGN in a Swiss German layout (Mac: + * only on ISO keyboards), CIRCUMFLEX ACCENT and + * DEGREE SIGN in a German layout (Mac: only on + * ISO keyboards), SUPERSCRIPT TWO and TILDE in a + * French Windows layout, COMMERCIAL AT and + * NUMBER SIGN in a French Mac layout on ISO + * keyboards, and LESS-THAN SIGN and GREATER-THAN + * SIGN in a Swiss German, German, or French Mac + * layout on ANSI keyboards. + */ + SCANCODE_COMMA = 54, + SCANCODE_PERIOD = 55, + SCANCODE_SLASH = 56, + + SCANCODE_CAPSLOCK = 57, + + SCANCODE_F1 = 58, + SCANCODE_F2 = 59, + SCANCODE_F3 = 60, + SCANCODE_F4 = 61, + SCANCODE_F5 = 62, + SCANCODE_F6 = 63, + SCANCODE_F7 = 64, + SCANCODE_F8 = 65, + SCANCODE_F9 = 66, + SCANCODE_F10 = 67, + SCANCODE_F11 = 68, + SCANCODE_F12 = 69, + + SCANCODE_PRINTSCREEN = 70, + SCANCODE_SCROLLLOCK = 71, + SCANCODE_PAUSE = 72, + SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but + does send code 73, not 117) */ + SCANCODE_HOME = 74, + SCANCODE_PAGEUP = 75, + SCANCODE_DELETE = 76, + SCANCODE_END = 77, + SCANCODE_PAGEDOWN = 78, + SCANCODE_RIGHT = 79, + SCANCODE_LEFT = 80, + SCANCODE_DOWN = 81, + SCANCODE_UP = 82, + + SCANCODE_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards + */ + SCANCODE_KP_DIVIDE = 84, + SCANCODE_KP_MULTIPLY = 85, + SCANCODE_KP_MINUS = 86, + SCANCODE_KP_PLUS = 87, + SCANCODE_KP_ENTER = 88, + SCANCODE_KP_1 = 89, + SCANCODE_KP_2 = 90, + SCANCODE_KP_3 = 91, + SCANCODE_KP_4 = 92, + SCANCODE_KP_5 = 93, + SCANCODE_KP_6 = 94, + SCANCODE_KP_7 = 95, + SCANCODE_KP_8 = 96, + SCANCODE_KP_9 = 97, + SCANCODE_KP_0 = 98, + SCANCODE_KP_PERIOD = 99, + + SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO + * keyboards have over ANSI ones, + * located between left shift and Y. + * Produces GRAVE ACCENT and TILDE in a + * US or UK Mac layout, REVERSE SOLIDUS + * (backslash) and VERTICAL LINE in a + * US or UK Windows layout, and + * LESS-THAN SIGN and GREATER-THAN SIGN + * in a Swiss German, German, or French + * layout. */ + SCANCODE_APPLICATION = 101, /**< windows contextual menu, compose */ + SCANCODE_POWER = 102, /**< The USB document says this is a status flag, + * not a physical key - but some Mac keyboards + * do have a power key. */ + SCANCODE_KP_EQUALS = 103, + SCANCODE_F13 = 104, + SCANCODE_F14 = 105, + SCANCODE_F15 = 106, + SCANCODE_F16 = 107, + SCANCODE_F17 = 108, + SCANCODE_F18 = 109, + SCANCODE_F19 = 110, + SCANCODE_F20 = 111, + SCANCODE_F21 = 112, + SCANCODE_F22 = 113, + SCANCODE_F23 = 114, + SCANCODE_F24 = 115, + SCANCODE_EXECUTE = 116, + SCANCODE_HELP = 117, + SCANCODE_MENU = 118, + SCANCODE_SELECT = 119, + SCANCODE_STOP = 120, + SCANCODE_AGAIN = 121, /**< redo */ + SCANCODE_UNDO = 122, + SCANCODE_CUT = 123, + SCANCODE_COPY = 124, + SCANCODE_PASTE = 125, + SCANCODE_FIND = 126, + SCANCODE_MUTE = 127, + SCANCODE_VOLUMEUP = 128, + SCANCODE_VOLUMEDOWN = 129, + /* not sure whether there's a reason to enable these */ + /* SCANCODE_LOCKINGCAPSLOCK = 130, */ + /* SCANCODE_LOCKINGNUMLOCK = 131, */ + /* SCANCODE_LOCKINGSCROLLLOCK = 132, */ + SCANCODE_KP_COMMA = 133, + SCANCODE_KP_EQUALSAS400 = 134, + + SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see + footnotes in USB doc */ + SCANCODE_INTERNATIONAL2 = 136, + SCANCODE_INTERNATIONAL3 = 137, /**< Yen */ + SCANCODE_INTERNATIONAL4 = 138, + SCANCODE_INTERNATIONAL5 = 139, + SCANCODE_INTERNATIONAL6 = 140, + SCANCODE_INTERNATIONAL7 = 141, + SCANCODE_INTERNATIONAL8 = 142, + SCANCODE_INTERNATIONAL9 = 143, + SCANCODE_LANG1 = 144, /**< Hangul/English toggle */ + SCANCODE_LANG2 = 145, /**< Hanja conversion */ + SCANCODE_LANG3 = 146, /**< Katakana */ + SCANCODE_LANG4 = 147, /**< Hiragana */ + SCANCODE_LANG5 = 148, /**< Zenkaku/Hankaku */ + SCANCODE_LANG6 = 149, /**< reserved */ + SCANCODE_LANG7 = 150, /**< reserved */ + SCANCODE_LANG8 = 151, /**< reserved */ + SCANCODE_LANG9 = 152, /**< reserved */ + + SCANCODE_ALTERASE = 153, /**< Erase-Eaze */ + SCANCODE_SYSREQ = 154, + SCANCODE_CANCEL = 155, + SCANCODE_CLEAR = 156, + SCANCODE_PRIOR = 157, + SCANCODE_RETURN2 = 158, + SCANCODE_SEPARATOR = 159, + SCANCODE_OUT = 160, + SCANCODE_OPER = 161, + SCANCODE_CLEARAGAIN = 162, + SCANCODE_CRSEL = 163, + SCANCODE_EXSEL = 164, + + SCANCODE_KP_00 = 176, + SCANCODE_KP_000 = 177, + SCANCODE_THOUSANDSSEPARATOR = 178, + SCANCODE_DECIMALSEPARATOR = 179, + SCANCODE_CURRENCYUNIT = 180, + SCANCODE_CURRENCYSUBUNIT = 181, + SCANCODE_KP_LEFTPAREN = 182, + SCANCODE_KP_RIGHTPAREN = 183, + SCANCODE_KP_LEFTBRACE = 184, + SCANCODE_KP_RIGHTBRACE = 185, + SCANCODE_KP_TAB = 186, + SCANCODE_KP_BACKSPACE = 187, + SCANCODE_KP_A = 188, + SCANCODE_KP_B = 189, + SCANCODE_KP_C = 190, + SCANCODE_KP_D = 191, + SCANCODE_KP_E = 192, + SCANCODE_KP_F = 193, + SCANCODE_KP_XOR = 194, + SCANCODE_KP_POWER = 195, + SCANCODE_KP_PERCENT = 196, + SCANCODE_KP_LESS = 197, + SCANCODE_KP_GREATER = 198, + SCANCODE_KP_AMPERSAND = 199, + SCANCODE_KP_DBLAMPERSAND = 200, + SCANCODE_KP_VERTICALBAR = 201, + SCANCODE_KP_DBLVERTICALBAR = 202, + SCANCODE_KP_COLON = 203, + SCANCODE_KP_HASH = 204, + SCANCODE_KP_SPACE = 205, + SCANCODE_KP_AT = 206, + SCANCODE_KP_EXCLAM = 207, + SCANCODE_KP_MEMSTORE = 208, + SCANCODE_KP_MEMRECALL = 209, + SCANCODE_KP_MEMCLEAR = 210, + SCANCODE_KP_MEMADD = 211, + SCANCODE_KP_MEMSUBTRACT = 212, + SCANCODE_KP_MEMMULTIPLY = 213, + SCANCODE_KP_MEMDIVIDE = 214, + SCANCODE_KP_PLUSMINUS = 215, + SCANCODE_KP_CLEAR = 216, + SCANCODE_KP_CLEARENTRY = 217, + SCANCODE_KP_BINARY = 218, + SCANCODE_KP_OCTAL = 219, + SCANCODE_KP_DECIMAL = 220, + SCANCODE_KP_HEXADECIMAL = 221, + + SCANCODE_LCTRL = 224, + SCANCODE_LSHIFT = 225, + SCANCODE_LALT = 226, /**< alt, option */ + SCANCODE_LGUI = 227, /**< windows, command (apple), meta */ + SCANCODE_RCTRL = 228, + SCANCODE_RSHIFT = 229, + SCANCODE_RALT = 230, /**< alt gr, option */ + SCANCODE_RGUI = 231, /**< windows, command (apple), meta */ + + SCANCODE_MODE = 257, /**< I'm not sure if this is really not covered + * by any of the above, but since there's a + * special KMOD_MODE for it I'm adding it here + */ + + /* @} */ /* Usage page 0x07 */ + + /** + * \name Usage page 0x0C + * + * These values are mapped from usage page 0x0C (USB consumer page). + */ + /* @{ */ + + SCANCODE_AUDIONEXT = 258, + SCANCODE_AUDIOPREV = 259, + SCANCODE_AUDIOSTOP = 260, + SCANCODE_AUDIOPLAY = 261, + SCANCODE_AUDIOMUTE = 262, + SCANCODE_MEDIASELECT = 263, + SCANCODE_WWW = 264, + SCANCODE_MAIL = 265, + SCANCODE_CALCULATOR = 266, + SCANCODE_COMPUTER = 267, + SCANCODE_AC_SEARCH = 268, + SCANCODE_AC_HOME = 269, + SCANCODE_AC_BACK = 270, + SCANCODE_AC_FORWARD = 271, + SCANCODE_AC_STOP = 272, + SCANCODE_AC_REFRESH = 273, + SCANCODE_AC_BOOKMARKS = 274, + + /* @} */ /* Usage page 0x0C */ + + /** + * \name Walther keys + * + * These are values that Christian Walther added (for mac keyboard?). + */ + /* @{ */ + + SCANCODE_BRIGHTNESSDOWN = 275, + SCANCODE_BRIGHTNESSUP = 276, + SCANCODE_DISPLAYSWITCH = 277, /**< display mirroring/dual display + switch, video mode switch */ + SCANCODE_KBDILLUMTOGGLE = 278, + SCANCODE_KBDILLUMDOWN = 279, + SCANCODE_KBDILLUMUP = 280, + SCANCODE_EJECT = 281, + SCANCODE_SLEEP = 282, + + SCANCODE_APP1 = 283, + SCANCODE_APP2 = 284, + + /* @} */ /* Walther keys */ + + /** + * \name Usage page 0x0C (additional media keys) + * + * These values are mapped from usage page 0x0C (USB consumer page). + */ + /* @{ */ + + SCANCODE_AUDIOREWIND = 285, + SCANCODE_AUDIOFASTFORWARD = 286, + + /* @} */ /* Usage page 0x0C (additional media keys) */ + + /* Add any other keys here. */ + + SCANCODES_NUM = 512 /**< not a key, just marks the number of scancodes + for array bounds */ +}; + +#define KEY_SCANCODE_MASK ( 1 << 30 ) +#define SCANCODE_TO_KEYCODE( X ) ( X | KEY_SCANCODE_MASK ) + +/** + * @brief The virtual key representation. + * + * Values of this type are used to represent keyboard keys using the current + * layout of the keyboard. These values include Unicode values representing + * the unmodified character that would be generated by pressing the key, or + * an KEY_* constant for those keys that do not generate characters. + * + * A special exception is the number keys at the top of the keyboard which + * always map to KEY_0...KEY_9, regardless of layout. + */ +enum Keycode { KEY_UNKNOWN = 0, - KEY_FIRST = 0, - KEY_BACKSPACE = 8, - KEY_TAB = 9, - KEY_CLEAR = 12, - KEY_RETURN = 13, - KEY_PAUSE = 19, - KEY_ESCAPE = 27, - KEY_SPACE = 32, - KEY_EXCLAIM = 33, - KEY_QUOTEDBL = 34, - KEY_HASH = 35, - KEY_DOLLAR = 36, - KEY_AMPERSAND = 38, - KEY_QUOTE = 39, - KEY_LEFTPAREN = 40, - KEY_RIGHTPAREN = 41, - KEY_ASTERISK = 42, - KEY_PLUS = 43, - KEY_COMMA = 44, - KEY_MINUS = 45, - KEY_PERIOD = 46, - KEY_SLASH = 47, - KEY_0 = 48, - KEY_1 = 49, - KEY_2 = 50, - KEY_3 = 51, - KEY_4 = 52, - KEY_5 = 53, - KEY_6 = 54, - KEY_7 = 55, - KEY_8 = 56, - KEY_9 = 57, - KEY_COLON = 58, - KEY_SEMICOLON = 59, - KEY_LESS = 60, - KEY_EQUALS = 61, - KEY_GREATER = 62, - KEY_QUESTION = 63, - KEY_AT = 64, + KEY_RETURN = '\r', + KEY_ESCAPE = '\033', + KEY_BACKSPACE = '\b', + KEY_TAB = '\t', + KEY_SPACE = ' ', + KEY_EXCLAIM = '!', + KEY_QUOTEDBL = '"', + KEY_HASH = '#', + KEY_PERCENT = '%', + KEY_DOLLAR = '$', + KEY_AMPERSAND = '&', + KEY_QUOTE = '\'', + KEY_LEFTPAREN = '(', + KEY_RIGHTPAREN = ')', + KEY_ASTERISK = '*', + KEY_PLUS = '+', + KEY_COMMA = ',', + KEY_MINUS = '-', + KEY_PERIOD = '.', + KEY_SLASH = '/', + KEY_0 = '0', + KEY_1 = '1', + KEY_2 = '2', + KEY_3 = '3', + KEY_4 = '4', + KEY_5 = '5', + KEY_6 = '6', + KEY_7 = '7', + KEY_8 = '8', + KEY_9 = '9', + KEY_COLON = ':', + KEY_SEMICOLON = ';', + KEY_LESS = '<', + KEY_EQUALS = '=', + KEY_GREATER = '>', + KEY_QUESTION = '?', + KEY_AT = '@', /* - Skip uppercase letters - */ - KEY_LEFTBRACKET = 91, - KEY_BACKSLASH = 92, - KEY_RIGHTBRACKET = 93, - KEY_CARET = 94, - KEY_UNDERSCORE = 95, - KEY_BACKQUOTE = 96, ///< GRAVE - KEY_A = 97, - KEY_B = 98, - KEY_C = 99, - KEY_D = 100, - KEY_E = 101, - KEY_F = 102, - KEY_G = 103, - KEY_H = 104, - KEY_I = 105, - KEY_J = 106, - KEY_K = 107, - KEY_L = 108, - KEY_M = 109, - KEY_N = 110, - KEY_O = 111, - KEY_P = 112, - KEY_Q = 113, - KEY_R = 114, - KEY_S = 115, - KEY_T = 116, - KEY_U = 117, - KEY_V = 118, - KEY_W = 119, - KEY_X = 120, - KEY_Y = 121, - KEY_Z = 122, - KEY_DELETE = 127, - /* End of ASCII mapped keysyms */ + Skip uppercase letters + */ + KEY_LEFTBRACKET = '[', + KEY_BACKSLASH = '\\', + KEY_RIGHTBRACKET = ']', + KEY_CARET = '^', + KEY_UNDERSCORE = '_', + KEY_BACKQUOTE = '`', + KEY_A = 'a', + KEY_B = 'b', + KEY_C = 'c', + KEY_D = 'd', + KEY_E = 'e', + KEY_F = 'f', + KEY_G = 'g', + KEY_H = 'h', + KEY_I = 'i', + KEY_J = 'j', + KEY_K = 'k', + KEY_L = 'l', + KEY_M = 'm', + KEY_N = 'n', + KEY_O = 'o', + KEY_P = 'p', + KEY_Q = 'q', + KEY_R = 'r', + KEY_S = 's', + KEY_T = 't', + KEY_U = 'u', + KEY_V = 'v', + KEY_W = 'w', + KEY_X = 'x', + KEY_Y = 'y', + KEY_Z = 'z', - /* International keyboard syms */ - KEY_WORLD_0 = 160, - KEY_WORLD_1 = 161, - KEY_WORLD_2 = 162, - KEY_WORLD_3 = 163, - KEY_WORLD_4 = 164, - KEY_WORLD_5 = 165, - KEY_WORLD_6 = 166, - KEY_WORLD_7 = 167, - KEY_WORLD_8 = 168, - KEY_WORLD_9 = 169, - KEY_WORLD_10 = 170, - KEY_WORLD_11 = 171, - KEY_WORLD_12 = 172, - KEY_WORLD_13 = 173, - KEY_WORLD_14 = 174, - KEY_WORLD_15 = 175, - KEY_WORLD_16 = 176, - KEY_WORLD_17 = 177, - KEY_WORLD_18 = 178, - KEY_WORLD_19 = 179, - KEY_WORLD_20 = 180, - KEY_WORLD_21 = 181, - KEY_WORLD_22 = 182, - KEY_WORLD_23 = 183, - KEY_WORLD_24 = 184, - KEY_WORLD_25 = 185, - KEY_WORLD_26 = 186, - KEY_WORLD_27 = 187, - KEY_WORLD_28 = 188, - KEY_WORLD_29 = 189, - KEY_WORLD_30 = 190, - KEY_WORLD_31 = 191, - KEY_WORLD_32 = 192, - KEY_WORLD_33 = 193, - KEY_WORLD_34 = 194, - KEY_WORLD_35 = 195, - KEY_WORLD_36 = 196, - KEY_WORLD_37 = 197, - KEY_WORLD_38 = 198, - KEY_WORLD_39 = 199, - KEY_WORLD_40 = 200, - KEY_WORLD_41 = 201, - KEY_WORLD_42 = 202, - KEY_WORLD_43 = 203, - KEY_WORLD_44 = 204, - KEY_WORLD_45 = 205, - KEY_WORLD_46 = 206, - KEY_WORLD_47 = 207, - KEY_WORLD_48 = 208, - KEY_WORLD_49 = 209, - KEY_WORLD_50 = 210, - KEY_WORLD_51 = 211, - KEY_WORLD_52 = 212, - KEY_WORLD_53 = 213, - KEY_WORLD_54 = 214, - KEY_WORLD_55 = 215, - KEY_WORLD_56 = 216, - KEY_WORLD_57 = 217, - KEY_WORLD_58 = 218, - KEY_WORLD_59 = 219, - KEY_WORLD_60 = 220, - KEY_WORLD_61 = 221, - KEY_WORLD_62 = 222, - KEY_WORLD_63 = 223, - KEY_WORLD_64 = 224, - KEY_WORLD_65 = 225, - KEY_WORLD_66 = 226, - KEY_WORLD_67 = 227, - KEY_WORLD_68 = 228, - KEY_WORLD_69 = 229, - KEY_WORLD_70 = 230, - KEY_WORLD_71 = 231, - KEY_WORLD_72 = 232, - KEY_WORLD_73 = 233, - KEY_WORLD_74 = 234, - KEY_WORLD_75 = 235, - KEY_WORLD_76 = 236, - KEY_WORLD_77 = 237, - KEY_WORLD_78 = 238, - KEY_WORLD_79 = 239, - KEY_WORLD_80 = 240, - KEY_WORLD_81 = 241, - KEY_WORLD_82 = 242, - KEY_WORLD_83 = 243, - KEY_WORLD_84 = 244, - KEY_WORLD_85 = 245, - KEY_WORLD_86 = 246, - KEY_WORLD_87 = 247, - KEY_WORLD_88 = 248, - KEY_WORLD_89 = 249, - KEY_WORLD_90 = 250, - KEY_WORLD_91 = 251, - KEY_WORLD_92 = 252, - KEY_WORLD_93 = 253, - KEY_WORLD_94 = 254, - KEY_WORLD_95 = 255, + KEY_CAPSLOCK = SCANCODE_TO_KEYCODE( SCANCODE_CAPSLOCK ), - /* Numeric keypad */ - KEY_KP0 = 256, - KEY_KP1 = 257, - KEY_KP2 = 258, - KEY_KP3 = 259, - KEY_KP4 = 260, - KEY_KP5 = 261, - KEY_KP6 = 262, - KEY_KP7 = 263, - KEY_KP8 = 264, - KEY_KP9 = 265, - KEY_KP_PEROID = 266, - KEY_KP_DIVIDE = 267, - KEY_KP_MULTIPLY = 268, - KEY_KP_MINUS = 269, - KEY_KP_PLUS = 270, - KEY_KP_ENTER = 271, - KEY_KP_EQUALS = 272, + KEY_F1 = SCANCODE_TO_KEYCODE( SCANCODE_F1 ), + KEY_F2 = SCANCODE_TO_KEYCODE( SCANCODE_F2 ), + KEY_F3 = SCANCODE_TO_KEYCODE( SCANCODE_F3 ), + KEY_F4 = SCANCODE_TO_KEYCODE( SCANCODE_F4 ), + KEY_F5 = SCANCODE_TO_KEYCODE( SCANCODE_F5 ), + KEY_F6 = SCANCODE_TO_KEYCODE( SCANCODE_F6 ), + KEY_F7 = SCANCODE_TO_KEYCODE( SCANCODE_F7 ), + KEY_F8 = SCANCODE_TO_KEYCODE( SCANCODE_F8 ), + KEY_F9 = SCANCODE_TO_KEYCODE( SCANCODE_F9 ), + KEY_F10 = SCANCODE_TO_KEYCODE( SCANCODE_F10 ), + KEY_F11 = SCANCODE_TO_KEYCODE( SCANCODE_F11 ), + KEY_F12 = SCANCODE_TO_KEYCODE( SCANCODE_F12 ), - /* Arrows + Home/End pad */ - KEY_UP = 273, - KEY_DOWN = 274, - KEY_RIGHT = 275, - KEY_LEFT = 276, - KEY_INSERT = 277, - KEY_HOME = 278, - KEY_END = 279, - KEY_PAGEUP = 280, - KEY_PAGEDOWN = 281, + KEY_PRINTSCREEN = SCANCODE_TO_KEYCODE( SCANCODE_PRINTSCREEN ), + KEY_SCROLLLOCK = SCANCODE_TO_KEYCODE( SCANCODE_SCROLLLOCK ), + KEY_PAUSE = SCANCODE_TO_KEYCODE( SCANCODE_PAUSE ), + KEY_INSERT = SCANCODE_TO_KEYCODE( SCANCODE_INSERT ), + KEY_HOME = SCANCODE_TO_KEYCODE( SCANCODE_HOME ), + KEY_PAGEUP = SCANCODE_TO_KEYCODE( SCANCODE_PAGEUP ), + KEY_DELETE = '\177', + KEY_END = SCANCODE_TO_KEYCODE( SCANCODE_END ), + KEY_PAGEDOWN = SCANCODE_TO_KEYCODE( SCANCODE_PAGEDOWN ), + KEY_RIGHT = SCANCODE_TO_KEYCODE( SCANCODE_RIGHT ), + KEY_LEFT = SCANCODE_TO_KEYCODE( SCANCODE_LEFT ), + KEY_DOWN = SCANCODE_TO_KEYCODE( SCANCODE_DOWN ), + KEY_UP = SCANCODE_TO_KEYCODE( SCANCODE_UP ), - /* Function keys */ - KEY_F1 = 282, - KEY_F2 = 283, - KEY_F3 = 284, - KEY_F4 = 285, - KEY_F5 = 286, - KEY_F6 = 287, - KEY_F7 = 288, - KEY_F8 = 289, - KEY_F9 = 290, - KEY_F10 = 291, - KEY_F11 = 292, - KEY_F12 = 293, - KEY_F13 = 294, - KEY_F14 = 295, - KEY_F15 = 296, + KEY_NUMLOCKCLEAR = SCANCODE_TO_KEYCODE( SCANCODE_NUMLOCKCLEAR ), + KEY_KP_DIVIDE = SCANCODE_TO_KEYCODE( SCANCODE_KP_DIVIDE ), + KEY_KP_MULTIPLY = SCANCODE_TO_KEYCODE( SCANCODE_KP_MULTIPLY ), + KEY_KP_MINUS = SCANCODE_TO_KEYCODE( SCANCODE_KP_MINUS ), + KEY_KP_PLUS = SCANCODE_TO_KEYCODE( SCANCODE_KP_PLUS ), + KEY_KP_ENTER = SCANCODE_TO_KEYCODE( SCANCODE_KP_ENTER ), + KEY_KP_1 = SCANCODE_TO_KEYCODE( SCANCODE_KP_1 ), + KEY_KP_2 = SCANCODE_TO_KEYCODE( SCANCODE_KP_2 ), + KEY_KP_3 = SCANCODE_TO_KEYCODE( SCANCODE_KP_3 ), + KEY_KP_4 = SCANCODE_TO_KEYCODE( SCANCODE_KP_4 ), + KEY_KP_5 = SCANCODE_TO_KEYCODE( SCANCODE_KP_5 ), + KEY_KP_6 = SCANCODE_TO_KEYCODE( SCANCODE_KP_6 ), + KEY_KP_7 = SCANCODE_TO_KEYCODE( SCANCODE_KP_7 ), + KEY_KP_8 = SCANCODE_TO_KEYCODE( SCANCODE_KP_8 ), + KEY_KP_9 = SCANCODE_TO_KEYCODE( SCANCODE_KP_9 ), + KEY_KP_0 = SCANCODE_TO_KEYCODE( SCANCODE_KP_0 ), + KEY_KP_PERIOD = SCANCODE_TO_KEYCODE( SCANCODE_KP_PERIOD ), - /* Key state modifier keys */ - KEY_NUMLOCK = 300, - KEY_CAPSLOCK = 301, - KEY_SCROLLOCK = 302, - KEY_RSHIFT = 303, - KEY_LSHIFT = 304, - KEY_RCTRL = 305, - KEY_LCTRL = 306, - KEY_RALT = 307, - KEY_LALT = 308, - KEY_RMETA = 309, - KEY_LMETA = 310, - KEY_LSUPER = 311, ///< Left "Windows" key - KEY_RSUPER = 312, ///< Right "Windows" key - KEY_MODE = 313, ///< "Alt Gr" key - KEY_COMPOSE = 314, ///< Multi-key compose key + KEY_APPLICATION = SCANCODE_TO_KEYCODE( SCANCODE_APPLICATION ), + KEY_POWER = SCANCODE_TO_KEYCODE( SCANCODE_POWER ), + KEY_KP_EQUALS = SCANCODE_TO_KEYCODE( SCANCODE_KP_EQUALS ), + KEY_F13 = SCANCODE_TO_KEYCODE( SCANCODE_F13 ), + KEY_F14 = SCANCODE_TO_KEYCODE( SCANCODE_F14 ), + KEY_F15 = SCANCODE_TO_KEYCODE( SCANCODE_F15 ), + KEY_F16 = SCANCODE_TO_KEYCODE( SCANCODE_F16 ), + KEY_F17 = SCANCODE_TO_KEYCODE( SCANCODE_F17 ), + KEY_F18 = SCANCODE_TO_KEYCODE( SCANCODE_F18 ), + KEY_F19 = SCANCODE_TO_KEYCODE( SCANCODE_F19 ), + KEY_F20 = SCANCODE_TO_KEYCODE( SCANCODE_F20 ), + KEY_F21 = SCANCODE_TO_KEYCODE( SCANCODE_F21 ), + KEY_F22 = SCANCODE_TO_KEYCODE( SCANCODE_F22 ), + KEY_F23 = SCANCODE_TO_KEYCODE( SCANCODE_F23 ), + KEY_F24 = SCANCODE_TO_KEYCODE( SCANCODE_F24 ), + KEY_EXECUTE = SCANCODE_TO_KEYCODE( SCANCODE_EXECUTE ), + KEY_HELP = SCANCODE_TO_KEYCODE( SCANCODE_HELP ), + KEY_MENU = SCANCODE_TO_KEYCODE( SCANCODE_MENU ), + KEY_SELECT = SCANCODE_TO_KEYCODE( SCANCODE_SELECT ), + KEY_STOP = SCANCODE_TO_KEYCODE( SCANCODE_STOP ), + KEY_AGAIN = SCANCODE_TO_KEYCODE( SCANCODE_AGAIN ), + KEY_UNDO = SCANCODE_TO_KEYCODE( SCANCODE_UNDO ), + KEY_CUT = SCANCODE_TO_KEYCODE( SCANCODE_CUT ), + KEY_COPY = SCANCODE_TO_KEYCODE( SCANCODE_COPY ), + KEY_PASTE = SCANCODE_TO_KEYCODE( SCANCODE_PASTE ), + KEY_FIND = SCANCODE_TO_KEYCODE( SCANCODE_FIND ), + KEY_MUTE = SCANCODE_TO_KEYCODE( SCANCODE_MUTE ), + KEY_VOLUMEUP = SCANCODE_TO_KEYCODE( SCANCODE_VOLUMEUP ), + KEY_VOLUMEDOWN = SCANCODE_TO_KEYCODE( SCANCODE_VOLUMEDOWN ), + KEY_KP_COMMA = SCANCODE_TO_KEYCODE( SCANCODE_KP_COMMA ), + KEY_KP_EQUALSAS400 = SCANCODE_TO_KEYCODE( SCANCODE_KP_EQUALSAS400 ), - /* Miscellaneous function keys */ - KEY_HELP = 315, - KEY_PRINT = 316, - KEY_SYSREQ = 317, - KEY_BREAK = 318, - KEY_MENU = 319, - KEY_POWER = 320, ///< Power Macintosh power key - KEY_EURO = 321, ///< Some european keyboards - KEY_UNDO = 322, ///< Atari keyboard has Undo + KEY_ALTERASE = SCANCODE_TO_KEYCODE( SCANCODE_ALTERASE ), + KEY_SYSREQ = SCANCODE_TO_KEYCODE( SCANCODE_SYSREQ ), + KEY_CANCEL = SCANCODE_TO_KEYCODE( SCANCODE_CANCEL ), + KEY_CLEAR = SCANCODE_TO_KEYCODE( SCANCODE_CLEAR ), + KEY_PRIOR = SCANCODE_TO_KEYCODE( SCANCODE_PRIOR ), + KEY_RETURN2 = SCANCODE_TO_KEYCODE( SCANCODE_RETURN2 ), + KEY_SEPARATOR = SCANCODE_TO_KEYCODE( SCANCODE_SEPARATOR ), + KEY_OUT = SCANCODE_TO_KEYCODE( SCANCODE_OUT ), + KEY_OPER = SCANCODE_TO_KEYCODE( SCANCODE_OPER ), + KEY_CLEARAGAIN = SCANCODE_TO_KEYCODE( SCANCODE_CLEARAGAIN ), + KEY_CRSEL = SCANCODE_TO_KEYCODE( SCANCODE_CRSEL ), + KEY_EXSEL = SCANCODE_TO_KEYCODE( SCANCODE_EXSEL ), - KEY_LAST + KEY_KP_00 = SCANCODE_TO_KEYCODE( SCANCODE_KP_00 ), + KEY_KP_000 = SCANCODE_TO_KEYCODE( SCANCODE_KP_000 ), + KEY_THOUSANDSSEPARATOR = SCANCODE_TO_KEYCODE( SCANCODE_THOUSANDSSEPARATOR ), + KEY_DECIMALSEPARATOR = SCANCODE_TO_KEYCODE( SCANCODE_DECIMALSEPARATOR ), + KEY_CURRENCYUNIT = SCANCODE_TO_KEYCODE( SCANCODE_CURRENCYUNIT ), + KEY_CURRENCYSUBUNIT = SCANCODE_TO_KEYCODE( SCANCODE_CURRENCYSUBUNIT ), + KEY_KP_LEFTPAREN = SCANCODE_TO_KEYCODE( SCANCODE_KP_LEFTPAREN ), + KEY_KP_RIGHTPAREN = SCANCODE_TO_KEYCODE( SCANCODE_KP_RIGHTPAREN ), + KEY_KP_LEFTBRACE = SCANCODE_TO_KEYCODE( SCANCODE_KP_LEFTBRACE ), + KEY_KP_RIGHTBRACE = SCANCODE_TO_KEYCODE( SCANCODE_KP_RIGHTBRACE ), + KEY_KP_TAB = SCANCODE_TO_KEYCODE( SCANCODE_KP_TAB ), + KEY_KP_BACKSPACE = SCANCODE_TO_KEYCODE( SCANCODE_KP_BACKSPACE ), + KEY_KP_A = SCANCODE_TO_KEYCODE( SCANCODE_KP_A ), + KEY_KP_B = SCANCODE_TO_KEYCODE( SCANCODE_KP_B ), + KEY_KP_C = SCANCODE_TO_KEYCODE( SCANCODE_KP_C ), + KEY_KP_D = SCANCODE_TO_KEYCODE( SCANCODE_KP_D ), + KEY_KP_E = SCANCODE_TO_KEYCODE( SCANCODE_KP_E ), + KEY_KP_F = SCANCODE_TO_KEYCODE( SCANCODE_KP_F ), + KEY_KP_XOR = SCANCODE_TO_KEYCODE( SCANCODE_KP_XOR ), + KEY_KP_POWER = SCANCODE_TO_KEYCODE( SCANCODE_KP_POWER ), + KEY_KP_PERCENT = SCANCODE_TO_KEYCODE( SCANCODE_KP_PERCENT ), + KEY_KP_LESS = SCANCODE_TO_KEYCODE( SCANCODE_KP_LESS ), + KEY_KP_GREATER = SCANCODE_TO_KEYCODE( SCANCODE_KP_GREATER ), + KEY_KP_AMPERSAND = SCANCODE_TO_KEYCODE( SCANCODE_KP_AMPERSAND ), + KEY_KP_DBLAMPERSAND = SCANCODE_TO_KEYCODE( SCANCODE_KP_DBLAMPERSAND ), + KEY_KP_VERTICALBAR = SCANCODE_TO_KEYCODE( SCANCODE_KP_VERTICALBAR ), + KEY_KP_DBLVERTICALBAR = SCANCODE_TO_KEYCODE( SCANCODE_KP_DBLVERTICALBAR ), + KEY_KP_COLON = SCANCODE_TO_KEYCODE( SCANCODE_KP_COLON ), + KEY_KP_HASH = SCANCODE_TO_KEYCODE( SCANCODE_KP_HASH ), + KEY_KP_SPACE = SCANCODE_TO_KEYCODE( SCANCODE_KP_SPACE ), + KEY_KP_AT = SCANCODE_TO_KEYCODE( SCANCODE_KP_AT ), + KEY_KP_EXCLAM = SCANCODE_TO_KEYCODE( SCANCODE_KP_EXCLAM ), + KEY_KP_MEMSTORE = SCANCODE_TO_KEYCODE( SCANCODE_KP_MEMSTORE ), + KEY_KP_MEMRECALL = SCANCODE_TO_KEYCODE( SCANCODE_KP_MEMRECALL ), + KEY_KP_MEMCLEAR = SCANCODE_TO_KEYCODE( SCANCODE_KP_MEMCLEAR ), + KEY_KP_MEMADD = SCANCODE_TO_KEYCODE( SCANCODE_KP_MEMADD ), + KEY_KP_MEMSUBTRACT = SCANCODE_TO_KEYCODE( SCANCODE_KP_MEMSUBTRACT ), + KEY_KP_MEMMULTIPLY = SCANCODE_TO_KEYCODE( SCANCODE_KP_MEMMULTIPLY ), + KEY_KP_MEMDIVIDE = SCANCODE_TO_KEYCODE( SCANCODE_KP_MEMDIVIDE ), + KEY_KP_PLUSMINUS = SCANCODE_TO_KEYCODE( SCANCODE_KP_PLUSMINUS ), + KEY_KP_CLEAR = SCANCODE_TO_KEYCODE( SCANCODE_KP_CLEAR ), + KEY_KP_CLEARENTRY = SCANCODE_TO_KEYCODE( SCANCODE_KP_CLEARENTRY ), + KEY_KP_BINARY = SCANCODE_TO_KEYCODE( SCANCODE_KP_BINARY ), + KEY_KP_OCTAL = SCANCODE_TO_KEYCODE( SCANCODE_KP_OCTAL ), + KEY_KP_DECIMAL = SCANCODE_TO_KEYCODE( SCANCODE_KP_DECIMAL ), + KEY_KP_HEXADECIMAL = SCANCODE_TO_KEYCODE( SCANCODE_KP_HEXADECIMAL ), + + KEY_LCTRL = SCANCODE_TO_KEYCODE( SCANCODE_LCTRL ), + KEY_LSHIFT = SCANCODE_TO_KEYCODE( SCANCODE_LSHIFT ), + KEY_LALT = SCANCODE_TO_KEYCODE( SCANCODE_LALT ), + KEY_LGUI = SCANCODE_TO_KEYCODE( SCANCODE_LGUI ), + KEY_RCTRL = SCANCODE_TO_KEYCODE( SCANCODE_RCTRL ), + KEY_RSHIFT = SCANCODE_TO_KEYCODE( SCANCODE_RSHIFT ), + KEY_RALT = SCANCODE_TO_KEYCODE( SCANCODE_RALT ), + KEY_RGUI = SCANCODE_TO_KEYCODE( SCANCODE_RGUI ), + + KEY_MODE = SCANCODE_TO_KEYCODE( SCANCODE_MODE ), + + KEY_AUDIONEXT = SCANCODE_TO_KEYCODE( SCANCODE_AUDIONEXT ), + KEY_AUDIOPREV = SCANCODE_TO_KEYCODE( SCANCODE_AUDIOPREV ), + KEY_AUDIOSTOP = SCANCODE_TO_KEYCODE( SCANCODE_AUDIOSTOP ), + KEY_AUDIOPLAY = SCANCODE_TO_KEYCODE( SCANCODE_AUDIOPLAY ), + KEY_AUDIOMUTE = SCANCODE_TO_KEYCODE( SCANCODE_AUDIOMUTE ), + KEY_MEDIASELECT = SCANCODE_TO_KEYCODE( SCANCODE_MEDIASELECT ), + KEY_WWW = SCANCODE_TO_KEYCODE( SCANCODE_WWW ), + KEY_MAIL = SCANCODE_TO_KEYCODE( SCANCODE_MAIL ), + KEY_CALCULATOR = SCANCODE_TO_KEYCODE( SCANCODE_CALCULATOR ), + KEY_COMPUTER = SCANCODE_TO_KEYCODE( SCANCODE_COMPUTER ), + KEY_AC_SEARCH = SCANCODE_TO_KEYCODE( SCANCODE_AC_SEARCH ), + KEY_AC_HOME = SCANCODE_TO_KEYCODE( SCANCODE_AC_HOME ), + KEY_AC_BACK = SCANCODE_TO_KEYCODE( SCANCODE_AC_BACK ), + KEY_AC_FORWARD = SCANCODE_TO_KEYCODE( SCANCODE_AC_FORWARD ), + KEY_AC_STOP = SCANCODE_TO_KEYCODE( SCANCODE_AC_STOP ), + KEY_AC_REFRESH = SCANCODE_TO_KEYCODE( SCANCODE_AC_REFRESH ), + KEY_AC_BOOKMARKS = SCANCODE_TO_KEYCODE( SCANCODE_AC_BOOKMARKS ), + + KEY_BRIGHTNESSDOWN = SCANCODE_TO_KEYCODE( SCANCODE_BRIGHTNESSDOWN ), + KEY_BRIGHTNESSUP = SCANCODE_TO_KEYCODE( SCANCODE_BRIGHTNESSUP ), + KEY_DISPLAYSWITCH = SCANCODE_TO_KEYCODE( SCANCODE_DISPLAYSWITCH ), + KEY_KBDILLUMTOGGLE = SCANCODE_TO_KEYCODE( SCANCODE_KBDILLUMTOGGLE ), + KEY_KBDILLUMDOWN = SCANCODE_TO_KEYCODE( SCANCODE_KBDILLUMDOWN ), + KEY_KBDILLUMUP = SCANCODE_TO_KEYCODE( SCANCODE_KBDILLUMUP ), + KEY_EJECT = SCANCODE_TO_KEYCODE( SCANCODE_EJECT ), + KEY_SLEEP = SCANCODE_TO_KEYCODE( SCANCODE_SLEEP ), + KEY_APP1 = SCANCODE_TO_KEYCODE( SCANCODE_APP1 ), + KEY_APP2 = SCANCODE_TO_KEYCODE( SCANCODE_APP2 ), + + KEY_AUDIOREWIND = SCANCODE_TO_KEYCODE( SCANCODE_AUDIOREWIND ), + KEY_AUDIOFASTFORWARD = SCANCODE_TO_KEYCODE( SCANCODE_AUDIOFASTFORWARD ) }; /** @enum KeyModTable Keyboard Modes */ @@ -311,6 +713,9 @@ enum MouseButtonsMask { EE_BUTTONS_ALL = 0xFFFFFFFF }; +#define EE_KEYS_NUM ( SCANCODES_NUM ) +#define EE_KEYS_SPACE ( EE_KEYS_NUM / 8 ) + }} // namespace EE::Window #endif diff --git a/projects/linux/ee.creator.user b/projects/linux/ee.creator.user index 5c22a656d..38197cc7f 100644 --- a/projects/linux/ee.creator.user +++ b/projects/linux/ee.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/src/eepp/maps/mapeditor/mapeditor.cpp b/src/eepp/maps/mapeditor/mapeditor.cpp index a73fd9130..cd7f60069 100644 --- a/src/eepp/maps/mapeditor/mapeditor.cpp +++ b/src/eepp/maps/mapeditor/mapeditor.cpp @@ -150,7 +150,7 @@ void MapEditor::createWinMenu() { addShortcut( KEY_KP_MINUS, KEYMOD_CTRL, PU3->getItem( PU3->add( "Zoom Out", mTheme->getIconByName( "zoom-out" ) ) ) ->asType() ); - addShortcut( KEY_KP0, KEYMOD_CTRL, + addShortcut( KEY_0, KEYMOD_CTRL, PU3->getItem( PU3->add( "Normal Size", mTheme->getIconByName( "zoom-original" ) ) ) ->asType() ); PU3->addSeparator(); diff --git a/src/eepp/ui/doc/syntaxcolorscheme.cpp b/src/eepp/ui/doc/syntaxcolorscheme.cpp index a735a9aef..dfac165c7 100644 --- a/src/eepp/ui/doc/syntaxcolorscheme.cpp +++ b/src/eepp/ui/doc/syntaxcolorscheme.cpp @@ -27,6 +27,7 @@ SyntaxColorScheme SyntaxColorScheme::getDefault() { {"line_number", Color( "#525259" )}, {"line_number2", Color( "#83838f" )}, {"line_number_background", Color::Transparent}, + {"indentation_guide", Color( "#54575b" )}, }}; } diff --git a/src/eepp/ui/doc/textdocument.cpp b/src/eepp/ui/doc/textdocument.cpp index 2e0c8e3bd..d0a20a6fc 100644 --- a/src/eepp/ui/doc/textdocument.cpp +++ b/src/eepp/ui/doc/textdocument.cpp @@ -24,6 +24,7 @@ bool TextDocument::isNonWord( String::StringBaseType ch ) { TextDocument::TextDocument() : mUndoStack( this ), mDefaultFileName( "untitled" ), mCleanChangeId( 0 ) { + initializeCommands(); reset(); } @@ -549,10 +550,9 @@ void TextDocument::moveToNextWord() { } } -void TextDocument::moveToPreviousLine( Int64 lastColIndex ) { +void TextDocument::moveToPreviousLine() { TextPosition pos = getSelection().start(); pos.setLine( pos.line() - 1 ); - pos.setColumn( lastColIndex ); setSelection( pos ); } @@ -858,6 +858,25 @@ bool TextDocument::isDirty() const { return mCleanChangeId != getCurrentChangeId(); } +void TextDocument::execute( const std::string& command ) { + auto cmdIt = mCommands.find( command ); + if ( cmdIt != mCommands.end() ) { + cmdIt->second(); + } +} + +void TextDocument::setCommand( const std::string& command, TextDocument::DocumentCommand func ) { + mCommands[command] = func; +} + +const Uint32& TextDocument::getPageSize() const { + return mPageSize; +} + +void TextDocument::setPageSize( const Uint32& pageSize ) { + mPageSize = pageSize; +} + void TextDocument::cleanChangeId() { mCleanChangeId = getCurrentChangeId(); } @@ -892,6 +911,52 @@ void TextDocument::notifyLineChanged( const Int64& lineIndex ) { } } +void TextDocument::initializeCommands() { + mCommands["reset"] = [&] { reset(); }; + mCommands["save"] = [&] { save(); }; + mCommands["delete-to-previous-word"] = [&] { deleteToPreviousWord(); }; + mCommands["delete-to-previous-char"] = [&] { deleteToPreviousChar(); }; + mCommands["delete-to-next-word"] = [&] { deleteToNextWord(); }; + mCommands["delete-to-next-char"] = [&] { deleteToNextChar(); }; + mCommands["delete-selection"] = [&] { deleteSelection(); }; + mCommands["move-to-previous-char"] = [&] { moveToPreviousChar(); }; + mCommands["move-to-previous-word"] = [&] { moveToPreviousWord(); }; + mCommands["move-to-next-char"] = [&] { moveToNextChar(); }; + mCommands["move-to-next-word"] = [&] { moveToNextWord(); }; + mCommands["move-to-previous-line"] = [&] { moveToPreviousLine(); }; + mCommands["move-to-next-line"] = [&] { moveToNextLine(); }; + mCommands["move-to-previous-page"] = [&] { moveToPreviousPage( mPageSize ); }; + mCommands["move-to-next-page"] = [&] { moveToNextPage( mPageSize ); }; + mCommands["move-to-start-of-doc"] = [&] { moveToStartOfDoc(); }; + mCommands["move-to-end-of-doc"] = [&] { moveToEndOfDoc(); }; + mCommands["move-to-start-of-line"] = [&] { moveToStartOfLine(); }; + mCommands["move-to-end-of-line"] = [&] { moveToEndOfLine(); }; + mCommands["move-to-start-of-content"] = [&] { moveToStartOfContent(); }; + mCommands["move-lines-up"] = [&] { moveLinesUp(); }; + mCommands["move-lines-down"] = [&] { moveLinesDown(); }; + mCommands["select-to-previous-char"] = [&] { selectToPreviousChar(); }; + mCommands["select-to-previous-word"] = [&] { selectToPreviousWord(); }; + mCommands["select-to-previous-line"] = [&] { selectToPreviousLine(); }; + mCommands["select-to-next-char"] = [&] { selectToNextChar(); }; + mCommands["select-to-next-word"] = [&] { selectToNextWord(); }; + mCommands["select-to-next-line"] = [&] { selectToNextLine(); }; + mCommands["select-word"] = [&] { selectWord(); }; + mCommands["select-to-start-of-line"] = [&] { selectToStartOfLine(); }; + mCommands["select-to-end-of-line"] = [&] { selectToEndOfLine(); }; + mCommands["select-to-start-of-doc"] = [&] { selectToStartOfDoc(); }; + mCommands["select-to-start-of-content"] = [&] { selectToStartOfContent(); }; + mCommands["select-to-end-of-doc"] = [&] { selectToEndOfDoc(); }; + mCommands["select-to-previous-page"] = [&] { selectToPreviousPage( mPageSize ); }; + mCommands["select-to-next-page"] = [&] { selectToNextPage( mPageSize ); }; + mCommands["select-all"] = [&] { selectAll(); }; + mCommands["new-line"] = [&] { newLine(); }; + mCommands["new-line-above"] = [&] { newLineAbove(); }; + mCommands["indent"] = [&] { indent(); }; + mCommands["unindent"] = [&] { unindent(); }; + mCommands["undo"] = [&] { undo(); }; + mCommands["redo"] = [&] { redo(); }; +} + TextDocument::Client::~Client() {} }}} // namespace EE::UI::Doc diff --git a/src/eepp/ui/uicodeeditor.cpp b/src/eepp/ui/uicodeeditor.cpp index 2191faaf7..fe8aa5627 100644 --- a/src/eepp/ui/uicodeeditor.cpp +++ b/src/eepp/ui/uicodeeditor.cpp @@ -24,6 +24,7 @@ UICodeEditor::UICodeEditor() : mCursorVisible( false ), mMouseDown( false ), mShowLineNumber( true ), + mShowIndentationGuide( true ), mLocked( false ), mTabWidth( 4 ), mLastColOffset( 0 ), @@ -130,6 +131,43 @@ void UICodeEditor::draw() { } } + // Draw tab marker + if ( mShowIndentationGuide ) { + primitives.setForceDraw( false ); + for ( int i = lineRange.first; i <= lineRange.second; i++ ) { + Float charWidth = getGlyphWidth(); + Float tabWidth = getTextWidth( "\t" ); + Vector2f curPos( startScroll.x, startScroll.y + lineHeight * i ); + auto& tokens = mHighlighter.getLine( i ); + + if ( !tokens.empty() ) { + size_t c = 0; + String::StringBaseType curChar; + primitives.setLineWidth( 1 ); + while ( c < tokens[0].text.size() && + ( tokens[0].text[c] == '\t' || tokens[0].text[c] == ' ' ) ) { + curChar = tokens[0].text[c]; + primitives.setColor( mIndentationGuideColor ); + if ( curChar == '\t' ) { + primitives.drawLine( {{eefloor( curPos.x + tabWidth * 0.25f ), + eeceil( curPos.y + lineHeight * 0.5f )}, + {eefloor( curPos.x + tabWidth * 0.75f ), + eeceil( curPos.y + lineHeight * 0.5f )}} ); + } else { + primitives.drawLine( + {{eefloor( curPos.x + charWidth * 0.5f - PixelDensity::dpToPx( 1 ) ), + eeceil( curPos.y + lineHeight * 0.5f )}, + {eefloor( curPos.x + charWidth * 0.5f + PixelDensity::dpToPx( 1 ) ), + eeceil( curPos.y + lineHeight * 0.5f )}} ); + } + c++; + curPos.x += curChar == ' ' ? charWidth : tabWidth; + } + } + } + primitives.setForceDraw( true ); + } + for ( int i = lineRange.first; i <= lineRange.second; i++ ) { Vector2f curPos( startScroll.x, startScroll.y + lineHeight * i ); auto& tokens = mHighlighter.getLine( i ); @@ -364,6 +402,17 @@ void UICodeEditor::setCaretColor( const Color& caretColor ) { } } +const Color& UICodeEditor::getIndentationGuideColor() const { + return mIndentationGuideColor; +} + +void UICodeEditor::setIndentationGuideColor( const Color& indentationGuide ) { + if ( mIndentationGuideColor != indentationGuide ) { + mIndentationGuideColor = indentationGuide; + invalidateDraw(); + } +} + const SyntaxColorScheme& UICodeEditor::getColorScheme() const { return mColorScheme; } @@ -377,6 +426,7 @@ void UICodeEditor::updateColorScheme() { mLineNumberBackgroundColor = mColorScheme.getEditorColor( "line_number_background" ); mCurrentLineBackgroundColor = mColorScheme.getEditorColor( "line_highlight" ); mCaretColor = mColorScheme.getEditorColor( "caret" ); + mIndentationGuideColor = mColorScheme.getEditorColor( "indentation_guide" ); } void UICodeEditor::setColorScheme( const SyntaxColorScheme& colorScheme ) { @@ -625,8 +675,7 @@ Uint32 UICodeEditor::onKeyDown( const KeyEvent& event ) { } break; } - case KEY_0: - case KEY_KP0: { + case KEY_0: { if ( event.getMod() & KEYMOD_CTRL ) { setFontSize( mFontSize ); } @@ -874,6 +923,28 @@ void UICodeEditor::setLocked( bool locked ) { } } +const Color& UICodeEditor::getLineNumberFontColor() const { + return mLineNumberFontColor; +} + +void UICodeEditor::setLineNumberFontColor( const Color& lineNumberFontColor ) { + if ( lineNumberFontColor != mLineNumberFontColor ) { + mLineNumberFontColor = lineNumberFontColor; + invalidateDraw(); + } +} + +const Color& UICodeEditor::getLineNumberActiveFontColor() const { + return mLineNumberActiveFontColor; +} + +void UICodeEditor::setLineNumberActiveFontColor( const Color& lineNumberActiveFontColor ) { + if ( mLineNumberActiveFontColor != lineNumberActiveFontColor ) { + mLineNumberActiveFontColor = lineNumberActiveFontColor; + invalidateDraw(); + } +} + Int64 UICodeEditor::getColFromXOffset( Int64 lineNumber, const Float& x ) const { if ( x <= 0 ) return 0; diff --git a/src/eepp/ui/uicommondialog.cpp b/src/eepp/ui/uicommondialog.cpp index de143ee14..1e8d34821 100644 --- a/src/eepp/ui/uicommondialog.cpp +++ b/src/eepp/ui/uicommondialog.cpp @@ -83,6 +83,24 @@ UICommonDialog::UICommonDialog( Uint32 CDLFlags, std::string DefaultFilePattern, mList->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) ->setLayoutWeight( 1 ) ->setLayoutMargin( Rect( 0, 0, 0, 4 ) ); + mList->addEventListener( Event::KeyDown, [&]( const Event* event ) { + const KeyEvent* KEvent = reinterpret_cast( event ); + if ( KEvent->getKeyCode() == KEY_DOWN ) { + if ( mList->getCount() && mList->getItemSelectedIndex() == eeINDEX_NOT_FOUND ) { + mList->setSelected( 0 ); + } + } else if ( KEvent->getKeyCode() == KEY_BACKSPACE ) { + goFolderUp(); + } + } ); + mList->addEventListener( Event::OnItemKeyDown, [&]( const Event* event ) { + const KeyEvent* KEvent = reinterpret_cast( event ); + if ( KEvent->getKeyCode() == KEY_RETURN ) { + openFileOrFolder(); + } else if ( KEvent->getKeyCode() == KEY_BACKSPACE ) { + goFolderUp(); + } + } ); hLayout = UILinearLayout::NewHorizontal(); hLayout->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) @@ -231,6 +249,8 @@ void UICommonDialog::refreshFolder() { 1.f / ( ( mList->getCount() * mList->getRowHeight() ) / (Float)mList->getSize().getHeight() ) ); } + + mList->setFocus(); } void UICommonDialog::openSaveClick() { @@ -260,6 +280,24 @@ void UICommonDialog::disableButtons() { mButtonMaximize->setEnabled( false ); } +void UICommonDialog::openFileOrFolder() { + std::string newPath = mCurPath + mList->getItemSelectedText(); + + if ( FileSystem::isDirectory( newPath ) ) { + mCurPath = newPath + FileSystem::getOSSlash(); + mPath->setText( mCurPath ); + refreshFolder(); + } else { + open(); + } +} + +void UICommonDialog::goFolderUp() { + mCurPath = FileSystem::removeLastFolderFromPath( mCurPath ); + mPath->setText( mCurPath ); + refreshFolder(); +} + Uint32 UICommonDialog::onMessage( const NodeMessage* Msg ) { switch ( Msg->getMsg() ) { case NodeMessage::Click: { @@ -271,9 +309,7 @@ Uint32 UICommonDialog::onMessage( const NodeMessage* Msg ) { closeWindow(); } else if ( Msg->getSender() == mButtonUp ) { - mCurPath = FileSystem::removeLastFolderFromPath( mCurPath ); - mPath->setText( mCurPath ); - refreshFolder(); + goFolderUp(); } } @@ -282,15 +318,7 @@ Uint32 UICommonDialog::onMessage( const NodeMessage* Msg ) { case NodeMessage::DoubleClick: { if ( Msg->getFlags() & EE_BUTTON_LMASK ) { if ( Msg->getSender()->isType( UI_TYPE_LISTBOXITEM ) ) { - std::string newPath = mCurPath + mList->getItemSelectedText(); - - if ( FileSystem::isDirectory( newPath ) ) { - mCurPath = newPath + FileSystem::getOSSlash(); - mPath->setText( mCurPath ); - refreshFolder(); - } else { - open(); - } + openFileOrFolder(); } } diff --git a/src/eepp/ui/uilistboxitem.cpp b/src/eepp/ui/uilistboxitem.cpp index 964c9e6fe..c5ac81627 100644 --- a/src/eepp/ui/uilistboxitem.cpp +++ b/src/eepp/ui/uilistboxitem.cpp @@ -106,6 +106,8 @@ void UIListBoxItem::select() { if ( !wasSelected ) { LBParent->onSelected(); } + + setFocus(); } } diff --git a/src/eepp/window/backend/SDL2/inputsdl2.cpp b/src/eepp/window/backend/SDL2/inputsdl2.cpp index 6580af3de..40bb5d5c2 100644 --- a/src/eepp/window/backend/SDL2/inputsdl2.cpp +++ b/src/eepp/window/backend/SDL2/inputsdl2.cpp @@ -9,9 +9,6 @@ namespace EE { namespace Window { namespace Backend { namespace SDL2 { -static Uint32 KeyCodesTable[SDL_NUM_SCANCODES]; -static bool KeyCodesTableInit = false; - InputSDL::InputSDL( EE::Window::Window* window ) : Input( window, eeNew( JoystickManagerSDL, () ) ), mDPIScale( 1.f ) { #if defined( EE_X11_PLATFORM ) @@ -141,7 +138,7 @@ void InputSDL::update() { EEEvent.Type = InputEvent::KeyDown; EEEvent.key.state = SDLEvent.key.state; EEEvent.key.which = SDLEvent.key.windowID; - EEEvent.key.keysym.sym = 0; + EEEvent.key.keysym.sym = KEY_UNKNOWN; EEEvent.key.keysym.mod = eeINDEX_NOT_FOUND; EEEvent.key.keysym.unicode = txt[0]; break; @@ -150,7 +147,8 @@ void InputSDL::update() { EEEvent.Type = InputEvent::KeyDown; EEEvent.key.state = SDLEvent.key.state; EEEvent.key.which = SDLEvent.key.windowID; - EEEvent.key.keysym.sym = KeyCodesTable[SDLEvent.key.keysym.scancode]; + EEEvent.key.keysym.sym = (Keycode)SDLEvent.key.keysym.sym; + EEEvent.key.keysym.scancode = (Scancode)SDLEvent.key.keysym.scancode; EEEvent.key.keysym.mod = SDLEvent.key.keysym.mod; EEEvent.key.keysym.unicode = 0; break; @@ -159,7 +157,8 @@ void InputSDL::update() { EEEvent.Type = InputEvent::KeyUp; EEEvent.key.state = SDLEvent.key.state; EEEvent.key.which = SDLEvent.key.windowID; - EEEvent.key.keysym.sym = KeyCodesTable[SDLEvent.key.keysym.scancode]; + EEEvent.key.keysym.sym = (Keycode)SDLEvent.key.keysym.sym; + EEEvent.key.keysym.scancode = (Scancode)SDLEvent.key.keysym.scancode; EEEvent.key.keysym.mod = SDLEvent.key.keysym.mod; EEEvent.key.keysym.unicode = 0; break; @@ -380,106 +379,38 @@ bool InputSDL::isMouseCaptured() const { SDL_WINDOW_MOUSE_CAPTURE; } +std::string InputSDL::getKeyName( const Keycode& keyCode ) const { + return std::string( SDL_GetKeyName( keyCode ) ); +} + +Keycode InputSDL::getKeyFromName( const std::string& keycode ) const { + return (Keycode)SDL_GetKeyFromName( keycode.c_str() ); +} + +std::string InputSDL::getScancodeName( const Scancode& scancode ) const { + return SDL_GetScancodeName( (SDL_Scancode)scancode ); +} + +Scancode InputSDL::getScancodeFromName( const std::string& scancode ) const { + return (Scancode)SDL_GetScancodeFromName( scancode.c_str() ); +} + +Keycode InputSDL::getKeyFromScancode( const Scancode& scancode ) const { + return (Keycode)SDL_GetKeyFromScancode( (SDL_Scancode)scancode ); +} + +Scancode InputSDL::getScancodeFromKey( const Keycode& scancode ) const { + return (Scancode)SDL_GetScancodeFromKey( (SDL_Keycode)scancode ); +} + void InputSDL::init() { mDPIScale = mWindow->getScale(); mMousePos = queryMousePos(); - - initializeTables(); - #if EE_PLATFORM != EE_PLATFORM_EMSCRIPTEN mJoystickManager->open(); #endif } -void InputSDL::initializeTables() { - if ( KeyCodesTableInit ) - return; - - Uint32 i; - - memset( &KeyCodesTable[0], 0, SDL_NUM_SCANCODES ); - - for ( i = SDL_SCANCODE_A; i <= SDL_SCANCODE_Z; i++ ) - KeyCodesTable[i] = KEY_A + i - SDL_SCANCODE_A; - - KeyCodesTable[SDL_SCANCODE_0] = KEY_0; - KeyCodesTable[SDL_SCANCODE_1] = KEY_1; - KeyCodesTable[SDL_SCANCODE_2] = KEY_2; - KeyCodesTable[SDL_SCANCODE_3] = KEY_3; - KeyCodesTable[SDL_SCANCODE_4] = KEY_4; - KeyCodesTable[SDL_SCANCODE_5] = KEY_5; - KeyCodesTable[SDL_SCANCODE_6] = KEY_6; - KeyCodesTable[SDL_SCANCODE_7] = KEY_7; - KeyCodesTable[SDL_SCANCODE_8] = KEY_8; - KeyCodesTable[SDL_SCANCODE_9] = KEY_9; - KeyCodesTable[SDL_SCANCODE_KP_0] = KEY_KP0; - KeyCodesTable[SDL_SCANCODE_KP_1] = KEY_KP1; - KeyCodesTable[SDL_SCANCODE_KP_2] = KEY_KP2; - KeyCodesTable[SDL_SCANCODE_KP_3] = KEY_KP3; - KeyCodesTable[SDL_SCANCODE_KP_4] = KEY_KP4; - KeyCodesTable[SDL_SCANCODE_KP_5] = KEY_KP5; - KeyCodesTable[SDL_SCANCODE_KP_6] = KEY_KP6; - KeyCodesTable[SDL_SCANCODE_KP_7] = KEY_KP7; - KeyCodesTable[SDL_SCANCODE_KP_8] = KEY_KP8; - KeyCodesTable[SDL_SCANCODE_KP_9] = KEY_KP9; - KeyCodesTable[SDL_SCANCODE_F1] = KEY_F1; - KeyCodesTable[SDL_SCANCODE_F2] = KEY_F2; - KeyCodesTable[SDL_SCANCODE_F3] = KEY_F3; - KeyCodesTable[SDL_SCANCODE_F4] = KEY_F4; - KeyCodesTable[SDL_SCANCODE_F5] = KEY_F5; - KeyCodesTable[SDL_SCANCODE_F6] = KEY_F6; - KeyCodesTable[SDL_SCANCODE_F7] = KEY_F7; - KeyCodesTable[SDL_SCANCODE_F8] = KEY_F8; - KeyCodesTable[SDL_SCANCODE_F9] = KEY_F9; - KeyCodesTable[SDL_SCANCODE_F10] = KEY_F10; - KeyCodesTable[SDL_SCANCODE_F11] = KEY_F11; - KeyCodesTable[SDL_SCANCODE_F12] = KEY_F12; - KeyCodesTable[SDL_SCANCODE_ESCAPE] = KEY_ESCAPE; - KeyCodesTable[SDL_SCANCODE_MINUS] = KEY_MINUS; - KeyCodesTable[SDL_SCANCODE_EQUALS] = KEY_EQUALS; - KeyCodesTable[SDL_SCANCODE_BACKSPACE] = KEY_BACKSPACE; - KeyCodesTable[SDL_SCANCODE_TAB] = KEY_TAB; - KeyCodesTable[SDL_SCANCODE_RETURN] = KEY_RETURN; - KeyCodesTable[SDL_SCANCODE_SEMICOLON] = KEY_SEMICOLON; - KeyCodesTable[SDL_SCANCODE_BACKSLASH] = KEY_BACKSLASH; - KeyCodesTable[SDL_SCANCODE_COMMA] = KEY_COMMA; - KeyCodesTable[SDL_SCANCODE_SLASH] = KEY_SLASH; - KeyCodesTable[SDL_SCANCODE_KP_SPACE] = KEY_SPACE; - KeyCodesTable[SDL_SCANCODE_SPACE] = KEY_SPACE; - KeyCodesTable[SDL_SCANCODE_INSERT] = KEY_INSERT; - KeyCodesTable[SDL_SCANCODE_DELETE] = KEY_DELETE; - KeyCodesTable[SDL_SCANCODE_HOME] = KEY_HOME; - KeyCodesTable[SDL_SCANCODE_END] = KEY_END; - KeyCodesTable[SDL_SCANCODE_PAGEUP] = KEY_PAGEUP; - KeyCodesTable[SDL_SCANCODE_PAGEDOWN] = KEY_PAGEDOWN; - KeyCodesTable[SDL_SCANCODE_LEFT] = KEY_LEFT; - KeyCodesTable[SDL_SCANCODE_RIGHT] = KEY_RIGHT; - KeyCodesTable[SDL_SCANCODE_UP] = KEY_UP; - KeyCodesTable[SDL_SCANCODE_DOWN] = KEY_DOWN; - KeyCodesTable[SDL_SCANCODE_KP_DIVIDE] = KEY_KP_DIVIDE; - KeyCodesTable[SDL_SCANCODE_KP_MULTIPLY] = KEY_KP_MULTIPLY; - KeyCodesTable[SDL_SCANCODE_KP_MINUS] = KEY_KP_MINUS; - KeyCodesTable[SDL_SCANCODE_KP_PLUS] = KEY_KP_PLUS; - KeyCodesTable[SDL_SCANCODE_KP_ENTER] = KEY_KP_ENTER; - KeyCodesTable[SDL_SCANCODE_PRINTSCREEN] = KEY_PRINT; - KeyCodesTable[SDL_SCANCODE_PAUSE] = KEY_PAUSE; - KeyCodesTable[SDL_SCANCODE_KP_EQUALS] = KEY_KP_EQUALS; - KeyCodesTable[SDL_SCANCODE_LSHIFT] = KEY_LSHIFT; - KeyCodesTable[SDL_SCANCODE_RSHIFT] = KEY_RSHIFT; - KeyCodesTable[SDL_SCANCODE_LCTRL] = KEY_LCTRL; - KeyCodesTable[SDL_SCANCODE_RCTRL] = KEY_RCTRL; - KeyCodesTable[SDL_SCANCODE_LALT] = KEY_LALT; - KeyCodesTable[SDL_SCANCODE_RALT] = KEY_RALT; - KeyCodesTable[SDL_SCANCODE_MODE] = KEY_MODE; - KeyCodesTable[SDL_SCANCODE_LGUI] = KEY_LSUPER; - KeyCodesTable[SDL_SCANCODE_RGUI] = KEY_RSUPER; - KeyCodesTable[SDL_SCANCODE_SCROLLLOCK] = KEY_SCROLLOCK; - KeyCodesTable[SDL_SCANCODE_NUMLOCKCLEAR] = KEY_NUMLOCK; - KeyCodesTable[SDL_SCANCODE_CAPSLOCK] = KEY_CAPSLOCK; - - KeyCodesTableInit = true; -} - }}}} // namespace EE::Window::Backend::SDL2 #endif diff --git a/src/eepp/window/backend/SDL2/inputsdl2.hpp b/src/eepp/window/backend/SDL2/inputsdl2.hpp index 734c8abc9..ca8e90b3a 100644 --- a/src/eepp/window/backend/SDL2/inputsdl2.hpp +++ b/src/eepp/window/backend/SDL2/inputsdl2.hpp @@ -12,7 +12,7 @@ namespace EE { namespace Window { namespace Backend { namespace SDL2 { class EE_API InputSDL : public Input { public: - virtual ~InputSDL(); + ~InputSDL(); void update(); @@ -28,15 +28,25 @@ class EE_API InputSDL : public Input { bool isMouseCaptured() const; + std::string getKeyName( const Keycode& keycode ) const; + + Keycode getKeyFromName( const std::string& keycode ) const; + + std::string getScancodeName( const Scancode& scancode ) const; + + Scancode getScancodeFromName( const std::string& scancode ) const; + + Keycode getKeyFromScancode( const Scancode& scancode ) const; + + Scancode getScancodeFromKey( const Keycode& scancode ) const; + protected: friend class WindowSDL; Float mDPIScale; InputSDL( EE::Window::Window* window ); - virtual void init(); - - void initializeTables(); + void init(); }; }}}} // namespace EE::Window::Backend::SDL2 diff --git a/src/eepp/window/input.cpp b/src/eepp/window/input.cpp index d4d1e04ef..e1934ec61 100644 --- a/src/eepp/window/input.cpp +++ b/src/eepp/window/input.cpp @@ -22,8 +22,8 @@ Input::Input( EE::Window::Window* window, JoystickManager* joystickmanager ) : mNumCallBacks( 0 ), mMouseSpeed( 1.0f ), mInputGrabed( false ) { - memset( mKeysDown, 0, EE_KEYS_SPACE ); - memset( mKeysUp, 0, EE_KEYS_SPACE ); + memset( mScancodeDown, 0, EE_KEYS_SPACE ); + memset( mScancodeUp, 0, EE_KEYS_SPACE ); } Input::~Input() { @@ -31,7 +31,7 @@ Input::~Input() { } void Input::cleanStates() { - memset( mKeysUp, 0, EE_KEYS_SPACE ); + memset( mScancodeUp, 0, EE_KEYS_SPACE ); mReleaseTrigger = 0; mLastPressTrigger = mPressTrigger; @@ -57,26 +57,27 @@ void Input::processEvent( InputEvent* Event ) { break; } case InputEvent::KeyDown: { - if ( Event->key.keysym.sym > EE_KEYS_NUM ) + if ( Event->key.keysym.scancode > EE_KEYS_NUM ) break; if ( Event->key.keysym.mod != eeINDEX_NOT_FOUND ) mInputMod = Event->key.keysym.mod; - BitOp::writeBitKey( &mKeysDown[Event->key.keysym.sym / 8], Event->key.keysym.sym % 8, - 1 ); + BitOp::writeBitKey( &mScancodeDown[Event->key.keysym.scancode / 8], + Event->key.keysym.scancode % 8, 1 ); break; } case InputEvent::KeyUp: { if ( Event->key.keysym.mod != eeINDEX_NOT_FOUND ) mInputMod = Event->key.keysym.mod; - if ( Event->key.keysym.sym > EE_KEYS_NUM ) + if ( Event->key.keysym.scancode > EE_KEYS_NUM ) break; - BitOp::writeBitKey( &mKeysDown[Event->key.keysym.sym / 8], Event->key.keysym.sym % 8, - 0 ); - BitOp::writeBitKey( &mKeysUp[Event->key.keysym.sym / 8], Event->key.keysym.sym % 8, 1 ); + BitOp::writeBitKey( &mScancodeDown[Event->key.keysym.scancode / 8], + Event->key.keysym.scancode % 8, 0 ); + BitOp::writeBitKey( &mScancodeUp[Event->key.keysym.scancode / 8], + Event->key.keysym.scancode % 8, 1 ); break; } case InputEvent::MouseMotion: { @@ -249,20 +250,28 @@ void Input::resetFingerWasDown() { } } -bool Input::isKeyDown( const KeyTable& Key ) { - return 0 != BitOp::readBitKey( &mKeysDown[Key / 8], Key % 8 ); +bool Input::isKeyDown( const Keycode& Key ) { + return isScancodeDown( getScancodeFromKey( Key ) ); } -bool Input::isKeyUp( const KeyTable& Key ) { - return 0 != BitOp::readBitKey( &mKeysUp[Key / 8], Key % 8 ); +bool Input::isKeyUp( const Keycode& Key ) { + return isScancodeUp( getScancodeFromKey( Key ) ); } -void Input::injectKeyDown( const KeyTable& Key ) { - BitOp::writeBitKey( &mKeysDown[Key / 8], Key % 8, 1 ); +bool Input::isScancodeUp( const Scancode& scancode ) { + return 0 != BitOp::readBitKey( &mScancodeUp[scancode / 8], scancode % 8 ); } -void Input::injectKeyUp( const KeyTable& Key ) { - BitOp::writeBitKey( &mKeysUp[Key / 8], Key % 8, 1 ); +bool Input::isScancodeDown( const Scancode& scancode ) { + return 0 != BitOp::readBitKey( &mScancodeDown[scancode / 8], scancode % 8 ); +} + +void Input::injectScancodeDown( const Scancode& scancode ) { + BitOp::writeBitKey( &mScancodeDown[scancode / 8], scancode % 8, 1 ); +} + +void Input::injectScancodeUp( const Scancode& scancode ) { + BitOp::writeBitKey( &mScancodeUp[scancode / 8], scancode % 8, 1 ); } void Input::injectButtonPress( const Uint32& Button ) { @@ -434,8 +443,8 @@ InputFinger* Input::getFinger( const Int64& fingerId ) { return NULL; } -std::list Input::getFingersDown() { - std::list fDown; +std::vector Input::getFingersDown() { + std::vector fDown; for ( Uint32 i = 0; i < EE_MAX_FINGERS; i++ ) { if ( mFingers[i].down ) { @@ -446,8 +455,8 @@ std::list Input::getFingersDown() { return fDown; } -std::list Input::getFingersWasDown() { - std::list fDown; +std::vector Input::getFingersWasDown() { + std::vector fDown; for ( Uint32 i = 0; i < EE_MAX_FINGERS; i++ ) { if ( mFingers[i].wasDown ) { @@ -458,7 +467,7 @@ std::list Input::getFingersWasDown() { return fDown; } -const Uint32& Input::getKeyMod() const { +const Uint32& Input::getModState() const { return mInputMod; } diff --git a/src/eepp/window/inputhelper.cpp b/src/eepp/window/inputhelper.cpp index 9dbd6a211..f8113f85f 100644 --- a/src/eepp/window/inputhelper.cpp +++ b/src/eepp/window/inputhelper.cpp @@ -2,8 +2,7 @@ namespace EE { namespace Window { -Uint32 InputHelper::convertKeyCharacter( const Uint32& KeyCode, const Uint16& Unicode, - const Uint32& Modifiers ) { +Uint32 InputHelper::convertKeyCharacter( const Uint32& KeyCode, const Uint16& Unicode ) { Uint32 value = 0; if ( Unicode < 255 ) { @@ -63,9 +62,6 @@ Uint32 InputHelper::convertKeyCharacter( const Uint32& KeyCode, const Uint16& Un case KEY_PAGEUP: value = KEY_PAGEUP; break; - case KEY_PRINT: - value = KEY_PRINT; - break; case KEY_PAGEDOWN: value = KEY_PAGEDOWN; break; @@ -114,27 +110,9 @@ Uint32 InputHelper::convertKeyCharacter( const Uint32& KeyCode, const Uint16& Un case KEY_F15: value = KEY_F15; break; - case KEY_NUMLOCK: - value = KEY_NUMLOCK; - break; case KEY_CAPSLOCK: value = KEY_CAPSLOCK; break; - case KEY_SCROLLOCK: - value = KEY_SCROLLOCK; - break; - case KEY_RMETA: - value = KEY_RMETA; - break; - case KEY_LMETA: - value = KEY_LMETA; - break; - case KEY_LSUPER: - value = KEY_LSUPER; - break; - case KEY_RSUPER: - value = KEY_RSUPER; - break; case KEY_MODE: value = KEY_MODE; break; diff --git a/src/eepp/window/inputtextbuffer.cpp b/src/eepp/window/inputtextbuffer.cpp index d937709de..3fc3ad712 100644 --- a/src/eepp/window/inputtextbuffer.cpp +++ b/src/eepp/window/inputtextbuffer.cpp @@ -4,6 +4,8 @@ namespace EE { namespace Window { +// TODO: Deprecate this. It's horrendous. Use TextDocument instead. + InputTextBuffer* InputTextBuffer::New( const bool& active, const bool& newLineEnabled, const bool& freeEditing, EE::Window::Window* window, const Uint32& maxLength ) { @@ -282,8 +284,8 @@ void InputTextBuffer::update( InputEvent* Event ) { if ( Event->Type == InputEvent::TextInput || Event->Type == InputEvent::KeyDown || Event->Type == InputEvent::KeyUp ) { - keyChar = InputHelper::convertKeyCharacter( - Event->key.keysym.sym, Event->key.keysym.unicode, Event->key.keysym.mod ); + keyChar = InputHelper::convertKeyCharacter( Event->key.keysym.sym, + Event->key.keysym.unicode ); } if ( isFreeEditingEnabled() ) { @@ -302,13 +304,12 @@ void InputTextBuffer::update( InputEvent* Event ) { Int32 end = eemax( mSelCurInit, mSelCurEnd ); std::string clipStr( mText.substr( init, end - init ).toUtf8() ); mWindow->getClipboard()->setText( clipStr ); - } else if ( ( Event->key.keysym.sym >= KEY_UP && - Event->key.keysym.sym <= KEY_END ) && - !( Event->key.keysym.sym >= KEY_NUMLOCK && - Event->key.keysym.sym <= KEY_COMPOSE ) ) { + } else { + Keycode sym = Event->key.keysym.sym; if ( !( Input->isShiftPressed() && - ( Event->key.keysym.sym >= KEY_UP && - Event->key.keysym.sym <= KEY_END ) ) ) { + ( sym == KEY_UP || sym == KEY_DOWN || sym == KEY_LEFT || + sym == KEY_RIGHT || sym == KEY_INSERT || + sym == KEY_HOME || sym == KEY_END ) ) ) { resetSelection(); } } diff --git a/src/tests/test_all/test.cpp b/src/tests/test_all/test.cpp index af2b677f3..4f1bd6543 100644 --- a/src/tests/test_all/test.cpp +++ b/src/tests/test_all/test.cpp @@ -1919,8 +1919,10 @@ void EETest::input() { UISceneNode* uiSceneNode = SceneManager::instance()->getUISceneNode(); - if ( KM->isKeyUp( KEY_F6 ) ) + if ( KM->isKeyUp( KEY_F6 ) ) { + uiSceneNode->setHighlightFocus( !uiSceneNode->getHighlightFocus() ); uiSceneNode->setHighlightOver( !uiSceneNode->getHighlightOver() ); + } if ( KM->isKeyUp( KEY_F7 ) ) uiSceneNode->setDrawBoxes( !uiSceneNode->getDrawBoxes() ); @@ -1986,7 +1988,7 @@ void EETest::input() { if ( KM->isControlPressed() && KM->isKeyUp( KEY_G ) ) KM->grabInput( !KM->grabInput() ); - if ( KM->isKeyUp( KEY_F3 ) || KM->isKeyUp( KEY_WORLD_26 ) || KM->isKeyUp( KEY_BACKSLASH ) ) { + if ( KM->isKeyUp( KEY_F3 ) || KM->isKeyUp( KEY_BACKSLASH ) ) { Con.toggle(); } diff --git a/src/tools/codeeditor/codeeditor.cpp b/src/tools/codeeditor/codeeditor.cpp index 42e616e63..3e0b49856 100644 --- a/src/tools/codeeditor/codeeditor.cpp +++ b/src/tools/codeeditor/codeeditor.cpp @@ -66,6 +66,7 @@ void mainLoop() { } if ( input->isKeyUp( KEY_F6 ) ) { + uiSceneNode->setHighlightFocus( !uiSceneNode->getHighlightFocus() ); uiSceneNode->setHighlightOver( !uiSceneNode->getHighlightOver() ); } diff --git a/src/tools/mapeditor/mapeditor.cpp b/src/tools/mapeditor/mapeditor.cpp index fa6f43ed8..6bd5ed569 100644 --- a/src/tools/mapeditor/mapeditor.cpp +++ b/src/tools/mapeditor/mapeditor.cpp @@ -45,24 +45,24 @@ void mainLoop() { win->close(); } + UISceneNode* uiSceneNode = SceneManager::instance()->getUISceneNode(); + if ( win->getInput()->isKeyUp( KEY_F6 ) ) { - SceneManager::instance()->getUISceneNode()->setHighlightOver( - !SceneManager::instance()->getUISceneNode()->getHighlightOver() ); + uiSceneNode->setHighlightFocus( !uiSceneNode->getHighlightFocus() ); + uiSceneNode->setHighlightOver( !uiSceneNode->getHighlightOver() ); } if ( win->getInput()->isKeyUp( KEY_F7 ) ) { - SceneManager::instance()->getUISceneNode()->setDrawBoxes( - !SceneManager::instance()->getUISceneNode()->getDrawBoxes() ); + uiSceneNode->setDrawBoxes( !uiSceneNode->getDrawBoxes() ); } if ( win->getInput()->isKeyUp( KEY_F8 ) ) { - SceneManager::instance()->getUISceneNode()->setDrawDebugData( - !SceneManager::instance()->getUISceneNode()->getDrawDebugData() ); + uiSceneNode->setDrawDebugData( !uiSceneNode->getDrawDebugData() ); } SceneManager::instance()->update(); - if ( SceneManager::instance()->getUISceneNode()->invalidated() ) { + if ( uiSceneNode->invalidated() ) { win->clear(); SceneManager::instance()->draw(); diff --git a/src/tools/textureatlaseditor/textureatlaseditor.cpp b/src/tools/textureatlaseditor/textureatlaseditor.cpp index 574dc6290..d92025cfe 100644 --- a/src/tools/textureatlaseditor/textureatlaseditor.cpp +++ b/src/tools/textureatlaseditor/textureatlaseditor.cpp @@ -44,24 +44,24 @@ void mainLoop() { win->close(); } + UISceneNode* uiSceneNode = SceneManager::instance()->getUISceneNode(); + if ( win->getInput()->isKeyUp( KEY_F6 ) ) { - SceneManager::instance()->getUISceneNode()->setHighlightOver( - !SceneManager::instance()->getUISceneNode()->getHighlightOver() ); + uiSceneNode->setHighlightFocus( !uiSceneNode->getHighlightFocus() ); + uiSceneNode->setHighlightOver( !uiSceneNode->getHighlightOver() ); } if ( win->getInput()->isKeyUp( KEY_F7 ) ) { - SceneManager::instance()->getUISceneNode()->setDrawBoxes( - !SceneManager::instance()->getUISceneNode()->getDrawBoxes() ); + uiSceneNode->setDrawBoxes( !uiSceneNode->getDrawBoxes() ); } if ( win->getInput()->isKeyUp( KEY_F8 ) ) { - SceneManager::instance()->getUISceneNode()->setDrawDebugData( - !SceneManager::instance()->getUISceneNode()->getDrawDebugData() ); + uiSceneNode->setDrawDebugData( !uiSceneNode->getDrawDebugData() ); } SceneManager::instance()->update(); - if ( SceneManager::instance()->getUISceneNode()->invalidated() ) { + if ( uiSceneNode->invalidated() ) { win->clear(); SceneManager::instance()->draw(); diff --git a/src/tools/uieditor/uieditor.cpp b/src/tools/uieditor/uieditor.cpp index ea14b976b..2e467ea5d 100644 --- a/src/tools/uieditor/uieditor.cpp +++ b/src/tools/uieditor/uieditor.cpp @@ -746,8 +746,7 @@ void mainLoop() { window->close(); } - if ( window->getInput()->isKeyUp( KEY_F3 ) || window->getInput()->isKeyUp( KEY_WORLD_26 ) || - window->getInput()->isKeyUp( KEY_BACKSLASH ) ) { + if ( window->getInput()->isKeyUp( KEY_F3 ) || window->getInput()->isKeyUp( KEY_BACKSLASH ) ) { console->toggle(); } @@ -756,6 +755,7 @@ void mainLoop() { } if ( window->getInput()->isKeyUp( KEY_F6 ) ) { + uiSceneNode->setHighlightFocus( !uiSceneNode->getHighlightFocus() ); uiSceneNode->setHighlightOver( !uiSceneNode->getHighlightOver() ); }