#ifndef _XPLMDisplay_h_ #define _XPLMDisplay_h_ /* * Copyright 2005-2012 Sandy Barbour and Ben Supnik * * All rights reserved. See license.txt for usage. * * X-Plane SDK Version: 2.1.1 * */ /* * XPLM Display APIs - THEORY OF OPERATION * * This API provides the basic hooks to draw in X-Plane and create user * interface. All X-Plane drawing is done in OpenGL. The X-Plane plug-in * manager takes care of properly setting up the OpenGL context and matrices. * You do not decide when in your code's execution to draw; X-Plane tells you * when it is ready to have your plugin draw. * * X-Plane's drawing strategy is straightforward: every "frame" the screen is * rendered by drawing the 3-d scene (dome, ground, objects, airplanes, etc.) * and then drawing the cockpit on top of it. Alpha blending is used to * overlay the cockpit over the world (and the gauges over the panel, etc.). * * There are two ways you can draw: directly and in a window. * * Direct drawing involves drawing to the screen before or after X-Plane * finishes a phase of drawing. When you draw directly, you can specify * whether x-plane is to complete this phase or not. This allows you to do * three things: draw before x-plane does (under it), draw after x-plane does * (over it), or draw instead of x-plane. * * To draw directly, you register a callback and specify what phase you want * to intercept. The plug-in manager will call you over and over to draw that * phase. * * Direct drawing allows you to override scenery, panels, or anything. Note * that you cannot assume that you are the only plug-in drawing at this * phase. * * Window drawing provides slightly higher level functionality. With window * drawing you create a window that takes up a portion of the screen. Window * drawing is always two dimensional. Window drawing is front-to-back * controlled; you can specify that you want your window to be brought on * top, and other plug-ins may put their window on top of you. Window drawing * also allows you to sign up for key presses and receive mouse clicks. * * There are three ways to get keystrokes: * * If you create a window, the window can take keyboard focus. It will then * receive all keystrokes. If no window has focus, X-Plane receives * keystrokes. Use this to implement typing in dialog boxes, etc. Only one * window may have focus at a time; your window will be notified if it loses * focus. * * If you need to associate key strokes with commands/functions in your * plug-in, use a hot key. A hoy is a key-specific callback. Hotkeys are * sent based on virtual key strokes, so any key may be distinctly mapped with * any modifiers. Hot keys can be remapped by other plug-ins. As a plug-in, * you don't have to worry about what your hot key ends up mapped to; other * plug-ins may provide a UI for remapping keystrokes. So hotkeys allow a * user to resolve conflicts and customize keystrokes. * * If you need low level access to the keystroke stream, install a key * sniffer. Key sniffers can be installed above everything or right in front * of the sim. * */ #include "XPLMDefs.h" #ifdef __cplusplus extern "C" { #endif /*************************************************************************** * DRAWING CALLBACKS ***************************************************************************/ /* * Basic drawing callbacks, for low level intercepting of render loop. The * purpose of drawing callbacks is to provide targeted additions or * replacements to x-plane's graphics environment (for example, to add extra * custom objects, or replace drawing of the AI aircraft). Do not assume that * the drawing callbacks will be called in the order implied by the * enumerations. Also do not assume that each drawing phase ends before * another begins; they may be nested. * */ /* * XPLMDrawingPhase * * This constant indicates which part of drawing we are in. Drawing is done * from the back to the front. We get a callback before or after each item. * Metaphases provide access to the beginning and end of the 3d (scene) and 2d * (cockpit) drawing in a manner that is independent of new phases added via * x-plane implementation. * * WARNING: As X-Plane's scenery evolves, some drawing phases may cease to * exist and new ones may be invented. If you need a particularly specific * use of these codes, consult Austin and/or be prepared to revise your code * as X-Plane evolves. * */ enum { /* This is the earliest point at which you can draw in 3-d. */ xplm_Phase_FirstScene = 0 /* Drawing of land and water. */ ,xplm_Phase_Terrain = 5 /* Drawing runways and other airport detail. */ ,xplm_Phase_Airports = 10 /* Drawing roads, trails, trains, etc. */ ,xplm_Phase_Vectors = 15 /* 3-d objects (houses, smokestacks, etc. */ ,xplm_Phase_Objects = 20 /* External views of airplanes, both yours and the AI aircraft. */ ,xplm_Phase_Airplanes = 25 /* This is the last point at which you can draw in 3-d. */ ,xplm_Phase_LastScene = 30 /* This is the first phase where you can draw in 2-d. */ ,xplm_Phase_FirstCockpit = 35 /* The non-moving parts of the aircraft panel. */ ,xplm_Phase_Panel = 40 /* The moving parts of the aircraft panel. */ ,xplm_Phase_Gauges = 45 /* Floating windows from plugins. */ ,xplm_Phase_Window = 50 /* The last change to draw in 2d. */ ,xplm_Phase_LastCockpit = 55 #if defined(XPLM200) /* 3-d Drawing for the local map. Use regular OpenGL coordinates to draw in * * this phase. */ ,xplm_Phase_LocalMap3D = 100 #endif /* XPLM200 */ #if defined(XPLM200) /* 2-d Drawing of text over the local map. */ ,xplm_Phase_LocalMap2D = 101 #endif /* XPLM200 */ #if defined(XPLM200) /* Drawing of the side-profile view in the local map screen. */ ,xplm_Phase_LocalMapProfile = 102 #endif /* XPLM200 */ }; typedef int XPLMDrawingPhase; /* * XPLMDrawCallback_f * * This is the prototype for a low level drawing callback. You are passed in * the phase and whether it is before or after. If you are before the phase, * return 1 to let x-plane draw or 0 to suppress x-plane drawing. If you are * after the phase the return value is ignored. * * Refcon is a unique value that you specify when registering the callback, * allowing you to slip a pointer to your own data to the callback. * * Upon entry the OpenGL context will be correctly set up for you and OpenGL * will be in 'local' coordinates for 3d drawing and panel coordinates for 2d * drawing. The OpenGL state (texturing, etc.) will be unknown. * */ typedef int (* XPLMDrawCallback_f)( XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon); /* * XPLMKeySniffer_f * * This is the prototype for a low level key-sniffing function. Window-based * UI _should not use this_! The windowing system provides high-level * mediated keyboard access. By comparison, the key sniffer provides low * level keyboard access. * * Key sniffers are provided to allow libraries to provide non-windowed user * interaction. For example, the MUI library uses a key sniffer to do pop-up * text entry. * * inKey is the character pressed, inRefCon is a value you supply during * registration. Return 1 to pass the key on to the next sniffer, the window * mgr, x-plane, or whomever is down stream. Return 0 to consume the key. * * Warning: this API declares virtual keys as a signed character; however the * VKEY #define macros in XPLMDefs.h define the vkeys using unsigned values * (that is 0x80 instead of -0x80). So you may need to cast the incoming vkey * to an unsigned char to get correct comparisons in C. * */ typedef int (* XPLMKeySniffer_f)( char inChar, XPLMKeyFlags inFlags, char inVirtualKey, void * inRefcon); /* * XPLMRegisterDrawCallback * * This routine registers a low level drawing callback. Pass in the phase you * want to be called for and whether you want to be called before or after. * This routine returns 1 if the registration was successful, or 0 if the * phase does not exist in this version of x-plane. You may register a * callback multiple times for the same or different phases as long as the * refcon is unique each time. * */ XPLM_API int XPLMRegisterDrawCallback( XPLMDrawCallback_f inCallback, XPLMDrawingPhase inPhase, int inWantsBefore, void * inRefcon); /* * XPLMUnregisterDrawCallback * * This routine unregisters a draw callback. You must unregister a callback * for each time you register a callback if you have registered it multiple * times with different refcons. The routine returns 1 if it can find the * callback to unregister, 0 otherwise. * */ XPLM_API int XPLMUnregisterDrawCallback( XPLMDrawCallback_f inCallback, XPLMDrawingPhase inPhase, int inWantsBefore, void * inRefcon); /* * XPLMRegisterKeySniffer * * This routine registers a key sniffing callback. You specify whether you * want to sniff before the window system, or only sniff keys the window * system does not consume. You should ALMOST ALWAYS sniff non-control keys * after the window system. When the window system consumes a key, it is * because the user has "focused" a window. Consuming the key or taking * action based on the key will produce very weird results. Returns 1 if * successful. * */ XPLM_API int XPLMRegisterKeySniffer( XPLMKeySniffer_f inCallback, int inBeforeWindows, void * inRefcon); /* * XPLMUnregisterKeySniffer * * This routine unregisters a key sniffer. You must unregister a key sniffer * for every time you register one with the exact same signature. Returns 1 * if successful. * */ XPLM_API int XPLMUnregisterKeySniffer( XPLMKeySniffer_f inCallback, int inBeforeWindows, void * inRefcon); /*************************************************************************** * WINDOW API ***************************************************************************/ /* * Window API, for higher level drawing with UI interaction. * * Note: all 2-d (and thus all window drawing) is done in 'cockpit pixels'. * Even when the OpenGL window contains more than 1024x768 pixels, the cockpit * drawing is magnified so that only 1024x768 pixels are available. * */ /* * XPLMMouseStatus * * When the mouse is clicked, your mouse click routine is called repeatedly. * It is first called with the mouse down message. It is then called zero or * more times with the mouse-drag message, and finally it is called once with * the mouse up message. All of these messages will be directed to the same * window. * */ enum { xplm_MouseDown = 1 ,xplm_MouseDrag = 2 ,xplm_MouseUp = 3 }; typedef int XPLMMouseStatus; #if defined(XPLM200) /* * XPLMCursorStatus * * XPLMCursorStatus describes how you would like X-Plane to manage the cursor. * See XPLMHandleCursor_f for more info. * */ enum { /* X-Plane manages the cursor normally, plugin does not affect the cusrsor. */ xplm_CursorDefault = 0 /* X-Plane hides the cursor. */ ,xplm_CursorHidden = 1 /* X-Plane shows the cursor as the default arrow. */ ,xplm_CursorArrow = 2 /* X-Plane shows the cursor but lets you select an OS cursor. */ ,xplm_CursorCustom = 3 }; typedef int XPLMCursorStatus; #endif /* XPLM200 */ /* * XPLMWindowID * * This is an opaque identifier for a window. You use it to control your * window. When you create a window, you will specify callbacks to handle * drawing and mouse interaction, etc. * */ typedef void * XPLMWindowID; /* * XPLMDrawWindow_f * * This function handles drawing. You are passed in your window and its * refcon. Draw the window. You can use XPLM functions to find the current * dimensions of your window, etc. When this callback is called, the OpenGL * context will be set properly for cockpit drawing. NOTE: Because you are * drawing your window over a background, you can make a translucent window * easily by simply not filling in your entire window's bounds. * */ typedef void (* XPLMDrawWindow_f)( XPLMWindowID inWindowID, void * inRefcon); /* * XPLMHandleKey_f * * This function is called when a key is pressed or keyboard focus is taken * away from your window. If losingFocus is 1, you are losign the keyboard * focus, otherwise a key was pressed and inKey contains its character. You * are also passewd your window and a refcon. Warning: this API declares * virtual keys as a signed character; however the VKEY #define macros in * XPLMDefs.h define the vkeys using unsigned values (that is 0x80 instead of * -0x80). So you may need to cast the incoming vkey to an unsigned char to * get correct comparisons in C. * */ typedef void (* XPLMHandleKey_f)( XPLMWindowID inWindowID, char inKey, XPLMKeyFlags inFlags, char inVirtualKey, void * inRefcon, int losingFocus); /* * XPLMHandleMouseClick_f * * You receive this call when the mouse button is pressed down or released. * Between then these two calls is a drag. You receive the x and y of the * click, your window, and a refcon. Return 1 to consume the click, or 0 to * pass it through. * * WARNING: passing clicks through windows (as of this writing) causes mouse * tracking problems in X-Plane; do not use this feature! * */ typedef int (* XPLMHandleMouseClick_f)( XPLMWindowID inWindowID, int x, int y, XPLMMouseStatus inMouse, void * inRefcon); #if defined(XPLM200) /* * XPLMHandleCursor_f * * The SDK calls your cursor status callback when the mouse is over your * plugin window. Return a cursor status code to indicate how you would like * X-Plane to manage the cursor. If you return xplm_CursorDefault, the SDK * will try lower-Z-order plugin windows, then let the sim manage the cursor. * * Note: you should never show or hide the cursor yourself - these APIs are * typically reference-counted and thus cannot safely and predictably be used * by the SDK. Instead return one of xplm_CursorHidden to hide the cursor or * xplm_CursorArrow/xplm_CursorCustom to show the cursor. * * If you want to implement a custom cursor by drawing a cursor in OpenGL, use * xplm_CursorHidden to hide the OS cursor and draw the cursor using a 2-d * drawing callback (after xplm_Phase_Window is probably a good choice). If * you want to use a custom OS-based cursor, use xplm_CursorCustom to ask * X-Plane to show the cursor but not affect its image. You can then use an * OS specific call like SetThemeCursor (Mac) or SetCursor/LoadCursor * (Windows). * */ typedef XPLMCursorStatus (* XPLMHandleCursor_f)( XPLMWindowID inWindowID, int x, int y, void * inRefcon); #endif /* XPLM200 */ #if defined(XPLM200) /* * XPLMHandleMouseWheel_f * * The SDK calls your mouse wheel callback when one of the mouse wheels is * turned within your window. Return 1 to consume the mouse wheel clicks or * 0 to pass them on to a lower window. (You should consume mouse wheel * clicks even if they do nothing if your window appears opaque to the user.) * The number of clicks indicates how far the wheel was turned since the last * callback. The wheel is 0 for the vertical axis or 1 for the horizontal axis * (for OS/mouse combinations that support this). * */ typedef int (* XPLMHandleMouseWheel_f)( XPLMWindowID inWindowID, int x, int y, int wheel, int clicks, void * inRefcon); #endif /* XPLM200 */ #if defined(XPLM200) /* * XPLMCreateWindow_t * * The XPMCreateWindow_t structure defines all of the parameters used to * create a window using XPLMCreateWindowEx. The structure will be expanded * in future SDK APIs to include more features. Always set the structSize * member to the size of your struct in bytes! * */ typedef struct { int structSize; int left; int top; int right; int bottom; int visible; XPLMDrawWindow_f drawWindowFunc; XPLMHandleMouseClick_f handleMouseClickFunc; XPLMHandleKey_f handleKeyFunc; XPLMHandleCursor_f handleCursorFunc; XPLMHandleMouseWheel_f handleMouseWheelFunc; void * refcon; } XPLMCreateWindow_t; #endif /* XPLM200 */ /* * XPLMGetScreenSize * * This routine returns the size of the size of the X-Plane OpenGL window in * pixels. Please note that this is not the size of the screen when doing * 2-d drawing (the 2-d screen is currently always 1024x768, and graphics are * scaled up by OpenGL when doing 2-d drawing for higher-res monitors). This * number can be used to get a rough idea of the amount of detail the user * will be able to see when drawing in 3-d. * */ XPLM_API void XPLMGetScreenSize( int * outWidth, /* Can be NULL */ int * outHeight); /* Can be NULL */ /* * XPLMGetMouseLocation * * This routine returns the current mouse location in cockpit pixels. The * bottom left corner of the display is 0,0. Pass NULL to not receive info * about either parameter. * */ XPLM_API void XPLMGetMouseLocation( int * outX, /* Can be NULL */ int * outY); /* Can be NULL */ /* * XPLMCreateWindow * * This routine creates a new window. Pass in the dimensions and offsets to * the window's bottom left corner from the bottom left of the screen. You * can specify whether the window is initially visible or not. Also, you pass * in three callbacks to run the window and a refcon. This function returns a * window ID you can use to refer to the new window. * * NOTE: windows do not have "frames"; you are responsible for drawing the * background and frame of the window. Higher level libraries have routines * which make this easy. * */ XPLM_API XPLMWindowID XPLMCreateWindow( int inLeft, int inTop, int inRight, int inBottom, int inIsVisible, XPLMDrawWindow_f inDrawCallback, XPLMHandleKey_f inKeyCallback, XPLMHandleMouseClick_f inMouseCallback, void * inRefcon); #if defined(XPLM200) /* * XPLMCreateWindowEx * * This routine creates a new window - you pass in an XPLMCreateWindow_t * structure with all of the fields set in. You must set the structSize of * the structure to the size of the actual structure you used. Also, you * must provide funtions for every callback - you may not leave them null! * (If you do not support the cursor or mouse wheel, use functions that return * the default values.) The numeric values of the XPMCreateWindow_t structure * correspond to the parameters of XPLMCreateWindow. * */ XPLM_API XPLMWindowID XPLMCreateWindowEx( XPLMCreateWindow_t * inParams); #endif /* XPLM200 */ /* * XPLMDestroyWindow * * This routine destroys a window. The callbacks are not called after this * call. Keyboard focus is removed from the window before destroying it. * */ XPLM_API void XPLMDestroyWindow( XPLMWindowID inWindowID); /* * XPLMGetWindowGeometry * * This routine returns the position and size of a window in cockpit pixels. * Pass NULL to not receive any paramter. * */ XPLM_API void XPLMGetWindowGeometry( XPLMWindowID inWindowID, int * outLeft, /* Can be NULL */ int * outTop, /* Can be NULL */ int * outRight, /* Can be NULL */ int * outBottom); /* Can be NULL */ /* * XPLMSetWindowGeometry * * This routine allows you to set the position or height aspects of a window. * */ XPLM_API void XPLMSetWindowGeometry( XPLMWindowID inWindowID, int inLeft, int inTop, int inRight, int inBottom); /* * XPLMGetWindowIsVisible * * This routine returns whether a window is visible. * */ XPLM_API int XPLMGetWindowIsVisible( XPLMWindowID inWindowID); /* * XPLMSetWindowIsVisible * * This routine shows or hides a window. * */ XPLM_API void XPLMSetWindowIsVisible( XPLMWindowID inWindowID, int inIsVisible); /* * XPLMGetWindowRefCon * * This routine returns a windows refcon, the unique value you can use for * your own purposes. * */ XPLM_API void * XPLMGetWindowRefCon( XPLMWindowID inWindowID); /* * XPLMSetWindowRefCon * * This routine sets a window's reference constant. Use this to pass data to * yourself in the callbacks. * */ XPLM_API void XPLMSetWindowRefCon( XPLMWindowID inWindowID, void * inRefcon); /* * XPLMTakeKeyboardFocus * * This routine gives a specific window keyboard focus. Keystrokes will be * sent to that window. Pass a window ID of 0 to pass keyboard strokes * directly to X-Plane. * */ XPLM_API void XPLMTakeKeyboardFocus( XPLMWindowID inWindow); /* * XPLMBringWindowToFront * * This routine brings the window to the front of the Z-order. Windows are * brought to the front when they are created...beyond that you should make * sure you are front before handling mouse clicks. * */ XPLM_API void XPLMBringWindowToFront( XPLMWindowID inWindow); /* * XPLMIsWindowInFront * * This routine returns true if you pass inthe ID of the frontmost visible * window. * */ XPLM_API int XPLMIsWindowInFront( XPLMWindowID inWindow); /*************************************************************************** * HOT KEYS ***************************************************************************/ /* * Hot Keys - keystrokes that can be managed by others. * */ /* * XPLMHotKey_f * * Your hot key callback simply takes a pointer of your choosing. * */ typedef void (* XPLMHotKey_f)( void * inRefcon); /* * XPLMHotKeyID * * Hot keys are identified by opaque IDs. * */ typedef void * XPLMHotKeyID; /* * XPLMRegisterHotKey * * This routine registers a hot key. You specify your preferred key stroke * virtual key/flag combination, a description of what your callback does (so * other plug-ins can describe the plug-in to the user for remapping) and a * callback function and opaque pointer to pass in). A new hot key ID is * returned. During execution, the actual key associated with your hot key * may change, but you are insulated from this. * */ XPLM_API XPLMHotKeyID XPLMRegisterHotKey( char inVirtualKey, XPLMKeyFlags inFlags, const char * inDescription, XPLMHotKey_f inCallback, void * inRefcon); /* * XPLMUnregisterHotKey * * This API unregisters a hot key. You can only register your own hot keys. * */ XPLM_API void XPLMUnregisterHotKey( XPLMHotKeyID inHotKey); /* * XPLMCountHotKeys * * Returns the number of current hot keys. * */ XPLM_API int XPLMCountHotKeys(void); /* * XPLMGetNthHotKey * * Returns a hot key by index, for iteration on all hot keys. * */ XPLM_API XPLMHotKeyID XPLMGetNthHotKey( int inIndex); /* * XPLMGetHotKeyInfo * * Returns information about the hot key. Return NULL for any parameter you * don't want info about. The description should be at least 512 chars long. * */ XPLM_API void XPLMGetHotKeyInfo( XPLMHotKeyID inHotKey, char * outVirtualKey, /* Can be NULL */ XPLMKeyFlags * outFlags, /* Can be NULL */ char * outDescription, /* Can be NULL */ XPLMPluginID * outPlugin); /* Can be NULL */ /* * XPLMSetHotKeyCombination * * XPLMSetHotKeyCombination remaps a hot keys keystrokes. You may remap * another plugin's keystrokes. * */ XPLM_API void XPLMSetHotKeyCombination( XPLMHotKeyID inHotKey, char inVirtualKey, XPLMKeyFlags inFlags); #ifdef __cplusplus } #endif #endif