/*
 *  SDL - Simple DirectMedia Layer
 *  Copyright (C) 1997-2009 Sam Lantinga
 *
 *  SPDX-License-Identifier: LGPL-2.1-or-later
 *  See LICENSES/README.md for more information.
 *
 *  Sam Lantinga
 *  slouken@libsdl.org
 */

#pragma once

// The XBMC_keysym identifies a physical key on the keyboard i.e. it is
// analogous to a scan code but is hardware independent.
// These values are bazsed on the SDL_keysym standards, see:
//
//   http://www.libsdl.org/tmp/SDL-1.3-docs/SDL__keysym_8h.html
//
// On SDL_KEYDOWN messages the keysym.sym will be one of these values.
//
// On OSs that don't support SDL (i.e. Windows) the OS dependant key
// handling code converts keypresses to an XBMC_keysym value.

typedef enum
{
  // The keyboard syms have been cleverly chosen to map to ASCII
  XBMCK_UNKNOWN = 0x00,
  XBMCK_FIRST = 0x00,
  XBMCK_CTRLF = 0x06,
  XBMCK_BACKSPACE = 0x08,
  XBMCK_TAB = 0x09,
  XBMCK_CLEAR = 0x0C,
  XBMCK_RETURN = 0x0D,
  XBMCK_PAUSE = 0x13,
  XBMCK_ESCAPE = 0x1B,
  XBMCK_SPACE = 0x20,
  XBMCK_EXCLAIM = 0x21,
  XBMCK_QUOTEDBL = 0x22,
  XBMCK_HASH = 0x23,
  XBMCK_DOLLAR = 0x24,
  XBMCK_PERCENT = 0x25,
  XBMCK_AMPERSAND = 0x26,
  XBMCK_QUOTE = 0x27,
  XBMCK_LEFTPAREN = 0x28,
  XBMCK_RIGHTPAREN = 0x29,
  XBMCK_ASTERISK = 0x2A,
  XBMCK_PLUS = 0x2B,
  XBMCK_COMMA = 0x2C,
  XBMCK_MINUS = 0x2D,
  XBMCK_PERIOD = 0x2E,
  XBMCK_SLASH = 0x2F,
  XBMCK_0 = 0x30,
  XBMCK_1 = 0x31,
  XBMCK_2 = 0x32,
  XBMCK_3 = 0x33,
  XBMCK_4 = 0x34,
  XBMCK_5 = 0x35,
  XBMCK_6 = 0x36,
  XBMCK_7 = 0x37,
  XBMCK_8 = 0x38,
  XBMCK_9 = 0x39,
  XBMCK_COLON = 0x3A,
  XBMCK_SEMICOLON = 0x3B,
  XBMCK_LESS = 0x3C,
  XBMCK_EQUALS = 0x3D,
  XBMCK_GREATER = 0x3E,
  XBMCK_QUESTION = 0x3F,
  XBMCK_AT = 0x40,
  // Skip uppercase letters
  XBMCK_LEFTBRACKET = 0x5B,
  XBMCK_BACKSLASH = 0x5C,
  XBMCK_RIGHTBRACKET = 0x5D,
  XBMCK_CARET = 0x5E,
  XBMCK_UNDERSCORE = 0x5F,
  XBMCK_BACKQUOTE = 0x60,
  XBMCK_a = 0x61,
  XBMCK_b = 0x62,
  XBMCK_c = 0x63,
  XBMCK_d = 0x64,
  XBMCK_e = 0x65,
  XBMCK_f = 0x66,
  XBMCK_g = 0x67,
  XBMCK_h = 0x68,
  XBMCK_i = 0x69,
  XBMCK_j = 0x6A,
  XBMCK_k = 0x6B,
  XBMCK_l = 0x6C,
  XBMCK_m = 0x6D,
  XBMCK_n = 0x6E,
  XBMCK_o = 0x6F,
  XBMCK_p = 0x70,
  XBMCK_q = 0x71,
  XBMCK_r = 0x72,
  XBMCK_s = 0x73,
  XBMCK_t = 0x74,
  XBMCK_u = 0x75,
  XBMCK_v = 0x76,
  XBMCK_w = 0x77,
  XBMCK_x = 0x78,
  XBMCK_y = 0x79,
  XBMCK_z = 0x7A,
  XBMCK_LEFTBRACE = 0x7b,
  XBMCK_PIPE = 0x7C,
  XBMCK_RIGHTBRACE = 0x7D,
  XBMCK_TILDE = 0x7E,
  XBMCK_DELETE = 0x7F,
  // End of ASCII mapped keysyms

  // Multimedia keys
  // These are the Windows VK_ codes. SDL doesn't define codes for
  // these keys.
  XBMCK_BROWSER_BACK = 0xA6,
  XBMCK_BROWSER_FORWARD = 0xA7,
  XBMCK_BROWSER_REFRESH = 0xA8,
  XBMCK_BROWSER_STOP = 0xA9,
  XBMCK_BROWSER_SEARCH = 0xAA,
  XBMCK_BROWSER_FAVORITES = 0xAB,
  XBMCK_BROWSER_HOME = 0xAC,
  XBMCK_VOLUME_MUTE = 0xAD,
  XBMCK_VOLUME_DOWN = 0xAE,
  XBMCK_VOLUME_UP = 0xAF,
  XBMCK_MEDIA_NEXT_TRACK = 0xB0,
  XBMCK_MEDIA_PREV_TRACK = 0xB1,
  XBMCK_MEDIA_STOP = 0xB2,
  XBMCK_MEDIA_PLAY_PAUSE = 0xB3,
  XBMCK_LAUNCH_MAIL = 0xB4,
  XBMCK_LAUNCH_MEDIA_SELECT = 0xB5,
  XBMCK_LAUNCH_APP1 = 0xB6,
  XBMCK_LAUNCH_APP2 = 0xB7,
  XBMCK_LAUNCH_FILE_BROWSER = 0xB8,
  XBMCK_LAUNCH_MEDIA_CENTER = 0xB9,
  XBMCK_MEDIA_REWIND = 0xBA,
  XBMCK_MEDIA_FASTFORWARD = 0xBB,

  // Numeric keypad
  XBMCK_KP0 = 0x100,
  XBMCK_KP1 = 0x101,
  XBMCK_KP2 = 0x102,
  XBMCK_KP3 = 0x103,
  XBMCK_KP4 = 0x104,
  XBMCK_KP5 = 0x105,
  XBMCK_KP6 = 0x106,
  XBMCK_KP7 = 0x107,
  XBMCK_KP8 = 0x108,
  XBMCK_KP9 = 0x109,
  XBMCK_KP_PERIOD = 0x10A,
  XBMCK_KP_DIVIDE = 0x10B,
  XBMCK_KP_MULTIPLY = 0x10C,
  XBMCK_KP_MINUS = 0x10D,
  XBMCK_KP_PLUS = 0x10E,
  XBMCK_KP_ENTER = 0x10F,
  XBMCK_KP_EQUALS = 0x110,

  // Arrows + Home/End pad
  XBMCK_UP = 0x111,
  XBMCK_DOWN = 0x112,
  XBMCK_RIGHT = 0x113,
  XBMCK_LEFT = 0x114,
  XBMCK_INSERT = 0x115,
  XBMCK_HOME = 0x116,
  XBMCK_END = 0x117,
  XBMCK_PAGEUP = 0x118,
  XBMCK_PAGEDOWN = 0x119,

  // Function keys
  XBMCK_F1 = 0x11A,
  XBMCK_F2 = 0x11B,
  XBMCK_F3 = 0x11C,
  XBMCK_F4 = 0x11D,
  XBMCK_F5 = 0x11E,
  XBMCK_F6 = 0x11F,
  XBMCK_F7 = 0x120,
  XBMCK_F8 = 0x121,
  XBMCK_F9 = 0x122,
  XBMCK_F10 = 0x123,
  XBMCK_F11 = 0x124,
  XBMCK_F12 = 0x125,
  XBMCK_F13 = 0x126,
  XBMCK_F14 = 0x127,
  XBMCK_F15 = 0x128,

  // Key state modifier keys
  XBMCK_NUMLOCK = 0x12C,
  XBMCK_CAPSLOCK = 0x12D,
  XBMCK_SCROLLOCK = 0x12E,
  XBMCK_RSHIFT = 0x12F,
  XBMCK_LSHIFT = 0x130,
  XBMCK_RCTRL = 0x131,
  XBMCK_LCTRL = 0x132,
  XBMCK_RALT = 0x133,
  XBMCK_LALT = 0x134,
  XBMCK_RMETA = 0x135,
  XBMCK_LMETA = 0x136,
  XBMCK_LSUPER = 0x137, // Left "Windows" key
  XBMCK_RSUPER = 0x138, // Right "Windows" key
  XBMCK_MODE = 0x139, // "Alt Gr" key
  XBMCK_COMPOSE = 0x13A, // Multi-key compose key

  // Miscellaneous function keys
  XBMCK_HELP = 0x13B,
  XBMCK_PRINT = 0x13C,
  XBMCK_SYSREQ = 0x13D,
  XBMCK_BREAK = 0x13E,
  XBMCK_MENU = 0x13F,
  XBMCK_POWER = 0x140, // Power Macintosh power key
  XBMCK_EURO = 0x141, // Some european keyboards
  XBMCK_UNDO = 0x142, // Atari keyboard has Undo
  XBMCK_SLEEP = 0x143, // Sleep button on Nyxboard remote (and others?)
  XBMCK_GUIDE = 0x144,
  XBMCK_SETTINGS = 0x145,
  XBMCK_INFO = 0x146,
  XBMCK_RED = 0x147,
  XBMCK_GREEN = 0x148,
  XBMCK_YELLOW = 0x149,
  XBMCK_BLUE = 0x14a,
  XBMCK_ZOOM = 0x14b,
  XBMCK_TEXT = 0x14c,
  XBMCK_FAVORITES = 0x14d,
  XBMCK_HOMEPAGE = 0x14e,
  XBMCK_CONFIG = 0x14f,
  XBMCK_EPG = 0x150,

  // Add any other keys here

  /* Media keys */
  XBMCK_STOP = 337,
  XBMCK_RECORD = 338,
  XBMCK_REWIND = 339,
  XBMCK_PHONE = 340,
  XBMCK_PLAY = 341,
  XBMCK_SHUFFLE = 342,
  XBMCK_FASTFORWARD = 343,
  XBMCK_EJECT = 344,

  XBMCK_LAST
} XBMCKey;

// Enumeration of valid key mods (possibly OR'd together)
typedef enum
{
  XBMCKMOD_NONE = 0x0000,
  XBMCKMOD_LSHIFT = 0x0001,
  XBMCKMOD_RSHIFT = 0x0002,
  XBMCKMOD_LSUPER = 0x0010,
  XBMCKMOD_RSUPER = 0x0020,
  XBMCKMOD_LCTRL = 0x0040,
  XBMCKMOD_RCTRL = 0x0080,
  XBMCKMOD_LALT = 0x0100,
  XBMCKMOD_RALT = 0x0200,
  XBMCKMOD_LMETA = 0x0400,
  XBMCKMOD_RMETA = 0x0800,
  XBMCKMOD_NUM = 0x1000,
  XBMCKMOD_CAPS = 0x2000,
  XBMCKMOD_MODE = 0x4000,
  XBMCKMOD_RESERVED = 0x8000
} XBMCMod;

#define XBMCKMOD_CTRL (XBMCKMOD_LCTRL | XBMCKMOD_RCTRL)
#define XBMCKMOD_SHIFT (XBMCKMOD_LSHIFT | XBMCKMOD_RSHIFT)
#define XBMCKMOD_ALT (XBMCKMOD_LALT | XBMCKMOD_RALT)
#define XBMCKMOD_META (XBMCKMOD_LMETA | XBMCKMOD_RMETA)
#define XBMCKMOD_SUPER (XBMCKMOD_LSUPER | XBMCKMOD_RSUPER)
