2001-04-26 16:45:43 +00:00
|
|
|
/*
|
|
|
|
SDL - Simple DirectMedia Layer
|
2002-03-06 11:23:08 +00:00
|
|
|
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
|
2001-04-26 16:45:43 +00:00
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Library General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2 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
|
|
|
|
Library General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
|
|
License along with this library; if not, write to the Free
|
|
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
|
|
|
|
Sam Lantinga
|
2001-12-14 12:38:15 +00:00
|
|
|
slouken@libsdl.org
|
2001-04-26 16:45:43 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef SAVE_RCSID
|
|
|
|
static char rcsid =
|
|
|
|
"@(#) $Id$";
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _SDL_BWin_h
|
|
|
|
#define _SDL_BWin_h
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <AppKit.h>
|
|
|
|
#include <InterfaceKit.h>
|
|
|
|
#include <be/game/DirectWindow.h>
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
#include <be/opengl/GLView.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "SDL_BeApp.h"
|
|
|
|
#include "SDL_events.h"
|
|
|
|
#include "SDL_BView.h"
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
#include "SDL_events_c.h"
|
|
|
|
};
|
|
|
|
|
|
|
|
class SDL_BWin : public BDirectWindow
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
SDL_BWin(BRect bounds) :
|
|
|
|
BDirectWindow(bounds, "Untitled", B_TITLED_WINDOW, 0) {
|
|
|
|
the_view = NULL;
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
SDL_GLView = NULL;
|
|
|
|
#endif
|
|
|
|
SDL_View = NULL;
|
|
|
|
Unlock();
|
|
|
|
shown = false;
|
|
|
|
inhibit_resize = false;
|
|
|
|
}
|
|
|
|
virtual ~SDL_BWin() {
|
|
|
|
Lock();
|
|
|
|
if ( the_view ) {
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
if ( the_view == SDL_GLView ) {
|
|
|
|
SDL_GLView->UnlockGL();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
RemoveChild(the_view);
|
|
|
|
the_view = NULL;
|
|
|
|
}
|
|
|
|
Unlock();
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
if ( SDL_GLView ) {
|
|
|
|
delete SDL_GLView;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if ( SDL_View ) {
|
|
|
|
delete SDL_View;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Override the Show() method so we can tell when we've been shown */
|
|
|
|
virtual void Show(void) {
|
|
|
|
BWindow::Show();
|
|
|
|
shown = true;
|
|
|
|
}
|
|
|
|
virtual bool Shown(void) {
|
|
|
|
return (shown);
|
|
|
|
}
|
|
|
|
/* If called, the next resize event will not be forwarded to SDL. */
|
|
|
|
virtual void InhibitResize(void) {
|
|
|
|
inhibit_resize=true;
|
|
|
|
}
|
|
|
|
/* Handle resizing of the window */
|
|
|
|
virtual void FrameResized(float width, float height) {
|
|
|
|
if(inhibit_resize)
|
|
|
|
inhibit_resize = false;
|
|
|
|
else
|
|
|
|
SDL_PrivateResize((int)width, (int)height);
|
|
|
|
}
|
|
|
|
virtual int CreateView(Uint32 flags) {
|
|
|
|
int retval;
|
|
|
|
|
|
|
|
retval = 0;
|
|
|
|
Lock();
|
|
|
|
if ( flags & SDL_OPENGL ) {
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
if ( SDL_GLView == NULL ) {
|
|
|
|
/* FIXME: choose BGL type via user flags */
|
|
|
|
SDL_GLView = new BGLView(Bounds(), "SDL GLView",
|
|
|
|
B_FOLLOW_ALL_SIDES,
|
|
|
|
(B_WILL_DRAW|B_FRAME_EVENTS),
|
|
|
|
(BGL_RGB|BGL_DOUBLE|BGL_DEPTH));
|
|
|
|
}
|
|
|
|
if ( the_view != SDL_GLView ) {
|
|
|
|
if ( the_view ) {
|
|
|
|
RemoveChild(the_view);
|
|
|
|
}
|
|
|
|
AddChild(SDL_GLView);
|
|
|
|
SDL_GLView->LockGL();
|
|
|
|
the_view = SDL_GLView;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
SDL_SetError("OpenGL support not enabled");
|
|
|
|
retval = -1;
|
|
|
|
#endif
|
|
|
|
} else {
|
|
|
|
if ( SDL_View == NULL ) {
|
|
|
|
SDL_View = new SDL_BView(Bounds());
|
|
|
|
}
|
|
|
|
if ( the_view != SDL_View ) {
|
|
|
|
if ( the_view ) {
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
if ( the_view == SDL_GLView ) {
|
|
|
|
SDL_GLView->UnlockGL();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
RemoveChild(the_view);
|
|
|
|
}
|
|
|
|
AddChild(SDL_View);
|
|
|
|
the_view = SDL_View;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Unlock();
|
|
|
|
return(retval);
|
|
|
|
}
|
|
|
|
virtual void SetBitmap(BBitmap *bitmap) {
|
|
|
|
SDL_View->SetBitmap(bitmap);
|
|
|
|
}
|
|
|
|
virtual void SetXYOffset(int x, int y) {
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
if ( the_view == SDL_GLView ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
SDL_View->SetXYOffset(x, y);
|
|
|
|
}
|
2001-04-26 16:50:19 +00:00
|
|
|
virtual void GetXYOffset(int &x, int &y) {
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
if ( the_view == SDL_GLView ) {
|
|
|
|
x = 0;
|
|
|
|
y = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
SDL_View->GetXYOffset(x, y);
|
|
|
|
}
|
2001-04-26 16:45:43 +00:00
|
|
|
virtual bool BeginDraw(void) {
|
|
|
|
return(Lock());
|
|
|
|
}
|
|
|
|
virtual void DrawAsync(BRect updateRect) {
|
|
|
|
SDL_View->DrawAsync(updateRect);
|
|
|
|
}
|
|
|
|
virtual void EndDraw(void) {
|
|
|
|
SDL_View->Sync();
|
|
|
|
Unlock();
|
|
|
|
}
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
virtual void SwapBuffers(void) {
|
|
|
|
SDL_GLView->UnlockGL();
|
|
|
|
SDL_GLView->LockGL();
|
|
|
|
SDL_GLView->SwapBuffers();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
virtual BView *View(void) {
|
|
|
|
return(the_view);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Hook functions -- overridden */
|
|
|
|
virtual void Minimize(bool minimize) {
|
|
|
|
/* This is only called when mimimized, not when restored */
|
|
|
|
//SDL_PrivateAppActive(minimize, SDL_APPACTIVE);
|
|
|
|
BWindow::Minimize(minimize);
|
|
|
|
}
|
|
|
|
virtual void WindowActivated(bool active) {
|
|
|
|
SDL_PrivateAppActive(active, SDL_APPINPUTFOCUS);
|
|
|
|
}
|
|
|
|
virtual bool QuitRequested(void) {
|
|
|
|
if ( SDL_BeAppActive > 0 ) {
|
|
|
|
SDL_PrivateQuit();
|
|
|
|
/* We don't ever actually close the window here because
|
|
|
|
the application should respond to the quit request,
|
|
|
|
or ignore it as desired.
|
|
|
|
*/
|
|
|
|
return(false);
|
|
|
|
}
|
|
|
|
return(true); /* Close the app window */
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
#ifdef HAVE_OPENGL
|
|
|
|
BGLView *SDL_GLView;
|
|
|
|
#endif
|
|
|
|
SDL_BView *SDL_View;
|
|
|
|
BView *the_view;
|
|
|
|
|
|
|
|
bool shown;
|
|
|
|
bool inhibit_resize;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* _SDL_BWin_h */
|