#ifndef _MGL_KEY_H_
#define _MGL_KEY_H_

#include <stdbool.h>
#include <stdint.h>

/* New keys should always be added at the end! otherwise it will break some software that depends on this order */
typedef enum {
    MGL_KEY_UNKNOWN,
    MGL_KEY_A,
    MGL_KEY_B,
    MGL_KEY_C,
    MGL_KEY_D,
    MGL_KEY_E,
    MGL_KEY_F,
    MGL_KEY_G,
    MGL_KEY_H,
    MGL_KEY_I,
    MGL_KEY_J,
    MGL_KEY_K,
    MGL_KEY_L,
    MGL_KEY_M,
    MGL_KEY_N,
    MGL_KEY_O,
    MGL_KEY_P,
    MGL_KEY_Q,
    MGL_KEY_R,
    MGL_KEY_S,
    MGL_KEY_T,
    MGL_KEY_U,
    MGL_KEY_V,
    MGL_KEY_W,
    MGL_KEY_X,
    MGL_KEY_Y,
    MGL_KEY_Z,
    MGL_KEY_NUM0,
    MGL_KEY_NUM1,
    MGL_KEY_NUM2,
    MGL_KEY_NUM3,
    MGL_KEY_NUM4,
    MGL_KEY_NUM5,
    MGL_KEY_NUM6,
    MGL_KEY_NUM7,
    MGL_KEY_NUM8,
    MGL_KEY_NUM9,
    MGL_KEY_ESCAPE,
    MGL_KEY_LCONTROL,
    MGL_KEY_LSHIFT,
    MGL_KEY_LALT,
    MGL_KEY_LSYSTEM,
    MGL_KEY_RCONTROL,
    MGL_KEY_RSHIFT,
    MGL_KEY_RALT,
    MGL_KEY_RSYSTEM,
    MGL_KEY_MENU,
    MGL_KEY_LBRACKET,
    MGL_KEY_RBRACKET,
    MGL_KEY_SEMICOLON,
    MGL_KEY_COMMA,
    MGL_KEY_PERIOD,
    MGL_KEY_QUOTE,
    MGL_KEY_SLASH,
    MGL_KEY_BACKSLASH,
    MGL_KEY_TILDE,
    MGL_KEY_EQUAL,
    MGL_KEY_HYPHEN,
    MGL_KEY_SPACE,
    MGL_KEY_ENTER,
    MGL_KEY_BACKSPACE,
    MGL_KEY_TAB,
    MGL_KEY_PAGEUP,
    MGL_KEY_PAGEDOWN,
    MGL_KEY_END,
    MGL_KEY_HOME,
    MGL_KEY_INSERT,
    MGL_KEY_DELETE,
    MGL_KEY_ADD,
    MGL_KEY_SUBTRACT,
    MGL_KEY_MULTIPLY,
    MGL_KEY_DIVIDE,
    MGL_KEY_LEFT,
    MGL_KEY_RIGHT,
    MGL_KEY_UP,
    MGL_KEY_DOWN,
    MGL_KEY_NUMPAD0,
    MGL_KEY_NUMPAD1,
    MGL_KEY_NUMPAD2,
    MGL_KEY_NUMPAD3,
    MGL_KEY_NUMPAD4,
    MGL_KEY_NUMPAD5,
    MGL_KEY_NUMPAD6,
    MGL_KEY_NUMPAD7,
    MGL_KEY_NUMPAD8,
    MGL_KEY_NUMPAD9,
    MGL_KEY_F1,
    MGL_KEY_F2,
    MGL_KEY_F3,
    MGL_KEY_F4,
    MGL_KEY_F5,
    MGL_KEY_F6,
    MGL_KEY_F7,
    MGL_KEY_F8,
    MGL_KEY_F9,
    MGL_KEY_F10,
    MGL_KEY_F11,
    MGL_KEY_F12,
    MGL_KEY_F13,
    MGL_KEY_F14,
    MGL_KEY_F15,
    MGL_KEY_PAUSE,
    MGL_KEY_PRINTSCREEN,
    MGL_KEY_NUMPAD_ENTER,
    MGL_KEY_AUDIO_LOWER_VOLUME,
    MGL_KEY_AUDIO_RAISE_VOLUME,
    MGL_KEY_AUDIO_PLAY,
    MGL_KEY_AUDIO_STOP,
    MGL_KEY_AUDIO_PAUSE,
    MGL_KEY_AUDIO_MUTE,
    MGL_KEY_AUDIO_PREV,
    MGL_KEY_AUDIO_NEXT,
    MGL_KEY_AUDIO_REWIND,
    MGL_KEY_AUDIO_FORWARD,
    MGL_KEY_DEAD_ACUTE,
    MGL_KEY_APOSTROPHE,
    MGL_KEY_F16,
    MGL_KEY_F17,
    MGL_KEY_F18,
    MGL_KEY_F19,
    MGL_KEY_F20,
    MGL_KEY_F21,
    MGL_KEY_F22,
    MGL_KEY_F23,
    MGL_KEY_F24,
    MGL_KEY_EXCLAM,
    MGL_KEY_QUOTEDBL,
    MGL_KEY_NUMBERSIGN,
    MGL_KEY_DOLLAR,
    MGL_KEY_PERCENT,
    MGL_KEY_AMPERSAND,
    MGL_KEY_PARENLEFT,
    MGL_KEY_PARENRIGHT,
    MGL_KEY_ASTERISK,
    MGL_KEY_PLUS,
    MGL_KEY_MINUS,
    MGL_KEY_COLON,
    MGL_KEY_LESS,
    MGL_KEY_GREATER,
    MGL_KEY_QUESTION,
    MGL_KEY_BRACKETLEFT,
    MGL_KEY_BRACKETRIGHT,
    MGL_KEY_ASCIICIRCUM,
    MGL_KEY_UNDERSCORE,
    MGL_KEY_GRAVE,

    /* This should always be the last key */
    __MGL_NUM_KEYS__
} mgl_key;

/* Return NULL if unknown key */
const char* mgl_key_to_string(mgl_key key);
bool mgl_key_is_modifier(mgl_key key);
/* Returns XK_VoidSymbol on no match */
uint64_t mgl_key_to_x11_keysym(mgl_key key);

#endif /* _MGL_KEY_H_ */
