/*
  Copyright:    © 2018 SIL International.
  Description:  API declarations for modifier keys, handy access masks and
                Keyman VKEY names.  These follow the same keytop->code
                associations as the Windows API. This is a separate header to
                maintain readability of the primary API header.
  Create Date:  17 Oct 2018
  Authors:      Tim Eves (TSE)
  History:      17 Oct 2018 - TSE - Moved & refactored km_kbp_modifier_state
                                    from keyboardprocessor.h.
                                  - Added VKey and mask definitions.
                 6 Oct 2018 - TSE - Move into keyman folder.

*/

#pragma once

enum km_kbp_modifier_state {
  KM_KBP_MODIFIER_LCTRL       = 1 << 0,
  KM_KBP_MODIFIER_RCTRL       = 1 << 1,
  KM_KBP_MODIFIER_LALT        = 1 << 2,
  KM_KBP_MODIFIER_RALT        = 1 << 3,
  KM_KBP_MODIFIER_SHIFT       = 1 << 4,
  KM_KBP_MODIFIER_CTRL        = 1 << 5,
  KM_KBP_MODIFIER_ALT         = 1 << 6,
  /*
    KM_KBP_MODIFIER_META        = 1 << 7,    // Either Meta-key flag (tentative).  Not usable by keyboards currently
                                             // Used internally (currently, only by KMW) to ensure Meta-key
                                             // shortcuts safely bypass rules
                                             // Meta key = Command key on macOS, Windows key on Windows
  */
  KM_KBP_MODIFIER_CAPS        = 1 << 8,
  KM_KBP_MODIFIER_NOCAPS      = 1 << 9,
  /*
    KM_KBP_MODIFIER_NUMLOCK     = 1 << 10,
    KM_KBP_MODIFIER_NONUMLOCK   = 1 << 11,
    KM_KBP_MODIFIER_SCROLLOCK   = 1 << 12,
    KM_KBP_MODIFIER_NOSCROLLOCK = 1 << 13,
    KM_KBP_MODIFIER_VIRTUALKEY  = 1 << 14,
  */
};

enum km_kbp_modifier_mask {
  KM_KBP_MODIFIER_MASK_ALL         = 0x7f,
  KM_KBP_MODIFIER_MASK_ALT_GR_SIM  = KM_KBP_MODIFIER_LCTRL|KM_KBP_MODIFIER_LALT,
  KM_KBP_MODIFIER_MASK_CHIRAL      = 0x1f,
  KM_KBP_MODIFIER_MASK_IS_CHIRAL   = 0x0f,
  KM_KBP_MODIFIER_MASK_NON_CHIRAL  = 0x7f,
  KM_KBP_MODIFIER_MASK_CAPS        = 0x0300,
/*KM_KBP_MODIFIER_MASK_NUMLOCK     = 0x0C00,
  KM_KBP_MODIFIER_MASK_SCROLLLOCK  = 0x3000,*/
};

// These are Windows API VKEYs, using Keyman VKEY names.
enum km_kpb_virtual_key {
  KM_KBP_VKEY__00,
  KM_KBP_VKEY_LBUTTON,
  KM_KBP_VKEY_RBUTTON,
  KM_KBP_VKEY_CANCEL,
  KM_KBP_VKEY_MBUTTON,
  KM_KBP_VKEY__05,
  KM_KBP_VKEY__06,
  KM_KBP_VKEY__07,
  KM_KBP_VKEY_BKSP,
  KM_KBP_VKEY_TAB,
  KM_KBP_VKEY__0A,
  KM_KBP_VKEY__0B,
  KM_KBP_VKEY_KP5,
  KM_KBP_VKEY_ENTER,
  KM_KBP_VKEY__0E,
  KM_KBP_VKEY__0F,
  KM_KBP_VKEY_SHIFT,
  KM_KBP_VKEY_CONTROL,
  KM_KBP_VKEY_ALT,
  KM_KBP_VKEY_PAUSE,
  KM_KBP_VKEY_CAPS,
  KM_KBP_VKEY__15,
  KM_KBP_VKEY__16,
  KM_KBP_VKEY__17,
  KM_KBP_VKEY__18,
  KM_KBP_VKEY__19,
  KM_KBP_VKEY__1A,
  KM_KBP_VKEY_ESC,
  KM_KBP_VKEY__1C,
  KM_KBP_VKEY__1D,
  KM_KBP_VKEY__1E,
  KM_KBP_VKEY__1F,
  KM_KBP_VKEY_SPACE,
  KM_KBP_VKEY_PGUP,
  KM_KBP_VKEY_PGDN,
  KM_KBP_VKEY_END,
  KM_KBP_VKEY_HOME,
  KM_KBP_VKEY_LEFT,
  KM_KBP_VKEY_UP,
  KM_KBP_VKEY_RIGHT,
  KM_KBP_VKEY_DOWN,
  KM_KBP_VKEY_SEL,
  KM_KBP_VKEY_PRINT,
  KM_KBP_VKEY_EXEC,
  KM_KBP_VKEY_PRTSCN,
  KM_KBP_VKEY_INS,
  KM_KBP_VKEY_DEL,
  KM_KBP_VKEY_HELP,
  KM_KBP_VKEY_0,
  KM_KBP_VKEY_1,
  KM_KBP_VKEY_2,
  KM_KBP_VKEY_3,
  KM_KBP_VKEY_4,
  KM_KBP_VKEY_5,
  KM_KBP_VKEY_6,
  KM_KBP_VKEY_7,
  KM_KBP_VKEY_8,
  KM_KBP_VKEY_9,
  KM_KBP_VKEY__3A,
  KM_KBP_VKEY__3B,
  KM_KBP_VKEY__3C,
  KM_KBP_VKEY__3D,
  KM_KBP_VKEY__3E,
  KM_KBP_VKEY__3F,
  KM_KBP_VKEY__40,
  KM_KBP_VKEY_A,
  KM_KBP_VKEY_B,
  KM_KBP_VKEY_C,
  KM_KBP_VKEY_D,
  KM_KBP_VKEY_E,
  KM_KBP_VKEY_F,
  KM_KBP_VKEY_G,
  KM_KBP_VKEY_H,
  KM_KBP_VKEY_I,
  KM_KBP_VKEY_J,
  KM_KBP_VKEY_K,
  KM_KBP_VKEY_L,
  KM_KBP_VKEY_M,
  KM_KBP_VKEY_N,
  KM_KBP_VKEY_O,
  KM_KBP_VKEY_P,
  KM_KBP_VKEY_Q,
  KM_KBP_VKEY_R,
  KM_KBP_VKEY_S,
  KM_KBP_VKEY_T,
  KM_KBP_VKEY_U,
  KM_KBP_VKEY_V,
  KM_KBP_VKEY_W,
  KM_KBP_VKEY_X,
  KM_KBP_VKEY_Y,
  KM_KBP_VKEY_Z,
  KM_KBP_VKEY__5B,
  KM_KBP_VKEY__5C,
  KM_KBP_VKEY__5D,
  KM_KBP_VKEY__5E,
  KM_KBP_VKEY__5F,
  KM_KBP_VKEY_NP0,
  KM_KBP_VKEY_NP1,
  KM_KBP_VKEY_NP2,
  KM_KBP_VKEY_NP3,
  KM_KBP_VKEY_NP4,
  KM_KBP_VKEY_NP5,
  KM_KBP_VKEY_NP6,
  KM_KBP_VKEY_NP7,
  KM_KBP_VKEY_NP8,
  KM_KBP_VKEY_NP9,
  KM_KBP_VKEY_NPSTAR,
  KM_KBP_VKEY_NPPLUS,
  KM_KBP_VKEY_SEPARATOR,
  KM_KBP_VKEY_NPMINUS,
  KM_KBP_VKEY_NPDOT,
  KM_KBP_VKEY_NPSLASH,
  KM_KBP_VKEY_F1,
  KM_KBP_VKEY_F2,
  KM_KBP_VKEY_F3,
  KM_KBP_VKEY_F4,
  KM_KBP_VKEY_F5,
  KM_KBP_VKEY_F6,
  KM_KBP_VKEY_F7,
  KM_KBP_VKEY_F8,
  KM_KBP_VKEY_F9,
  KM_KBP_VKEY_F10,
  KM_KBP_VKEY_F11,
  KM_KBP_VKEY_F12,
  KM_KBP_VKEY_F13,
  KM_KBP_VKEY_F14,
  KM_KBP_VKEY_F15,
  KM_KBP_VKEY_F16,
  KM_KBP_VKEY_F17,
  KM_KBP_VKEY_F18,
  KM_KBP_VKEY_F19,
  KM_KBP_VKEY_F20,
  KM_KBP_VKEY_F21,
  KM_KBP_VKEY_F22,
  KM_KBP_VKEY_F23,
  KM_KBP_VKEY_F24,
  KM_KBP_VKEY__88,
  KM_KBP_VKEY__89,
  KM_KBP_VKEY__8A,
  KM_KBP_VKEY__8B,
  KM_KBP_VKEY__8C,
  KM_KBP_VKEY__8D,
  KM_KBP_VKEY__8E,
  KM_KBP_VKEY__8F,
  KM_KBP_VKEY_NUMLOCK,
  KM_KBP_VKEY_SCROLL,
  KM_KBP_VKEY__92,
  KM_KBP_VKEY__93,
  KM_KBP_VKEY__94,
  KM_KBP_VKEY__95,
  KM_KBP_VKEY__96,
  KM_KBP_VKEY__97,
  KM_KBP_VKEY__98,
  KM_KBP_VKEY__99,
  KM_KBP_VKEY__9A,
  KM_KBP_VKEY__9B,
  KM_KBP_VKEY__9C,
  KM_KBP_VKEY__9D,
  KM_KBP_VKEY__9E,
  KM_KBP_VKEY__9F,
  KM_KBP_VKEY__A0,
  KM_KBP_VKEY__A1,
  KM_KBP_VKEY__A2,
  KM_KBP_VKEY__A3,
  KM_KBP_VKEY__A4,
  KM_KBP_VKEY__A5,
  KM_KBP_VKEY__A6,
  KM_KBP_VKEY__A7,
  KM_KBP_VKEY__A8,
  KM_KBP_VKEY__A9,
  KM_KBP_VKEY__AA,
  KM_KBP_VKEY__AB,
  KM_KBP_VKEY__AC,
  KM_KBP_VKEY__AD,
  KM_KBP_VKEY__AE,
  KM_KBP_VKEY__AF,
  KM_KBP_VKEY__B0,
  KM_KBP_VKEY__B1,
  KM_KBP_VKEY__B2,
  KM_KBP_VKEY__B3,
  KM_KBP_VKEY__B4,
  KM_KBP_VKEY__B5,
  KM_KBP_VKEY__B6,
  KM_KBP_VKEY__B7,
  KM_KBP_VKEY__B8,
  KM_KBP_VKEY__B9,
  KM_KBP_VKEY_COLON,
  KM_KBP_VKEY_EQUAL,
  KM_KBP_VKEY_COMMA,
  KM_KBP_VKEY_HYPHEN,
  KM_KBP_VKEY_PERIOD,
  KM_KBP_VKEY_SLASH,
  KM_KBP_VKEY_BKQUOTE,
  KM_KBP_VKEY__C1,
  KM_KBP_VKEY__C2,
  KM_KBP_VKEY__C3,
  KM_KBP_VKEY__C4,
  KM_KBP_VKEY__C5,
  KM_KBP_VKEY__C6,
  KM_KBP_VKEY__C7,
  KM_KBP_VKEY__C8,
  KM_KBP_VKEY__C9,
  KM_KBP_VKEY__CA,
  KM_KBP_VKEY__CB,
  KM_KBP_VKEY__CC,
  KM_KBP_VKEY__CD,
  KM_KBP_VKEY__CE,
  KM_KBP_VKEY__CF,
  KM_KBP_VKEY__D0,
  KM_KBP_VKEY__D1,
  KM_KBP_VKEY__D2,
  KM_KBP_VKEY__D3,
  KM_KBP_VKEY__D4,
  KM_KBP_VKEY__D5,
  KM_KBP_VKEY__D6,
  KM_KBP_VKEY__D7,
  KM_KBP_VKEY__D8,
  KM_KBP_VKEY__D9,
  KM_KBP_VKEY__DA,
  KM_KBP_VKEY_LBRKT,
  KM_KBP_VKEY_BKSLASH,
  KM_KBP_VKEY_RBRKT,
  KM_KBP_VKEY_QUOTE,
  KM_KBP_VKEY_oDF,
  KM_KBP_VKEY_oE0,
  KM_KBP_VKEY_oE1,
  KM_KBP_VKEY_oE2,  // 102nd key on European layouts
  KM_KBP_VKEY_oE3,
  KM_KBP_VKEY_oE4,
  KM_KBP_VKEY__E5,
  KM_KBP_VKEY_oE6,
  KM_KBP_VKEY__E7,
  KM_KBP_VKEY__E8,
  KM_KBP_VKEY_oE9,
  KM_KBP_VKEY_oEA,
  KM_KBP_VKEY_oEB,
  KM_KBP_VKEY_oEC,
  KM_KBP_VKEY_oED,
  KM_KBP_VKEY_oEE,
  KM_KBP_VKEY_oEF,
  KM_KBP_VKEY_oF0,
  KM_KBP_VKEY_oF1,
  KM_KBP_VKEY_oF2,
  KM_KBP_VKEY_oF3,
  KM_KBP_VKEY_oF4,
  KM_KBP_VKEY_oF5,
  KM_KBP_VKEY__F6,
  KM_KBP_VKEY__F7,
  KM_KBP_VKEY__F8,
  KM_KBP_VKEY__F9,
  KM_KBP_VKEY__FA,
  KM_KBP_VKEY__FB,
  KM_KBP_VKEY__FC,
  KM_KBP_VKEY__FD,
  KM_KBP_VKEY__FE,
  KM_KBP_VKEY__FF,
};
