// Hotkey.h
// 
// Constant definitions and a couple of exports for the hotkey processor
//
// Mark Thompson (mot20@cam.ac.uk / mark@wildfiregames.com)
//
// Hotkeys can be mapped onto SDL events (for use internal to the engine),
// or used to trigger activation of GUI buttons.
//
// Adding a hotkey (SDL event type):
//
// - Define your constant in the enum, just below;
// - Add an entry to hotkeyInfo[], in Hotkey.cpp
//     first column is this constant, second is the config string (minus 'hotkey.') it maps to
//     third and fourth are the default keys, used if the config file doesn't contain that string.
// - Create an input handler for SDL_HOTKEYDOWN, SDL_HOTKEYUP, or poll the hotkeys[] array.
//     For SDL_HOTKEYDOWN, SDL_HOTKEYUP, the constant is passed in as ev->user.code.
// - Add some bindings to the config file.

#include "CStr.h"
#include "lib/input.h"

const int SDL_HOTKEYDOWN = SDL_USEREVENT;
const int SDL_HOTKEYUP = SDL_USEREVENT + 1;
const int SDL_GUIHOTKEYPRESS = SDL_USEREVENT + 2;

enum
{
	HOTKEY_EXIT,
	HOTKEY_SCREENSHOT,
	HOTKEY_BIGSCREENSHOT,
	HOTKEY_WIREFRAME,
	HOTKEY_CAMERA_RESET,
	HOTKEY_CAMERA_RESET_ORIGIN,
	HOTKEY_CAMERA_ZOOM_IN,
	HOTKEY_CAMERA_ZOOM_OUT,
	HOTKEY_CAMERA_ZOOM_WHEEL_IN,
	HOTKEY_CAMERA_ZOOM_WHEEL_OUT,
	HOTKEY_CAMERA_ROTATE,
	HOTKEY_CAMERA_ROTATE_KEYBOARD,
	HOTKEY_CAMERA_ROTATE_ABOUT_TARGET,
	HOTKEY_CAMERA_ROTATE_ABOUT_TARGET_KEYBOARD,
	HOTKEY_CAMERA_PAN,
	HOTKEY_CAMERA_PAN_KEYBOARD,
	HOTKEY_CAMERA_LEFT,
	HOTKEY_CAMERA_RIGHT,
	HOTKEY_CAMERA_UP,
	HOTKEY_CAMERA_DOWN,
	HOTKEY_CAMERA_UNIT_VIEW,
	HOTKEY_CAMERA_UNIT_ATTACH,
	HOTKEY_CAMERA_BOOKMARK_0,
	HOTKEY_CAMERA_BOOKMARK_1,
	HOTKEY_CAMERA_BOOKMARK_2,
	HOTKEY_CAMERA_BOOKMARK_3,
	HOTKEY_CAMERA_BOOKMARK_4,
	HOTKEY_CAMERA_BOOKMARK_5,
	HOTKEY_CAMERA_BOOKMARK_6,
	HOTKEY_CAMERA_BOOKMARK_7,
	HOTKEY_CAMERA_BOOKMARK_8,
	HOTKEY_CAMERA_BOOKMARK_9,
	HOTKEY_CAMERA_BOOKMARK_SAVE,
	HOTKEY_CAMERA_BOOKMARK_SNAP,
	HOTKEY_CAMERA_CINEMA_ADD,
	HOTKEY_CAMERA_CINEMA_DELETE,
	HOTKEY_CAMERA_CINEMA_DELETE_ALL,
	HOTKEY_CAMERA_CINEMA_QUEUE,
	HOTKEY_CONSOLE_TOGGLE,
	HOTKEY_CONSOLE_COPY,
	HOTKEY_CONSOLE_PASTE,
	HOTKEY_SELECTION_ADD,
	HOTKEY_SELECTION_REMOVE,
	HOTKEY_SELECTION_GROUP_0,
	HOTKEY_SELECTION_GROUP_1,
	HOTKEY_SELECTION_GROUP_2,
	HOTKEY_SELECTION_GROUP_3,
	HOTKEY_SELECTION_GROUP_4,
	HOTKEY_SELECTION_GROUP_5,
	HOTKEY_SELECTION_GROUP_6,
	HOTKEY_SELECTION_GROUP_7,
	HOTKEY_SELECTION_GROUP_8,
	HOTKEY_SELECTION_GROUP_9,
	HOTKEY_SELECTION_GROUP_10,
	HOTKEY_SELECTION_GROUP_11,
	HOTKEY_SELECTION_GROUP_12,
	HOTKEY_SELECTION_GROUP_13,
	HOTKEY_SELECTION_GROUP_14,
	HOTKEY_SELECTION_GROUP_15,
	HOTKEY_SELECTION_GROUP_16,
	HOTKEY_SELECTION_GROUP_17,
	HOTKEY_SELECTION_GROUP_18,
	HOTKEY_SELECTION_GROUP_19,
	HOTKEY_SELECTION_GROUP_ADD,
	HOTKEY_SELECTION_GROUP_SAVE,
	HOTKEY_SELECTION_GROUP_SNAP,
	HOTKEY_SELECTION_SNAP,
	HOTKEY_ORDER_QUEUE,
	HOTKEY_CONTEXTORDER_NEXT,
	HOTKEY_CONTEXTORDER_PREVIOUS,
	HOTKEY_HIGHLIGHTALL,
	HOTKEY_PROFILE_TOGGLE,
	HOTKEY_PROFILE_SAVE,
	HOTKEY_PLAYMUSIC,
	HOTKEY_WATER_TOGGLE,
	HOTKEY_WATER_RAISE,
	HOTKEY_WATER_LOWER,
	HOTKEY_PAUSE,
	HOTKEY_SPEED_INCREASE,
	HOTKEY_SPEED_DECREASE,
	
	HOTKEY_LAST,

	HOTKEY_NEGATION_FLAG = 65536
};

extern void loadHotkeys();
extern InReaction hotkeyInputHandler( const SDL_Event* ev );
extern void hotkeyRegisterGUIObject( const CStr& objName, const CStr& hotkeyName );

extern void initKeyNameMap();
extern CStr getKeyName( int keycode );
extern int getKeyCode( CStr keyname );

extern bool keyRespondsTo( int hotkey, int sdlkey );

extern bool hotkeys[HOTKEY_LAST];
