text: //
  //  KMBinaryFileFormat.h
  //  KeymanEngine4Mac
  //
  //  Created by Serkan Kurt on 19/11/2014.
  //  Copyright (c) 2017 SIL International. All rights reserved.
  //
  
  #ifndef KMBinaryFileFormat_h
  #define KMBinaryFileFormat_h
  
  typedef uint16_t WORD;
  typedef uint32_t DWORD;
  //typedef wchar_t* PWSTR;
  
  struct COMP_KEYBOARD {
      DWORD dwIdentifier;     // 0000 Keyman compiled keyboard id
      DWORD dwFileVersion;    // 0004 Version of the file - Keyman 4.0 is 0x0400
      DWORD dwCheckSum;       // 0008 As stored in keyboard
      DWORD KeyboardID;       // 000C as stored in HKEY_LOCAL_MACHINE//system//currentcontrolset//control//keyboard layouts
      DWORD IsRegistered;     // 0010
      DWORD version;          // 0014 keyboard version
      DWORD cxStoreArray;     // 0018 in array entries
      DWORD cxGroupArray;     // 001C in array entries
      DWORD dpStoreArray;     // 0020 [LPCOMP_STORE] address of first item in store array
      DWORD dpGroupArray;     // 0024 [LPCOMP_GROUP] address of first item in group array
      DWORD StartGroup[2];    // 0028 index of starting groups [2 of them]
      DWORD dwFlags;          // 0030 Flags for the keyboard file
      DWORD dwHotKey;         // 0034 standard windows hotkey (hiword=shift/ctrl/alt stuff, loword=vkey)
      DWORD dpBitmapOffset;   // 0038 offset of the bitmaps in the file
      DWORD dwBitmapSize;     // 003C size in bytes of the bitmaps
  };
  
  #define VERSION_30  0x00000300
  #define VERSION_31  0x00000301
  #define VERSION_32  0x00000302
  #define VERSION_40  0x00000400
  #define VERSION_50  0x00000500
  #define VERSION_501 0x00000501
  #define VERSION_60  0x00000600
  #define VERSION_70  0x00000700
  #define VERSION_80  0x00000800
  #define VERSION_90  0x00000900
  #define VERSION_100 0x00000A00
  #define VERSION_MIN VERSION_50
  #define VERSION_MAX VERSION_100
  
  struct COMP_GROUP {
      DWORD dpName;           // string (only debug)
      DWORD dpKeyArray;       // [LPCOMP_KEY] address of first item in key array
      DWORD dpMatch;          // extended string
      DWORD dpNoMatch;        // extended string
      DWORD cxKeyArray;       // in array entries
      BOOL  fUsingKeys;       // group(xx) [using keys] <-- specified or not
  };
  
  struct COMP_STORE {
      DWORD dwSystemID;
      DWORD dpName;           // string (only debug)
      DWORD dpString;         // extended string
  };
  
  // dwSystemID definitions
  #define TSS_NONE                        0
  #define TSS_BITMAP                      1
  #define TSS_COPYRIGHT                   2
  #define TSS_HOTKEY                      3
  #define TSS_LANGUAGE                    4
  #define TSS_LAYOUT                      5
  #define TSS_MESSAGE                     6
  #define TSS_NAME                        7
  #define TSS_VERSION                     8
  #define TSS_CAPSONONLY                  9
  #define TSS_CAPSALWAYSOFF               10
  #define TSS_SHIFTFREESCAPS              11
  #define TSS_LANGUAGENAME                12
  #define TSS_CALLDEFINITION              13
  #define TSS_CALLDEFINITION_LOADFAILED   14
  #define TSS_ETHNOLOGUECODE              15
  #define TSS_DEBUG_LINE                  16
  #define TSS_MNEMONIC                    17
  #define TSS_INCLUDECODES                18
  #define TSS_OLDCHARPOSMATCHING          19
  #define TSS_COMPILEDVERSION             20
  #define TSS_KEYMANCOPYRIGHT             21
  #define TSS_CUSTOMKEYMANEDITION         22
  #define TSS_CUSTOMKEYMANEDITIONNAME     23
  /* Keyman 7.0 system stores */
  #define TSS__KEYMAN_60_MAX              23
  #define TSS_VISUALKEYBOARD              24
  #define TSS_KMW_RTL                     25
  #define TSS_KMW_HELPFILE                26
  #define TSS_KMW_HELPTEXT                27
  #define TSS_KMW_EMBEDJS                 28
  #define TSS_WINDOWSLANGUAGES            29
  #define TSS__KEYMAN_70_MAX              29
  /* Keyman 8.0 system stores */
  #define TSS_COMPARISON                  30
  /* Keyman 9.0 system stores */
  #define TSS_PLATFORM                    31
  #define TSS_BASELAYOUT                  32
  #define TSS_LAYER                       33
  #define TSS_PLATFORM_NOMATCH            0x8001  // Reserved for internal use - after platform statement is run, set to either TSS_PLATFORM_NOMATCH or TSS_PLATFORM_MATCH
  #define TSS_PLATFORM_MATCH              0x8002  // Reserved for internal use - as the result will never change for the lifetime of the process.
  #define TSS_VKDICTIONARY                34      // Dictionary of virtual key names for v9 dynamic layouts
  #define TSS_LAYOUTFILE                  35      // Keyman 9 layer-based JSON OSK
  #define TSS_KEYBOARDVERSION             36      // &keyboardversion system store   // I4140
  #define TSS_KMW_EMBEDCSS                37
  #define TSS_TARGETS                     38
  #define TSS__MAX                        38
  
  // ShiftFlags
  #define LCTRLFLAG       0x0001      // Left Control flag
  #define RCTRLFLAG       0x0002      // Right Control flag
  #define LALTFLAG        0x0004      // Left Alt flag
  #define RALTFLAG        0x0008      // Right Alt flag
  #define K_SHIFTFLAG     0x0010      // Either shift flag
  #define K_CTRLFLAG      0x0020      // Either ctrl flag
  #define K_ALTFLAG       0x0040      // Either alt flag
  //#define K_METAFLAG  0x0080    // Either Meta-key flag (tentative).  Not usable in keyboard rules;
                                  // Used internally (currently, only by KMW) to ensure Meta-key 
                                  // shortcuts safely bypass rules
                                  // Meta key = Command key on macOS, Windows key on Windows
  #define CAPITALFLAG     0x0100      // Caps lock on
  #define NOTCAPITALFLAG  0x0200      // Caps lock NOT on
  #define NUMLOCKFLAG     0x0400      // Num lock on
  #define NOTNUMLOCKFLAG  0x0800      // Num lock NOT on
  #define SCROLLFLAG      0x1000      // Scroll lock on
  #define NOTSCROLLFLAG   0x2000      // Scroll lock NOT on
  #define ISVIRTUALKEY    0x4000      // It is a Virtual Key Sequence
  #define VIRTUALCHARKEY  0x8000      // Keyman 6.0: Virtual Key Cap Sequence
  #define K_MODIFIERFLAG  0x007F
  
  struct COMP_KEY {
      WORD Key;  // Windows VK code or character value (VIRTUALCHARKEY, ISVIRTUALKEY)
      DWORD Line;
      DWORD ShiftFlags;
      DWORD dpOutput;   // extended string
      DWORD dpContext;  // extended string
  };
  
  #define UC_SENTINEL             0xFFFF
  #define UC_SENTINEL_EXTENDEDEND 0x10
  
  #define CODE_ANY                0x01
  #define CODE_INDEX              0x02
  #define CODE_CONTEXT            0x03
  #define CODE_NUL                0x04
  #define CODE_USE                0x05
  #define CODE_RETURN             0x06
  #define CODE_BEEP               0x07
  #define CODE_DEADKEY            0x08
  //  0x09 = bkspace.-- we don't need to keep this separate though with UC_SENTINEL
  #define CODE_EXTENDED           0x0A
  //#define CODE_EXTENDEDEND  0x0B  deprecated
  #define CODE_SWITCH             0x0C
  #define CODE_KEY                0x0D
  #define CODE_CLEARCONTEXT       0x0E
  #define CODE_CALL               0x0F
  // UC_SENTINEL_EXTENDEDEND  0x10
  #define CODE_CONTEXTEX          0x11
  #define CODE_NOTANY             0x12
  #define CODE_KEYMAN70_LASTCODE  0x12
  
  #define CODE_SETOPT             0x13
  #define CODE_IFOPT              0x14
  #define CODE_SAVEOPT            0x15
  #define CODE_RESETOPT           0x16
  #define CODE_KEYMAN80_LASTCODE  0x16
  
  /* Keyman 9.0 codes */
  #define CODE_IFSYSTEMSTORE      0x17
  #define CODE_SETSYSTEMSTORE     0x18
  #define CODE_LASTCODE           0x18
  
  /* Keyman4Mac codes */
  #define CODE_NULLCHAR           0x20
  
  
  #define NOT_EQUAL   0
  #define EQUAL       1
  
  /* KVK file format definitions */
  
  // KVK header flags
  #define KVKH_102                0x01
  #define KVKH_DISPLAY_UNDERLYING 0x02
  #define KVKH_USE_UNDERLYING     0x04
  #define KVKH_ALTGR              0x08
  
  // KVK key type flags
  #define KVKK_BITMAP             0x01
  #define KVKK_UNICODE            0x02
  
  // KVK shift flags
  #define KVKS_NORMAL             0x00
  #define KVKS_SHIFT              0x01
  #define KVKS_CTRL               0x02
  #define KVKS_ALT                0x04
  #define KVKS_LCTRL              0x08
  #define KVKS_RCTRL              0x10
  #define KVKS_LALT               0x20
  #define KVKS_RALT               0x40
  
  #endif /* KMBinaryFileFormat_h */
  