src/video/haiku/SDL_bwindow.cc
author Sam Lantinga <slouken@libsdl.org>
Fri, 09 Dec 2016 01:47:43 -0800
changeset 10690 23a825f341e6
parent 10385 ad12658bc7ae
child 10737 3406a0f8b041
permissions -rw-r--r--
Fixed bug 3513 - SDL_GL_SwapWindow does not return error status

Return an error code from SDL_GL_SwapWindow(), like the other SDL APIs.
     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 
    34 static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) {
    35 	return ((SDL_BWin*)(window->driverdata));
    36 }
    37 
    38 static SDL_INLINE SDL_BApp *_GetBeApp() {
    39 	return ((SDL_BApp*)be_app);
    40 }
    41 
    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 
    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 
    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 
   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 
   124 void BE_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) {
   125 	/* FIXME: Icons not supported by Haiku */
   126 }
   127 
   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 
   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 
   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 
   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 
   154 void BE_ShowWindow(_THIS, SDL_Window * window) {
   155 	BMessage msg(BWIN_SHOW_WINDOW);
   156 	_ToBeWin(window)->PostMessage(&msg);
   157 }
   158 
   159 void BE_HideWindow(_THIS, SDL_Window * window) {
   160 	BMessage msg(BWIN_HIDE_WINDOW);
   161 	_ToBeWin(window)->PostMessage(&msg);
   162 }
   163 
   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 
   169 void BE_MaximizeWindow(_THIS, SDL_Window * window) {
   170 	BMessage msg(BWIN_MAXIMIZE_WINDOW);
   171 	_ToBeWin(window)->PostMessage(&msg);
   172 }
   173 
   174 void BE_MinimizeWindow(_THIS, SDL_Window * window) {
   175 	BMessage msg(BWIN_MINIMIZE_WINDOW);
   176 	_ToBeWin(window)->PostMessage(&msg);
   177 }
   178 
   179 void BE_RestoreWindow(_THIS, SDL_Window * window) {
   180 	BMessage msg(BWIN_RESTORE_WINDOW);
   181 	_ToBeWin(window)->PostMessage(&msg);
   182 }
   183 
   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 
   193 int BE_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp) {
   194 	/* FIXME: Not Haiku supported */
   195 	return -1;
   196 }
   197 
   198 int BE_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp) {
   199 	/* FIXME: Not Haiku supported */
   200 	return -1;
   201 }
   202 
   203 
   204 void BE_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) {
   205 	/* TODO: Implement this! */
   206 }
   207 
   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 
   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 
   231 /* vi: set ts=4 sw=4 expandtab: */