1 /*
2   Simple DirectMedia Layer
3   Copyright (C) 1997-2016 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 /* Define a path to window's BWIN data */
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
_ToBeWin(SDL_Window * window)34 static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) {
35 	return ((SDL_BWin*)(window->driverdata));
36 }
37 
_GetBeApp()38 static SDL_INLINE SDL_BApp *_GetBeApp() {
39 	return ((SDL_BApp*)be_app);
40 }
41 
_InitWindow(_THIS,SDL_Window * window)42 static int _InitWindow(_THIS, SDL_Window *window) {
43 	uint32 flags = 0;
44 	window_look look = B_BORDERED_WINDOW_LOOK;
45 
46 	BRect bounds(
47         window->x,
48         window->y,
49         window->x + window->w - 1,	//BeWindows have an off-by-one px w/h thing
50         window->y + window->h - 1
51     );
52 
53     if(window->flags & SDL_WINDOW_FULLSCREEN) {
54     	/* TODO: Add support for this flag */
55     	printf(__FILE__": %d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",__LINE__);
56     }
57     if(window->flags & SDL_WINDOW_OPENGL) {
58     	/* TODO: Add support for this flag */
59     }
60     if(!(window->flags & SDL_WINDOW_RESIZABLE)) {
61     	flags |= B_NOT_RESIZABLE | B_NOT_ZOOMABLE;
62     }
63     if(window->flags & SDL_WINDOW_BORDERLESS) {
64     	look = B_NO_BORDER_WINDOW_LOOK;
65     }
66 
67     SDL_BWin *bwin = new(std::nothrow) SDL_BWin(bounds, look, flags);
68     if(bwin == NULL)
69     	return ENOMEM;
70 
71     window->driverdata = bwin;
72     int32 winID = _GetBeApp()->GetID(window);
73     bwin->SetID(winID);
74 
75     return 0;
76 }
77 
BE_CreateWindow(_THIS,SDL_Window * window)78 int BE_CreateWindow(_THIS, SDL_Window *window) {
79 	if(_InitWindow(_this, window) == ENOMEM)
80 		return ENOMEM;
81 
82 	/* Start window loop */
83     _ToBeWin(window)->Show();
84     return 0;
85 }
86 
BE_CreateWindowFrom(_THIS,SDL_Window * window,const void * data)87 int BE_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) {
88 
89 	SDL_BWin *otherBWin = (SDL_BWin*)data;
90 	if(!otherBWin->LockLooper())
91 		return -1;
92 
93 	/* Create the new window and initialize its members */
94 	window->x = (int)otherBWin->Frame().left;
95 	window->y = (int)otherBWin->Frame().top;
96 	window->w = (int)otherBWin->Frame().Width();
97 	window->h = (int)otherBWin->Frame().Height();
98 
99 	/* Set SDL flags */
100 	if(!(otherBWin->Flags() & B_NOT_RESIZABLE)) {
101 		window->flags |= SDL_WINDOW_RESIZABLE;
102 	}
103 
104 	/* If we are out of memory, return the error code */
105 	if(_InitWindow(_this, window) == ENOMEM)
106 		return ENOMEM;
107 
108 	/* TODO: Add any other SDL-supported window attributes here */
109     _ToBeWin(window)->SetTitle(otherBWin->Title());
110 
111     /* Start window loop and unlock the other window */
112     _ToBeWin(window)->Show();
113 
114     otherBWin->UnlockLooper();
115     return 0;
116 }
117 
BE_SetWindowTitle(_THIS,SDL_Window * window)118 void BE_SetWindowTitle(_THIS, SDL_Window * window) {
119 	BMessage msg(BWIN_SET_TITLE);
120 	msg.AddString("window-title", window->title);
121 	_ToBeWin(window)->PostMessage(&msg);
122 }
123 
BE_SetWindowIcon(_THIS,SDL_Window * window,SDL_Surface * icon)124 void BE_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) {
125 	/* FIXME: Icons not supported by Haiku */
126 }
127 
BE_SetWindowPosition(_THIS,SDL_Window * window)128 void BE_SetWindowPosition(_THIS, SDL_Window * window) {
129 	BMessage msg(BWIN_MOVE_WINDOW);
130 	msg.AddInt32("window-x", window->x);
131 	msg.AddInt32("window-y", window->y);
132 	_ToBeWin(window)->PostMessage(&msg);
133 }
134 
BE_SetWindowSize(_THIS,SDL_Window * window)135 void BE_SetWindowSize(_THIS, SDL_Window * window) {
136 	BMessage msg(BWIN_RESIZE_WINDOW);
137 	msg.AddInt32("window-w", window->w - 1);
138 	msg.AddInt32("window-h", window->h - 1);
139 	_ToBeWin(window)->PostMessage(&msg);
140 }
141 
BE_SetWindowBordered(_THIS,SDL_Window * window,SDL_bool bordered)142 void BE_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) {
143 	BMessage msg(BWIN_SET_BORDERED);
144 	msg.AddBool("window-border", bordered != SDL_FALSE);
145 	_ToBeWin(window)->PostMessage(&msg);
146 }
147 
BE_SetWindowResizable(_THIS,SDL_Window * window,SDL_bool resizable)148 void BE_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable) {
149 	BMessage msg(BWIN_SET_RESIZABLE);
150 	msg.AddBool("window-resizable", resizable != SDL_FALSE);
151 	_ToBeWin(window)->PostMessage(&msg);
152 }
153 
BE_ShowWindow(_THIS,SDL_Window * window)154 void BE_ShowWindow(_THIS, SDL_Window * window) {
155 	BMessage msg(BWIN_SHOW_WINDOW);
156 	_ToBeWin(window)->PostMessage(&msg);
157 }
158 
BE_HideWindow(_THIS,SDL_Window * window)159 void BE_HideWindow(_THIS, SDL_Window * window) {
160 	BMessage msg(BWIN_HIDE_WINDOW);
161 	_ToBeWin(window)->PostMessage(&msg);
162 }
163 
BE_RaiseWindow(_THIS,SDL_Window * window)164 void BE_RaiseWindow(_THIS, SDL_Window * window) {
165 	BMessage msg(BWIN_SHOW_WINDOW);	/* Activate this window and move to front */
166 	_ToBeWin(window)->PostMessage(&msg);
167 }
168 
BE_MaximizeWindow(_THIS,SDL_Window * window)169 void BE_MaximizeWindow(_THIS, SDL_Window * window) {
170 	BMessage msg(BWIN_MAXIMIZE_WINDOW);
171 	_ToBeWin(window)->PostMessage(&msg);
172 }
173 
BE_MinimizeWindow(_THIS,SDL_Window * window)174 void BE_MinimizeWindow(_THIS, SDL_Window * window) {
175 	BMessage msg(BWIN_MINIMIZE_WINDOW);
176 	_ToBeWin(window)->PostMessage(&msg);
177 }
178 
BE_RestoreWindow(_THIS,SDL_Window * window)179 void BE_RestoreWindow(_THIS, SDL_Window * window) {
180 	BMessage msg(BWIN_RESTORE_WINDOW);
181 	_ToBeWin(window)->PostMessage(&msg);
182 }
183 
BE_SetWindowFullscreen(_THIS,SDL_Window * window,SDL_VideoDisplay * display,SDL_bool fullscreen)184 void BE_SetWindowFullscreen(_THIS, SDL_Window * window,
185 		SDL_VideoDisplay * display, SDL_bool fullscreen) {
186 	/* Haiku tracks all video display information */
187 	BMessage msg(BWIN_FULLSCREEN);
188 	msg.AddBool("fullscreen", fullscreen);
189 	_ToBeWin(window)->PostMessage(&msg);
190 
191 }
192 
BE_SetWindowGammaRamp(_THIS,SDL_Window * window,const Uint16 * ramp)193 int BE_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp) {
194 	/* FIXME: Not Haiku supported */
195 	return -1;
196 }
197 
BE_GetWindowGammaRamp(_THIS,SDL_Window * window,Uint16 * ramp)198 int BE_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp) {
199 	/* FIXME: Not Haiku supported */
200 	return -1;
201 }
202 
203 
BE_SetWindowGrab(_THIS,SDL_Window * window,SDL_bool grabbed)204 void BE_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) {
205 	/* TODO: Implement this! */
206 }
207 
BE_DestroyWindow(_THIS,SDL_Window * window)208 void BE_DestroyWindow(_THIS, SDL_Window * window) {
209 	_ToBeWin(window)->LockLooper();	/* This MUST be locked */
210 	_GetBeApp()->ClearID(_ToBeWin(window));
211 	_ToBeWin(window)->Quit();
212 	window->driverdata = NULL;
213 }
214 
BE_GetWindowWMInfo(_THIS,SDL_Window * window,struct SDL_SysWMinfo * info)215 SDL_bool BE_GetWindowWMInfo(_THIS, SDL_Window * window,
216                                     struct SDL_SysWMinfo *info) {
217 	/* FIXME: What is the point of this? What information should be included? */
218 	return SDL_FALSE;
219 }
220 
221 
222 
223 
224 
225 #ifdef __cplusplus
226 }
227 #endif
228 
229 #endif /* SDL_VIDEO_DRIVER_HAIKU */
230