src/video/haiku/SDL_bwindow.cc
changeset 12201 8bdc4d340419
parent 12082 09999a0e8f9a
child 12503 806492103856
equal deleted inserted replaced
12200:c0b17b32b95e 12201:8bdc4d340419
    30 #ifdef __cplusplus
    30 #ifdef __cplusplus
    31 extern "C" {
    31 extern "C" {
    32 #endif
    32 #endif
    33 
    33 
    34 static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) {
    34 static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) {
    35 	return ((SDL_BWin*)(window->driverdata));
    35     return ((SDL_BWin*)(window->driverdata));
    36 }
    36 }
    37 
    37 
    38 static SDL_INLINE SDL_BApp *_GetBeApp() {
    38 static SDL_INLINE SDL_BApp *_GetBeApp() {
    39 	return ((SDL_BApp*)be_app);
    39     return ((SDL_BApp*)be_app);
    40 }
    40 }
    41 
    41 
    42 static int _InitWindow(_THIS, SDL_Window *window) {
    42 static int _InitWindow(_THIS, SDL_Window *window) {
    43 	uint32 flags = 0;
    43     uint32 flags = 0;
    44 	window_look look = B_TITLED_WINDOW_LOOK;
    44     window_look look = B_TITLED_WINDOW_LOOK;
    45 
    45 
    46 	BRect bounds(
    46     BRect bounds(
    47         window->x,
    47         window->x,
    48         window->y,
    48         window->y,
    49         window->x + window->w - 1,	//BeWindows have an off-by-one px w/h thing
    49         window->x + window->w - 1,    //BeWindows have an off-by-one px w/h thing
    50         window->y + window->h - 1
    50         window->y + window->h - 1
    51     );
    51     );
    52     
    52     
    53     if(window->flags & SDL_WINDOW_FULLSCREEN) {
    53     if(window->flags & SDL_WINDOW_FULLSCREEN) {
    54     	/* TODO: Add support for this flag */
    54         /* TODO: Add support for this flag */
    55     	printf(__FILE__": %d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",__LINE__);
    55         printf(__FILE__": %d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",__LINE__);
    56     }
    56     }
    57     if(window->flags & SDL_WINDOW_OPENGL) {
    57     if(window->flags & SDL_WINDOW_OPENGL) {
    58     	/* TODO: Add support for this flag */
    58         /* TODO: Add support for this flag */
    59     }
    59     }
    60     if(!(window->flags & SDL_WINDOW_RESIZABLE)) {
    60     if(!(window->flags & SDL_WINDOW_RESIZABLE)) {
    61     	flags |= B_NOT_RESIZABLE | B_NOT_ZOOMABLE;
    61         flags |= B_NOT_RESIZABLE | B_NOT_ZOOMABLE;
    62     }
    62     }
    63     if(window->flags & SDL_WINDOW_BORDERLESS) {
    63     if(window->flags & SDL_WINDOW_BORDERLESS) {
    64     	look = B_NO_BORDER_WINDOW_LOOK;
    64         look = B_NO_BORDER_WINDOW_LOOK;
    65     }
    65     }
    66 
    66 
    67     SDL_BWin *bwin = new(std::nothrow) SDL_BWin(bounds, look, flags);
    67     SDL_BWin *bwin = new(std::nothrow) SDL_BWin(bounds, look, flags);
    68     if(bwin == NULL)
    68     if(bwin == NULL)
    69         return -1;
    69         return -1;
    77 
    77 
    78 int HAIKU_CreateWindow(_THIS, SDL_Window *window) {
    78 int HAIKU_CreateWindow(_THIS, SDL_Window *window) {
    79     if (_InitWindow(_this, window) < 0) {
    79     if (_InitWindow(_this, window) < 0) {
    80         return -1;
    80         return -1;
    81     }
    81     }
    82 	
    82     
    83 	/* Start window loop */
    83     /* Start window loop */
    84     _ToBeWin(window)->Show();
    84     _ToBeWin(window)->Show();
    85     return 0;
    85     return 0;
    86 }
    86 }
    87 
    87 
    88 int HAIKU_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) {
    88 int HAIKU_CreateWindowFrom(_THIS, SDL_Window * window, const void *data) {
    89 
    89 
    90 	SDL_BWin *otherBWin = (SDL_BWin*)data;
    90     SDL_BWin *otherBWin = (SDL_BWin*)data;
    91 	if(!otherBWin->LockLooper())
    91     if(!otherBWin->LockLooper())
    92 		return -1;
    92         return -1;
    93 	
    93     
    94 	/* Create the new window and initialize its members */
    94     /* Create the new window and initialize its members */
    95 	window->x = (int)otherBWin->Frame().left;
    95     window->x = (int)otherBWin->Frame().left;
    96 	window->y = (int)otherBWin->Frame().top;
    96     window->y = (int)otherBWin->Frame().top;
    97 	window->w = (int)otherBWin->Frame().Width();
    97     window->w = (int)otherBWin->Frame().Width();
    98 	window->h = (int)otherBWin->Frame().Height();
    98     window->h = (int)otherBWin->Frame().Height();
    99 	
    99     
   100 	/* Set SDL flags */
   100     /* Set SDL flags */
   101 	if(!(otherBWin->Flags() & B_NOT_RESIZABLE)) {
   101     if(!(otherBWin->Flags() & B_NOT_RESIZABLE)) {
   102 		window->flags |= SDL_WINDOW_RESIZABLE;
   102         window->flags |= SDL_WINDOW_RESIZABLE;
   103 	}
   103     }
   104 	
   104     
   105 	/* If we are out of memory, return the error code */
   105     /* If we are out of memory, return the error code */
   106     if (_InitWindow(_this, window) < 0) {
   106     if (_InitWindow(_this, window) < 0) {
   107         return -1;
   107         return -1;
   108     }
   108     }
   109 	
   109     
   110 	/* TODO: Add any other SDL-supported window attributes here */
   110     /* TODO: Add any other SDL-supported window attributes here */
   111     _ToBeWin(window)->SetTitle(otherBWin->Title());
   111     _ToBeWin(window)->SetTitle(otherBWin->Title());
   112     
   112     
   113     /* Start window loop and unlock the other window */
   113     /* Start window loop and unlock the other window */
   114     _ToBeWin(window)->Show();
   114     _ToBeWin(window)->Show();
   115     
   115     
   116     otherBWin->UnlockLooper();
   116     otherBWin->UnlockLooper();
   117     return 0;
   117     return 0;
   118 }
   118 }
   119 
   119 
   120 void HAIKU_SetWindowTitle(_THIS, SDL_Window * window) {
   120 void HAIKU_SetWindowTitle(_THIS, SDL_Window * window) {
   121 	BMessage msg(BWIN_SET_TITLE);
   121     BMessage msg(BWIN_SET_TITLE);
   122 	msg.AddString("window-title", window->title);
   122     msg.AddString("window-title", window->title);
   123 	_ToBeWin(window)->PostMessage(&msg);
   123     _ToBeWin(window)->PostMessage(&msg);
   124 }
   124 }
   125 
   125 
   126 void HAIKU_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) {
   126 void HAIKU_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) {
   127 	/* FIXME: Icons not supported by Haiku */
   127     /* FIXME: Icons not supported by Haiku */
   128 }
   128 }
   129 
   129 
   130 void HAIKU_SetWindowPosition(_THIS, SDL_Window * window) {
   130 void HAIKU_SetWindowPosition(_THIS, SDL_Window * window) {
   131 	BMessage msg(BWIN_MOVE_WINDOW);
   131     BMessage msg(BWIN_MOVE_WINDOW);
   132 	msg.AddInt32("window-x", window->x);
   132     msg.AddInt32("window-x", window->x);
   133 	msg.AddInt32("window-y", window->y);
   133     msg.AddInt32("window-y", window->y);
   134 	_ToBeWin(window)->PostMessage(&msg);
   134     _ToBeWin(window)->PostMessage(&msg);
   135 }
   135 }
   136 
   136 
   137 void HAIKU_SetWindowSize(_THIS, SDL_Window * window) {
   137 void HAIKU_SetWindowSize(_THIS, SDL_Window * window) {
   138 	BMessage msg(BWIN_RESIZE_WINDOW);
   138     BMessage msg(BWIN_RESIZE_WINDOW);
   139 	msg.AddInt32("window-w", window->w - 1);
   139     msg.AddInt32("window-w", window->w - 1);
   140 	msg.AddInt32("window-h", window->h - 1);
   140     msg.AddInt32("window-h", window->h - 1);
   141 	_ToBeWin(window)->PostMessage(&msg);
   141     _ToBeWin(window)->PostMessage(&msg);
   142 }
   142 }
   143 
   143 
   144 void HAIKU_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) {
   144 void HAIKU_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered) {
   145 	BMessage msg(BWIN_SET_BORDERED);
   145     BMessage msg(BWIN_SET_BORDERED);
   146 	msg.AddBool("window-border", bordered != SDL_FALSE);
   146     msg.AddBool("window-border", bordered != SDL_FALSE);
   147 	_ToBeWin(window)->PostMessage(&msg);
   147     _ToBeWin(window)->PostMessage(&msg);
   148 }
   148 }
   149 
   149 
   150 void HAIKU_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable) {
   150 void HAIKU_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable) {
   151 	BMessage msg(BWIN_SET_RESIZABLE);
   151     BMessage msg(BWIN_SET_RESIZABLE);
   152 	msg.AddBool("window-resizable", resizable != SDL_FALSE);
   152     msg.AddBool("window-resizable", resizable != SDL_FALSE);
   153 	_ToBeWin(window)->PostMessage(&msg);
   153     _ToBeWin(window)->PostMessage(&msg);
   154 }
   154 }
   155 
   155 
   156 void HAIKU_ShowWindow(_THIS, SDL_Window * window) {
   156 void HAIKU_ShowWindow(_THIS, SDL_Window * window) {
   157 	BMessage msg(BWIN_SHOW_WINDOW);
   157     BMessage msg(BWIN_SHOW_WINDOW);
   158 	_ToBeWin(window)->PostMessage(&msg);
   158     _ToBeWin(window)->PostMessage(&msg);
   159 }
   159 }
   160 
   160 
   161 void HAIKU_HideWindow(_THIS, SDL_Window * window) {
   161 void HAIKU_HideWindow(_THIS, SDL_Window * window) {
   162 	BMessage msg(BWIN_HIDE_WINDOW);
   162     BMessage msg(BWIN_HIDE_WINDOW);
   163 	_ToBeWin(window)->PostMessage(&msg);
   163     _ToBeWin(window)->PostMessage(&msg);
   164 }
   164 }
   165 
   165 
   166 void HAIKU_RaiseWindow(_THIS, SDL_Window * window) {
   166 void HAIKU_RaiseWindow(_THIS, SDL_Window * window) {
   167 	BMessage msg(BWIN_SHOW_WINDOW);	/* Activate this window and move to front */
   167     BMessage msg(BWIN_SHOW_WINDOW);    /* Activate this window and move to front */
   168 	_ToBeWin(window)->PostMessage(&msg);
   168     _ToBeWin(window)->PostMessage(&msg);
   169 }
   169 }
   170 
   170 
   171 void HAIKU_MaximizeWindow(_THIS, SDL_Window * window) {
   171 void HAIKU_MaximizeWindow(_THIS, SDL_Window * window) {
   172 	BMessage msg(BWIN_MAXIMIZE_WINDOW);
   172     BMessage msg(BWIN_MAXIMIZE_WINDOW);
   173 	_ToBeWin(window)->PostMessage(&msg);
   173     _ToBeWin(window)->PostMessage(&msg);
   174 }
   174 }
   175 
   175 
   176 void HAIKU_MinimizeWindow(_THIS, SDL_Window * window) {
   176 void HAIKU_MinimizeWindow(_THIS, SDL_Window * window) {
   177 	BMessage msg(BWIN_MINIMIZE_WINDOW);
   177     BMessage msg(BWIN_MINIMIZE_WINDOW);
   178 	_ToBeWin(window)->PostMessage(&msg);
   178     _ToBeWin(window)->PostMessage(&msg);
   179 }
   179 }
   180 
   180 
   181 void HAIKU_RestoreWindow(_THIS, SDL_Window * window) {
   181 void HAIKU_RestoreWindow(_THIS, SDL_Window * window) {
   182 	BMessage msg(BWIN_RESTORE_WINDOW);
   182     BMessage msg(BWIN_RESTORE_WINDOW);
   183 	_ToBeWin(window)->PostMessage(&msg);
   183     _ToBeWin(window)->PostMessage(&msg);
   184 }
   184 }
   185 
   185 
   186 void HAIKU_SetWindowFullscreen(_THIS, SDL_Window * window,
   186 void HAIKU_SetWindowFullscreen(_THIS, SDL_Window * window,
   187 		SDL_VideoDisplay * display, SDL_bool fullscreen) {
   187         SDL_VideoDisplay * display, SDL_bool fullscreen) {
   188 	/* Haiku tracks all video display information */
   188     /* Haiku tracks all video display information */
   189 	BMessage msg(BWIN_FULLSCREEN);
   189     BMessage msg(BWIN_FULLSCREEN);
   190 	msg.AddBool("fullscreen", fullscreen);
   190     msg.AddBool("fullscreen", fullscreen);
   191 	_ToBeWin(window)->PostMessage(&msg);
   191     _ToBeWin(window)->PostMessage(&msg);
   192 	
   192     
   193 }
   193 }
   194 
   194 
   195 int HAIKU_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp) {
   195 int HAIKU_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp) {
   196 	/* FIXME: Not Haiku supported */
   196     /* FIXME: Not Haiku supported */
   197 	return -1;
   197     return -1;
   198 }
   198 }
   199 
   199 
   200 int HAIKU_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp) {
   200 int HAIKU_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp) {
   201 	/* FIXME: Not Haiku supported */
   201     /* FIXME: Not Haiku supported */
   202 	return -1;
   202     return -1;
   203 }
   203 }
   204 
   204 
   205 
   205 
   206 void HAIKU_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) {
   206 void HAIKU_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed) {
   207 	/* TODO: Implement this! */
   207     /* TODO: Implement this! */
   208 }
   208 }
   209 
   209 
   210 void HAIKU_DestroyWindow(_THIS, SDL_Window * window) {
   210 void HAIKU_DestroyWindow(_THIS, SDL_Window * window) {
   211 	_ToBeWin(window)->LockLooper();	/* This MUST be locked */
   211     _ToBeWin(window)->LockLooper();    /* This MUST be locked */
   212 	_GetBeApp()->ClearID(_ToBeWin(window));
   212     _GetBeApp()->ClearID(_ToBeWin(window));
   213 	_ToBeWin(window)->Quit();
   213     _ToBeWin(window)->Quit();
   214 	window->driverdata = NULL;
   214     window->driverdata = NULL;
   215 }
   215 }
   216 
   216 
   217 SDL_bool HAIKU_GetWindowWMInfo(_THIS, SDL_Window * window,
   217 SDL_bool HAIKU_GetWindowWMInfo(_THIS, SDL_Window * window,
   218                                     struct SDL_SysWMinfo *info) {
   218                                     struct SDL_SysWMinfo *info) {
   219 	/* FIXME: What is the point of this? What information should be included? */
   219     /* FIXME: What is the point of this? What information should be included? */
   220 	return SDL_FALSE;
   220     return SDL_FALSE;
   221 }
   221 }
   222 
   222 
   223 
   223 
   224 
   224 
   225 
   225