spiegel-keyman/linux/kmflcomp/include/kmfl.h
2018-08-28 15:16:16 +07:00

190 lines
6.4 KiB
C

/* kmfl.h
* Copyright (C) 2005 SIL International
*
* This file is part of the KMFL compiler.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
// KMFL.H: Header for compiler and interpreter for Keyboard Mapping for Linux
#ifndef KMFL_H
#define KMFL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#define FILE_VERSION "1"
#define BASE_VERSION "0320"
#define LAST_VERSION "1000"
// Undefine some Windows constants so we can use them (even on Windows)
#ifdef UNDEFINED
#undef UNDEFINED
#endif
#ifdef SS_BITMAP
#undef SS_BITMAP
#endif
// Keyboard flags
#define KF_ANSI 0
#define KF_UNICODE 1
#define KF_POSITIONAL 0
#define KF_MNEMONIC 1
// State bit assignments
#define KS_LSHIFT 1
#define KS_CAPS 2
#define KS_LCTRL 4
#define KS_LALT 8
#define KS_RSHIFT 16
#define KS_NCAPS 32
#define KS_RCTRL 64
#define KS_RALT 128
#define KS_SHIFT (KS_LSHIFT|KS_RSHIFT)
#define KS_CTRL (KS_LCTRL|KS_RCTRL)
#define KS_ALT (KS_LALT|KS_RALT)
// Group flags
#define GF_USEKEYS 1
// Various constants
#define UNDEFINED (-1) // redefine this value for our own use
#define NAMELEN 64 // maximum length of names for stores, groups or deadkeys
#define MAX_HISTORY 128 // number of output (32-bit) characters remembered
#define MAX_OUTPUT 128 // maximum length of output allowed from any one key event
#define MAX_KEYBOARDS 64 // maximum number of keyboards that can be loaded
#define MAX_INSTANCES 255 // maximum number of keyboard instances that can be supported
#define VERSION_ZERO 1000 // lowest valid version
// Variable types and structures
#ifdef _WIN32
typedef unsigned int UINT; // 32-bit unsigned integer (general purpose)
#else
typedef u_int32_t UINT;
#endif
typedef int32_t INT;
typedef u_int8_t BYTE;
typedef UINT ITEM; // 32-bit unsigned integer for UTF-32 or control values
typedef UINT OFFSET; // 32-bit unsigned integer used as table offsets
#define ITEMSIZE (sizeof(ITEM))
// Rule (and store) item types (high-order byte of ITEMs)
enum {ITEM_CHAR=0,ITEM_KEYSYM,ITEM_ANY,ITEM_INDEX,ITEM_OUTS,ITEM_DEADKEY,ITEM_CONTEXT,ITEM_NUL,ITEM_RETURN,
ITEM_BEEP,ITEM_USE,ITEM_MATCH,ITEM_NOMATCH,ITEM_PLUS,ITEM_CALL, ITEM_NOTANY};
// Macros to determine an item type and build an item from item type and value
#define ITEM_TYPE(x) (((x)>>24)&0xff)
#define MAKE_ITEM(t,x) (((t)<<24)|((x)&0xffffff))
#define MAKE_PARAMETER_ITEM(t,i,x) (((t)<<24)|(((i)&0xff)<<16)|((x)&0xffff))
// Enumerate special stores with reserved names (prefixed by &)
enum TAG_SS {SS_UNDEFINED=-1,SS_NAME,SS_VERSION,SS_HOTKEY,SS_LANGUAGE,SS_LAYOUT,SS_COPYRIGHT,
SS_MESSAGE,SS_BITMAP,SS_MNEMONIC,SS_ETHNOLOGUE,SS_CAPSOFF,SS_CAPSON,SS_CAPSFREE,SS_AUTHOR,
SS_TARGETS,SS_VISUALKEYBOARD,SS_KEYBOARDVERSION};
// The following compiled keyboard structures and types are used by both the compiler
// and the interpreter
// Unnamed stores
struct _xstore {
UINT len; // number of items in store
OFFSET items; // offset to store text (from start of string table)
};
typedef struct _xstore XSTORE;
// Interpreter rule structure
struct _xrule {
UINT ilen; // input rule length (items)
UINT olen; // output rule length (items)
OFFSET lhs; // offset to input (match) rule (from start of string table)
OFFSET rhs; // offset to output (process) rule (from start of string table)
};
typedef struct _xrule XRULE;
// Unnamed groups (each group header is followed by its rules, so the rules are not included)
struct _xgroup {
UINT flags; // group flags
UINT nrules; // number of rules in group
UINT rule1; // (absolute) rule number of first rule of group
UINT mrlen; // length of match rule (rhs)
UINT nmrlen; // length of nomatch rule (rhs)
OFFSET match; // offset to match (rhs) rule (from start of string table)
OFFSET nomatch; // offset to nomatch (rhs) rule (from start of string table)
};
typedef struct _xgroup XGROUP;
// Compiled keyboard structure
struct _xkeyboard {
char id[4]; // always KMFL
char version[5]; // keyboard version(4) and file version(1)
char name[NAMELEN+1]; // utf8 version of keyboard name
UINT mode:1; // Keyboard Flags: Unicode (0) or ANSI (1)
UINT layout:1; // positional(0) or mnemonic(1)
UINT capson:1; // caps on only
UINT capsoff:1; // caps always off
UINT capsfree:1; // shift frees caps
UINT usedll:1; // use external library (to be implemented)
UINT hotkey; // shift state + keysym for hotkey
UINT group1; // index of first group used
UINT nstores; // number of defined stores
UINT ngroups; // number of groups
};
typedef struct _xkeyboard XKEYBOARD;
// Keyboard mapping server instance
struct _kmsi {
void *connection; // instance identification passed by server
char kbd_name[NAMELEN+1]; // name of currently attached keyboard
int keyboard_number; // the keyboard slot
XKEYBOARD *keyboard; // pointer to valid keyboard structure
XGROUP *groups; // pointer to list of groups in loaded keyboard
XRULE *rules; // pointer to list of rules in loaded keyboard
XSTORE *stores; // pointer to list of stores in loaded keyboard
ITEM *strings; // pointer to (32-bit) string table in loaded keyboard
ITEM *history; // (32-bit) character output history
UINT nhistory; // valid history count
ITEM output_queue[MAX_OUTPUT];
UINT noutput_queue;
struct _kmsi *next; // link to next instance
struct _kmsi *last; // link to previous instance
};
typedef struct _kmsi KMSI;
#ifdef __cplusplus
}
#endif
#endif /* *** end of KMFL.H *** */