/*
 * BRLTTY - A background process providing access to the console screen (when in
 *          text mode) for a blind person using a refreshable braille display.
 *
 * Copyright (C) 1995-2020 by The BRLTTY Developers.
 *
 * BRLTTY comes with ABSOLUTELY NO WARRANTY.
 *
 * This is free software, placed under the terms of the
 * GNU Lesser General Public License, as published by the Free Software
 * Foundation; either version 2.1 of the License, or (at your option) any
 * later version. Please see the file LICENSE-LGPL for details.
 *
 * Web Page: http://brltty.app/
 *
 * This software is maintained by Dave Mielke <dave@mielke.cc>.
 */

#ifndef BRLTTY_INCLUDED_KTB_KEYBOARD
#define BRLTTY_INCLUDED_KTB_KEYBOARD

#include "ktb_types.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#define KBD_GROUP(grp) KBD_GRP_##grp
#define KBD_KEY(grp,key) KBD_KEY_##grp##_##key

#define KBD_KEY_VALUE(grp,num) {.group=KBD_GROUP(grp), .number=num}
#define KBD_KEY_ENTRY(grp,key) KBD_KEY_VALUE(grp, KBD_KEY(grp, key))

#define KBD_GROUP_NAME(grp,nam) {.value=KBD_KEY_VALUE(grp, KTB_KEY_ANY), .name=nam}
#define KBD_KEY_NAME(grp,key,nam) {.value=KBD_KEY_ENTRY(grp, key), .name=nam}

#define KBD_KEY_SPECIAL(name) KBD_KEY_ENTRY(SPECIAL, name)
#define KBD_KEY_UNMAPPED KBD_KEY_SPECIAL(Unmapped)
#define KBD_KEY_IGNORE KBD_KEY_SPECIAL(Ignore)

#define KBD_KEY_LETTER(name) KBD_KEY_ENTRY(LETTER, name)
#define KBD_KEY_NUMBER(name) KBD_KEY_ENTRY(NUMBER, name)
#define KBD_KEY_SYMBOL(name) KBD_KEY_ENTRY(SYMBOL, name)

#define KBD_KEY_ACTION(name) KBD_KEY_ENTRY(ACTION, name)
#define KBD_KEY_MEDIA(name) KBD_KEY_ENTRY(MEDIA, name)
#define KBD_KEY_FUNCTION(name) KBD_KEY_ENTRY(FUNCTION, name)

#define KBD_KEY_MODIFIER(name) KBD_KEY_ENTRY(MODIFIER, name)
#define KBD_KEY_LOCK(name) KBD_KEY_ENTRY(LOCK, name)

#define KBD_KEY_KPNUMBER(name) KBD_KEY_ENTRY(KPNUMBER, name)
#define KBD_KEY_KPSYMBOL(name) KBD_KEY_ENTRY(KPSYMBOL, name)
#define KBD_KEY_KPACTION(name) KBD_KEY_ENTRY(KPACTION, name)

#define KBD_KEY_BRAILLE(name) KBD_KEY_ENTRY(BRAILLE, name)
#define KBD_KEY_ROUTING(number) KBD_KEY_VALUE(ROUTING, (number))

typedef enum {
  KBD_GROUP(SPECIAL) = 0 /* KBD_KEY_UNMAPPED must be all zeros */,

  KBD_GROUP(LETTER),
  KBD_GROUP(NUMBER),
  KBD_GROUP(SYMBOL),

  KBD_GROUP(ACTION),
  KBD_GROUP(MEDIA),
  KBD_GROUP(FUNCTION),

  KBD_GROUP(MODIFIER),
  KBD_GROUP(LOCK),

  KBD_GROUP(KPNUMBER),
  KBD_GROUP(KPSYMBOL),
  KBD_GROUP(KPACTION),

  KBD_GROUP(BRAILLE),
  KBD_GROUP(ROUTING),
} KBD_KeyGroup;

typedef enum {
  KBD_KEY(SPECIAL, Unmapped) = 0 /* KBD_KEY_UNMAPPED must be all zeros */,
  KBD_KEY(SPECIAL, Ignore),
} KBD_SpecialKey;

typedef enum {
  KBD_KEY(LETTER, A),
  KBD_KEY(LETTER, B),
  KBD_KEY(LETTER, C),
  KBD_KEY(LETTER, D),
  KBD_KEY(LETTER, E),
  KBD_KEY(LETTER, F),
  KBD_KEY(LETTER, G),
  KBD_KEY(LETTER, H),
  KBD_KEY(LETTER, I),
  KBD_KEY(LETTER, J),
  KBD_KEY(LETTER, K),
  KBD_KEY(LETTER, L),
  KBD_KEY(LETTER, M),
  KBD_KEY(LETTER, N),
  KBD_KEY(LETTER, O),
  KBD_KEY(LETTER, P),
  KBD_KEY(LETTER, Q),
  KBD_KEY(LETTER, R),
  KBD_KEY(LETTER, S),
  KBD_KEY(LETTER, T),
  KBD_KEY(LETTER, U),
  KBD_KEY(LETTER, V),
  KBD_KEY(LETTER, W),
  KBD_KEY(LETTER, X),
  KBD_KEY(LETTER, Y),
  KBD_KEY(LETTER, Z),
} KBD_LetterKey;

typedef enum {
  KBD_KEY(NUMBER, Zero),
  KBD_KEY(NUMBER, One),
  KBD_KEY(NUMBER, Two),
  KBD_KEY(NUMBER, Three),
  KBD_KEY(NUMBER, Four),
  KBD_KEY(NUMBER, Five),
  KBD_KEY(NUMBER, Six),
  KBD_KEY(NUMBER, Seven),
  KBD_KEY(NUMBER, Eight),
  KBD_KEY(NUMBER, Nine),
} KBD_NumberKey;

typedef enum {
  KBD_KEY(SYMBOL, Grave),
  KBD_KEY(SYMBOL, Minus),
  KBD_KEY(SYMBOL, Equals),
  KBD_KEY(SYMBOL, Backslash),

  KBD_KEY(SYMBOL, LeftBracket),
  KBD_KEY(SYMBOL, RightBracket),

  KBD_KEY(SYMBOL, Semicolon),
  KBD_KEY(SYMBOL, Apostrophe),

  KBD_KEY(SYMBOL, Europe2),
  KBD_KEY(SYMBOL, Comma),
  KBD_KEY(SYMBOL, Period),
  KBD_KEY(SYMBOL, Slash),

  KBD_KEY(SYMBOL, Space),
} KBD_SymbolKey;

typedef enum {
  KBD_KEY(ACTION, Enter),
  KBD_KEY(ACTION, Tab),
  KBD_KEY(ACTION, Escape),

  KBD_KEY(ACTION, Insert),
  KBD_KEY(ACTION, DeleteBackward),
  KBD_KEY(ACTION, DeleteForward),

  KBD_KEY(ACTION, Home),
  KBD_KEY(ACTION, End),

  KBD_KEY(ACTION, PageUp),
  KBD_KEY(ACTION, PageDown),

  KBD_KEY(ACTION, ArrowUp),
  KBD_KEY(ACTION, ArrowDown),
  KBD_KEY(ACTION, ArrowLeft),
  KBD_KEY(ACTION, ArrowRight),

  KBD_KEY(ACTION, PrintScreen),
  KBD_KEY(ACTION, SystemRequest),
  KBD_KEY(ACTION, Pause),

  KBD_KEY(ACTION, GuiLeft),
  KBD_KEY(ACTION, GuiRight),
  KBD_KEY(ACTION, Context),

  KBD_KEY(ACTION, Help),
  KBD_KEY(ACTION, Stop),
  KBD_KEY(ACTION, Props),
  KBD_KEY(ACTION, Front),
  KBD_KEY(ACTION, Open),
  KBD_KEY(ACTION, Find),
  KBD_KEY(ACTION, Again),
  KBD_KEY(ACTION, Undo),
  KBD_KEY(ACTION, Copy),
  KBD_KEY(ACTION, Paste),
  KBD_KEY(ACTION, Cut),

  KBD_KEY(ACTION, Power),
  KBD_KEY(ACTION, Sleep),
  KBD_KEY(ACTION, Wakeup),

  KBD_KEY(ACTION, Menu),
  KBD_KEY(ACTION, Select),

  KBD_KEY(ACTION, Cancel),
  KBD_KEY(ACTION, Clear),
  KBD_KEY(ACTION, Prior),
  KBD_KEY(ACTION, Return),
  KBD_KEY(ACTION, Separator),
  KBD_KEY(ACTION, Out),
  KBD_KEY(ACTION, Oper),
  KBD_KEY(ACTION, Clear_Again),
  KBD_KEY(ACTION, CrSel_Props),
  KBD_KEY(ACTION, ExSel),
} KBD_ActionKey;

typedef enum {
  KBD_KEY(MEDIA, Mute),
  KBD_KEY(MEDIA, VolumeDown),
  KBD_KEY(MEDIA, VolumeUp),

  KBD_KEY(MEDIA, Stop),
  KBD_KEY(MEDIA, Play),
  KBD_KEY(MEDIA, Record),
  KBD_KEY(MEDIA, Pause),
  KBD_KEY(MEDIA, PlayPause),

  KBD_KEY(MEDIA, Previous),
  KBD_KEY(MEDIA, Next),
  KBD_KEY(MEDIA, Backward),
  KBD_KEY(MEDIA, Forward),

  KBD_KEY(MEDIA, Eject),
  KBD_KEY(MEDIA, Close),
  KBD_KEY(MEDIA, EjectClose),
} KBD_MediaKey;

typedef enum {
  KBD_KEY(FUNCTION, F1),
  KBD_KEY(FUNCTION, F2),
  KBD_KEY(FUNCTION, F3),
  KBD_KEY(FUNCTION, F4),
  KBD_KEY(FUNCTION, F5),
  KBD_KEY(FUNCTION, F6),
  KBD_KEY(FUNCTION, F7),
  KBD_KEY(FUNCTION, F8),
  KBD_KEY(FUNCTION, F9),
  KBD_KEY(FUNCTION, F10),
  KBD_KEY(FUNCTION, F11),
  KBD_KEY(FUNCTION, F12),
  KBD_KEY(FUNCTION, F13),
  KBD_KEY(FUNCTION, F14),
  KBD_KEY(FUNCTION, F15),
  KBD_KEY(FUNCTION, F16),
  KBD_KEY(FUNCTION, F17),
  KBD_KEY(FUNCTION, F18),
  KBD_KEY(FUNCTION, F19),
  KBD_KEY(FUNCTION, F20),
  KBD_KEY(FUNCTION, F21),
  KBD_KEY(FUNCTION, F22),
  KBD_KEY(FUNCTION, F23),
  KBD_KEY(FUNCTION, F24),
} KBD_FunctionKey;

typedef enum {
  KBD_KEY(MODIFIER, ShiftLeft),
  KBD_KEY(MODIFIER, ShiftRight),

  KBD_KEY(MODIFIER, ControlLeft),
  KBD_KEY(MODIFIER, ControlRight),

  KBD_KEY(MODIFIER, AltLeft),
  KBD_KEY(MODIFIER, AltRight),
} KBD_ModifierKey;

typedef enum {
  KBD_KEY(LOCK, Capitals),
  KBD_KEY(LOCK, Scroll),
  KBD_KEY(LOCK, Numbers),
} KBD_LockKey;

typedef enum {
  KBD_KEY(KPNUMBER, Zero),
  KBD_KEY(KPNUMBER, One),
  KBD_KEY(KPNUMBER, Two),
  KBD_KEY(KPNUMBER, Three),
  KBD_KEY(KPNUMBER, Four),
  KBD_KEY(KPNUMBER, Five),
  KBD_KEY(KPNUMBER, Six),
  KBD_KEY(KPNUMBER, Seven),
  KBD_KEY(KPNUMBER, Eight),
  KBD_KEY(KPNUMBER, Nine),

  KBD_KEY(KPNUMBER, A),
  KBD_KEY(KPNUMBER, B),
  KBD_KEY(KPNUMBER, C),
  KBD_KEY(KPNUMBER, D),
  KBD_KEY(KPNUMBER, E),
  KBD_KEY(KPNUMBER, F),
} KBD_KPNumberKey;

typedef enum {
  KBD_KEY(KPSYMBOL, DecimalSeparator),
  KBD_KEY(KPSYMBOL, ThousandsSeparator),
  KBD_KEY(KPSYMBOL, 00),
  KBD_KEY(KPSYMBOL, 000),

  KBD_KEY(KPSYMBOL, Plus),
  KBD_KEY(KPSYMBOL, Minus),
  KBD_KEY(KPSYMBOL, Multiply),
  KBD_KEY(KPSYMBOL, Divide),
  KBD_KEY(KPSYMBOL, Modulo),

  KBD_KEY(KPSYMBOL, Equals),
  KBD_KEY(KPSYMBOL, Less),
  KBD_KEY(KPSYMBOL, Greater),
  KBD_KEY(KPSYMBOL, PlusMinus),

  KBD_KEY(KPSYMBOL, LeftParenthesis),
  KBD_KEY(KPSYMBOL, RightParenthesis),
  KBD_KEY(KPSYMBOL, LeftBrace),
  KBD_KEY(KPSYMBOL, RightBrace),

  KBD_KEY(KPSYMBOL, BitwiseAnd),
  KBD_KEY(KPSYMBOL, BitwiseOr),
  KBD_KEY(KPSYMBOL, BitwiseXor),

  KBD_KEY(KPSYMBOL, BooleanNot),
  KBD_KEY(KPSYMBOL, BooleanAnd),
  KBD_KEY(KPSYMBOL, BooleanOr),
  KBD_KEY(KPSYMBOL, BooleanXor),

  KBD_KEY(KPSYMBOL, Space),
  KBD_KEY(KPSYMBOL, Period),
  KBD_KEY(KPSYMBOL, Comma),
  KBD_KEY(KPSYMBOL, Colon),
  KBD_KEY(KPSYMBOL, At),
  KBD_KEY(KPSYMBOL, Number),
  KBD_KEY(KPSYMBOL, CurrencyUnit),
  KBD_KEY(KPSYMBOL, CurrencySubunit),
} KBD_KPSymbolKey;

typedef enum {
  KBD_KEY(KPACTION, Enter),
  KBD_KEY(KPACTION, Backspace),
  KBD_KEY(KPACTION, Tab),

  KBD_KEY(KPACTION, Clear),
  KBD_KEY(KPACTION, ClearEntry),

  KBD_KEY(KPACTION, MemoryClear),
  KBD_KEY(KPACTION, MemoryStore),
  KBD_KEY(KPACTION, MemoryRecall),
  KBD_KEY(KPACTION, MemoryAdd),
  KBD_KEY(KPACTION, MemorySubtract),
  KBD_KEY(KPACTION, MemoryMultiply),
  KBD_KEY(KPACTION, MemoryDivide),

  KBD_KEY(KPACTION, Binary),
  KBD_KEY(KPACTION, Octal),
  KBD_KEY(KPACTION, Decimal),
  KBD_KEY(KPACTION, Hexadecimal),
} KBD_KPActionKey;

typedef enum {
  KBD_KEY(BRAILLE, Space),

  KBD_KEY(BRAILLE, Dot1),
  KBD_KEY(BRAILLE, Dot2),
  KBD_KEY(BRAILLE, Dot3),
  KBD_KEY(BRAILLE, Dot4),
  KBD_KEY(BRAILLE, Dot5),
  KBD_KEY(BRAILLE, Dot6),
  KBD_KEY(BRAILLE, Dot7),
  KBD_KEY(BRAILLE, Dot8),

  KBD_KEY(BRAILLE, Backward),
  KBD_KEY(BRAILLE, Forward),
} KBD_BrailleKey;

extern KEY_NAME_TABLES_DECLARATION(keyboard);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* BRLTTY_INCLUDED_KTB_KEYBOARD */
