SDL_BWin.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_BWin.h,v 1.4 2002/04/22 21:38:04 wmay Exp $";
  21. #endif
  22. #ifndef _SDL_BWin_h
  23. #define _SDL_BWin_h
  24. #include <stdio.h>
  25. #include <AppKit.h>
  26. #include <InterfaceKit.h>
  27. #include <be/game/DirectWindow.h>
  28. #ifdef HAVE_OPENGL
  29. #include <be/opengl/GLView.h>
  30. #endif
  31. #include "SDL_BeApp.h"
  32. #include "SDL_events.h"
  33. #include "SDL_BView.h"
  34. extern "C" {
  35. #include "SDL_events_c.h"
  36. };
  37. class SDL_BWin : public BDirectWindow
  38. {
  39. public:
  40. SDL_BWin(BRect bounds) :
  41. BDirectWindow(bounds, "Untitled", B_TITLED_WINDOW, 0) {
  42. the_view = NULL;
  43. #ifdef HAVE_OPENGL
  44. SDL_GLView = NULL;
  45. #endif
  46. SDL_View = NULL;
  47. Unlock();
  48. shown = false;
  49. inhibit_resize = false;
  50. }
  51. virtual ~SDL_BWin() {
  52. Lock();
  53. if ( the_view ) {
  54. #ifdef HAVE_OPENGL
  55. if ( the_view == SDL_GLView ) {
  56. SDL_GLView->UnlockGL();
  57. }
  58. #endif
  59. RemoveChild(the_view);
  60. the_view = NULL;
  61. }
  62. Unlock();
  63. #ifdef HAVE_OPENGL
  64. if ( SDL_GLView ) {
  65. delete SDL_GLView;
  66. }
  67. #endif
  68. if ( SDL_View ) {
  69. delete SDL_View;
  70. }
  71. }
  72. /* Override the Show() method so we can tell when we've been shown */
  73. virtual void Show(void) {
  74. BWindow::Show();
  75. shown = true;
  76. }
  77. virtual bool Shown(void) {
  78. return (shown);
  79. }
  80. /* If called, the next resize event will not be forwarded to SDL. */
  81. virtual void InhibitResize(void) {
  82. inhibit_resize=true;
  83. }
  84. /* Handle resizing of the window */
  85. virtual void FrameResized(float width, float height) {
  86. if(inhibit_resize)
  87. inhibit_resize = false;
  88. else 
  89. SDL_PrivateResize((int)width, (int)height);
  90. }
  91. virtual int CreateView(Uint32 flags) {
  92. int retval;
  93. retval = 0;
  94. Lock();
  95. if ( flags & SDL_OPENGL ) {
  96. #ifdef HAVE_OPENGL
  97. if ( SDL_GLView == NULL ) {
  98. /* FIXME: choose BGL type via user flags */
  99. SDL_GLView = new BGLView(Bounds(), "SDL GLView",
  100.   B_FOLLOW_ALL_SIDES,
  101.                                          (B_WILL_DRAW|B_FRAME_EVENTS),
  102. (BGL_RGB|BGL_DOUBLE|BGL_DEPTH));
  103. }
  104. if ( the_view != SDL_GLView ) {
  105. if ( the_view ) {
  106. RemoveChild(the_view);
  107. }
  108. AddChild(SDL_GLView);
  109. SDL_GLView->LockGL();
  110. the_view = SDL_GLView;
  111. }
  112. #else
  113. SDL_SetError("OpenGL support not enabled");
  114. retval = -1;
  115. #endif
  116. } else {
  117. if ( SDL_View == NULL ) {
  118. SDL_View = new SDL_BView(Bounds());
  119. }
  120. if ( the_view != SDL_View ) {
  121. if ( the_view ) {
  122. #ifdef HAVE_OPENGL
  123. if ( the_view == SDL_GLView ) {
  124. SDL_GLView->UnlockGL();
  125. }
  126. #endif
  127. RemoveChild(the_view);
  128. }
  129. AddChild(SDL_View);
  130. the_view = SDL_View;
  131. }
  132. }
  133. Unlock();
  134. return(retval);
  135. }
  136. virtual void SetBitmap(BBitmap *bitmap) {
  137. SDL_View->SetBitmap(bitmap);
  138. }
  139. virtual void SetXYOffset(int x, int y) {
  140. #ifdef HAVE_OPENGL
  141. if ( the_view == SDL_GLView ) {
  142. return;
  143. }
  144. #endif
  145. SDL_View->SetXYOffset(x, y);
  146. }
  147. virtual void GetXYOffset(int &x, int &y) {
  148. #ifdef HAVE_OPENGL
  149. if ( the_view == SDL_GLView ) {
  150. x = 0;
  151. y = 0;
  152. return;
  153. }
  154. #endif
  155. SDL_View->GetXYOffset(x, y);
  156. }
  157. virtual bool BeginDraw(void) {
  158. return(Lock());
  159. }
  160. virtual void DrawAsync(BRect updateRect) {
  161. SDL_View->DrawAsync(updateRect);
  162. }
  163. virtual void EndDraw(void) {
  164. SDL_View->Sync();
  165. Unlock();
  166. }
  167. #ifdef HAVE_OPENGL
  168. virtual void SwapBuffers(void) {
  169. SDL_GLView->UnlockGL();
  170. SDL_GLView->LockGL();
  171. SDL_GLView->SwapBuffers();
  172. }
  173. #endif
  174. virtual BView *View(void) {
  175. return(the_view);
  176. }
  177. /* Hook functions -- overridden */
  178. virtual void Minimize(bool minimize) {
  179. /* This is only called when mimimized, not when restored */
  180. //SDL_PrivateAppActive(minimize, SDL_APPACTIVE);
  181. BWindow::Minimize(minimize);
  182. }
  183. virtual void WindowActivated(bool active) {
  184. SDL_PrivateAppActive(active, SDL_APPINPUTFOCUS);
  185. }
  186. virtual bool QuitRequested(void) {
  187. if ( SDL_BeAppActive > 0 ) {
  188. SDL_PrivateQuit();
  189. /* We don't ever actually close the window here because
  190.    the application should respond to the quit request,
  191.    or ignore it as desired.
  192.  */
  193. return(false);
  194. }
  195. return(true); /* Close the app window */
  196. }
  197. private:
  198. #ifdef HAVE_OPENGL
  199. BGLView *SDL_GLView;
  200. #endif
  201. SDL_BView *SDL_View;
  202. BView *the_view;
  203. bool shown;
  204. bool inhibit_resize;
  205. };
  206. #endif /* _SDL_BWin_h */