/*
    SDL - Simple DirectMedia Layer
    Copyright (C) 1997-2006 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
*/
#include "SDL_config.h"

#include "SDL_BWin.h"

extern "C" {
#include "SDL_syswm_c.h"
#include "SDL_error.h"
#include "../SDL_cursor_c.h"

void BE_SetWMCaption(_THIS, const char *title, const char *icon)
{
	SDL_Win->SetTitle(title);
}

int BE_IconifyWindow(_THIS)
{
	SDL_Win->Minimize(true);
}

SDL_GrabMode BE_GrabInput(_THIS, SDL_GrabMode mode)
{
	if ( mode == SDL_GRAB_OFF ) {
//		be_app->ShowCursor();
		if ( !(SDL_cursorstate & CURSOR_VISIBLE) ) {
		/*	BeSman: Jan 2, 2006
			must be leaving relative mode, move mouse from
			center of window to where it belongs ... */
			BPoint pt;
			int x, y;
			SDL_GetMouseState(&x,&y);
			pt.x = x;
			pt.y = y;
			SDL_Win->Lock();
			SDL_Win->ConvertToScreen(&pt);
			SDL_Win->Unlock();
			set_mouse_position((int)pt.x, (int)pt.y);
		}
	} else {
//		be_app->HideCursor();
		if ( !(SDL_cursorstate & CURSOR_VISIBLE) ) {
		/*	BeSman: Jan 2, 2006
			must be entering relative mode, get ready by
			moving mouse to	center of window ... */
			BPoint pt;
			pt.x = (SDL_VideoSurface->w/2);
			pt.y = (SDL_VideoSurface->h/2);
			SDL_Win->Lock();
			SDL_Win->ConvertToScreen(&pt);
			SDL_Win->Unlock();
			set_mouse_position((int)pt.x, (int)pt.y);
		}
	}
	return(mode);
}

int BE_GetWMInfo(_THIS, SDL_SysWMinfo *info)
{
    if (info->version.major <= SDL_MAJOR_VERSION)
    {
        return 1;
    }
    else
    {
        SDL_SetError("Application not compiled with SDL %d.%d\n",
                      SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
        return -1;
    }
}

}; /* Extern C */
