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