• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2012 Sam Lantinga
4 
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Lesser General Public
7     License as published by the Free Software Foundation; either
8     version 2.1 of the License, or (at your option) any later version.
9 
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Lesser General Public License for more details.
14 
15     You should have received a copy of the GNU Lesser General Public
16     License along with this library; if not, write to the Free Software
17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18 
19     Sam Lantinga
20     slouken@libsdl.org
21 */
22 
23 #ifndef _SDL_BWin_h
24 #define _SDL_BWin_h
25 
26 #include "SDL_config.h"
27 
28 #include <stdio.h>
29 #include <AppKit.h>
30 #include <InterfaceKit.h>
31 #include <be/game/DirectWindow.h>
32 #if SDL_VIDEO_OPENGL
33 #include "SDL_opengl.h"
34 #include <be/opengl/GLView.h>
35 #endif
36 #include <support/UTF8.h>
37 
38 #include "../../main/beos/SDL_BeApp.h"
39 #include "SDL_events.h"
40 #include "SDL_BView.h"
41 
42 extern "C" {
43 #include "../../events/SDL_events_c.h"
44 
45 extern int mouse_relative;
46 };
47 
48 class SDL_BWin : public BDirectWindow
49 {
50 public:
SDL_BWin(BRect bounds)51 	SDL_BWin(BRect bounds) :
52 			BDirectWindow(bounds, "Untitled", B_TITLED_WINDOW, 0) {
53 		last_buttons = 0;
54 		the_view = NULL;
55 #if SDL_VIDEO_OPENGL
56 		SDL_GLView = NULL;
57 #endif
58 		SDL_View = NULL;
59 		Unlock();
60 		shown = false;
61 		inhibit_resize = false;
62 	}
63 
~SDL_BWin()64 	virtual ~SDL_BWin() {
65 		Lock();
66 		if ( the_view ) {
67 #if SDL_VIDEO_OPENGL
68 			if ( the_view == SDL_GLView ) {
69 				SDL_GLView->UnlockGL();
70 			}
71 #endif
72 			RemoveChild(the_view);
73 			the_view = NULL;
74 		}
75 		Unlock();
76 #if SDL_VIDEO_OPENGL
77 		if ( SDL_GLView ) {
78 			delete SDL_GLView;
79 		}
80 #endif
81 		if ( SDL_View ) {
82 			delete SDL_View;
83 		}
84 	}
85 
86 
87 	/* Override the Show() method so we can tell when we've been shown */
Show(void)88 	virtual void Show(void) {
89 		BWindow::Show();
90 		shown = true;
91 	}
Shown(void)92 	virtual bool Shown(void) {
93 		return (shown);
94 	}
95 	/* If called, the next resize event will not be forwarded to SDL. */
InhibitResize(void)96 	virtual void InhibitResize(void) {
97 		inhibit_resize=true;
98 	}
99 	/* Handle resizing of the window */
FrameResized(float width,float height)100 	virtual void FrameResized(float width, float height) {
101 		if(inhibit_resize)
102 			inhibit_resize = false;
103 		else
104 			SDL_PrivateResize((int)width, (int)height);
105 	}
CreateView(Uint32 flags,Uint32 gl_flags)106 	virtual int CreateView(Uint32 flags, Uint32 gl_flags) {
107 		int retval;
108 
109 		retval = 0;
110 		Lock();
111 		if ( flags & SDL_OPENGL ) {
112 #if SDL_VIDEO_OPENGL
113 			if ( SDL_GLView == NULL ) {
114 				SDL_GLView = new BGLView(Bounds(), "SDL GLView",
115 					 	B_FOLLOW_ALL_SIDES, (B_WILL_DRAW|B_FRAME_EVENTS),
116 					 	gl_flags|BGL_DOUBLE);
117 				SDL_GLView->EnableDirectMode(true);
118 			}
119 			if ( the_view != SDL_GLView ) {
120 				if ( the_view ) {
121 					RemoveChild(the_view);
122 				}
123 				AddChild(SDL_GLView);
124 				SDL_GLView->LockGL();
125 				the_view = SDL_GLView;
126 			}
127 #else
128 			SDL_SetError("OpenGL support not enabled");
129 			retval = -1;
130 #endif
131 		} else {
132 			if ( SDL_View == NULL ) {
133 				SDL_View = new SDL_BView(Bounds());
134 			}
135 			if ( the_view != SDL_View ) {
136 				if ( the_view ) {
137 					RemoveChild(the_view);
138 				}
139 				AddChild(SDL_View);
140 				the_view = SDL_View;
141 			}
142 		}
143 #if SDL_VIDEO_OPENGL
144 		if ( the_view == SDL_GLView ) {
145 			SDL_GLView->UnlockGL();
146 		}
147 #endif
148 		Unlock();
149 		return(retval);
150 	}
SetBitmap(BBitmap * bitmap)151 	virtual void SetBitmap(BBitmap *bitmap) {
152 		SDL_View->SetBitmap(bitmap);
153 	}
SetXYOffset(int x,int y)154 	virtual void SetXYOffset(int x, int y) {
155 #if SDL_VIDEO_OPENGL
156 		if ( the_view == SDL_GLView ) {
157 			return;
158 		}
159 #endif
160 		SDL_View->SetXYOffset(x, y);
161 	}
GetXYOffset(int & x,int & y)162 	virtual void GetXYOffset(int &x, int &y) {
163 #if SDL_VIDEO_OPENGL
164 		if ( the_view == SDL_GLView ) {
165 			x = 0;
166 			y = 0;
167 			return;
168 		}
169 #endif
170 		SDL_View->GetXYOffset(x, y);
171 	}
GetXYOffset(float & x,float & y)172 	virtual void GetXYOffset(float &x, float &y) {
173 #if SDL_VIDEO_OPENGL
174 		if ( the_view == SDL_GLView ) {
175 			x = 0.0f;
176 			y = 0.0f;
177 			return;
178 		}
179 #endif
180 		SDL_View->GetXYOffset(x, y);
181 	}
BeginDraw(void)182 	virtual bool BeginDraw(void) {
183 		return(Lock());
184 	}
DrawAsync(BRect updateRect)185 	virtual void DrawAsync(BRect updateRect) {
186 		SDL_View->DrawAsync(updateRect);
187 	}
EndDraw(void)188 	virtual void EndDraw(void) {
189 		SDL_View->Sync();
190 		Unlock();
191 	}
192 #if SDL_VIDEO_OPENGL
SwapBuffers(void)193 	virtual void SwapBuffers(void) {
194 		SDL_GLView->UnlockGL();
195 		SDL_GLView->SwapBuffers();
196 		SDL_GLView->LockGL();
197 	}
198 #endif
View(void)199 	virtual BView *View(void) {
200 		return(the_view);
201 	}
202 
203 	/* Hook functions -- overridden */
Minimize(bool minimize)204 	virtual void Minimize(bool minimize) {
205 		/* This is only called when mimimized, not when restored */
206 		//SDL_PrivateAppActive(minimize, SDL_APPACTIVE);
207 		BWindow::Minimize(minimize);
208 	}
WindowActivated(bool active)209 	virtual void WindowActivated(bool active) {
210 		SDL_PrivateAppActive(active, SDL_APPINPUTFOCUS);
211 	}
QuitRequested(void)212 	virtual bool QuitRequested(void) {
213 		if ( SDL_BeAppActive > 0 ) {
214 			SDL_PrivateQuit();
215 			/* We don't ever actually close the window here because
216 			   the application should respond to the quit request,
217 			   or ignore it as desired.
218 			 */
219 #if SDL_VIDEO_OPENGL
220 			if ( SDL_GLView != NULL ) {
221 				SDL_GLView->EnableDirectMode(false);
222 			}
223 #endif
224 			return(false);
225 		}
226 		return(true);	/* Close the app window */
227 	}
Quit()228 	virtual void Quit() {
229 		if (!IsLocked())
230 			Lock();
231 		BDirectWindow::Quit();
232 	}
233 
Translate2Unicode(const char * buf)234 	virtual int16 Translate2Unicode(const char *buf) {
235 		int32 state, srclen, dstlen;
236 		unsigned char destbuf[2];
237 		Uint16 unicode = 0;
238 
239 		if ((uchar)buf[0] > 127) {
240 			state = 0;
241 			srclen = SDL_strlen(buf);
242 			dstlen = sizeof(destbuf);
243 			convert_from_utf8(B_UNICODE_CONVERSION, buf, &srclen, (char *)destbuf, &dstlen, &state);
244 			unicode = destbuf[0];
245 			unicode <<= 8;
246 			unicode |= destbuf[1];
247 		} else
248 			unicode = buf[0];
249 
250 		/* For some reason function keys map to control characters */
251 # define CTRL(X)	((X)-'@')
252 		switch (unicode) {
253 		    case CTRL('A'):
254 		    case CTRL('B'):
255 		    case CTRL('C'):
256 		    case CTRL('D'):
257 		    case CTRL('E'):
258 		    case CTRL('K'):
259 		    case CTRL('L'):
260 		    case CTRL('P'):
261 			if ( ! (SDL_GetModState() & KMOD_CTRL) )
262 				unicode = 0;
263 			break;
264 			/* Keyboard input maps newline to carriage return */
265 			case '\n':
266 				unicode = '\r';
267 			break;
268 		    default:
269 			break;
270 		}
271 
272 		return unicode;
273 	}
274 
275 	virtual void DispatchMessage(BMessage *msg, BHandler *target);
276 
277 	virtual void DirectConnected(direct_buffer_info *info);
278 
279 private:
280 #if SDL_VIDEO_OPENGL
281 	BGLView *SDL_GLView;
282 #endif
283 	SDL_BView *SDL_View;
284 	BView *the_view;
285 	bool shown;
286 	bool inhibit_resize;
287 	int32 last_buttons;
288 };
289 
290 #endif /* _SDL_BWin_h */
291