#ifndef _XPLMDefs_h_
#define _XPLMDefs_h_

/*
 * Copyright 2005-2012 Sandy Barbour and Ben Supnik
 * 
 * All rights reserved.  See license.txt for usage.
 * 
 * X-Plane SDK Version: 2.1.1                                                  
 *
 */

/*
 * This file is contains the cross-platform and basic definitions for the 
 * X-Plane SDK. 
 * 
 * The preprocessor macros APL and IBM must be defined to specify the 
 * compilation target; define APL to 1 and IBM 0 to compile on Macintosh and 
 * APL to 0 and IBM to 1 for Windows. You must specify these macro definitions 
 * before including XPLMDefs.h or any other XPLM headers.  You can do this 
 * using the -D command line option or a preprocessor header.                  
 *
 */


#ifdef __cplusplus
extern "C" {
#endif

#ifdef  _WIN32
#include <windows.h>
#else
#include <stdint.h>
#endif
/***************************************************************************
 * DLL Definitions
 ***************************************************************************/
/*
 * These definitions control the importing and exporting of functions within 
 * the DLL. 
 * 
 * You can prefix your five required callbacks with the PLUGIN_API macro to 
 * declare  them as exported C functions.  The XPLM_API macro identifies 
 * functions that are provided to you via the plugin SDK.  (Link against 
 * XPLM.lib to use these functions.)                                           
 *
 */



#ifdef __cplusplus
	#ifdef APL
        #if __GNUC__ >= 4
            #define PLUGIN_API extern "C" __attribute__((visibility("default")))
        #elif __MACH__
			#define PLUGIN_API extern "C"
		#else		
			#define PLUGIN_API extern "C" __declspec(dllexport)
		#endif
	#endif
	#ifdef _WIN32
		#define PLUGIN_API extern "C" __declspec(dllexport)
	#endif
	#ifdef LIN
		#if __GNUC__ >= 4
			#define PLUGIN_API extern "C" __attribute__((visibility("default")))
		#else
			#define PLUGIN_API extern "C"
		#endif
	#endif
#else
	#if APL
        #if __GNUC__ >= 4
            #define PLUGIN_API __attribute__((visibility("default")))
        #elif __MACH__
			#define PLUGIN_API 
		#else
			#define PLUGIN_API __declspec(dllexport)
		#endif		
	#elif IBM
		#define PLUGIN_API __declspec(dllexport)
	#elif LIN
        #if __GNUC__ >= 4
            #define PLUGIN_API __attribute__((visibility("default")))
		#else
			#define PLUGIN_API
		#endif		
	#else
		#error "Platform not defined!"
	#endif
#endif

#ifdef APL
	#if XPLM
        #if __GNUC__ >= 4
            #define XPLM_API __attribute__((visibility("default")))
        #elif __MACH__
			#define XPLM_API 
		#else
			#define XPLM_API __declspec(dllexport)
		#endif
	#else
		#define XPLM_API 
	#endif
#endif
#ifdef _WIN32
	#if XPLM
		#define XPLM_API __declspec(dllexport)
	#else
		#define XPLM_API __declspec(dllimport)
	#endif
#endif
#ifdef LIN
	#if XPLM
		#if __GNUC__ >= 4
            #define XPLM_API __attribute__((visibility("default")))
		#else
			#define XPLM_API
		#endif
	#else
		#define XPLM_API
	#endif	
#endif

/***************************************************************************
 * GLOBAL DEFINITIONS
 ***************************************************************************/
/*
 * These definitions are used in all parts of the SDK.                         
 *
 */



/*
 * XPLMPluginID
 * 
 * Each plug-in is identified by a unique integer ID.  This ID can be used to 
 * disable or enable a plug-in, or discover what plug-in is 'running' at the 
 * time.  A plug-in ID is unique within the currently running instance of 
 * X-Plane unless plug-ins are reloaded.  Plug-ins may receive a different 
 * unique ID each time they are loaded. 
 * 
 * For persistent identification of plug-ins, use XPLMFindPluginBySignature in 
 * XPLMUtiltiies.h 
 * 
 * -1 indicates no plug-in.                                                    
 *
 */
typedef int XPLMPluginID;

/* No plugin.                                                                  */
#define XPLM_NO_PLUGIN_ID    (-1)

/* X-Plane itself                                                              */
#define XPLM_PLUGIN_XPLANE   (0)

/* The current XPLM revision is 2.10 (210).                                    */
#define kXPLM_Version        (210)

/*
 * XPLMKeyFlags
 * 
 * These bitfields define modifier keys in a platform independent way. When a 
 * key is pressed, a series of messages are sent to your plugin.  The down 
 * flag is set in the first of these messages, and the up flag in the last.  
 * While the key is held down, messages are sent with neither to indicate that 
 * the key is being held down as a repeated character. 
 * 
 * The control flag is mapped to the control flag on Macintosh and PC.  
 * Generally X-Plane uses the control key and not the command key on 
 * Macintosh, providing a consistent interface across platforms that does not 
 * necessarily match the Macintosh user interface guidelines.  There is not 
 * yet a way for plugins to access the Macintosh control keys without using 
 * #ifdefed code.                                                              
 *
 */
enum {
     /* The shift key is down                                                       */
     xplm_ShiftFlag                           = 1

     /* The option or alt key is down                                               */
    ,xplm_OptionAltFlag                       = 2

     /* The control key is down*                                                    */
    ,xplm_ControlFlag                         = 4

     /* The key is being pressed down                                               */
    ,xplm_DownFlag                            = 8

     /* The key is being released                                                   */
    ,xplm_UpFlag                              = 16


};
typedef int XPLMKeyFlags;

/***************************************************************************
 * ASCII CONTROL KEY CODES
 ***************************************************************************/
/*
 * These definitions define how various control keys are mapped to ASCII key 
 * codes. Not all key presses generate an ASCII value, so plugin code should 
 * be prepared to see null characters come from the keyboard...this usually 
 * represents a key stroke that has no equivalent ASCII, like a page-down 
 * press.  Use virtual key codes to find these key strokes. ASCII key codes 
 * take into account modifier keys; shift keys will affect capitals and 
 * punctuation; control key combinations may have no vaild ASCII and produce 
 * NULL.  To detect control-key combinations, use virtual key codes, not ASCII 
 * keys.                                                                       
 *
 */



#define XPLM_KEY_RETURN      13

#define XPLM_KEY_ESCAPE      27

#define XPLM_KEY_TAB         9

#define XPLM_KEY_DELETE      8

#define XPLM_KEY_LEFT        28

#define XPLM_KEY_RIGHT       29

#define XPLM_KEY_UP          30

#define XPLM_KEY_DOWN        31

#define XPLM_KEY_0           48

#define XPLM_KEY_1           49

#define XPLM_KEY_2           50

#define XPLM_KEY_3           51

#define XPLM_KEY_4           52

#define XPLM_KEY_5           53

#define XPLM_KEY_6           54

#define XPLM_KEY_7           55

#define XPLM_KEY_8           56

#define XPLM_KEY_9           57

#define XPLM_KEY_DECIMAL     46

/***************************************************************************
 * VIRTUAL KEY CODES
 ***************************************************************************/
/*
 * These are cross-platform defines for every distinct keyboard press on the 
 * computer. Every physical key on the keyboard has a virtual key code.  So 
 * the "two" key on the  top row of the main keyboard has a different code 
 * from the "two" key on the numeric key pad.  But the 'w' and 'W' character 
 * are indistinguishable by virtual key code  because they are the same 
 * physical key (one with and one without the shift key). 
 * 
 * Use virtual key codes to detect keystrokes that do not have ASCII 
 * equivalents, allow the user to map the numeric keypad separately from the 
 * main keyboard, and detect control key and other modifier-key combinations 
 * that generate ASCII control key sequences (many of which are not available 
 * directly via character keys in the SDK).			 
 * 
 * To assign virtual key codes we started with the Microsoft set but made some 
 * additions and changes.  A few differences: 
 * 
 * 1. Modifier keys are not available as virtual key codes.  You cannot get 
 * distinct modifier press and release messages.  Please do not try to use 
 * modifier keys as regular keys; doing so will almost certainly interfere 
 * with users' abilities to use the native x-plane key bindings. 
 * 
 * 2. Some keys that do not exist on both Mac and PC keyboards are removed. 
 * 
 * 3. Do not assume that the values of these keystrokes are interchangeable 
 * with MS v-keys.                                                             
 *
 */



#define XPLM_VK_BACK         0x08

#define XPLM_VK_TAB          0x09

#define XPLM_VK_CLEAR        0x0C

#define XPLM_VK_RETURN       0x0D

#define XPLM_VK_ESCAPE       0x1B

#define XPLM_VK_SPACE        0x20

#define XPLM_VK_PRIOR        0x21

#define XPLM_VK_NEXT         0x22

#define XPLM_VK_END          0x23

#define XPLM_VK_HOME         0x24

#define XPLM_VK_LEFT         0x25

#define XPLM_VK_UP           0x26

#define XPLM_VK_RIGHT        0x27

#define XPLM_VK_DOWN         0x28

#define XPLM_VK_SELECT       0x29

#define XPLM_VK_PRINT        0x2A

#define XPLM_VK_EXECUTE      0x2B

#define XPLM_VK_SNAPSHOT     0x2C

#define XPLM_VK_INSERT       0x2D

#define XPLM_VK_DELETE       0x2E

#define XPLM_VK_HELP         0x2F

/* XPLM_VK_0 thru XPLM_VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)   */
#define XPLM_VK_0            0x30

#define XPLM_VK_1            0x31

#define XPLM_VK_2            0x32

#define XPLM_VK_3            0x33

#define XPLM_VK_4            0x34

#define XPLM_VK_5            0x35

#define XPLM_VK_6            0x36

#define XPLM_VK_7            0x37

#define XPLM_VK_8            0x38

#define XPLM_VK_9            0x39

/* XPLM_VK_A thru XPLM_VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)   */
#define XPLM_VK_A            0x41

#define XPLM_VK_B            0x42

#define XPLM_VK_C            0x43

#define XPLM_VK_D            0x44

#define XPLM_VK_E            0x45

#define XPLM_VK_F            0x46

#define XPLM_VK_G            0x47

#define XPLM_VK_H            0x48

#define XPLM_VK_I            0x49

#define XPLM_VK_J            0x4A

#define XPLM_VK_K            0x4B

#define XPLM_VK_L            0x4C

#define XPLM_VK_M            0x4D

#define XPLM_VK_N            0x4E

#define XPLM_VK_O            0x4F

#define XPLM_VK_P            0x50

#define XPLM_VK_Q            0x51

#define XPLM_VK_R            0x52

#define XPLM_VK_S            0x53

#define XPLM_VK_T            0x54

#define XPLM_VK_U            0x55

#define XPLM_VK_V            0x56

#define XPLM_VK_W            0x57

#define XPLM_VK_X            0x58

#define XPLM_VK_Y            0x59

#define XPLM_VK_Z            0x5A

#define XPLM_VK_NUMPAD0      0x60

#define XPLM_VK_NUMPAD1      0x61

#define XPLM_VK_NUMPAD2      0x62

#define XPLM_VK_NUMPAD3      0x63

#define XPLM_VK_NUMPAD4      0x64

#define XPLM_VK_NUMPAD5      0x65

#define XPLM_VK_NUMPAD6      0x66

#define XPLM_VK_NUMPAD7      0x67

#define XPLM_VK_NUMPAD8      0x68

#define XPLM_VK_NUMPAD9      0x69

#define XPLM_VK_MULTIPLY     0x6A

#define XPLM_VK_ADD          0x6B

#define XPLM_VK_SEPARATOR    0x6C

#define XPLM_VK_SUBTRACT     0x6D

#define XPLM_VK_DECIMAL      0x6E

#define XPLM_VK_DIVIDE       0x6F

#define XPLM_VK_F1           0x70

#define XPLM_VK_F2           0x71

#define XPLM_VK_F3           0x72

#define XPLM_VK_F4           0x73

#define XPLM_VK_F5           0x74

#define XPLM_VK_F6           0x75

#define XPLM_VK_F7           0x76

#define XPLM_VK_F8           0x77

#define XPLM_VK_F9           0x78

#define XPLM_VK_F10          0x79

#define XPLM_VK_F11          0x7A

#define XPLM_VK_F12          0x7B

#define XPLM_VK_F13          0x7C

#define XPLM_VK_F14          0x7D

#define XPLM_VK_F15          0x7E

#define XPLM_VK_F16          0x7F

#define XPLM_VK_F17          0x80

#define XPLM_VK_F18          0x81

#define XPLM_VK_F19          0x82

#define XPLM_VK_F20          0x83

#define XPLM_VK_F21          0x84

#define XPLM_VK_F22          0x85

#define XPLM_VK_F23          0x86

#define XPLM_VK_F24          0x87

/* The following definitions are extended and are not based on the Microsoft   *
 * key set.                                                                    */
#define XPLM_VK_EQUAL        0xB0

#define XPLM_VK_MINUS        0xB1

#define XPLM_VK_RBRACE       0xB2

#define XPLM_VK_LBRACE       0xB3

#define XPLM_VK_QUOTE        0xB4

#define XPLM_VK_SEMICOLON    0xB5

#define XPLM_VK_BACKSLASH    0xB6

#define XPLM_VK_COMMA        0xB7

#define XPLM_VK_SLASH        0xB8

#define XPLM_VK_PERIOD       0xB9

#define XPLM_VK_BACKQUOTE    0xBA

#define XPLM_VK_ENTER        0xBB

#define XPLM_VK_NUMPAD_ENT   0xBC

#define XPLM_VK_NUMPAD_EQ    0xBD

#ifdef __cplusplus
}
#endif

#endif
