SDL_bwindow.cc (7102B)
1 /* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any damages 7 arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, 10 including commercial applications, and to alter it and redistribute it 11 freely, subject to the following restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not 14 claim that you wrote the original software. If you use this software 15 in a product, an acknowledgment in the product documentation would be 16 appreciated but is not required. 17 2. Altered source versions must be plainly marked as such, and must not be 18 misrepresented as being the original software. 19 3. This notice may not be removed or altered from any source distribution. 20 */ 21 #include "../../SDL_internal.h" 22 23 #if SDL_VIDEO_DRIVER_HAIKU 24 #include "../SDL_sysvideo.h" 25 26 #include "SDL_BWin.h" 27 #include <new> 28 29 #include "SDL_syswm.h" 30 31 /* Define a path to window's BWIN data */ 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) { 37 return ((SDL_BWin*)(window->driverdata)); 38 } 39 40 static SDL_INLINE SDL_BApp *_GetBeApp() { 41 return ((SDL_BApp*)be_app); 42 } 43 44 static int _InitWindow(_THIS, SDL_Window *window) { 45 uint32 flags = 0; 46 window_look look = B_TITLED_WINDOW_LOOK; 47 48 BRect bounds( 49 window->x, 50 window->y, 51 window->x + window->w - 1, //BeWindows have an off-by-one px w/h thing 52 window->y + window->h - 1 53 ); 54 55 if(window->flags & SDL_WINDOW_FULLSCREEN) { 56 /* TODO: Add support for this flag */ 57 printf(__FILE__": %d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",__LINE__); 58 } 59 if(window->flags & SDL_WINDOW_OPENGL) { 60 /* TODO: Add support for this flag */ 61 } 62 if(!(window->flags & SDL_WINDOW_RESIZABLE)) { 63 flags |= B_NOT_RESIZABLE | B_NOT_ZOOMABLE; 64 } 65 if(window->flags & SDL_WINDOW_BORDERLESS) { 66 look = B_NO_BORDER_WINDOW_LOOK; 67 } 68 69 SDL_BWin *bwin = new(std::nothrow) SDL_BWin(bounds, look, flags); 70 if(bwin == NULL) 71 return -1; 72 73 window->driverdata = bwin; 74 int32 winID = _GetBeApp()->GetID(window); 75 bwin->SetID(winID); 76 77 return 0; 78 } 79 80 int HAIKU_CreateWindow(_THIS, SDL_Window *window) { 81 if (_InitWindow(_this, window) < 0) { 82 return -1; 83 } 84 85 /* Start window loop */ 86 _ToBeWin(window)->Show(); 87 return 0; 88 } 89 90 int HAIKU_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) { 91 92 SDL_BWin *otherBWin = (SDL_BWin*)data; 93 if(!otherBWin->LockLooper()) 94 return -1; 95 96 /* Create the new window and initialize its members */ 97 window->x = (int)otherBWin->Frame().left; 98 window->y = (int)otherBWin->Frame().top; 99 window->w = (int)otherBWin->Frame().Width(); 100 window->h = (int)otherBWin->Frame().Height(); 101 102 /* Set SDL flags */ 103 if(!(otherBWin->Flags() & B_NOT_RESIZABLE)) { 104 window->flags |= SDL_WINDOW_RESIZABLE; 105 } 106 107 /* If we are out of memory, return the error code */ 108 if (_InitWindow(_this, window) < 0) { 109 return -1; 110 } 111 112 /* TODO: Add any other SDL-supported window attributes here */ 113 _ToBeWin(window)->SetTitle(otherBWin->Title()); 114 115 /* Start window loop and unlock the other window */ 116 _ToBeWin(window)->Show(); 117 118 otherBWin->UnlockLooper(); 119 return 0; 120 } 121 122 void HAIKU_SetWindowTitle(_THIS, SDL_Window * window) { 123 BMessage msg(BWIN_SET_TITLE); 124 msg.AddString("window-title", window->title); 125 _ToBeWin(window)->PostMessage(&msg); 126 } 127 128 void HAIKU_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) { 129 /* FIXME: Icons not supported by Haiku */ 130 } 131 132 void HAIKU_SetWindowPosition(_THIS, SDL_Window * window) { 133 BMessage msg(BWIN_MOVE_WINDOW); 134 msg.AddInt32("window-x", window->x); 135 msg.AddInt32("window-y", window->y); 136 _ToBeWin(window)->PostMessage(&msg); 137 } 138 139 void HAIKU_SetWindowSize(_THIS, SDL_Window * window) { 140 BMessage msg(BWIN_RESIZE_WINDOW); 141 msg.AddInt32("window-w", window->w - 1); 142 msg.AddInt32("window-h", window->h - 1); 143 _ToBeWin(window)->PostMessage(&msg); 144 } 145 146 void HAIKU_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) { 147 BMessage msg(BWIN_SET_BORDERED); 148 msg.AddBool("window-border", bordered != SDL_FALSE); 149 _ToBeWin(window)->PostMessage(&msg); 150 } 151 152 void HAIKU_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable) { 153 BMessage msg(BWIN_SET_RESIZABLE); 154 msg.AddBool("window-resizable", resizable != SDL_FALSE); 155 _ToBeWin(window)->PostMessage(&msg); 156 } 157 158 void HAIKU_ShowWindow(_THIS, SDL_Window * window) { 159 BMessage msg(BWIN_SHOW_WINDOW); 160 _ToBeWin(window)->PostMessage(&msg); 161 } 162 163 void HAIKU_HideWindow(_THIS, SDL_Window * window) { 164 BMessage msg(BWIN_HIDE_WINDOW); 165 _ToBeWin(window)->PostMessage(&msg); 166 } 167 168 void HAIKU_RaiseWindow(_THIS, SDL_Window * window) { 169 BMessage msg(BWIN_SHOW_WINDOW); /* Activate this window and move to front */ 170 _ToBeWin(window)->PostMessage(&msg); 171 } 172 173 void HAIKU_MaximizeWindow(_THIS, SDL_Window * window) { 174 BMessage msg(BWIN_MAXIMIZE_WINDOW); 175 _ToBeWin(window)->PostMessage(&msg); 176 } 177 178 void HAIKU_MinimizeWindow(_THIS, SDL_Window * window) { 179 BMessage msg(BWIN_MINIMIZE_WINDOW); 180 _ToBeWin(window)->PostMessage(&msg); 181 } 182 183 void HAIKU_RestoreWindow(_THIS, SDL_Window * window) { 184 BMessage msg(BWIN_RESTORE_WINDOW); 185 _ToBeWin(window)->PostMessage(&msg); 186 } 187 188 void HAIKU_SetWindowFullscreen(_THIS, SDL_Window * window, 189 SDL_VideoDisplay * display, SDL_bool fullscreen) { 190 /* Haiku tracks all video display information */ 191 BMessage msg(BWIN_FULLSCREEN); 192 msg.AddBool("fullscreen", fullscreen); 193 _ToBeWin(window)->PostMessage(&msg); 194 195 } 196 197 int HAIKU_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp) { 198 /* FIXME: Not Haiku supported */ 199 return -1; 200 } 201 202 int HAIKU_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp) { 203 /* FIXME: Not Haiku supported */ 204 return -1; 205 } 206 207 208 void HAIKU_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) { 209 /* TODO: Implement this! */ 210 } 211 212 void HAIKU_DestroyWindow(_THIS, SDL_Window * window) { 213 _ToBeWin(window)->LockLooper(); /* This MUST be locked */ 214 _GetBeApp()->ClearID(_ToBeWin(window)); 215 _ToBeWin(window)->Quit(); 216 window->driverdata = NULL; 217 } 218 219 SDL_bool HAIKU_GetWindowWMInfo(_THIS, SDL_Window * window, 220 struct SDL_SysWMinfo *info) { 221 /* FIXME: What is the point of this? What information should be included? */ 222 if (info->version.major == SDL_MAJOR_VERSION && 223 info->version.minor == SDL_MINOR_VERSION) { 224 info->subsystem = SDL_SYSWM_HAIKU; 225 return SDL_TRUE; 226 } else { 227 SDL_SetError("Application not compiled with SDL %d.%d", 228 SDL_MAJOR_VERSION, SDL_MINOR_VERSION); 229 return SDL_FALSE; 230 } 231 } 232 233 234 235 236 237 #ifdef __cplusplus 238 } 239 #endif 240 241 #endif /* SDL_VIDEO_DRIVER_HAIKU */ 242 243 /* vi: set ts=4 sw=4 expandtab: */