#ifndef keystate_h
#define keystate_h

#include "keyboard.h"
#include "keyb_server.h"
#include "keynum.h"

struct key_pressed_state {
	unsigned char keys[32];
};
typedef Bit32u keystring;

struct press_state {
	unsigned char	character;
	t_keynum	key;
	t_keysym	deadsym;
	t_modifiers	shiftstate;
	t_modifiers	shiftstate_mask;
	int 		map;
};

struct character_translate_rules {
	struct press_state keys[NUM_KEYSYMS];
};

struct translate_rule {
	t_keysym rule_map[NUM_KEY_NUMS];
	t_modifiers modifiers;
};

struct translate_rules_struct {
	struct translate_rule plain;
	struct translate_rule shift;
	struct translate_rule ctrl;
	struct translate_rule alt; /* unnecessary? */
	struct translate_rule altgr;
	struct translate_rule shift_altgr;
	struct translate_rule ctrl_alt;
};
#define NUM_RULES (sizeof(struct translate_rules_struct) / \
    sizeof(struct translate_rule))

struct scancode_translate_rules {
	int keyboard;
	union {
		struct translate_rules_struct rule_structs;
		struct translate_rule rule_arr[NUM_RULES];
	} trans_rules;
};

struct raw_key_state {
	Bit32u rawprefix;
};

#define MAPS_MAX 4
struct keyboard_rules {
	struct character_translate_rules charset;
	struct scancode_translate_rules maps[MAPS_MAX];
	int activemap;
};

struct keyboard_state {
	struct keyboard_rules *rules;
	struct key_pressed_state keys_pressed;
	t_shiftstate shiftstate;
	int alt_num_buffer;		/* used for alt-keypad entry mode */
	t_keysym accent;		/* buffer for dead-key accents */
	struct raw_key_state raw_state;	/* used in putrawkey() */
};


extern t_keynum compute_functional_keynum(Boolean make, t_keynum keynum,
					  struct key_pressed_state *keystate);
extern t_keynum compute_keynum(Boolean *make_ret,
			       t_rawkeycode code, struct raw_key_state *state);
extern Bit16u translate_key(Boolean make, t_keynum key,
			    struct keyboard_state *state);

extern struct keyboard_state dos_keyboard_state;
extern struct keyboard_state input_keyboard_state;
extern Boolean handle_dosemu_keys(Boolean make, t_keysym key);
extern t_modifiers get_modifiers_r(t_shiftstate shiftstate);

#endif /* keystate_h */
