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 
_ToBeWin(SDL_Window * window)36 static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) {
37     return ((SDL_BWin*)(window->driverdata));
38 }
39 
_GetBeApp()40 static SDL_INLINE SDL_BApp *_GetBeApp() {
41     return ((SDL_BApp*)be_app);
42 }
43 
_InitWindow(_THIS,SDL_Window * window)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 
HAIKU_CreateWindow(_THIS,SDL_Window * window)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 
HAIKU_CreateWindowFrom(_THIS,SDL_Window * window,const void * data)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 
HAIKU_SetWindowTitle(_THIS,SDL_Window * window)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 
HAIKU_SetWindowIcon(_THIS,SDL_Window * window,SDL_Surface * icon)128 void HAIKU_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) {
129     /* FIXME: Icons not supported by Haiku */
130 }
131 
HAIKU_SetWindowPosition(_THIS,SDL_Window * window)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 
HAIKU_SetWindowSize(_THIS,SDL_Window * window)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 
HAIKU_SetWindowBordered(_THIS,SDL_Window * window,SDL_bool bordered)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 
HAIKU_SetWindowResizable(_THIS,SDL_Window * window,SDL_bool resizable)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 
HAIKU_ShowWindow(_THIS,SDL_Window * window)158 void HAIKU_ShowWindow(_THIS, SDL_Window * window) {
159     BMessage msg(BWIN_SHOW_WINDOW);
160     _ToBeWin(window)->PostMessage(&msg);
161 }
162 
HAIKU_HideWindow(_THIS,SDL_Window * window)163 void HAIKU_HideWindow(_THIS, SDL_Window * window) {
164     BMessage msg(BWIN_HIDE_WINDOW);
165     _ToBeWin(window)->PostMessage(&msg);
166 }
167 
HAIKU_RaiseWindow(_THIS,SDL_Window * window)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 
HAIKU_MaximizeWindow(_THIS,SDL_Window * window)173 void HAIKU_MaximizeWindow(_THIS, SDL_Window * window) {
174     BMessage msg(BWIN_MAXIMIZE_WINDOW);
175     _ToBeWin(window)->PostMessage(&msg);
176 }
177 
HAIKU_MinimizeWindow(_THIS,SDL_Window * window)178 void HAIKU_MinimizeWindow(_THIS, SDL_Window * window) {
179     BMessage msg(BWIN_MINIMIZE_WINDOW);
180     _ToBeWin(window)->PostMessage(&msg);
181 }
182 
HAIKU_RestoreWindow(_THIS,SDL_Window * window)183 void HAIKU_RestoreWindow(_THIS, SDL_Window * window) {
184     BMessage msg(BWIN_RESTORE_WINDOW);
185     _ToBeWin(window)->PostMessage(&msg);
186 }
187 
HAIKU_SetWindowFullscreen(_THIS,SDL_Window * window,SDL_VideoDisplay * display,SDL_bool fullscreen)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 
HAIKU_SetWindowGammaRamp(_THIS,SDL_Window * window,const Uint16 * ramp)197 int HAIKU_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp) {
198     /* FIXME: Not Haiku supported */
199     return -1;
200 }
201 
HAIKU_GetWindowGammaRamp(_THIS,SDL_Window * window,Uint16 * ramp)202 int HAIKU_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp) {
203     /* FIXME: Not Haiku supported */
204     return -1;
205 }
206 
207 
HAIKU_SetWindowGrab(_THIS,SDL_Window * window,SDL_bool grabbed)208 void HAIKU_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) {
209     /* TODO: Implement this! */
210 }
211 
HAIKU_DestroyWindow(_THIS,SDL_Window * window)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 
HAIKU_GetWindowWMInfo(_THIS,SDL_Window * window,struct SDL_SysWMinfo * info)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: */
244