/*
    SDL - Simple DirectMedia Layer
    Copyright (C) 1997-2010 Sam Lantinga

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    Sam Lantinga
    slouken@libsdl.org
*/

/**
 *  \file SDL_syswm.h
 *  
 *  Include file for SDL custom system window manager hooks.
 */

#ifndef _SDL_syswm_h
#define _SDL_syswm_h

#include "SDL_stdinc.h"
#include "SDL_error.h"
#include "SDL_video.h"
#include "SDL_version.h"

#include "begin_code.h"
/* Set up for C function definitions, even when using C++ */
#ifdef __cplusplus
/* *INDENT-OFF* */
extern "C" {
/* *INDENT-ON* */
#endif

/**
 *  \file SDL_syswm.h
 *  
 *  Your application has access to a special type of event ::SDL_SYSWMEVENT,
 *  which contains window-manager specific information and arrives whenever
 *  an unhandled window event occurs.  This event is ignored by default, but
 *  you can enable it with SDL_EventState().
 */
#ifdef SDL_PROTOTYPES_ONLY
struct SDL_SysWMinfo;
#else

/* This is the structure for custom window manager events */
#if defined(SDL_VIDEO_DRIVER_X11)
#if defined(__APPLE__) && defined(__MACH__)
/* conflicts with Quickdraw.h */
#define Cursor X11Cursor
#endif

#include <X11/Xlib.h>
#include <X11/Xatom.h>

#if defined(__APPLE__) && defined(__MACH__)
/* matches the re-define above */
#undef Cursor
#endif

/** 
 *  These are the various supported subsystems under UNIX.
 */
typedef enum
{
    SDL_SYSWM_X11
} SDL_SYSWM_TYPE;

/**
 *  The UNIX custom event structure.
 */
struct SDL_SysWMmsg
{
    SDL_version version;
    SDL_SYSWM_TYPE subsystem;
    union
    {
        XEvent xevent;
    } event;
};

/**
 *  The UNIX custom window manager information structure.
 *
 *  When this structure is returned, it holds information about which
 *  low level system it is using, and will be one of SDL_SYSWM_TYPE.
 */
struct SDL_SysWMinfo
{
    SDL_version version;
    SDL_SYSWM_TYPE subsystem;
    union
    {
        struct
        {
            Display *display;   /**< The X11 display */
            Window window;      /**< The X11 display window */
            /**
             *  These locking functions should be called around
             *  any X11 functions using the display variable.
             *  They lock the event thread, so should not be
             *  called around event functions or from event filters.
             */
            /*@{*/
            void (*lock_func) (void);
            void (*unlock_func) (void);
            /*@}*/

            /**
             *  Introduced in SDL 1.0.2.
             */
            /*@{*/
            Window fswindow;    /**< The X11 fullscreen window */
            Window wmwindow;    /**< The X11 managed input window */
            /*@}*/
        } x11;
    } info;
};

#elif defined(SDL_VIDEO_DRIVER_WIN32)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

/**
 *  The windows custom event structure.
 */
struct SDL_SysWMmsg
{
    SDL_version version;
    HWND hwnd;                  /**< The window for the message */
    UINT msg;                   /**< The type of message */
    WPARAM wParam;              /**< WORD message parameter */
    LPARAM lParam;              /**< LONG message parameter */
};

/**
 *  The windows custom window manager information structure.
 */
struct SDL_SysWMinfo
{
    SDL_version version;
    HWND window;                /**< The Win32 display window */
};

#elif defined(SDL_VIDEO_DRIVER_RISCOS)

/**
 *  RISC OS custom event structure.
 */
struct SDL_SysWMmsg
{
    SDL_version version;
    int eventCode;              /**< The window for the message */
    int pollBlock[64];
};

/**
 *  The RISC OS custom window manager information structure.
 */
struct SDL_SysWMinfo
{
    SDL_version version;
    int wimpVersion;            /**< Wimp version running under */
    int taskHandle;             /**< The RISC OS task handle */
    int window;                 /**< The RISC OS display window */
};

#elif defined(SDL_VIDEO_DRIVER_PHOTON) || defined(SDL_VIDEO_DRIVER_QNXGF)
#include <sys/neutrino.h>
#if defined(SDL_VIDEO_OPENGL_ES)
#include <gf/gf.h>
#endif /* SDL_VIDEO_OPENGL_ES */
#include <Ph.h>

/**
 * The QNX custom event structure.
 */
struct SDL_SysWMmsg
{
    SDL_version version;
    int data;
};

/**
 *  The QNX Photon custom window manager information structure.
 */
struct SDL_SysWMinfo
{
    SDL_version version;
    int data;
};

#else

/**
 *  The generic custom event structure.
 */
struct SDL_SysWMmsg
{
    SDL_version version;
    int data;
};

/**
 *  The generic custom window manager information structure.
 */
struct SDL_SysWMinfo
{
    SDL_version version;
    int data;
};

#endif /* video driver type */

#endif /* SDL_PROTOTYPES_ONLY */

typedef struct SDL_SysWMinfo SDL_SysWMinfo;

/* Function prototypes */
/**
 *  \brief This function allows access to driver-dependent window information.
 *  
 *  \param windowID The window about which information is being requested
 *  \param info This structure must be initialized with the SDL version, and is 
 *              then filled in with information about the given window.
 *  
 *  \return SDL_TRUE if the function is implemented and the version member of 
 *          the \c info struct is valid, SDL_FALSE otherwise.
 *  
 *  You typically use this function like this:
 *  \code
 *  SDL_SysWMInfo info;
 *  SDL_VERSION(&info.version);
 *  if ( SDL_GetWindowWMInfo(&info) ) { ... }
 *  \endcode
 */
extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_Window * window,
                                                     SDL_SysWMinfo * info);


/* Ends C function definitions when using C++ */
#ifdef __cplusplus
/* *INDENT-OFF* */
}
/* *INDENT-ON* */
#endif
#include "close_code.h"

#endif /* _SDL_syswm_h */

/* vi: set ts=4 sw=4 expandtab: */
